diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index 8ad8bf7..1ac2e5c 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -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