]> git.mdlowis.com Git - proto/labwc.git/commitdiff
keyboard: add option to enable Num Lock automatically (default=enabled)
authorJohn Lindgren <john@jlindgren.net>
Mon, 9 Oct 2023 02:26:26 +0000 (22:26 -0400)
committerJohan Malm <johanmalm@users.noreply.github.com>
Mon, 9 Oct 2023 19:48:03 +0000 (20:48 +0100)
Co-authored-by: @Consolatis
docs/labwc-config.5.scd
docs/rc.xml.all
include/config/rcxml.h
include/labwc.h
src/config/rcxml.c
src/keyboard.c
src/seat.c

index 87d0b352de93848a1a81bb628550173b4b741870..7bc6cce4f18f14faa339f3536173226698f99df3 100644 (file)
@@ -276,6 +276,10 @@ this is for compatibility with Openbox.
 
 ## KEYBOARD
 
+*<keyboard><numlock>* [on|off]
+       When recognizing a new keyboard enable or disable Num Lock.
+       Default is on.
+
 *<keyboard><keybind key="" layoutDependent="">*
        Define a *key* binding in the format *modifier-key*, where supported
        modifiers are:
index c0665ee67b33231427efe4c5182c87c15026249e..7a44ea39d039d52ada0233a64e6df161656c17fa 100644 (file)
     your favourite terminal or application launcher. See rc.xml for an example.
   -->
   <keyboard>
+    <numlock>on</numlock>
     <repeatRate>25</repeatRate>
     <repeatDelay>600</repeatDelay>
     <keybind key="A-Tab">
index e15fcabf3e2fdc2595ebb65af62ee639c88fb5d6..b3ef127fd6303a86d763091ec59626e086ac6b54 100644 (file)
@@ -62,6 +62,7 @@ struct rcxml {
        /* keyboard */
        int repeat_rate;
        int repeat_delay;
+       bool kb_numlock_enable;
        struct wl_list keybinds;   /* struct keybind.link */
 
        /* mouse */
index 84d39d4f34d6cb1fb843fab7f340a19bcaae0305..ae6867edef784abe2502c5de8abb3f36977f30c9 100644 (file)
@@ -419,6 +419,7 @@ void desktop_focus_topmost_view(struct server *server);
 void keyboard_cancel_keybind_repeat(struct keyboard *keyboard);
 void keyboard_key_notify(struct wl_listener *listener, void *data);
 void keyboard_modifiers_notify(struct wl_listener *listener, void *data);
+void keyboard_set_numlock(struct wlr_keyboard *keyboard);
 void keyboard_init(struct seat *seat);
 bool keyboard_any_modifiers_pressed(struct wlr_keyboard *keyboard);
 void keyboard_finish(struct seat *seat);
index ed0ae75941a9ae481f08a7d7d06331a6f4dfff9c..79ea79d8241ec15ffaf0f981c93ed413dc7befee 100644 (file)
@@ -732,6 +732,8 @@ entry(xmlNode *node, char *nodename, char *content)
                rc.repeat_rate = atoi(content);
        } else if (!strcasecmp(nodename, "repeatDelay.keyboard")) {
                rc.repeat_delay = atoi(content);
+       } else if (!strcasecmp(nodename, "numlock.keyboard")) {
+               set_bool(content, &rc.kb_numlock_enable);
        } else if (!strcasecmp(nodename, "screenEdgeStrength.resistance")) {
                rc.screen_edge_strength = atoi(content);
        } else if (!strcasecmp(nodename, "range.snapping")) {
@@ -949,6 +951,7 @@ rcxml_init(void)
        rc.scroll_factor = 1.0;
        rc.repeat_rate = 25;
        rc.repeat_delay = 600;
+       rc.kb_numlock_enable = true;
        rc.screen_edge_strength = 20;
 
        rc.snap_edge_range = 1;
index aba3c6c95ba0aed71e2711fbdcd595643809d122..c55636b098780d28d3650c74f679e01e667ec64b 100644 (file)
@@ -2,6 +2,7 @@
 #include <assert.h>
 #include <wlr/backend/multi.h>
 #include <wlr/backend/session.h>
+#include <wlr/interfaces/wlr_keyboard.h>
 #include "action.h"
 #include "idle.h"
 #include "key-state.h"
@@ -489,6 +490,33 @@ keyboard_key_notify(struct wl_listener *listener, void *data)
        }
 }
 
+void
+keyboard_set_numlock(struct wlr_keyboard *keyboard)
+{
+       xkb_mod_index_t num_idx =
+               xkb_map_mod_get_index(keyboard->keymap, XKB_MOD_NAME_NUM);
+       if (num_idx == XKB_MOD_INVALID) {
+               wlr_log(WLR_INFO, "Failed to set Num Lock: not found in keymap");
+               return;
+       }
+
+       xkb_mod_mask_t locked = keyboard->modifiers.locked;
+       if (rc.kb_numlock_enable) {
+               locked |= (xkb_mod_mask_t)1 << num_idx;
+       } else {
+               locked &= ~((xkb_mod_mask_t)1 << num_idx);
+       }
+
+       /*
+        * This updates the xkb-state + kb->modifiers and also triggers the
+        * keyboard->events.modifiers signal (the signal has no effect in
+        * current labwc usage since the keyboard is not part of a
+        * keyboard-group yet).
+        */
+       wlr_keyboard_notify_modifiers(keyboard, keyboard->modifiers.depressed,
+               keyboard->modifiers.latched, locked, keyboard->modifiers.group);
+}
+
 void
 keyboard_init(struct seat *seat)
 {
index bb6729a096f1f592581b5dffb97d83d6b8c3cdc5..f36c532c41096634c0053e071560d949df54ee63 100644 (file)
@@ -211,6 +211,14 @@ new_keyboard(struct seat *seat, struct wlr_input_device *device, bool virtual)
 
        wlr_keyboard_set_keymap(kb, seat->keyboard_group->keyboard.keymap);
 
+       /*
+        * This needs to be before wlr_keyboard_group_add_keyboard().
+        * For some reason, wlroots takes the modifier state from the
+        * new keyboard and syncs it to the others in the group, rather
+        * than the other way around.
+        */
+       keyboard_set_numlock(kb);
+
        if (!virtual) {
                wlr_keyboard_group_add_keyboard(seat->keyboard_group, kb);
        }