Pack motion notify in dematerialize icon.
[wmaker-crm.git] / src / xde.c
bloba8ef769d184d057775e2b4896448543254d36f2a
2 #include "wconfig.h"
4 #ifdef XDE_DND
6 #include <X11/Xlib.h>
7 #include "WindowMaker.h"
8 #include "window.h"
10 #include "stdlib.h"
12 #include <X11/Xatom.h>
13 #include <gdk/gdk.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;
25 Bool
26 wXDEProcessClientMessage(XClientMessageEvent *event)
28 Bool done = False;
30 if (event->message_type==_XA_XDE_DATA_AVAILABLE) {
31 GdkEvent gdkev;
32 WScreen *scr = wScreenForWindow(event->window);
33 Atom tmpatom;
34 int datalenght;
35 long tmplong;
36 char * tmpstr, * runstr, * freestr, * tofreestr;
37 printf("x\n");
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,
45 event->data.l[2],
46 0, LONG_MAX -1,
47 0, XA_PRIMARY, &tmpatom,
48 &datalenght,
49 &gdkev.dropdataavailable.data_numbytes,
50 &tmplong,
51 &tmpstr);
52 datalenght=gdkev.dropdataavailable.data_numbytes-1;
53 tofreestr=tmpstr;
54 runstr=NULL;
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);
59 free(tofreestr);
60 scr->xdestring=runstr;
61 /* no need to redirect ? */
62 wDockReceiveDNDDrop(scr,event);
63 free(runstr);
64 scr->xdestring=NULL;
66 done = True;
67 } else if (event->message_type==_XA_XDE_LEAVE) {
68 printf("leave\n");
69 done = True;
70 } else if (event->message_type==_XA_XDE_ENTER) {
71 GdkEvent gdkev;
72 XEvent replyev;
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){
89 /*reply*/
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);
105 XSync(dpy, 0);
107 done = True;
110 return done;
113 #endif