diff options
-rw-r--r-- | include/sway/config.h | 3 | ||||
-rw-r--r-- | sway/config/input.c | 8 | ||||
-rw-r--r-- | sway/input/keyboard.c | 18 |
3 files changed, 29 insertions, 0 deletions
diff --git a/include/sway/config.h b/include/sway/config.h index 4a6bb780..0f74b439 100644 --- a/include/sway/config.h +++ b/include/sway/config.h | |||
@@ -101,6 +101,9 @@ struct input_config { | |||
101 | char *xkb_rules; | 101 | char *xkb_rules; |
102 | char *xkb_variant; | 102 | char *xkb_variant; |
103 | 103 | ||
104 | int xkb_numlock; | ||
105 | int xkb_capslock; | ||
106 | |||
104 | struct input_config_mapped_from_region *mapped_from_region; | 107 | struct input_config_mapped_from_region *mapped_from_region; |
105 | char *mapped_to_output; | 108 | char *mapped_to_output; |
106 | 109 | ||
diff --git a/sway/config/input.c b/sway/config/input.c index 8d687a6d..9885e85c 100644 --- a/sway/config/input.c +++ b/sway/config/input.c | |||
@@ -33,6 +33,8 @@ struct input_config *new_input_config(const char* identifier) { | |||
33 | input->left_handed = INT_MIN; | 33 | input->left_handed = INT_MIN; |
34 | input->repeat_delay = INT_MIN; | 34 | input->repeat_delay = INT_MIN; |
35 | input->repeat_rate = INT_MIN; | 35 | input->repeat_rate = INT_MIN; |
36 | input->xkb_numlock = INT_MIN; | ||
37 | input->xkb_capslock = INT_MIN; | ||
36 | 38 | ||
37 | return input; | 39 | return input; |
38 | } | 40 | } |
@@ -104,6 +106,12 @@ void merge_input_config(struct input_config *dst, struct input_config *src) { | |||
104 | free(dst->xkb_variant); | 106 | free(dst->xkb_variant); |
105 | dst->xkb_variant = strdup(src->xkb_variant); | 107 | dst->xkb_variant = strdup(src->xkb_variant); |
106 | } | 108 | } |
109 | if (src->xkb_numlock != INT_MIN) { | ||
110 | dst->xkb_numlock = src->xkb_numlock; | ||
111 | } | ||
112 | if (src->xkb_capslock != INT_MIN) { | ||
113 | dst->xkb_capslock = src->xkb_capslock; | ||
114 | } | ||
107 | if (src->mapped_from_region) { | 115 | if (src->mapped_from_region) { |
108 | free(dst->mapped_from_region); | 116 | free(dst->mapped_from_region); |
109 | dst->mapped_from_region = | 117 | dst->mapped_from_region = |
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 49241db8..36c5a064 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c | |||
@@ -3,6 +3,7 @@ | |||
3 | #include <wlr/backend/multi.h> | 3 | #include <wlr/backend/multi.h> |
4 | #include <wlr/backend/session.h> | 4 | #include <wlr/backend/session.h> |
5 | #include <wlr/types/wlr_idle.h> | 5 | #include <wlr/types/wlr_idle.h> |
6 | #include <wlr/interfaces/wlr_keyboard.h> | ||
6 | #include "sway/commands.h" | 7 | #include "sway/commands.h" |
7 | #include "sway/desktop/transaction.h" | 8 | #include "sway/desktop/transaction.h" |
8 | #include "sway/input/input-manager.h" | 9 | #include "sway/input/input-manager.h" |
@@ -385,6 +386,23 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) { | |||
385 | keyboard->keymap = keymap; | 386 | keyboard->keymap = keymap; |
386 | wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); | 387 | wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); |
387 | 388 | ||
389 | xkb_mod_mask_t locked_mods = 0; | ||
390 | if (!input_config || input_config->xkb_numlock != 0) { | ||
391 | xkb_mod_index_t mod_index = xkb_map_mod_get_index(keymap, XKB_MOD_NAME_NUM); | ||
392 | if (mod_index != XKB_MOD_INVALID) { | ||
393 | locked_mods |= (uint32_t)1 << mod_index; | ||
394 | } | ||
395 | } | ||
396 | if (input_config && input_config->xkb_capslock > 0) { | ||
397 | xkb_mod_index_t mod_index = xkb_map_mod_get_index(keymap, XKB_MOD_NAME_CAPS); | ||
398 | if (mod_index != XKB_MOD_INVALID) { | ||
399 | locked_mods |= (uint32_t)1 << mod_index; | ||
400 | } | ||
401 | } | ||
402 | if (locked_mods) { | ||
403 | wlr_keyboard_notify_modifiers(wlr_device->keyboard, 0, 0, locked_mods, 0); | ||
404 | } | ||
405 | |||
388 | if (input_config && input_config->repeat_delay != INT_MIN | 406 | if (input_config && input_config->repeat_delay != INT_MIN |
389 | && input_config->repeat_rate != INT_MIN) { | 407 | && input_config->repeat_rate != INT_MIN) { |
390 | wlr_keyboard_set_repeat_info(wlr_device->keyboard, | 408 | wlr_keyboard_set_repeat_info(wlr_device->keyboard, |