]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix oldXMenu grab handling
authorPo Lu <luangruo@yahoo.com>
Fri, 5 Aug 2022 08:26:01 +0000 (16:26 +0800)
committerPo Lu <luangruo@yahoo.com>
Fri, 5 Aug 2022 08:26:01 +0000 (16:26 +0800)
* src/xmenu.c (x_menu_translate_generic_event, pop_down_menu):
Clear grab correctly on individual XI2 devices.

src/xmenu.c

index 3be0fb187661a532829d6754819f45be56f7a224..5b8a8f77a2dd4cca13c9ccfaff61fa9a563fa90e 100644 (file)
@@ -232,6 +232,7 @@ static void
 x_menu_translate_generic_event (XEvent *event)
 {
   struct x_display_info *dpyinfo;
+  struct xi_device_t *device;
   XEvent copy;
   XIDeviceEvent *xev;
 
@@ -265,6 +266,16 @@ x_menu_translate_generic_event (XEvent *event)
              copy.xbutton.button = xev->detail;
              copy.xbutton.same_screen = True;
 
+             device = xi_device_from_id (dpyinfo, xev->deviceid);
+
+             /* I don't know the repercussions of changing
+                device->grab on XI_ButtonPress events, so be safe and
+                only do what is necessary to prevent the grab from
+                being left invalid as XMenuActivate swallows
+                events.  */
+             if (device && xev->evtype == XI_ButtonRelease)
+               device->grab &= ~(1 << xev->detail);
+
              XPutBackEvent (dpyinfo->display, &copy);
 
              break;
@@ -2507,6 +2518,10 @@ pop_down_menu (void *arg)
   struct pop_down_menu *data = arg;
   struct frame *f = data->frame;
   XMenu *menu = data->menu;
+#ifdef HAVE_XINPUT2
+  int i;
+  struct xi_device_t *device;
+#endif
 
   block_input ();
 #ifndef MSDOS
@@ -2526,6 +2541,17 @@ pop_down_menu (void *arg)
      results, and it is a pain to ask which are actually held now.  */
   FRAME_DISPLAY_INFO (f)->grabbed = 0;
 
+#ifdef HAVE_XINPUT2
+  /* Likewise for XI grabs when the mouse is released on top of the
+     menu itself.  */
+
+  for (i = 0; i < FRAME_DISPLAY_INFO (f)->num_devices; ++i)
+    {
+      device = &FRAME_DISPLAY_INFO (f)->devices[i];
+      device->grab = 0;
+    }
+#endif
+
 #endif /* HAVE_X_WINDOWS */
 
   unblock_input ();