diff options
author | Dorota Czaplejewicz <dorota.czaplejewicz@puri.sm> | 2019-06-24 13:59:03 +0000 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2019-06-24 17:16:37 +0300 |
commit | 0b1f9439bab7e653fb59cee2b8446dcbf359935c (patch) | |
tree | 023a483c8a2f601fab549f6f7fd6d4a2ba04e09e | |
parent | 46dc4100d66567f77a413627a0a0b046ccf8094b (diff) |
virtual_keyboard: Require keymap before accepting keycodes
-rw-r--r-- | include/wlr/types/wlr_virtual_keyboard_v1.h | 1 | ||||
-rw-r--r-- | types/wlr_virtual_keyboard_v1.c | 13 |
2 files changed, 14 insertions, 0 deletions
diff --git a/include/wlr/types/wlr_virtual_keyboard_v1.h b/include/wlr/types/wlr_virtual_keyboard_v1.h index e75ed8ec..fbc9d223 100644 --- a/include/wlr/types/wlr_virtual_keyboard_v1.h +++ b/include/wlr/types/wlr_virtual_keyboard_v1.h @@ -30,6 +30,7 @@ struct wlr_virtual_keyboard_v1 { struct wl_resource *resource; struct wlr_input_device input_device; struct wlr_seat *seat; + bool has_keymap; struct wl_list link; diff --git a/types/wlr_virtual_keyboard_v1.c b/types/wlr_virtual_keyboard_v1.c index ffbd8a4e..fd0d7797 100644 --- a/types/wlr_virtual_keyboard_v1.c +++ b/types/wlr_virtual_keyboard_v1.c @@ -61,6 +61,7 @@ static void virtual_keyboard_keymap(struct wl_client *client, goto keymap_fail; } wlr_keyboard_set_keymap(keyboard->input_device.keyboard, keymap); + keyboard->has_keymap = true; xkb_keymap_unref(keymap); xkb_context_unref(context); return; @@ -76,6 +77,12 @@ static void virtual_keyboard_key(struct wl_client *client, uint32_t state) { struct wlr_virtual_keyboard_v1 *keyboard = virtual_keyboard_from_resource(resource); + if (!keyboard->has_keymap) { + wl_resource_post_error(resource, + ZWP_VIRTUAL_KEYBOARD_V1_ERROR_NO_KEYMAP, + "Cannot send a keypress before defining a keymap"); + return; + } struct wlr_event_keyboard_key event = { .time_msec = time, .keycode = key, @@ -90,6 +97,12 @@ static void virtual_keyboard_modifiers(struct wl_client *client, uint32_t mods_latched, uint32_t mods_locked, uint32_t group) { struct wlr_virtual_keyboard_v1 *keyboard = virtual_keyboard_from_resource(resource); + if (!keyboard->has_keymap) { + wl_resource_post_error(resource, + ZWP_VIRTUAL_KEYBOARD_V1_ERROR_NO_KEYMAP, + "Cannot send a modifier state before defining a keymap"); + return; + } wlr_keyboard_notify_modifiers(keyboard->input_device.keyboard, mods_depressed, mods_latched, mods_locked, group); } |