Skip to content

Commit

Permalink
input/keyboard: attempt default keymap on failure
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
RedSoxFan authored and ddevault committed May 21, 2019
1 parent 56b7d89 commit b8f12b4
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 29 deletions.
2 changes: 2 additions & 0 deletions include/sway/input/keyboard.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
50 changes: 21 additions & 29 deletions sway/input/keyboard.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit b8f12b4

Please sign in to comment.