From f863a9b0b9c1e3f5df9bd9a636146c2f8429d81c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= Date: Sun, 4 Apr 2021 19:56:09 -0500 Subject: [PATCH] add option to enable numlock/capslock Co-authored-by: A Frederick Christensen --- config.def.h | 4 ++++ dwl.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/config.def.h b/config.def.h index 447ba00..87435d8 100644 --- a/config.def.h +++ b/config.def.h @@ -45,6 +45,10 @@ static const struct xkb_rule_names xkb_rules = { .options = NULL, }; +/* numlock and capslock */ +static const int numlock = 1; +static const int capslock = 0; + static const int repeat_rate = 25; static const int repeat_delay = 600; diff --git a/dwl.c b/dwl.c index 4ff5c37..20a70dd 100644 --- a/dwl.c +++ b/dwl.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -795,6 +796,8 @@ createkeyboard(struct wlr_keyboard *keyboard) { struct xkb_context *context; struct xkb_keymap *keymap; + uint32_t leds = 0; + xkb_mod_mask_t locked_mods = 0; Keyboard *kb = keyboard->data = ecalloc(1, sizeof(*kb)); kb->wlr_keyboard = keyboard; @@ -818,6 +821,34 @@ createkeyboard(struct wlr_keyboard *keyboard) kb->key_repeat_source = wl_event_loop_add_timer( wl_display_get_event_loop(dpy), keyrepeat, kb); + if (numlock) { + xkb_mod_index_t mod_index = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_NUM); + if (mod_index != XKB_MOD_INVALID) { + locked_mods |= (uint32_t)1 << mod_index; + } + } + + if (capslock) { + xkb_mod_index_t mod_index = xkb_keymap_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(keyboard, 0, 0, + locked_mods, 0); + + for (uint32_t i = 0; i < WLR_LED_COUNT; ++i) { + if (xkb_state_led_index_is_active( + keyboard->xkb_state, + keyboard->led_indexes[i])) { + leds |= (1 << i); + } + } + wlr_keyboard_led_update(keyboard, leds); + } + /* And add the keyboard to our list of keyboards */ wl_list_insert(&keyboards, &kb->link); }