aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar ProgAndy <code@progandy.de>2018-07-22 21:16:19 +0200
committerLibravatar ProgAndy <code@progandy.de>2018-07-25 17:24:45 +0200
commit2166dbe2e49fc5eeb345d744424db360ee63f508 (patch)
treefcb9cd6632e0e6b907ae046f94288617230a3688
parentMerge pull request #2358 from CedricCabessa/fix-2355-move-workspace-crashes (diff)
downloadsway-2166dbe2e49fc5eeb345d744424db360ee63f508.tar.gz
sway-2166dbe2e49fc5eeb345d744424db360ee63f508.tar.zst
sway-2166dbe2e49fc5eeb345d744424db360ee63f508.zip
Implement setting NumLock and CapsLock status
After setting the keymap, try to enable NumLock and disable CapsLock. This only works if sway has the xkb master state and controls the keyboard. Prepare configuration settings for later use as well.
-rw-r--r--include/sway/config.h3
-rw-r--r--sway/config/input.c8
-rw-r--r--sway/input/keyboard.c18
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,