Commit 364d6498 authored by Samuel Thibault's avatar Samuel Thibault Committed by Adam Jackson
Browse files

dix: do not send focus event when grab actually does not change


 ("dix: always send focus event on grab change") made dix
always sent events when it's a NotifyGrab or NotifyUngrab, even if
from == to, because 'from' can just come from a previous XSetInputFocus

However, when an application calls XGrabKeyboard several times on
the same window, we are now sending spurious FocusOut+FocusIn with
NotifyGrab, even if the grab does not actually change. This makes screen
readers for blind people spuriously emit activity events which disturb
screen reading workflow when e.g. switching between menus.

This commit avoids calling DoFocusEvents in that precise case, i.e. when
oldWin is a previous grab and the new grab is the same window.
Signed-off-by: Samuel Thibault's avatarSamuel Thibault <>
Reviewed-by: Adam Jackson's avatarAdam Jackson <>
parent 82f8cf89
Pipeline #9042 passed with stage
in 1 minute and 1 second
......@@ -1530,7 +1530,9 @@ ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab,
mouse->spriteInfo->sprite->hotPhys.y = 0;
ConfineCursorToWindow(mouse, grab->confineTo, FALSE, TRUE);
DoEnterLeaveEvents(mouse, mouse->id, oldWin, grab->window, NotifyGrab);
if (! (grabinfo->grab && oldWin == grabinfo->grab->window
&& oldWin == grab->window))
DoEnterLeaveEvents(mouse, mouse->id, oldWin, grab->window, NotifyGrab);
mouse->valuator->motionHintWindow = NullWindow;
if (syncEvents.playingEvents)
grabinfo->grabTime = syncEvents.time;
......@@ -1640,7 +1642,9 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time,
oldWin = keybd->focus->win;
if (keybd->valuator)
keybd->valuator->motionHintWindow = NullWindow;
if (oldWin)
if (oldWin &&
! (grabinfo->grab && oldWin == grabinfo->grab->window
&& oldWin == grab->window))
DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);
if (syncEvents.playingEvents)
grabinfo->grabTime = syncEvents.time;
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment