]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix child frame focus for MPX environments
authorPo Lu <luangruo@yahoo.com>
Mon, 22 Aug 2022 01:50:45 +0000 (09:50 +0800)
committerPo Lu <luangruo@yahoo.com>
Mon, 22 Aug 2022 01:50:45 +0000 (09:50 +0800)
* src/xterm.c (handle_one_xevent): Set child frame click-to
focus on the pointer device's attachment.

src/xterm.c

index 200ef1d11fcd9e720c6e9cc4ce36cd859bd66dd9..103573d1fdcb9afcff2d11092de55775b53c727c 100644 (file)
@@ -20270,7 +20270,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              {
                block_input ();
                XSetInputFocus (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
-                               RevertToParent, CurrentTime);
+                               RevertToParent, event->xbutton.time);
                if (FRAME_PARENT_FRAME (f))
                  XRaiseWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f));
                unblock_input ();
@@ -21852,8 +21852,26 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                  if (FRAME_PARENT_FRAME (f) || (hf && frame_ancestor_p (f, hf)))
                    {
                      block_input ();
+#if defined HAVE_GTK3 || (!defined USE_GTK && !defined USE_X_TOOLKIT)
+                     if (device)
+                       {
+                         /* This can generate XI_BadDevice if the
+                            device's attachment was destroyed
+                            server-side.  */
+                         x_ignore_errors_for_next_request (dpyinfo);
+                         XISetFocus (dpyinfo->display, device->attachment,
+                                     /* Note that the input extension
+                                        only supports RevertToParent-type
+                                        behavior.  */
+                                     FRAME_OUTER_WINDOW (f), xev->time);
+                         x_stop_ignoring_errors (dpyinfo);
+                       }
+#else
+                     /* Non-no toolkit builds without GTK 3 use core
+                        events to handle focus.  */
                      XSetInputFocus (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
-                                     RevertToParent, CurrentTime);
+                                     RevertToParent, xev->time);
+#endif
                      if (FRAME_PARENT_FRAME (f))
                        XRaiseWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f));
                      unblock_input ();