Support wl_keyboard::modifiers event
This event lets the compositor inform clients of the canonical keyboard
modifier/group state. Make sure we send it at appropriate moments from
the compositor, and listen for it in clients as well.
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
diff --git a/clients/window.c b/clients/window.c
index ae8792e..012260d 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -1831,11 +1831,9 @@
window->send_cursor_position = 1;
num_syms = xkb_key_get_syms(d->xkb.state, code, &syms);
- xkb_state_update_key(d->xkb.state, code,
- state ? XKB_KEY_DOWN : XKB_KEY_UP);
- mask = xkb_state_serialize_mods(d->xkb.state,
- XKB_STATE_DEPRESSED |
+ mask = xkb_state_serialize_mods(d->xkb.state,
+ XKB_STATE_DEPRESSED |
XKB_STATE_LATCHED);
input->modifiers = 0;
if (mask & input->display->xkb.control_mask)
@@ -1862,6 +1860,23 @@
}
static void
+keyboard_handle_modifiers(void *data, struct wl_keyboard *keyboard,
+ uint32_t serial, uint32_t mods_depressed,
+ uint32_t mods_latched, uint32_t mods_locked,
+ uint32_t group)
+{
+ struct input *input = data;
+
+ xkb_state_update_mask(input->display->xkb.state,
+ mods_depressed,
+ mods_latched,
+ mods_locked,
+ 0,
+ 0,
+ group);
+}
+
+static void
input_remove_pointer_focus(struct input *input)
{
struct window *window = input->pointer_focus;
@@ -1977,6 +1992,7 @@
keyboard_handle_enter,
keyboard_handle_leave,
keyboard_handle_key,
+ keyboard_handle_modifiers,
};
static void