summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2022-09-04 21:03:31 +0800
committerPo Lu <luangruo@yahoo.com>2022-09-04 21:04:19 +0800
commit55ff36485f42777a4eaecd187cd25da5a7c153cd (patch)
treeed7905b4a5683c896e40dcef356a37a0cfc367c8
parentf1635c8efb30cd42b83e31aa29be58aeb2965a9a (diff)
downloademacs-55ff36485f42777a4eaecd187cd25da5a7c153cd.tar.gz
Fix earlier change to xterm.c
* src/xterm.c (x_detect_focus_change): Finally figure out what the call to x_new_focus_frame does with the core focus, and do the equivalent with the XInput 2 focus.
-rw-r--r--src/xterm.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/src/xterm.c b/src/xterm.c
index accd1b90fb8..c58f2d15da2 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -13174,7 +13174,12 @@ x_detect_focus_change (struct x_display_info *dpyinfo, struct frame *frame,
void
x_mouse_leave (struct x_display_info *dpyinfo)
{
- Mouse_HLInfo *hlinfo = &dpyinfo->mouse_highlight;
+#if defined HAVE_XINPUT2 && !defined USE_X_TOOLKIT
+ struct xi_device_t *device;
+#endif
+ Mouse_HLInfo *hlinfo;
+
+ hlinfo = &dpyinfo->mouse_highlight;
if (hlinfo->mouse_face_mouse_frame)
{
@@ -13182,13 +13187,30 @@ x_mouse_leave (struct x_display_info *dpyinfo)
hlinfo->mouse_face_mouse_frame = NULL;
}
-#ifdef HAVE_XINPUT2
+#if defined HAVE_XINPUT2 && !defined USE_X_TOOLKIT
if (!dpyinfo->supports_xi2)
- /* I don't understand what the call below is supposed to do. But
- reading dpyinfo->x_focus_event_frame is invalid on input
- extension builds, so disable it there. */
+ /* The call below is supposed to reset the implicit focus and
+ revert the focus back to the last explicitly focused frame. It
+ doesn't work on input extension builds because focus tracking
+ does not set x_focus_event_frame, and proceeds on a per-device
+ basis. On such builds, clear the implicit focus of the client
+ pointer instead. */
#endif
x_new_focus_frame (dpyinfo, dpyinfo->x_focus_event_frame);
+#if defined HAVE_XINPUT2 && !defined USE_X_TOOLKIT
+ else
+ {
+ if (dpyinfo->client_pointer_device == -1)
+ /* If there's no client pointer device, then no implicit focus
+ is currently set. */
+ return;
+
+ device = xi_device_from_id (dpyinfo, dpyinfo->client_pointer_device);
+
+ if (device)
+ device->focus_implicit_frame = NULL;
+ }
+#endif
}
#endif