void xdnd_send_enter(DndClass *dnd, Window window, Window from, Atom *typelist) { XEvent xevent; int n, i; n = array_length (typelist); memset(&xevent, 0, sizeof (xevent)); xevent.xany.type = ClientMessage; xevent.xany.display = dnd->display; xevent.xclient.window = window; xevent.xclient.message_type = dnd->XdndEnter; xevent.xclient.format = 32; XDND_ENTER_SOURCE_WIN (&xevent) = from; XDND_ENTER_THREE_TYPES_SET (&xevent, n > XDND_THREE); XDND_ENTER_VERSION_SET (&xevent, dnd->version); for (i = 0; i < n && i < XDND_THREE; i++) { XDND_ENTER_TYPE (&xevent, i) = typelist[i]; } XSendEvent (dnd->display, window, 0, 0, &xevent); }
bool Dnd::handleEnterEvent(const XEvent& xEvent) { m_DragWindow = XDND_ENTER_SOURCE_WIN(&xEvent); CArray<Atom> typeList; if (XDND_STATUS_WILL_ACCEPT(&xEvent) == 0) { //cout << "Only three types" << endl; for (int i = 0; i < XDND_THREE; i++) { if (XDND_ENTER_TYPE(&xEvent, i) != 0) { typeList.Append(XDND_ENTER_TYPE(&xEvent, i)); } } for ( unsigned int i = 0; i < typeList.GetSize(); i++) { Atom atom = XInternAtom(m_pDisplay, "text/uri-list", False); if (typeList[i] == atom) { m_DesiredType = atom; } } } else { //cout << "More than three types - getting list" << endl; generateTypeList(XDND_STATUS_TARGET_WIN(&xEvent), typeList); if (!typeList.GetSize()) { for ( unsigned int i = 0; i < typeList.GetSize(); i++) { Atom atom = XInternAtom(m_pDisplay, "text/uri-list", False); if (typeList[i] == atom) { m_DesiredType = atom; } } } } return false; }