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);