Fixed bug 2676 - xdnd_version check issue in case ClientMessage
authorSam Lantinga <slouken@libsdl.org>
Fri, 28 Nov 2014 04:42:46 -0800
changeset 9245 104f3bcfbf45
parent 9244 9f8962b9b09e
child 9246 a761913e5e91
Fixed bug 2676 - xdnd_version check issue in case ClientMessage Nitz I added xdnd_version check to XdndPosition case also under DEBUG_XEVENTS macro. by this we can get the action requested by user. I analysed further and found out that removing xdnd_version check at XdndDrop case is a bad idea because in XConvertSelection API timestamp should be passed if(xdnd_version >= 1) otherwise CurrentTime should be passed So xdnd_version check is important at XdndDrop case I made xdnd_version as a static so that it can store the version in other cases also.
src/video/x11/SDL_x11events.c
--- a/src/video/x11/SDL_x11events.c	Fri Nov 28 04:37:50 2014 -0800
+++ b/src/video/x11/SDL_x11events.c	Fri Nov 28 04:42:46 2014 -0800
@@ -866,12 +866,19 @@
         /* Have we been requested to quit (or another client message?) */
     case ClientMessage:{
 
-            int xdnd_version=0;
+            static int xdnd_version=0;
 
             if (xevent.xclient.message_type == videodata->XdndEnter) {
+
                 SDL_bool use_list = xevent.xclient.data.l[1] & 1;
                 data->xdnd_source = xevent.xclient.data.l[0];
                 xdnd_version = ( xevent.xclient.data.l[1] >> 24);
+#ifdef DEBUG_XEVENTS
+                printf("XID of source window : %ld\n", data->xdnd_source);
+                printf("Protocol version to use : %ld\n", xdnd_version);
+                printf("More then 3 data types : %ld\n", use_list); 
+#endif
+ 
                 if (use_list) {
                     /* fetch conversion targets */
                     SDL_x11Prop p;
@@ -885,6 +892,15 @@
                 }
             }
             else if (xevent.xclient.message_type == videodata->XdndPosition) {
+            
+#ifdef DEBUG_XEVENTS
+                Atom act= videodata->XdndActionCopy;
+                if(xdnd_version >= 2) {
+                    act = xevent.xclient.data.l[4];
+                }
+                printf("Action requested by user is : %s\n", X11_XGetAtomName(display , act));
+#endif
+                
 
                 /* reply with status */
                 memset(&m, 0, sizeof(XClientMessageEvent));