From: Po Lu Date: Tue, 8 Mar 2022 13:25:37 +0000 (+0800) Subject: Handle XI focus change events that specify implicit focus correctly X-Git-Tag: emacs-29.0.90~1956 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=a7fdbed880fb92392b93c3ad53e89c0ce7ba515f;p=emacs.git Handle XI focus change events that specify implicit focus correctly * src/xterm.c (x_detect_focus_change): If detail is XINotifyPointer, set focus type to implicit. --- diff --git a/src/xterm.c b/src/xterm.c index 72c7c05d893..94b8f60c716 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -6480,7 +6480,8 @@ x_detect_focus_change (struct x_display_info *dpyinfo, struct frame *frame, #ifdef HAVE_XINPUT2 case GenericEvent: { - XIEvent *xi_event = (XIEvent *) event->xcookie.data; + XIEvent *xi_event = event->xcookie.data; + XIEnterEvent *enter_or_focus = event->xcookie.data; struct frame *focus_frame = dpyinfo->x_focus_event_frame; int focus_state @@ -6490,13 +6491,14 @@ x_detect_focus_change (struct x_display_info *dpyinfo, struct frame *frame, || xi_event->evtype == XI_FocusOut) x_focus_changed ((xi_event->evtype == XI_FocusIn ? FocusIn : FocusOut), - FOCUS_EXPLICIT, - dpyinfo, frame, bufp); + ((enter_or_focus->detail + == XINotifyPointer) + ? FOCUS_IMPLICIT : FOCUS_EXPLICIT), + dpyinfo, frame, bufp); else if ((xi_event->evtype == XI_Enter || xi_event->evtype == XI_Leave) - && (((XIEnterEvent *) xi_event)->detail - != XINotifyInferior) - && ((XIEnterEvent *) xi_event)->focus + && (enter_or_focus->detail != XINotifyInferior) + && enter_or_focus->focus && !(focus_state & FOCUS_EXPLICIT)) x_focus_changed ((xi_event->evtype == XI_Enter ? FocusIn : FocusOut),