aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorProgAndy <code@progandy.de>2018-07-22 21:16:19 +0200
committerProgAndy <code@progandy.de>2018-07-25 17:24:45 +0200
commit2166dbe2e49fc5eeb345d744424db360ee63f508 (patch)
treefcb9cd6632e0e6b907ae046f94288617230a3688
parent6a8d1e5044086a8dce121bd1f405b342e17a1301 (diff)
downloadsway-2166dbe2e49fc5eeb345d744424db360ee63f508.tar.xz
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 {
char *xkb_rules;
char *xkb_variant;
+ int xkb_numlock;
+ int xkb_capslock;
+
struct input_config_mapped_from_region *mapped_from_region;
char *mapped_to_output;
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) {
input->left_handed = INT_MIN;
input->repeat_delay = INT_MIN;
input->repeat_rate = INT_MIN;
+ input->xkb_numlock = INT_MIN;
+ input->xkb_capslock = INT_MIN;
return input;
}
@@ -104,6 +106,12 @@ void merge_input_config(struct input_config *dst, struct input_config *src) {
free(dst->xkb_variant);
dst->xkb_variant = strdup(src->xkb_variant);
}
+ if (src->xkb_numlock != INT_MIN) {
+ dst->xkb_numlock = src->xkb_numlock;
+ }
+ if (src->xkb_capslock != INT_MIN) {
+ dst->xkb_capslock = src->xkb_capslock;
+ }
if (src->mapped_from_region) {
free(dst->mapped_from_region);
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 @@
#include <wlr/backend/multi.h>
#include <wlr/backend/session.h>
#include <wlr/types/wlr_idle.h>
+#include <wlr/interfaces/wlr_keyboard.h>
#include "sway/commands.h"
#include "sway/desktop/transaction.h"
#include "sway/input/input-manager.h"
@@ -385,6 +386,23 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) {
keyboard->keymap = keymap;
wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap);
+ xkb_mod_mask_t locked_mods = 0;
+ if (!input_config || input_config->xkb_numlock != 0) {
+ xkb_mod_index_t mod_index = xkb_map_mod_get_index(keymap, XKB_MOD_NAME_NUM);
+ if (mod_index != XKB_MOD_INVALID) {
+ locked_mods |= (uint32_t)1 << mod_index;
+ }
+ }
+ if (input_config && input_config->xkb_capslock > 0) {
+ xkb_mod_index_t mod_index = xkb_map_mod_get_index(keymap, XKB_MOD_NAME_CAPS);
+ if (mod_index != XKB_MOD_INVALID) {
+ locked_mods |= (uint32_t)1 << mod_index;
+ }
+ }
+ if (locked_mods) {
+ wlr_keyboard_notify_modifiers(wlr_device->keyboard, 0, 0, locked_mods, 0);
+ }
+
if (input_config && input_config->repeat_delay != INT_MIN
&& input_config->repeat_rate != INT_MIN) {
wlr_keyboard_set_repeat_info(wlr_device->keyboard,