]> git.eshelyaron.com Git - emacs.git/commitdiff
Handle XI focus change events that specify implicit focus correctly
authorPo Lu <luangruo@yahoo.com>
Tue, 8 Mar 2022 13:25:37 +0000 (21:25 +0800)
committerPo Lu <luangruo@yahoo.com>
Tue, 8 Mar 2022 13:26:37 +0000 (21:26 +0800)
* src/xterm.c (x_detect_focus_change): If detail is
XINotifyPointer, set focus type to implicit.

src/xterm.c

index 72c7c05d893d8bcb8e6cdaf2ad977b05287d62e5..94b8f60c716015a92290158b27a068566520bd48 100644 (file)
@@ -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),