[PATCH] xwayland-input: Always set the xkb group index on modifiers events

Marek Chalupa mchqwerty at gmail.com
Thu Jul 30 03:32:11 PDT 2015


Hey,

ping
(not sure if in-reply-to will work, so here's a link too
http://lists.x.org/archives/xorg-devel/2014-July/043080.html)

I pinged this patch for two reasons:

1) it fixes a bug https://bugzilla.gnome.org/show_bug.cgi?id=752165

2) [for wayland-devel] The order of modifier event and the key press is 
not still settled in the protocol (or I can't find it anywhere). If it 
is, sorry for spam. (I found it only in the commit message that 
introduced the event 
http://cgit.freedesktop.org/wayland/wayland/commit/?id=9a1705c5f5e877d4e68bd0e7eb858f517375ba3f 
)

comment for the patch below

Regards,
Marek

 > From tiagomatos at gmail.com  Tue Jul 15 06:57:20 2014
 > From: tiagomatos at gmail.com (Rui Matos)
 > Date: Tue, 15 Jul 2014 15:57:20 +0200
 > Subject: [PATCH] xwayland-input: Always set the xkb group index on 
modifiers
 >  events
 > Message-ID: <1405432640-16113-1-git-send-email-tiagomatos at gmail.com>
 >
 > While we have keyboard focus, the server's xkb code is already locking
 > and latching modifiers appropriately while processing keyboard
 > events.
 >
 > Since there is no guaranteed order between wl_keyboard key and
 > modifiers events, if we got the modifiers event with a locked or
 > latched modifier and then process the key press event for that
 > modifier we would wrongly unlock/unlatch. To prevent this, we ignore
 > locked and latched modifiers while any of our surfaces has keyboard
 > focus.
 >
 > But we always need to set the xkb group index since this might be
 > triggered programatically by the wayland compositor at any time.
 > ---
 >
 > Note that xwayland's xkb state handling needs quite a bit of work to
 > make it reliable. Basically, if the wl_keyboard.modifiers event comes
 > in after the wl_keyboard.enter event we won't update the locked and
 > latched modifiers properly. Right now this just happens to work with
 > mutter.
 >
 > I'm working on a proper fix for this which requires API changes to the
 > core xkb code in order for us to be able to tell it to ignore modifier
 > state processing on key events and instead always set that state from
 > wl_keyboard.modifiers events like any other wayland client.
 >
 > Extra API will also be needed to tell the xkb request processing code
 > to return errors and/or silently drop X client requests that try to
 > change any xkb state and keymaps.
 >
 > Anyway, that wouldn't be acceptable for the upcoming 1.16 release so
 > I'm just proposing this targetted fix for the group index to be
 > honored which I'd like to have working on the next GNOME release.
 >
 >  hw/xwayland/xwayland-input.c | 14 +++++---------
 >  1 file changed, 5 insertions(+), 9 deletions(-)
 >
 > diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
 > index 990cb82..9bdf9c3 100644
 > --- a/hw/xwayland/xwayland-input.c
 > +++ b/hw/xwayland/xwayland-input.c
 > @@ -420,12 +420,6 @@ keyboard_handle_modifiers(void *data, struct 
wl_keyboard *keyboard,
 >      xkbStateNotify sn;
 >      CARD16 changed;
 >
 > -    /* We don't need any of this while we have keyboard focus since
 > -       the regular key event processing already takes care of setting
 > -       our internal state correctly. */
 > -    if (xwl_seat->keyboard_focus)
 > -        return;
 > -
 >      for (dev = inputInfo.devices; dev; dev = dev->next) {
 >          if (dev != xwl_seat->keyboard &&
 >              dev != GetMaster(xwl_seat->keyboard, MASTER_KEYBOARD))
 > @@ -434,10 +428,12 @@ 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);
 > +        }

I believe here it would deserve a comment why we care about the focus
and why the group is updated unconditionally.

Reviewed-by: Marek Chalupa <mchqwerty at gmail.com>

 >          new_state->locked_group = group & XkbAllGroupsMask;
 > -        new_state->locked_mods = mods_locked & XkbAllModifiersMask;
 > -        XkbLatchModifiers(dev, XkbAllModifiersMask,
 > -                          mods_latched & XkbAllModifiersMask);
 >
 >          XkbComputeDerivedState(dev->key->xkbInfo);
 >
 > --
 > 1.9.0

-------------------------------------------------------------------------

 > From daniel at fooishbar.org  Fri Jul 18 05:42:48 2014
 > From: daniel at fooishbar.org (Daniel Stone)
 > Date: Fri, 18 Jul 2014 13:42:48 +0100
 > Subject: [PATCH] xwayland-input: Always set the xkb group index on 
modifiers events
 > In-Reply-To: <1405432640-16113-1-git-send-email-tiagomatos at gmail.com>
 > References: <1405432640-16113-1-git-send-email-tiagomatos at gmail.com>
 > Message-ID: 
<CAPj87rO8OvpgzF=Vsp9CtcALSLZJ-ONEpFbeC=jRT7HqQAq6zg at mail.gmail.com>
 >
 > Hi,
 >
 > On 15 July 2014 14:57, Rui Matos <tiagomatos at gmail.com> wrote:
 >
 > > While we have keyboard focus, the server's xkb code is already locking
 > > and latching modifiers appropriately while processing keyboard
 > > events.
 > >
 > > Since there is no guaranteed order between wl_keyboard key and
 > > modifiers events, if we got the modifiers event with a locked or
 > > latched modifier and then process the key press event for that
 > > modifier we would wrongly unlock/unlatch. To prevent this, we ignore
 > > locked and latched modifiers while any of our surfaces has keyboard
 > > focus.
 > >
 >
 > Wow, I really wish I'd encoded that properly in the wl_keyboard spec.
 >
 > Sending modifiers before key is _seriously_ broken, and no-one should 
ever
 > do it. There are corner cases it completely and horrifically breaks.
 >
 > X11 actually got this right for once: the state sent with the key 
event is
 > the state that applied _immediately before the press_, i.e. unaffected by
 > the press itself. Where it slipped up was not updating you with the state
 > immediately after the press as well, but you cannot interpret the press
 > with the state the press itself created.
 >
 > I'm very much tempted to merge Jonny's repeat rate patches which take 
us to
 > a new wl_keyboard version, and including in that version a 
requirement that
 > this ordering be observed.
 >
 > If Mutter sends modifiers before key, _please_ reverse that.
 >
 >
 > > But we always need to set the xkb group index since this might be
 > > triggered programatically by the wayland compositor at any time.
 > > ---
 > >
 > > Note that xwayland's xkb state handling needs quite a bit of work to
 > > make it reliable. Basically, if the wl_keyboard.modifiers event comes
 > > in after the wl_keyboard.enter event we won't update the locked and
 > > latched modifiers properly. Right now this just happens to work with
 > > mutter.
 > >
 > > I'm working on a proper fix for this which requires API changes to the
 > > core xkb code in order for us to be able to tell it to ignore modifier
 > > state processing on key events and instead always set that state from
 > > wl_keyboard.modifiers events like any other wayland client.
 > >
 > > Extra API will also be needed to tell the xkb request processing code
 > > to return errors and/or silently drop X client requests that try to
 > > change any xkb state and keymaps.
 > >
 > > Anyway, that wouldn't be acceptable for the upcoming 1.16 release so
 > > I'm just proposing this targetted fix for the group index to be
 > > honored which I'd like to have working on the next GNOME release.
 > >
 >
 > Agreed to all of the above, but, wouldn't we be better off waiting for a
 > modifiers event straight after enter? Although that's another thing which
 > really needs encoding into the protocol ... oh well.
 >
 > Reviewed-by: Daniel Stone <daniels at collabora.com>
 >
 > Cheers,
 > Daniel


More information about the xorg-devel mailing list