]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve multi-pointer X support
authorPo Lu <luangruo@yahoo.com>
Fri, 5 Aug 2022 05:21:29 +0000 (13:21 +0800)
committerPo Lu <luangruo@yahoo.com>
Fri, 5 Aug 2022 05:23:39 +0000 (13:23 +0800)
* etc/TODO: Document that MPX support still needs work.
* src/xterm.c (xi_handle_interaction): New function.
(handle_one_xevent): Call it in the appropriate places.

etc/TODO
src/xterm.c

index 4d0bfd1c2a05e54b23aaad9c8d3869f5556fdc8b..bd846dd89881f8a1117c144337755dd63c3e78a8 100644 (file)
--- a/etc/TODO
+++ b/etc/TODO
@@ -1746,6 +1746,19 @@ for vc-rcs-update-changelog.
 A two-char comment-starter whose two chars are symbol constituents will
 not be noticed if it appears within a word.
 
+** Multi-pointer X does not work very well
+Emacs is reasonably usable under a multi-pointer X (MPX) environment,
+if you turn off tooltips and mouse highlight, and don't use anything
+that calls `mouse-position'.  Otherwise, tooltips are shown next to
+the wrong pointer, mouse highlight simply goes haywire, and
+`mouse-position' returns information for the wrong pointer.
+
+This could be easily fixed in principle, but I cannot find a stable
+enough environment under which the fix can be tested.
+
+The MPX code has not been tested under X toolkit or GTK+ 2.x builds
+and is not expected to work there.
+
 \f
 This file is part of GNU Emacs.
 
index ebd27aea0691a8336a770aec256f8a3f1ebf987c..4bbcfb0e59642148109de469a879f91796c02026 100644 (file)
@@ -12616,6 +12616,36 @@ xi_handle_delete_frame (struct x_display_info *dpyinfo,
     }
 }
 
+/* Handle an interaction by DEVICE on frame F.  TIME is the time of
+   the interaction; if F isn't currently the global focus frame, but
+   is the focus of DEVICE, make it the focus frame.  */
+
+static void
+xi_handle_interaction (struct x_display_info *dpyinfo,
+                      struct frame *f, struct xi_device_t *device,
+                      Time time)
+{
+  bool change;
+
+  change = false;
+
+  if (device->focus_frame == f)
+    {
+      device->focus_frame_time = time;
+      change = true;
+    }
+
+  if (device->focus_implicit_frame == f)
+    {
+      device->focus_implicit_time = time;
+      change = true;
+    }
+
+  /* If F isn't currently focused, update the focus state.  */
+  if (change && f != dpyinfo->x_focus_frame)
+    xi_handle_focus_change (dpyinfo);
+}
+
 #endif
 
 /* The focus may have changed.  Figure out if it is a real focus change,
@@ -21285,6 +21315,16 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                    }
                }
 
+             if (f)
+               {
+                 /* If the user interacts with a frame that's focused
+                    on another device, but not the current focus
+                    frame, make it the focus frame.  */
+                 if (device)
+                   xi_handle_interaction (dpyinfo, f, device,
+                                          xev->time);
+               }
+
 #ifdef USE_GTK
              if (!f)
                {
@@ -21566,6 +21606,16 @@ handle_one_xevent (struct x_display_info *dpyinfo,
 
              f = x_any_window_to_frame (dpyinfo, xev->event);
 
+             if (f)
+               {
+                 /* If the user interacts with a frame that's focused
+                    on another device, but not the current focus
+                    frame, make it the focus frame.  */
+                 if (device)
+                   xi_handle_interaction (dpyinfo, f, device,
+                                          xev->time);
+               }
+
              XKeyPressedEvent xkey;
 
              memset (&xkey, 0, sizeof xkey);