aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/wlr/types/wlr_virtual_keyboard_v1.h1
-rw-r--r--types/wlr_virtual_keyboard_v1.c13
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);
}