From 2eba4e5832e2d91e1a927046ed20578573cbb86c Mon Sep 17 00:00:00 2001 From: Lauri Kasanen Date: Fri, 13 Dec 2013 14:27:06 +0200 Subject: [PATCH] Better lock key handling --- kdrive/src/kinput.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/kdrive/src/kinput.c b/kdrive/src/kinput.c index 4dc93a5..39a0beb 100644 --- a/kdrive/src/kinput.c +++ b/kdrive/src/kinput.c @@ -1195,6 +1195,7 @@ static void KdCheckLock(void) void KdEnqueueKeyboardEvent(unsigned char scan_code, unsigned char is_up) { unsigned char key_code; + static unsigned int locks = 0; xEvent xE; @@ -1218,18 +1219,19 @@ void KdEnqueueKeyboardEvent(unsigned char scan_code, unsigned char is_up) xE.u.u.type = KeyPress; xE.u.u.detail = key_code; - switch (KEYCOL1(key_code)) { - case XK_Num_Lock: - case XK_Scroll_Lock: - case XK_Shift_Lock: - case XK_Caps_Lock: - if (xE.u.u.type == KeyRelease) - return; - if (IsKeyDown(key_code)) - xE.u.u.type = KeyRelease; - else - xE.u.u.type = KeyPress; + // Handle toggling keys + if (xE.u.u.type == KeyPress) { + switch (KEYCOL1(key_code)) { + case XK_Num_Lock: + locks ^= Mod2Mask; + break; + case XK_Shift_Lock: + case XK_Caps_Lock: + locks ^= LockMask; + break; + } } + keyc->state |= locks; /* * Check pressed keys which are already down