From dd249df5ebd0df7e13ee3b6626c932d798f83d03 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 1 Jan 2025 06:10:47 +0530 Subject: [PATCH] Dont encode enter, tab and backspace when lock mods are set Otherwise user cant type reset when num lock is set. --- kitty/key_encoding.c | 9 +++++++++ kitty_tests/keys.py | 3 +++ 2 files changed, 12 insertions(+) diff --git a/kitty/key_encoding.c b/kitty/key_encoding.c index 7e416341e..1683d1104 100644 --- a/kitty/key_encoding.c +++ b/kitty/key_encoding.c @@ -10,6 +10,7 @@ typedef enum { SHIFT=1, ALT=2, CTRL=4, SUPER=8, HYPER=16, META=32, CAPS_LOCK=64, NUM_LOCK=128} ModifierMasks; typedef enum { PRESS = 0, REPEAT = 1, RELEASE = 2} KeyAction; +#define LOCK_MASK (CAPS_LOCK | NUM_LOCK) typedef struct { uint32_t key, shifted_key, alternate_key; struct { @@ -186,6 +187,14 @@ encode_function_key(const KeyEvent *ev, char *output) { int num = legacy_functional_key_encoding_with_modifiers(key_number, ev, output); if (num > -1) return num; } + if (!(ev->mods.value & ~LOCK_MASK) && !ev->report_text) { + switch(key_number) { + case GLFW_FKEY_ENTER: if (ev->action == RELEASE) return -1; SIMPLE("\r"); + case GLFW_FKEY_BACKSPACE: if (ev->action == RELEASE) return -1; SIMPLE("\x7f"); + case GLFW_FKEY_TAB: if (ev->action == RELEASE) return -1; SIMPLE("\t"); + default: break; + } + } #undef SIMPLE #define S(number, trailer) key_number = number; csi_trailer = trailer; break switch(key_number) { diff --git a/kitty_tests/keys.py b/kitty_tests/keys.py index 76f8799fd..ba078dac0 100644 --- a/kitty_tests/keys.py +++ b/kitty_tests/keys.py @@ -441,6 +441,9 @@ class TestKeys(BaseTest): tq = partial(enc, key_encoding_flags=0b11) ae(tq(defines.GLFW_FKEY_BACKSPACE), '\x7f') ae(tq(defines.GLFW_FKEY_BACKSPACE, action=release), '') + tq = partial(enc, key_encoding_flags=0b11, mods=num_lock|caps_lock) + ae(tq(defines.GLFW_FKEY_ENTER), '\r') + ae(tq(defines.GLFW_FKEY_ENTER, action=release), '') # test alternate key reporting aq = partial(enc, key_encoding_flags=0b100)