From c45231ef89faeee0674e405e94ef6a92eb6726a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 22 Jun 2024 07:58:43 +0200 Subject: [PATCH] input: don't reset the XKB compose state in keymap() When the compositor sends a new keymap, don't reset the XKB compose state. This is done by initializing the XKB context, along with the compose state, when binding the seat, instead of in keymap(). Then, in keymap(), simply stop destroying the old xkb state. Only destroy, and re-create the keymap state. Closes #1744 --- CHANGELOG.md | 3 +++ input.c | 24 ------------------------ wayland.c | 22 +++++++++++++++++++--- 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85b8c59d..2f3367c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -95,11 +95,14 @@ * IME interfering in URL-mode ([#1718][1718]). * OSC-52 reply interleaved with other data sent to the client ([#1734][1734]). +* XKB compose state being reset when foot receives a new keymap + ([#1744][1744]). [1694]: https://codeberg.org/dnkl/foot/issues/1694 [1717]: https://codeberg.org/dnkl/foot/issues/1717 [1718]: https://codeberg.org/dnkl/foot/issues/1718 [1734]: https://codeberg.org/dnkl/foot/issues/1734 +[1744]: https://codeberg.org/dnkl/foot/issues/1744 ### Security diff --git a/input.c b/input.c index 13999250..5c7de859 100644 --- a/input.c +++ b/input.c @@ -513,14 +513,6 @@ keyboard_keymap(void *data, struct wl_keyboard *wl_keyboard, * Free old keymap state */ - if (seat->kbd.xkb_compose_state != NULL) { - xkb_compose_state_unref(seat->kbd.xkb_compose_state); - seat->kbd.xkb_compose_state = NULL; - } - if (seat->kbd.xkb_compose_table != NULL) { - xkb_compose_table_unref(seat->kbd.xkb_compose_table); - seat->kbd.xkb_compose_table = NULL; - } if (seat->kbd.xkb_keymap != NULL) { xkb_keymap_unref(seat->kbd.xkb_keymap); seat->kbd.xkb_keymap = NULL; @@ -529,10 +521,6 @@ keyboard_keymap(void *data, struct wl_keyboard *wl_keyboard, xkb_state_unref(seat->kbd.xkb_state); seat->kbd.xkb_state = NULL; } - if (seat->kbd.xkb != NULL) { - xkb_context_unref(seat->kbd.xkb); - seat->kbd.xkb = NULL; - } key_binding_unload_keymap(wayl->key_binding_manager, seat); @@ -559,23 +547,11 @@ keyboard_keymap(void *data, struct wl_keyboard *wl_keyboard, while (map_str[size - 1] == '\0') size--; - seat->kbd.xkb = xkb_context_new(XKB_CONTEXT_NO_FLAGS); - if (seat->kbd.xkb != NULL) { seat->kbd.xkb_keymap = xkb_keymap_new_from_buffer( seat->kbd.xkb, map_str, size, XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS); - /* Compose (dead keys) */ - seat->kbd.xkb_compose_table = xkb_compose_table_new_from_locale( - seat->kbd.xkb, setlocale(LC_CTYPE, NULL), XKB_COMPOSE_COMPILE_NO_FLAGS); - - if (seat->kbd.xkb_compose_table == NULL) { - LOG_WARN("failed to instantiate compose table; dead keys will not work"); - } else { - seat->kbd.xkb_compose_state = xkb_compose_state_new( - seat->kbd.xkb_compose_table, XKB_COMPOSE_STATE_NO_FLAGS); - } } if (seat->kbd.xkb_keymap != NULL) { diff --git a/wayland.c b/wayland.c index c357f382..29ffab60 100644 --- a/wayland.c +++ b/wayland.c @@ -1,11 +1,12 @@ #include "wayland.h" +#include +#include +#include +#include #include #include #include -#include -#include -#include #include #include @@ -13,6 +14,8 @@ #include #include #include +#include +#include #include #include @@ -1195,6 +1198,19 @@ handle_global(void *data, struct wl_registry *registry, return; } + seat->kbd.xkb = xkb_context_new(XKB_CONTEXT_NO_FLAGS); + if (seat->kbd.xkb != NULL) { + seat->kbd.xkb_compose_table = xkb_compose_table_new_from_locale( + seat->kbd.xkb, setlocale(LC_CTYPE, NULL), XKB_COMPOSE_COMPILE_NO_FLAGS); + + if (seat->kbd.xkb_compose_table != NULL) { + seat->kbd.xkb_compose_state = xkb_compose_state_new( + seat->kbd.xkb_compose_table, XKB_COMPOSE_STATE_NO_FLAGS); + } else { + LOG_WARN("failed to instantiate compose table; dead keys (compose) will not work"); + } + } + seat_add_data_device(seat); seat_add_primary_selection(seat); seat_add_text_input(seat);