]> git.sur5r.net Git - i3/i3lock/blobdiff - i3lock.c
Bugfix: correctly check for errors when connecting to X11
[i3/i3lock] / i3lock.c
index 2d2cc89c13df791a615226158b646a4496a0154e..1f5e8cd367e78aec12dd0d17e85b7f967ca3677a 100644 (file)
--- a/i3lock.c
+++ b/i3lock.c
@@ -120,23 +120,22 @@ 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;
         return;
 
     case XK_Return:
+    case XK_KP_Enter:
         input_done();
     case XK_Escape:
         input_position = 0;
@@ -157,6 +156,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));
@@ -337,8 +347,9 @@ int main(int argc, char *argv[]) {
         errx(EXIT_FAILURE, "PAM: %s\n", pam_strerror(pam_handle, ret));
 
     /* Initialize connection to X11 */
-    if ((conn = xcb_connect(NULL, &screen)) == NULL)
-        err(EXIT_FAILURE, "xcb_connect()");
+    if ((conn = xcb_connect(NULL, &screen)) == NULL ||
+        xcb_connection_has_error(conn))
+        errx(EXIT_FAILURE, "Could not connect to X11, maybe you need to set DISPLAY?");
 
     if (!dont_fork) {
         /* In the parent process, we exit */