void xdnd_send_status(DndClass *dnd, Window window, Window from, int will_accept, int want_position, int x, int y, int w, int h, Atom action) { 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->XdndStatus; xevent.xclient.format = 32; XDND_STATUS_TARGET_WIN (&xevent) = from; XDND_STATUS_WILL_ACCEPT_SET (&xevent, will_accept); if (will_accept) XDND_STATUS_WANT_POSITION_SET (&xevent, want_position); if (want_position) XDND_STATUS_RECT_SET (&xevent, x, y, w, h); if (dnd_version_at_least (dnd->dragging_version, 2)) if (will_accept) XDND_STATUS_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); }
Bool wsXDNDProcessClientMessage(XClientMessageEvent *event) { /* test */ /*{ char * name = XGetAtomName(wsDisplay, event->message_type); printf("Got %s\n",name); XFree(name); }*/ if (event->message_type == XA_XdndEnter) { Atom ok = XInternAtom(wsDisplay, "text/uri-list", False); atom_support = None; if ((event->data.l[1] & 1) == 0){ int index; for(index = 0; index <= 2 ; index++){ if ((Atom) event->data.l[2+index] == ok) { atom_support = ok; } } if (atom_support == None) { mp_msg( MSGT_GPLAYER,MSGL_WARN,MSGTR_WS_NotAFile ); } } else { /* need to check the whole list here */ unsigned long ret_left = 1; int offset = 0; Atom* ret_buff; Atom ret_type; int ret_format; unsigned long ret_items; /* while there is data left...*/ while(ret_left && atom_support == None){ XGetWindowProperty(wsDisplay,event->data.l[0],XA_XdndTypeList, offset,256,False,XA_ATOM,&ret_type, &ret_format,&ret_items,&ret_left, (unsigned char**)&ret_buff); /* sanity checks...*/ if(ret_buff == NULL || ret_type != XA_ATOM || ret_format != 8*sizeof(Atom)){ XFree(ret_buff); break; } /* now chek what we've got */ { unsigned long i; for(i=0; i<ret_items; i++){ if(ret_buff[i] == ok){ atom_support = ok; break; } } } /* maybe next time ... */ XFree(ret_buff); offset += 256; } } return True; } if (event->message_type == XA_XdndLeave) { return True; } if (event->message_type == XA_XdndDrop) { if ((Window) event->data.l[0] != XGetSelectionOwner(wsDisplay, XA_XdndSelection)){ puts("Wierd selection owner... QT?"); } if (atom_support != None) { XConvertSelection(wsDisplay, XA_XdndSelection, atom_support, XA_XdndSelection, event->window, CurrentTime); } return True; } if (event->message_type == XA_XdndPosition) { Window srcwin = event->data.l[0]; if (atom_support == None){ return True; } /* send response */ { XEvent xevent; memset (&xevent, 0, sizeof(xevent)); xevent.xany.type = ClientMessage; xevent.xany.display = wsDisplay; xevent.xclient.window = srcwin; xevent.xclient.message_type = XA_XdndStatus; xevent.xclient.format = 32; XDND_STATUS_TARGET_WIN (&xevent) = event->window; XDND_STATUS_WILL_ACCEPT_SET (&xevent, True); XDND_STATUS_WANT_POSITION_SET(&xevent, True); /* actually need smth real here */ XDND_STATUS_RECT_SET(&xevent, 0, 0, 1024,768); XDND_STATUS_ACTION(&xevent) = XA_XdndActionCopy; XSendEvent(wsDisplay, srcwin, 0, 0, &xevent); } return True; } return False; }