]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve grabbing detection with multiple master devices (MPX)
authorPo Lu <luangruo@yahoo.com>
Fri, 24 Jun 2022 02:57:35 +0000 (10:57 +0800)
committerPo Lu <luangruo@yahoo.com>
Fri, 24 Jun 2022 02:57:35 +0000 (10:57 +0800)
* src/frame.c (gui_mouse_grabbed): Respect any_grab_hook.
* src/termhooks.h (GCALIGNED_STRUCT): New hook `any_grab_hook'.
* src/xterm.c (x_have_any_grab): New function.
(x_create_terminal): Define hook on XI2 builds.

src/frame.c
src/termhooks.h
src/xterm.c

index c2f2f8e464211885f8afff49d07d1289cc414e39..02c90ea65191fa57701bae2f1c3939cb44965621 100644 (file)
@@ -5130,7 +5130,9 @@ gui_set_no_special_glyphs (struct frame *f, Lisp_Object new_value, Lisp_Object o
 bool
 gui_mouse_grabbed (Display_Info *dpyinfo)
 {
-  return (dpyinfo->grabbed
+  return ((dpyinfo->grabbed
+          || (dpyinfo->terminal->any_grab_hook
+              && dpyinfo->terminal->any_grab_hook (dpyinfo)))
          && dpyinfo->last_mouse_frame
          && FRAME_LIVE_P (dpyinfo->last_mouse_frame));
 }
index d7190e77362a26d5563207ccc6a4eee8a55936ed..a1e3e2cde9ad06208fc0f4858778cfeffd617a98 100644 (file)
@@ -877,6 +877,13 @@ struct terminal
      MENU_BAR_P if X and Y are in FRAME's toolkit menu bar, and true
      into TOOL_BAR_P if X and Y are in FRAME's toolkit tool bar.  */
   void (*toolkit_position_hook) (struct frame *, int, int, bool *, bool *);
+
+#ifdef HAVE_WINDOW_SYSTEM
+  /* Called to determine if the mouse is grabbed on the given display.
+     If either dpyinfo->grabbed or this returns true, then the display
+     will be considered as grabbed.  */
+  bool (*any_grab_hook) (Display_Info *);
+#endif
 } GCALIGNED_STRUCT;
 
 INLINE bool
index 6375b71666befc87f16e263c6a1d04b8ba44d98c..414a9c0ebed2b7227bbc0ce23929806afdd845d9 100644 (file)
@@ -27320,6 +27320,25 @@ x_delete_terminal (struct terminal *terminal)
   unblock_input ();
 }
 
+#ifdef HAVE_XINPUT2
+static bool
+x_have_any_grab (struct x_display_info *dpyinfo)
+{
+  int i;
+
+  if (!dpyinfo->supports_xi2)
+    return false;
+
+  for (i = 0; i < dpyinfo->num_devices; ++i)
+    {
+      if (dpyinfo->devices[i].grab)
+       return true;
+    }
+
+  return false;
+}
+#endif
+
 /* Create a struct terminal, initialize it with the X11 specific
    functions and make DISPLAY->TERMINAL point to it.  */
 
@@ -27387,6 +27406,9 @@ x_create_terminal (struct x_display_info *dpyinfo)
   terminal->delete_frame_hook = x_destroy_window;
   terminal->delete_terminal_hook = x_delete_terminal;
   terminal->toolkit_position_hook = x_toolkit_position;
+#ifdef HAVE_XINPUT2
+  terminal->any_grab_hook = x_have_any_grab;
+#endif
   /* Other hooks are NULL by default.  */
 
   return terminal;