From 0b1f9439bab7e653fb59cee2b8446dcbf359935c Mon Sep 17 00:00:00 2001 From: Dorota Czaplejewicz Date: Mon, 24 Jun 2019 13:59:03 +0000 Subject: [PATCH] virtual_keyboard: Require keymap before accepting keycodes --- include/wlr/types/wlr_virtual_keyboard_v1.h | 1 + types/wlr_virtual_keyboard_v1.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) 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); }