]> git.sur5r.net Git - i3/i3lock/commitdiff
Handle MappingNotify-events (Thanks Pascal)
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 13 Mar 2011 18:31:08 +0000 (19:31 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 13 Mar 2011 18:31:08 +0000 (19:31 +0100)
i3lock.c
xcb.c

index 1f5e8cd367e78aec12dd0d17e85b7f967ca3677a..c645a0054243333c581c980bbdf784b4d5073ac3 100644 (file)
--- a/i3lock.c
+++ b/i3lock.c
@@ -34,6 +34,7 @@
 #include "cursors.h"
 
 static xcb_connection_t *conn;
+static xcb_cursor_t cursor;
 static xcb_key_symbols_t *symbols;
 static xcb_screen_t *scr;
 static pam_handle_t *pam_handle;
@@ -61,6 +62,8 @@ static void input_done() {
         exit(0);
     }
 
+    fprintf(stderr, "Authentication failure\n");
+
     /* beep on authentication failure, if enabled */
     if (beep) {
         xcb_bell(conn, 100);
@@ -218,6 +221,25 @@ void handle_visibility_notify(xcb_visibility_notify_event_t *event) {
     }
 }
 
+/*
+ * Called when the keyboard mapping changes. We update our symbols and re-grab
+ * pointer/keyboard.
+ *
+ */
+void handle_mapping_notify(xcb_mapping_notify_event_t *event) {
+    printf("mapping notify\n");
+    xcb_refresh_keyboard_mapping(symbols, event);
+
+    xcb_ungrab_pointer(conn, XCB_CURRENT_TIME);
+    xcb_ungrab_keyboard(conn, XCB_CURRENT_TIME);
+    grab_pointer_and_keyboard(conn, scr, cursor);
+
+    modeswitchmask = get_mod_mask(conn, symbols, XK_Mode_switch);
+    numlockmask = get_mod_mask(conn, symbols, XK_Num_Lock);
+
+    xcb_flush(conn);
+}
+
 /*
  * Callback function for PAM. We only react on password request callbacks.
  *
@@ -264,7 +286,6 @@ int main(int argc, char *argv[]) {
     xcb_visualtype_t *vistype;
     xcb_generic_event_t *event;
     xcb_window_t win;
-    xcb_cursor_t cursor;
     int curs_choice = CURS_NONE;
     char o;
     int optind = 0;
@@ -436,6 +457,11 @@ int main(int argc, char *argv[]) {
             continue;
         }
 
+        if (type == XCB_MAPPING_NOTIFY) {
+            handle_mapping_notify((xcb_mapping_notify_event_t*)event);
+            continue;
+        }
+
         printf("WARNING: unhandled event of type %d\n", type);
     }
 
diff --git a/xcb.c b/xcb.c
index bf9f9948c134e5c4468189b18e64c77f27d3b9a7..95870525c7de3db7ccc91d5b7631550835b56000 100644 (file)
--- a/xcb.c
+++ b/xcb.c
@@ -191,9 +191,6 @@ void grab_pointer_and_keyboard(xcb_connection_t *conn, xcb_screen_t *screen, xcb
         usleep(50);
     }
 
-    if (cursor != XCB_NONE)
-        xcb_free_cursor(conn, cursor);
-
     while (tries-- > 0) {
         kcookie = xcb_grab_keyboard(
             conn,