]> git.sur5r.net Git - i3/i3lock/commitdiff
Ignore empty passwd after repeated Enter keypress
authorVytautas Šaltenis <vytas@rtfb.lt>
Mon, 10 Mar 2014 20:02:27 +0000 (22:02 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 23 Mar 2014 09:07:03 +0000 (10:07 +0100)
When no ignore_empty_password flag is specified, but Enter key is held
down for some time, i3lock enters a finite, but hours-long loop
verifying empty password. Don't do that, skip empty password
verification if nothing was pressed after last Enter keypress.

Again, making the software cat-proof.

i3lock.c

index 84b4c7d14fa39cdee9c495908ed35e97231098e2..b383522f6ceac071166a30b5ecb9025f58a8f643 100644 (file)
--- a/i3lock.c
+++ b/i3lock.c
@@ -74,6 +74,7 @@ static struct xkb_keymap *xkb_keymap;
 cairo_surface_t *img = NULL;
 bool tile = false;
 bool ignore_empty_password = false;
+bool skip_repeated_empty_password = false;
 
 /* isutf, u8_dec © 2005 Jeff Bezanson, public domain */
 #define isutf(c) (((c) & 0xC0) != 0x80)
@@ -325,6 +326,16 @@ static void redraw_timeout(EV_P_ ev_timer *w, int revents) {
     free(w);
 }
 
+static bool skip_without_validation(void) {
+    if (input_position != 0)
+        return false;
+
+    if (skip_repeated_empty_password || ignore_empty_password)
+        return true;
+
+    return false;
+}
+
 /*
  * Handle key presses. Fixes state, then looks up the key symbol for the
  * given keycode, then looks up the key symbol (as UCS-2), converts it to
@@ -349,7 +360,7 @@ static void handle_key_press(xcb_key_press_event_t *event) {
     case XKB_KEY_Return:
     case XKB_KEY_KP_Enter:
     case XKB_KEY_XF86ScreenSaver:
-        if (ignore_empty_password && input_position == 0) {
+        if (skip_without_validation()) {
             clear_input();
             return;
         }
@@ -357,8 +368,13 @@ static void handle_key_press(xcb_key_press_event_t *event) {
         unlock_state = STATE_KEY_PRESSED;
         redraw_screen();
         input_done();
+        skip_repeated_empty_password = true;
         return;
+    default:
+        skip_repeated_empty_password = false;
+    }
 
+    switch (ksym) {
     case XKB_KEY_u:
         if (ctrl) {
             DEBUG("C-u pressed\n");