[PATCH xserver] xwayland: Process queued events before making wayland mods effective

Olivier Fourdan ofourdan at redhat.com
Mon Jun 27 07:36:31 UTC 2016


Hi

----- Original Message -----
> Since xwayland's initial commit we have had a check to not process
> wayland modifier events while one of our surfaces has keyboard focus
> since the normal xkb event processing keeps our internal modifier
> state up to date and if we use the modifiers we get from the
> compositor we mess up that state.
> 
> This was slightly changed in commit
> 10e9116b3f709bec6d6a50446c1341441a0564e4 to allow the xkb group to be
> set from the wayland event while we have focus in case the compositor
> triggers a group switch.
> 
> There's a better solution to the original problem though. Processing
> queued events before overriding the xkb state with the compositor's
> allows those events to be sent properly modified to X clients while
> any further events will be modified with the wayland modifiers as
> intended.
> 
> This allows us to fully take in the wayland modifiers, including
> depressed ones, which fixes an issue where we wouldn't be aware of
> already pressed modifiers on enter.
> 
> Signed-off-by: Rui Matos <tiagomatos at gmail.com>
> ---
> 
> Fixes https://bugzilla.gnome.org/show_bug.cgi?id=767475 . I'm not 100%
> sure there aren't unintended side-effects but it seems to be working
> fine in actual use for a couple of weeks.
> 
>  hw/xwayland/xwayland-input.c | 11 ++++++-----
>  1 file changed, 6 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
> index 4642efe..7aae7ba 100644
> --- a/hw/xwayland/xwayland-input.c
> +++ b/hw/xwayland/xwayland-input.c
> @@ -503,6 +503,8 @@ keyboard_handle_modifiers(void *data, struct wl_keyboard
> *keyboard,
>      xkbStateNotify sn;
>      CARD16 changed;
>  
> +    mieqProcessInputEvents();
> +
>      for (dev = inputInfo.devices; dev; dev = dev->next) {
>          if (dev != xwl_seat->keyboard &&
>              dev != GetMaster(xwl_seat->keyboard, MASTER_KEYBOARD))
> @@ -511,12 +513,11 @@ keyboard_handle_modifiers(void *data, struct
> wl_keyboard *keyboard,
>          old_state = dev->key->xkbInfo->state;
>          new_state = &dev->key->xkbInfo->state;
>  
> -        if (!xwl_seat->keyboard_focus) {
> -            new_state->locked_mods = mods_locked & XkbAllModifiersMask;
> -            XkbLatchModifiers(dev, XkbAllModifiersMask,
> -                              mods_latched & XkbAllModifiersMask);
> -        }
>          new_state->locked_group = group & XkbAllGroupsMask;
> +        new_state->base_mods = mods_depressed & XkbAllModifiersMask;
> +        new_state->locked_mods = mods_locked & XkbAllModifiersMask;
> +        XkbLatchModifiers(dev, XkbAllModifiersMask,
> +                          mods_latched & XkbAllModifiersMask);
>  
>          XkbComputeDerivedState(dev->key->xkbInfo);
>  

FWIW I have been using this patch for a few weeks and it works fine as far as I can tell, and it doesn't seem to have any ill effect on Weston either, so:

Tested-by: Olivier Fourdan <ofourdan at redhat.com>

Cheers,
Olivier


More information about the xorg-devel mailing list