xwayland-input: Always set the xkb group index on modifiers events
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. Reviewed-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
parent
f937032ee6
commit
10e9116b3f
|
@ -462,12 +462,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))
|
||||
|
@ -476,10 +470,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);
|
||||
}
|
||||
new_state->locked_group = group & XkbAllGroupsMask;
|
||||
new_state->locked_mods = mods_locked & XkbAllModifiersMask;
|
||||
XkbLatchModifiers(dev, XkbAllModifiersMask,
|
||||
mods_latched & XkbAllModifiersMask);
|
||||
|
||||
XkbComputeDerivedState(dev->key->xkbInfo);
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user