summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2022-09-04 16:27:55 +0300
committerEli Zaretskii <eliz@gnu.org>2022-09-04 16:27:55 +0300
commitbcde498a734bcf518331dbae8573915021823810 (patch)
tree010d734016e40855d624856b2ddc5fa6072987ea
parentfd47e62b015ed6873261a3fbdbad3c4b23faa8f2 (diff)
parent55ff36485f42777a4eaecd187cd25da5a7c153cd (diff)
downloademacs-bcde498a734bcf518331dbae8573915021823810.tar.gz
Merge branch 'master' of git.savannah.gnu.org:/srv/git/emacs
-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