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

Rui Matos tiagomatos at gmail.com
Sun Jun 26 17:48:23 UTC 2016

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

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);

More information about the xorg-devel mailing list