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.thiba...@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;
_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to