diff options
Diffstat (limited to 'sway/input/keyboard.c')
-rw-r--r-- | sway/input/keyboard.c | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 53db3270..2ab0206a 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c | |||
@@ -1,5 +1,6 @@ | |||
1 | #include "sway/input/seat.h" | 1 | #include "sway/input/seat.h" |
2 | #include "sway/input/keyboard.h" | 2 | #include "sway/input/keyboard.h" |
3 | #include "sway/input/input-manager.h" | ||
3 | #include "log.h" | 4 | #include "log.h" |
4 | 5 | ||
5 | static void handle_keyboard_key(struct wl_listener *listener, void *data) { | 6 | static void handle_keyboard_key(struct wl_listener *listener, void *data) { |
@@ -47,17 +48,44 @@ struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, | |||
47 | void sway_keyboard_configure(struct sway_keyboard *keyboard) { | 48 | void sway_keyboard_configure(struct sway_keyboard *keyboard) { |
48 | struct xkb_rule_names rules; | 49 | struct xkb_rule_names rules; |
49 | memset(&rules, 0, sizeof(rules)); | 50 | memset(&rules, 0, sizeof(rules)); |
50 | rules.rules = getenv("XKB_DEFAULT_RULES"); | 51 | struct input_config *input_config = |
51 | rules.model = getenv("XKB_DEFAULT_MODEL"); | 52 | keyboard->seat_device->input_device->config; |
52 | rules.layout = getenv("XKB_DEFAULT_LAYOUT"); | 53 | |
53 | rules.variant = getenv("XKB_DEFAULT_VARIANT"); | 54 | if (input_config && input_config->xkb_layout) { |
54 | rules.options = getenv("XKB_DEFAULT_OPTIONS"); | 55 | rules.layout = input_config->xkb_layout; |
56 | } else { | ||
57 | rules.layout = getenv("XKB_DEFAULT_LAYOUT"); | ||
58 | } | ||
59 | if (input_config && input_config->xkb_model) { | ||
60 | rules.model = input_config->xkb_model; | ||
61 | } else { | ||
62 | rules.model = getenv("XKB_DEFAULT_MODEL"); | ||
63 | } | ||
64 | |||
65 | if (input_config && input_config->xkb_options) { | ||
66 | rules.options = input_config->xkb_options; | ||
67 | } else { | ||
68 | rules.options = getenv("XKB_DEFAULT_OPTIONS"); | ||
69 | } | ||
70 | |||
71 | if (input_config && input_config->xkb_rules) { | ||
72 | rules.rules = input_config->xkb_rules; | ||
73 | } else { | ||
74 | rules.rules = getenv("XKB_DEFAULT_RULES"); | ||
75 | } | ||
76 | |||
77 | if (input_config && input_config->xkb_variant) { | ||
78 | rules.variant = input_config->xkb_variant; | ||
79 | } else { | ||
80 | rules.variant = getenv("XKB_DEFAULT_VARIANT"); | ||
81 | } | ||
55 | 82 | ||
56 | struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); | 83 | struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); |
57 | if (!sway_assert(context, "cannot create XKB context")) { | 84 | if (!sway_assert(context, "cannot create XKB context")) { |
58 | return; | 85 | return; |
59 | } | 86 | } |
60 | 87 | ||
88 | xkb_keymap_unref(keyboard->keymap); | ||
61 | keyboard->keymap = | 89 | keyboard->keymap = |
62 | xkb_keymap_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); | 90 | xkb_keymap_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); |
63 | wlr_keyboard_set_keymap(keyboard->seat_device->input_device->wlr_device->keyboard, keyboard->keymap); | 91 | wlr_keyboard_set_keymap(keyboard->seat_device->input_device->wlr_device->keyboard, keyboard->keymap); |