i3lock-color

The world's most popular non-default computer lockscreen.
Index Commits Files Refs README LICENSE
commit f891929d34b1ddad224550c1dbf15c542e59c106
parent 3a22727bffbf9519ed81e7cce7a73ed0774788db
Author: Michael Stapelberg <michael@stapelberg.de>
Date:   Mon,  8 Nov 2010 14:39:53 +0100

Bugfix: Handle numpad keys correctly (Thanks Pascal)

Diffstat:
Mi3lock.c | 31++++++++++++++++++++-----------
Mkeysym2ucs.c | 4++++
2 files changed, 24 insertions(+), 11 deletions(-)
diff --git a/i3lock.c b/i3lock.c
@@ -120,17 +120,15 @@ static void handle_key_release(xcb_key_release_event_t *event) {
 static void handle_key_press(xcb_key_press_event_t *event) {
     //printf("keypress %d, state raw = %d\n", event->detail, event->state);
 
-    /* fix state */
-    if (modeswitch_active)
-            event->state |= modeswitchmask;
-
-    /* Apparantly, after activating numlock once, the numlock modifier
-     * stays turned on (use xev(1) to verify). So, to resolve useful
-     * keysyms, we remove the numlock flag from the event state */
-    event->state &= ~numlockmask;
-
-    xcb_keysym_t sym = xcb_key_press_lookup_keysym(symbols, event, event->state);
-    switch (sym) {
+    xcb_keysym_t sym0, sym1, sym;
+    if (modeswitch_active) {
+        sym0 = xcb_key_press_lookup_keysym(symbols, event, 4);
+        sym1 = xcb_key_press_lookup_keysym(symbols, event, 5);
+    } else {
+        sym0 = xcb_key_press_lookup_keysym(symbols, event, 0);
+        sym1 = xcb_key_press_lookup_keysym(symbols, event, 1);
+    }
+    switch (sym0) {
     case XK_Mode_switch:
         //printf("Mode switch enabled\n");
         modeswitch_active = true;
@@ -157,6 +155,17 @@ static void handle_key_press(xcb_key_press_event_t *event) {
     if ((input_position + 8) >= sizeof(password))
         return;
 
+    if ((event->state & numlockmask) && xcb_is_keypad_key(sym1)) {
+        /* this key was a keypad key */
+        if ((event->state & XCB_MOD_MASK_SHIFT))
+            sym = sym0;
+        else sym = sym1;
+    } else {
+        if ((event->state & XCB_MOD_MASK_SHIFT))
+            sym = sym1;
+        else sym = sym0;
+    }
+
 #if 0
     /* FIXME: handle all of these? */
     printf("is_keypad_key = %d\n", xcb_is_keypad_key(sym));
diff --git a/keysym2ucs.c b/keysym2ucs.c
@@ -825,6 +825,10 @@ long keysym2ucs(xcb_keysym_t keysym)
         (keysym >= 0x00a0 && keysym <= 0x00ff))
         return keysym;
 
+    /* check for numpad keys (direct mapping) */
+    if ((keysym >= 0xff80 && keysym <= 0xffb9))
+        return keysym & 0x7F;
+
     /* also check for directly encoded 24-bit UCS characters */
     if ((keysym & 0xff000000) == 0x01000000)
     return keysym & 0x00ffffff;