aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFurkan Sahin <furkan-dev@proton.me>2019-05-13 23:56:59 -0400
committerFurkan Sahin <furkan-dev@proton.me>2019-05-13 23:56:59 -0400
commit665f384bda8d1675a2547dbc32ac6737a63c7978 (patch)
tree24dc0c936cb2a232378c3863cc4a5654fb00fab6
parentd9eb7b61b276d7401f832cd1484936e969d06b68 (diff)
input/keyboard: attempt default keymap on failure
This attempts to use the default keymap when the one defined in the input config fails to compile. The goal is to make it so the keyboard is always in a usable state, even if it is not the user's requested settings as usability is more important. This also removes the calls to `getenv` for the `XKB_DEFAULT_*` family of environment variables. The reasoning is libxkbcommon will fallback to using those (and then the system defaults) when any of the rule names are `NULL` or an empty string anyway so there is no need for sway to duplicate the efforts.
-rw-r--r--include/sway/input/keyboard.h2
-rw-r--r--sway/input/keyboard.c50
2 files changed, 23 insertions, 29 deletions
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);