diff --git a/include/sway/input/keyboard.h b/include/sway/input/keyboard.h index 0c8ada0f..b8622053 100644 --- a/include/sway/input/keyboard.h +++ b/include/sway/input/keyboard.h @@ -65,6 +65,8 @@ struct sway_keyboard { struct sway_binding *repeat_binding; }; +struct xkb_keymap *sway_keyboard_compile_keymap(struct input_config *ic); + struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, struct sway_seat_device *device); diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 396cc865..78e8fa0c 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -476,45 +476,38 @@ struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, return keyboard; } -void sway_keyboard_configure(struct sway_keyboard *keyboard) { - struct input_config *input_config = - input_device_get_config(keyboard->seat_device->input_device); - struct wlr_input_device *wlr_device = - keyboard->seat_device->input_device->wlr_device; - +struct xkb_keymap *sway_keyboard_compile_keymap(struct input_config *ic) { struct xkb_rule_names rules = {0}; - if (input_config) { - input_config_fill_rule_names(input_config, &rules); - } - - if (!rules.layout) { - rules.layout = getenv("XKB_DEFAULT_LAYOUT"); - } - if (!rules.model) { - rules.model = getenv("XKB_DEFAULT_MODEL"); - } - if (!rules.options) { - rules.options = getenv("XKB_DEFAULT_OPTIONS"); - } - if (!rules.rules) { - rules.rules = getenv("XKB_DEFAULT_RULES"); - } - if (!rules.variant) { - rules.variant = getenv("XKB_DEFAULT_VARIANT"); + if (ic) { + input_config_fill_rule_names(ic, &rules); } struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); if (!sway_assert(context, "cannot create XKB context")) { - return; + return NULL; } struct xkb_keymap *keymap = xkb_keymap_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); + xkb_context_unref(context); + return keymap; +} + +void sway_keyboard_configure(struct sway_keyboard *keyboard) { + struct input_config *input_config = + input_device_get_config(keyboard->seat_device->input_device); + struct wlr_input_device *wlr_device = + keyboard->seat_device->input_device->wlr_device; + struct xkb_keymap *keymap = sway_keyboard_compile_keymap(input_config); if (!keymap) { - sway_log(SWAY_DEBUG, "cannot configure keyboard: keymap does not exist"); - xkb_context_unref(context); - return; + sway_log(SWAY_ERROR, "Failed to compile keymap. Attempting defaults"); + keymap = sway_keyboard_compile_keymap(NULL); + if (!keymap) { + sway_log(SWAY_ERROR, + "Failed to compile default keymap. Aborting configure"); + return; + } } xkb_keymap_unref(keyboard->keymap); @@ -557,7 +550,6 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) { wlr_keyboard_set_repeat_info(wlr_device->keyboard, repeat_rate, repeat_delay); - xkb_context_unref(context); struct wlr_seat *seat = keyboard->seat_device->sway_seat->wlr_seat; wlr_seat_set_keyboard(seat, wlr_device);