Fix xkb_state NULL and respect host keyboard layout

- Only apply default XKB keymap as fallback when the host compositor
  hasn't provided one yet (kb->xkb_state == NULL)
- The nested backend receives the host's keymap (Dvorak, etc.) via
  wl_keyboard.keymap — don't overwrite it with QWERTY default
This commit is contained in:
Levi Neely 2026-05-13 22:50:18 +02:00
parent 8f0ec30759
commit 71c4bfdfbc
1 changed files with 11 additions and 4 deletions

View File

@ -1698,9 +1698,8 @@ handle_backend_new_input(struct wl_listener *listener, void *data)
switch (dev->type) {
case WLR_INPUT_DEVICE_KEYBOARD: {
struct wlr_keyboard *kb = wlr_keyboard_from_input_device(dev);
/* Apply our default XKB keymap unless the backend already set one
* (nested backend receives the host keymap via wl_keyboard.keymap). */
if (wl_state.xkb_keymap && !kb->keymap)
/* Apply default keymap only if the host hasn't provided one yet */
if (wl_state.xkb_keymap && !kb->xkb_state)
wlr_keyboard_set_keymap(kb, wl_state.xkb_keymap);
wl_state.real_keyboard_dev = dev;
wl_state.keyboard_dev = dev;
@ -2402,8 +2401,16 @@ wl_display_open(const char *name)
wl_state.xkb_keymap = xkb_keymap_new_from_names(
xkb_ctx, NULL, XKB_KEYMAP_COMPILE_NO_FLAGS);
xkb_context_unref(xkb_ctx);
if (wl_state.xkb_keymap)
if (wl_state.xkb_keymap) {
wwarning("wl_backend: default XKB keymap created for key binding resolution");
/* Apply to any keyboard that was wired before keymap was ready,
* but only if it doesn't already have one from the host. */
if (wl_state.keyboard_dev) {
struct wlr_keyboard *kb = wlr_keyboard_from_input_device(wl_state.keyboard_dev);
if (!kb->xkb_state)
wlr_keyboard_set_keymap(kb, wl_state.xkb_keymap);
}
}
}
}
/* Advertise keyboard+pointer capability unconditionally so clients do not