[PATCH xserver] dix: do not send focus event when grab actually does not change
Samuel Thibault
samuel.thibault at ens-lyon.org
Mon Nov 19 17:06:52 UTC 2018
Hello,
Ping?
Samuel
Samuel Thibault, le mar. 30 oct. 2018 18:43:51 +0100, a ecrit:
> c67f2eac5651 ("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
> call.
>
> 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 <samuel.thibault at ens-lyon.org>
>
> Index: xorg-server-1.19.2/dix/events.c
> ===================================================================
> --- xorg-server-1.19.2.orig/dix/events.c
> +++ xorg-server-1.19.2/dix/events.c
> @@ -1530,7 +1530,9 @@ ActivatePointerGrab(DeviceIntPtr mouse,
> 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,
> 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;
More information about the xorg-devel
mailing list