diff options
author | Po Lu <luangruo@yahoo.com> | 2022-09-04 21:03:31 +0800 |
---|---|---|
committer | Po Lu <luangruo@yahoo.com> | 2022-09-04 21:04:19 +0800 |
commit | 55ff36485f42777a4eaecd187cd25da5a7c153cd (patch) | |
tree | ed7905b4a5683c896e40dcef356a37a0cfc367c8 /src/xterm.c | |
parent | f1635c8efb30cd42b83e31aa29be58aeb2965a9a (diff) | |
download | emacs-55ff36485f42777a4eaecd187cd25da5a7c153cd.tar.gz emacs-55ff36485f42777a4eaecd187cd25da5a7c153cd.tar.bz2 emacs-55ff36485f42777a4eaecd187cd25da5a7c153cd.zip |
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.
Diffstat (limited to 'src/xterm.c')
-rw-r--r-- | src/xterm.c | 32 |
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 |