compositor: Update xkb state with key releases on focus out
This happens when vt-switching away from the compositor (drm) or
giving keyboard focus to a different X window. Release the modifiers
so we don't get stuck modifiers. We'll update with the new keys down
when we come back.
diff --git a/src/compositor.c b/src/compositor.c
index b4e430b..8cf66bb 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -1936,15 +1936,14 @@
struct weston_seat *ws = (struct weston_seat *) seat;
struct weston_compositor *compositor = ws->compositor;
struct wl_surface *surface;
- uint32_t *k;
+ uint32_t *k, serial;
+ serial = wl_display_next_serial(compositor->wl_display);
wl_array_copy(&seat->keyboard->keys, keys);
wl_array_for_each(k, &seat->keyboard->keys) {
weston_compositor_idle_inhibit(compositor);
if (update_state == STATE_UPDATE_AUTOMATIC)
- update_modifier_state(ws,
- wl_display_next_serial(compositor->wl_display),
- *k,
+ update_modifier_state(ws, serial, *k,
WL_KEYBOARD_KEY_STATE_PRESSED);
}
@@ -1969,10 +1968,14 @@
struct weston_seat *ws = (struct weston_seat *) seat;
struct weston_compositor *compositor = ws->compositor;
struct wl_surface *surface;
- uint32_t *k;
+ uint32_t *k, serial;
- wl_array_for_each(k, &seat->keyboard->keys)
+ serial = wl_display_next_serial(compositor->wl_display);
+ wl_array_for_each(k, &seat->keyboard->keys) {
weston_compositor_idle_release(compositor);
+ update_modifier_state(ws, serial, *k,
+ WL_KEYBOARD_KEY_STATE_RELEASED);
+ }
ws->modifier_state = 0;