Only force on|off if users specifically requests it in the config file.
Related-to: #2463
*<keyboard><numlock>* [on|off]
When recognizing a new keyboard enable or disable Num Lock.
- Default is off.
+ Default is unset.
*<keyboard layoutScope="">* [global|window]
Stores the keyboard layout either globally or per window and restores
your favourite terminal or application launcher. See rc.xml for an example.
-->
<keyboard>
- <numlock>off</numlock>
+ <!--
+ # Numlock is not set by default
+ <numlock>on|off</numlock>
+ -->
<layoutScope>global</layoutScope>
<repeatRate>25</repeatRate>
<repeatDelay>600</repeatDelay>
#include "common/border.h"
#include "common/buf.h"
#include "common/font.h"
+#include "common/three-state.h"
#include "config/touch.h"
#include "config/tablet.h"
#include "config/tablet-tool.h"
/* keyboard */
int repeat_rate;
int repeat_delay;
- bool kb_numlock_enable;
+ enum three_state kb_numlock_enable;
bool kb_layout_per_window;
struct wl_list keybinds; /* struct keybind.link */
#include "common/parse-bool.h"
#include "common/parse-double.h"
#include "common/string-helpers.h"
+#include "common/three-state.h"
#include "config/default-bindings.h"
#include "config/keybind.h"
#include "config/libinput.h"
} else if (!strcasecmp(nodename, "repeatDelay.keyboard")) {
rc.repeat_delay = atoi(content);
} else if (!strcasecmp(nodename, "numlock.keyboard")) {
- set_bool(content, &rc.kb_numlock_enable);
+ bool value;
+ set_bool(content, &value);
+ rc.kb_numlock_enable = value ? LAB_STATE_ENABLED
+ : LAB_STATE_DISABLED;
} else if (!strcasecmp(nodename, "layoutScope.keyboard")) {
/*
* This can be changed to an enum later on
rc.repeat_rate = 25;
rc.repeat_delay = 600;
- rc.kb_numlock_enable = false;
+ rc.kb_numlock_enable = LAB_STATE_UNSPECIFIED;
rc.kb_layout_per_window = false;
rc.screen_edge_strength = 20;
rc.window_edge_strength = 20;
#include <wlr/backend/session.h>
#include <wlr/interfaces/wlr_keyboard.h>
#include "action.h"
+#include "common/three-state.h"
#include "idle.h"
#include "input/ime.h"
#include "input/keyboard.h"
void
keyboard_set_numlock(struct wlr_keyboard *keyboard)
{
+ if (rc.kb_numlock_enable == LAB_STATE_UNSPECIFIED) {
+ return;
+ }
+
xkb_mod_index_t num_idx =
xkb_map_mod_get_index(keyboard->keymap, XKB_MOD_NAME_NUM);
if (num_idx == XKB_MOD_INVALID) {
}
xkb_mod_mask_t locked = keyboard->modifiers.locked;
- if (rc.kb_numlock_enable) {
+ if (rc.kb_numlock_enable == LAB_STATE_ENABLED) {
locked |= (xkb_mod_mask_t)1 << num_idx;
- } else {
+ } else if (rc.kb_numlock_enable == LAB_STATE_DISABLED) {
locked &= ~((xkb_mod_mask_t)1 << num_idx);
}