void xdnd_send_position(DndClass *dnd, Window window, Window from, Atom action, int x, int y, unsigned long time) { XEvent xevent; memset (&xevent, 0, sizeof (xevent)); xevent.xany.type = ClientMessage; xevent.xany.display = dnd->display; xevent.xclient.window = window; xevent.xclient.message_type = dnd->XdndPosition; xevent.xclient.format = 32; XDND_POSITION_SOURCE_WIN (&xevent) = from; XDND_POSITION_ROOT_SET (&xevent, x, y); if (dnd_version_at_least (dnd->dragging_version, 1)) XDND_POSITION_TIME (&xevent) = time; if (dnd_version_at_least (dnd->dragging_version, 2)) XDND_POSITION_ACTION (&xevent) = action; XSendEvent (dnd->display, window, 0, 0, &xevent); }
void Dnd::handlePositionEvent(const XEvent& xEvent) { XEvent replyXEvent; m_DropPosX = XDND_POSITION_ROOT_X((&xEvent)); m_DropPosY = XDND_POSITION_ROOT_Y((&xEvent)); m_Time = XDND_POSITION_TIME((&xEvent)); memset (&replyXEvent, 0, sizeof(replyXEvent)); replyXEvent.xany.type = ClientMessage; replyXEvent.xany.display = m_pDisplay; replyXEvent.xclient.window = m_DragWindow; replyXEvent.xclient.message_type = XdndStatus; replyXEvent.xclient.format = 32; XDND_STATUS_TARGET_WIN(&replyXEvent) = xEvent.xclient.window; XDND_STATUS_WILL_ACCEPT_SET(&replyXEvent, True); XDND_STATUS_WANT_POSITION_SET(&replyXEvent, True); XDND_STATUS_RECT_SET(&replyXEvent, m_DropPosX, m_DropPosY, 1, 1); XDND_STATUS_ACTION(&replyXEvent) = XDND_POSITION_ACTION(&xEvent); XSendEvent(m_pDisplay, m_DragWindow, 0, 0, &replyXEvent); }