summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/xterm.c14
1 files changed, 8 insertions, 6 deletions
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),