diff --git a/i3lock.c b/i3lock.c index 1f5e8cd..c645a00 100644 --- 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 bf9f994..9587052 100644 --- 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,