From 5a7a706fc42ef94e43a4a5675c1f996488f8ff7d Mon Sep 17 00:00:00 2001 From: id Date: Tue, 18 May 1999 20:40:30 +0000 Subject: [PATCH] misc update relates to xdnd. --- src/event.c | 22 +--------------------- src/misc.c | 17 +++++++---------- src/xdnd.c | 50 ++++++++++++++++++++++++++++++++++---------------- src/xdnd.h | 2 +- 4 files changed, 43 insertions(+), 48 deletions(-) diff --git a/src/event.c b/src/event.c index 52b2ef83..deba573d 100644 --- a/src/event.c +++ b/src/event.c @@ -436,27 +436,7 @@ saveTimestamp(XEvent *event) case SelectionNotify: LastTimestamp = event->xselection.time; #ifdef XDND - wXDNDProcessSelection(&event->xselection); - { - char *retain = scr->xdestring; - for (;retain[0];retain++) { - if (retain[0] < 32) retain[0] = 32; - if (!strncmp(retain, "file:", 5)) { - int i; - for (i=0;i<5;retain[i++]=' '); - } - } - retain = scr->xdestring; - if (scr->xdestring){ - if (!strncmp(scr->xdestring, "file:", 5)) - scr->xdestring+=5; - } - wDockReceiveDNDDrop(scr,event); - if (retain){ - XFree(retain); - scr->xdestring = NULL; - } - } + wXDNDProcessSelection(event); #endif break; } diff --git a/src/misc.c b/src/misc.c index 2feecd1a..dab7f7bc 100644 --- a/src/misc.c +++ b/src/misc.c @@ -875,14 +875,6 @@ get_dnd_selection(WScreen *scr) char *flat_string; int count; -#ifdef XDND - if(scr->xdestring) { - /* - printf(" return %s\n",scr->xdestring); - */ - return (wstrdup(scr->xdestring)); - } -#endif result=XGetTextProperty(dpy, scr->root_win, &text_ret, _XA_DND_SELECTION); if (result==0 || text_ret.value==NULL || text_ret.encoding==None @@ -936,7 +928,7 @@ ExpandOptions(WScreen *scr, char *cmdline) char *out, *nout; char *selection=NULL; char *user_input=NULL; -#ifdef OFFIX_DND +#if defined(OFFIX_DND) || defined(XDND) char *dropped_thing=NULL; #endif char tmpbuf[TMPBUFSIZE]; @@ -1047,8 +1039,13 @@ ExpandOptions(WScreen *scr, char *cmdline) } break; -#ifdef OFFIX_DND +#if defined(OFFIX_DND) || defined(XDND) case 'd': +#ifdef XDND + if(scr->xdestring) { + dropped_thing = wstrdup(scr->xdestring); + } +#endif if (!dropped_thing) { dropped_thing = get_dnd_selection(scr); } diff --git a/src/xdnd.c b/src/xdnd.c index 8c863e6e..fa358784 100644 --- a/src/xdnd.c +++ b/src/xdnd.c @@ -90,17 +90,20 @@ void wXDNDClearAwareness(Window window) { } Bool -wXDNDProcessSelection(XSelectionEvent *event) +wXDNDProcessSelection(XEvent *event) { - WScreen *scr = wScreenForWindow(event->requestor); + WScreen *scr = wScreenForWindow(event->xselection.requestor); char *dropdata; + char *retain = scr->xdestring; Atom ret_type; int ret_format; unsigned long ret_item; unsigned long remain_byte; char * delme; + XEvent xevent; Window selowner = XGetSelectionOwner(dpy,_XA_XdndSelection); - XGetWindowProperty(dpy, event->requestor, _XA_WINDOWMAKER_XDNDEXCHANGE, + XGetWindowProperty(dpy, event->xselection.requestor, + _XA_WINDOWMAKER_XDNDEXCHANGE, 0, 65536, True, atom_support, &ret_type, &ret_format, &ret_item, &remain_byte, (unsigned char **)&delme); if (delme){ @@ -110,19 +113,34 @@ wXDNDProcessSelection(XSelectionEvent *event) scr->xdestring=delme; } - { - /*finished*/ - XEvent xevent; - memset (&xevent, 0, sizeof(xevent)); - xevent.xany.type = ClientMessage; - xevent.xany.display = dpy; - xevent.xclient.window = selowner; - xevent.xclient.message_type = _XA_XdndFinished; - xevent.xclient.format = 32; - - XDND_FINISHED_TARGET_WIN(&xevent) = event->requestor; - XSendEvent(dpy, selowner, 0, 0, &xevent); - } + /*send finished*/ + memset (&xevent, 0, sizeof(xevent)); + xevent.xany.type = ClientMessage; + xevent.xany.display = dpy; + xevent.xclient.window = selowner; + xevent.xclient.message_type = _XA_XdndFinished; + xevent.xclient.format = 32; + XDND_FINISHED_TARGET_WIN(&xevent) = event->xselection.requestor; + XSendEvent(dpy, selowner, 0, 0, &xevent); + + /*process dropping*/ + for (;retain[0];retain++) { + if (retain[0] < 32) retain[0] = 32; + if (!strncmp(retain, "file:", 5)) { + int i; + for (i=0;i<5;retain[i++]=' '); + } + } + retain = scr->xdestring; + if (scr->xdestring){ + if (!strncmp(scr->xdestring, "file:", 5)) + scr->xdestring+=5; + } + wDockReceiveDNDDrop(scr,event); + if (retain){ + XFree(retain); + scr->xdestring = NULL; + } } Bool diff --git a/src/xdnd.h b/src/xdnd.h index 9d674619..23295f16 100644 --- a/src/xdnd.h +++ b/src/xdnd.h @@ -4,7 +4,7 @@ void wXDNDInitializeAtoms(); -Bool wXDNDProcessSelection(XSelectionEvent *event); +Bool wXDNDProcessSelection(XEvent *event); Bool wXDNDProcessClientMessage(XClientMessageEvent *event); void wXDNDMakeAwareness(Window window); void wXDNDClearAwareness(Window window);