| 1432 | } |
| 1433 | |
| 1434 | bool SDLCALL SDLPlatform::X11EventHook(void* userdata, _XEvent* xevent) |
| 1435 | { |
| 1436 | using namespace X11Impl; |
| 1437 | const X11::XEvent& event = *(X11::XEvent*)xevent; |
| 1438 | Window* window; |
| 1439 | |
| 1440 | // External event handling |
| 1441 | xEventReceived(xevent); |
| 1442 | |
| 1443 | if (event.type == ClientMessage) |
| 1444 | { |
| 1445 | if ((uint32)event.xclient.message_type == (uint32)xAtomXdndEnter) |
| 1446 | { |
| 1447 | // Drag&drop enter |
| 1448 | X11::Window source = event.xclient.data.l[0]; |
| 1449 | xDnDVersion = (int32)(event.xclient.data.l[1] >> 24); |
| 1450 | const char* targetTypeFiles = "text/uri-list"; |
| 1451 | if (event.xclient.data.l[1] & 1) |
| 1452 | { |
| 1453 | Property p = X11Impl::ReadProperty(xDisplay, source, XInternAtom(xDisplay, "XdndTypeList", 0)); |
| 1454 | xDnDRequested = X11Impl::SelectTargetFromList(xDisplay, targetTypeFiles, (X11::Atom*)p.data, p.nitems); |
| 1455 | X11::XFree(p.data); |
| 1456 | } |
| 1457 | else |
| 1458 | { |
| 1459 | xDnDRequested = X11Impl::SelectTargetFromAtoms(xDisplay, targetTypeFiles, event.xclient.data.l[2], event.xclient.data.l[3], event.xclient.data.l[4]); |
| 1460 | } |
| 1461 | return false; |
| 1462 | } |
| 1463 | else if ((uint32)event.xclient.message_type == (uint32)xAtomXdndPosition) |
| 1464 | { |
| 1465 | // Drag&drop move |
| 1466 | X11::XClientMessageEvent m; |
| 1467 | memset(&m, 0, sizeof(m)); |
| 1468 | m.type = ClientMessage; |
| 1469 | m.display = event.xclient.display; |
| 1470 | m.window = event.xclient.data.l[0]; |
| 1471 | m.message_type = xAtomXdndStatus; |
| 1472 | m.format = 32; |
| 1473 | m.data.l[0] = event.xany.window; |
| 1474 | m.data.l[1] = (xDnDRequested != 0); |
| 1475 | m.data.l[2] = 0; |
| 1476 | m.data.l[3] = 0; |
| 1477 | m.data.l[4] = xAtomXdndActionCopy; |
| 1478 | X11::XSendEvent(xDisplay, event.xclient.data.l[0], 0, NoEventMask, (X11::XEvent*)&m); |
| 1479 | X11::XFlush(xDisplay); |
| 1480 | xDndPos = Float2((float)(event.xclient.data.l[2] >> 16), (float)(event.xclient.data.l[2] & 0xffff)); |
| 1481 | window = WindowsManager::GetByNativePtr((void*)event.xany.window); |
| 1482 | if (window) |
| 1483 | { |
| 1484 | xDndPos = window->ScreenToClient(xDndPos); |
| 1485 | LinuxDropFilesData dropData; |
| 1486 | xDndResult = DragDropEffect::None; |
| 1487 | if (window->_dragOver) |
| 1488 | { |
| 1489 | window->OnDragOver(&dropData, xDndPos, xDndResult); |
| 1490 | } |
| 1491 | else |
nothing calls this directly
no test coverage detected