From 4b617b1e8cd9615ad603997064d686a2934044ec Mon Sep 17 00:00:00 2001 From: Simon Long Date: Tue, 16 Jan 2024 12:43:18 +0000 Subject: [PATCH] Reload keymap on reconfigure --- include/input/keyboard.h | 1 + src/input/keyboard.c | 18 ++++++++++++++++++ src/seat.c | 1 + 3 files changed, 20 insertions(+) diff --git a/include/input/keyboard.h b/include/input/keyboard.h index 38d82b7a..cb6c60ab 100644 --- a/include/input/keyboard.h +++ b/include/input/keyboard.h @@ -10,6 +10,7 @@ struct keyboard; struct wlr_keyboard; void keyboard_init(struct seat *seat); +void keyboard_reload(struct seat *seat); void keyboard_finish(struct seat *seat); void keyboard_setup_handlers(struct keyboard *keyboard); diff --git a/src/input/keyboard.c b/src/input/keyboard.c index 49859627..071936d3 100644 --- a/src/input/keyboard.c +++ b/src/input/keyboard.c @@ -613,6 +613,24 @@ keyboard_init(struct seat *seat) keybind_update_keycodes(seat->server); } +void +keyboard_reload(struct seat *seat) +{ + struct wlr_keyboard *kb = wlr_seat_get_keyboard(seat->seat); + struct xkb_rule_names rules = { 0 }; + struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); + struct xkb_keymap *keymap = xkb_map_new_from_names(context, &rules, + XKB_KEYMAP_COMPILE_NO_FLAGS); + if (keymap) { + wlr_keyboard_set_keymap(kb, keymap); + xkb_keymap_unref(keymap); + } else { + wlr_log(WLR_ERROR, "Failed to create xkb keymap"); + } + xkb_context_unref(context); + wlr_keyboard_set_repeat_info(kb, rc.repeat_rate, rc.repeat_delay); +} + void keyboard_setup_handlers(struct keyboard *keyboard) { diff --git a/src/seat.c b/src/seat.c index 594cdde9..f581ad82 100644 --- a/src/seat.c +++ b/src/seat.c @@ -537,6 +537,7 @@ seat_reconfigure(struct server *server) break; } } + keyboard_reload(seat); } static void