[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