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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c
index 8de356a..0703447 100644
--- a/src/video/x11/SDL_x11events.c
+++ b/src/video/x11/SDL_x11events.c
@@ -866,12 +866,19 @@ X11_DispatchEvent(_THIS)
/* 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 @@ X11_DispatchEvent(_THIS)
}
}
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));