diff options
author | Michael Stapelberg <michael@stapelberg.de> | 2011-03-13 19:31:08 +0100 |
---|---|---|
committer | Michael Stapelberg <michael@stapelberg.de> | 2011-03-13 19:31:08 +0100 |
commit | c14cb4a250d1b4ad63a741d4868ad7f06ff4bd3f (patch) | |
tree | 775abd83fac6a246f0d5a6a1b7e12b1671848ed2 | |
parent | a93f1105842eb1fa64587da36a92c7d17fffa3bd (diff) |
Handle MappingNotify-events (Thanks Pascal)
-rw-r--r-- | i3lock.c | 28 | ||||
-rw-r--r-- | xcb.c | 3 |
2 files changed, 27 insertions, 4 deletions
@@ -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); @@ -219,6 +222,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); } @@ -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, |