MCPcopy Create free account
hub / github.com/FlaxEngine/FlaxEngine / X11EventHook

Method X11EventHook

Source/Engine/Platform/SDL/SDLPlatform.Linux.cpp:1434–1633  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1432}
1433
1434bool 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

Callers

nothing calls this directly

Calls 15

memsetFunction · 0.85
Float2Class · 0.85
OnDragOverMethod · 0.80
ReplaceMethod · 0.80
TrimTrailingMethod · 0.80
ReadPropertyFunction · 0.70
SelectTargetFromListFunction · 0.70
SelectTargetFromAtomsFunction · 0.70
ScreenToClientMethod · 0.45
OnDragEnterMethod · 0.45
OnDragLeaveMethod · 0.45
SplitMethod · 0.45

Tested by

no test coverage detected