7 #include "WindowMaker.h"
12 #include <X11/Xatom.h>
16 extern Atom _XA_XDE_REQUEST
;
17 extern Atom _XA_XDE_ENTER
;
18 extern Atom _XA_XDE_LEAVE
;
19 extern Atom _XA_XDE_DATA_AVAILABLE
;
20 extern Atom _XDE_FILETYPE
;
21 extern Atom _XDE_URLTYPE
;
26 wXDEProcessClientMessage(XClientMessageEvent
*event
)
30 if (event
->message_type
==_XA_XDE_DATA_AVAILABLE
) {
32 WScreen
*scr
= wScreenForWindow(event
->window
);
36 char * tmpstr
, * runstr
, * freestr
, * tofreestr
;
38 gdkev
.dropdataavailable
.u
.allflags
= event
->data
.l
[1];
39 gdkev
.dropdataavailable
.timestamp
= event
->data
.l
[4];
41 if(gdkev
.dropdataavailable
.u
.flags
.isdrop
){
42 gdkev
.dropdataavailable
.type
= GDK_DROP_DATA_AVAIL
;
43 gdkev
.dropdataavailable
.requestor
= event
->data
.l
[0];
44 XGetWindowProperty(dpy
,gdkev
.dropdataavailable
.requestor
,
47 0, XA_PRIMARY
, &tmpatom
,
49 &gdkev
.dropdataavailable
.data_numbytes
,
52 datalenght
=gdkev
.dropdataavailable
.data_numbytes
-1;
55 for(;datalenght
>0;datalenght
-=(strlen(tmpstr
)+1),tmpstr
=&tmpstr
[strlen(tmpstr
)+1]){
56 freestr
=runstr
;runstr
=wstrappend(runstr
,tmpstr
);free(freestr
);
57 freestr
=runstr
;runstr
=wstrappend(runstr
," ");free(freestr
);
60 scr
->xdestring
=runstr
;
61 /* no need to redirect ? */
62 wDockReceiveDNDDrop(scr
,event
);
67 } else if (event
->message_type
==_XA_XDE_LEAVE
) {
70 } else if (event
->message_type
==_XA_XDE_ENTER
) {
74 gdkev
.dropenter
.u
.allflags
=event
->data
.l
[1];
75 printf("from win %x\n",event
->data
.l
[0]);
76 printf("to win %x\n",event
->window
);
77 printf("enter %x\n",event
->data
.l
[1]);
78 printf("v %x ",event
->data
.l
[2]);
79 printf("%x ",event
->data
.l
[3]);
80 printf("%x\n",event
->data
.l
[4]);
82 if(event
->data
.l
[2]==_XDE_FILETYPE
||
83 event
->data
.l
[3]==_XDE_FILETYPE
||
84 event
->data
.l
[4]==_XDE_FILETYPE
||
85 event
->data
.l
[2]==_XDE_URLTYPE
||
86 event
->data
.l
[3]==_XDE_URLTYPE
||
87 event
->data
.l
[4]==_XDE_URLTYPE
)
88 if(gdkev
.dropenter
.u
.flags
.sendreply
){
90 replyev
.xclient
.type
= ClientMessage
;
91 replyev
.xclient
.window
= event
->data
.l
[0];
92 replyev
.xclient
.format
= 32;
93 replyev
.xclient
.message_type
= _XA_XDE_REQUEST
;
94 replyev
.xclient
.data
.l
[0] = event
->window
;
96 gdkev
.dragrequest
.u
.allflags
= 0;
97 gdkev
.dragrequest
.u
.flags
.protocol_version
= 0;
98 gdkev
.dragrequest
.u
.flags
.willaccept
= 1;
99 gdkev
.dragrequest
.u
.flags
.delete_data
= 0;
101 replyev
.xclient
.data
.l
[1] = gdkev
.dragrequest
.u
.allflags
;
102 replyev
.xclient
.data
.l
[2] = replyev
.xclient
.data
.l
[3] = 0;
103 replyev
.xclient
.data
.l
[4] = event
->data
.l
[2];
104 XSendEvent(dpy
, replyev
.xclient
.window
, 0, NoEventMask
, &replyev
);