x11: Drop duplicate XInput2 XI_RawMotion events.
authorRyan C. Gordon <icculus@icculus.org>
Mon, 08 Jun 2015 02:58:46 -0400
changeset 9721 957a6ed39ad0
parent 9720 fd60d77139fc
child 9722 696d7571abcd
x11: Drop duplicate XInput2 XI_RawMotion events. This happens when the pointer is grabbed, but it's not clear if this is a bug in x.org or my misunderstanding of the XGrabPointer() documentation. At any rate, we'll want to revisit this later for a better solution. Fixes Bugzilla #2963.
src/video/x11/SDL_x11xinput2.c
--- a/src/video/x11/SDL_x11xinput2.c	Mon Jun 08 01:52:43 2015 -0400
+++ b/src/video/x11/SDL_x11xinput2.c	Mon Jun 08 02:58:46 2015 -0400
@@ -136,15 +136,25 @@
         case XI_RawMotion: {
             const XIRawEvent *rawev = (const XIRawEvent*)cookie->data;
             SDL_Mouse *mouse = SDL_GetMouse();
-            double relative_cords[2];
+            double relative_coords[2];
+            static Time prev_time = 0;
+            static double prev_rel_coords[2];
 
             if (!mouse->relative_mode || mouse->relative_mode_warp) {
                 return 0;
             }
 
             parse_valuators(rawev->raw_values,rawev->valuators.mask,
-                            rawev->valuators.mask_len,relative_cords,2);
-            SDL_SendMouseMotion(mouse->focus,mouse->mouseID,1,(int)relative_cords[0],(int)relative_cords[1]);
+                            rawev->valuators.mask_len,relative_coords,2);
+
+            if ((rawev->time == prev_time) && (relative_coords[0] == prev_rel_coords[0]) && (relative_coords[1] == prev_rel_coords[1])) {
+                return 0;  /* duplicate event, drop it. */
+            }
+
+            SDL_SendMouseMotion(mouse->focus,mouse->mouseID,1,(int)relative_coords[0],(int)relative_coords[1]);
+            prev_rel_coords[0] = relative_coords[0];
+            prev_rel_coords[1] = relative_coords[1];
+            prev_time = rawev->time;
             return 1;
             }
             break;