summaryrefslogtreecommitdiff
path: root/i3lock.c
diff options
context:
space:
mode:
authorMichael Stapelberg <michael@stapelberg.de>2011-03-13 19:31:08 +0100
committerMichael Stapelberg <michael@stapelberg.de>2011-03-13 19:31:08 +0100
commitc14cb4a250d1b4ad63a741d4868ad7f06ff4bd3f (patch)
tree775abd83fac6a246f0d5a6a1b7e12b1671848ed2 /i3lock.c
parenta93f1105842eb1fa64587da36a92c7d17fffa3bd (diff)
Handle MappingNotify-events (Thanks Pascal)
Diffstat (limited to 'i3lock.c')
-rw-r--r--i3lock.c28
1 files changed, 27 insertions, 1 deletions
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);
@@ -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);
}