]> git.eshelyaron.com Git - emacs.git/commitdiff
Use XI2 calls to warp the client pointer
authorPo Lu <luangruo@yahoo.com>
Wed, 22 Dec 2021 03:13:23 +0000 (11:13 +0800)
committerPo Lu <luangruo@yahoo.com>
Wed, 22 Dec 2021 03:13:23 +0000 (11:13 +0800)
* src/xfns.c (Fx_set_mouse_absolute_pixel_position):
* src/xterm.c (frame_set_mouse_pixel_position): Replace
calls to XWarpPointer with calls to XIWarpPointer with
the client pointer explictly specified.  This avoids the
odd situation where the client pointer of the root window
is not the client pointer of the frame.

src/xfns.c
src/xterm.c

index 30ed358fb2865b6c0d4c5f35fef0b62d6974befc..168debc8f332652330a1f20dff6ba309be8e14ff 100644 (file)
@@ -5643,8 +5643,23 @@ The coordinates X and Y are interpreted in pixels relative to a position
   int yval = check_integer_range (y, INT_MIN, INT_MAX);
 
   block_input ();
-  XWarpPointer (FRAME_X_DISPLAY (f), None, DefaultRootWindow (FRAME_X_DISPLAY (f)),
-               0, 0, 0, 0, xval, yval);
+#ifdef HAVE_XINPUT2
+  int deviceid;
+
+  if (FRAME_DISPLAY_INFO (f)->supports_xi2)
+    {
+      if (XIGetClientPointer (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+                             &deviceid))
+       {
+         XIWarpPointer (FRAME_X_DISPLAY (f), deviceid, None,
+                        DefaultRootWindow (FRAME_X_DISPLAY (f)),
+                        0, 0, 0, 0, xval, yval);
+       }
+    }
+  else
+#endif
+    XWarpPointer (FRAME_X_DISPLAY (f), None, DefaultRootWindow (FRAME_X_DISPLAY (f)),
+                 0, 0, 0, 0, xval, yval);
   unblock_input ();
 
   return Qnil;
index 33396cc9ab42f768d17b3928c5f4b896ed49a6fb..070ee7d671eaab99f63ebbcd4e2bdf9d95bfd245 100644 (file)
@@ -13223,9 +13223,24 @@ void
 frame_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y)
 {
   block_input ();
+#ifdef HAVE_XINPUT2
+  int deviceid;
 
-  XWarpPointer (FRAME_X_DISPLAY (f), None, FRAME_X_WINDOW (f),
-               0, 0, 0, 0, pix_x, pix_y);
+  if (FRAME_DISPLAY_INFO (f)->supports_xi2)
+    {
+      if (XIGetClientPointer (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+                             &deviceid))
+       {
+         XIWarpPointer (FRAME_X_DISPLAY (f),
+                        deviceid, None,
+                        FRAME_X_WINDOW (f),
+                        0, 0, 0, 0, pix_x, pix_y);
+       }
+    }
+  else
+#endif
+    XWarpPointer (FRAME_X_DISPLAY (f), None, FRAME_X_WINDOW (f),
+                 0, 0, 0, 0, pix_x, pix_y);
   unblock_input ();
 }
 \f