]> git.eshelyaron.com Git - emacs.git/commitdiff
Grab the server when warping the client pointer
authorPo Lu <luangruo@yahoo.com>
Fri, 24 Dec 2021 06:22:21 +0000 (14:22 +0800)
committerPo Lu <luangruo@yahoo.com>
Fri, 24 Dec 2021 06:23:23 +0000 (14:23 +0800)
* src/xfns.c (Fx_set_mouse_absolute_pixel_position):
* src/xterm.c (x_make_frame_invisible): Avoid race conditions
where the client pointer is destroyed between when it is
obtained and when XIWarpPointer is called.

src/xfns.c
src/xterm.c

index 168debc8f332652330a1f20dff6ba309be8e14ff..b02996c0d3c9a0e7e9e966add658f1d174ae00d4 100644 (file)
@@ -5648,6 +5648,7 @@ The coordinates X and Y are interpreted in pixels relative to a position
 
   if (FRAME_DISPLAY_INFO (f)->supports_xi2)
     {
+      XGrabServer (FRAME_X_DISPLAY (f));
       if (XIGetClientPointer (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
                              &deviceid))
        {
@@ -5655,6 +5656,7 @@ The coordinates X and Y are interpreted in pixels relative to a position
                         DefaultRootWindow (FRAME_X_DISPLAY (f)),
                         0, 0, 0, 0, xval, yval);
        }
+      XUngrabServer (FRAME_X_DISPLAY (f));
     }
   else
 #endif
index aa88610961cbab49c9882b743d27d5358c84aa15..42001023b3bcad9825e504d6d3597a252864b261 100644 (file)
@@ -13242,6 +13242,7 @@ frame_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y)
 
   if (FRAME_DISPLAY_INFO (f)->supports_xi2)
     {
+      XGrabServer (FRAME_X_DISPLAY (f));
       if (XIGetClientPointer (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
                              &deviceid))
        {
@@ -13250,6 +13251,7 @@ frame_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y)
                         FRAME_X_WINDOW (f),
                         0, 0, 0, 0, pix_x, pix_y);
        }
+      XUngrabServer (FRAME_X_DISPLAY (f));
     }
   else
 #endif