Ignore empty passwd after repeated Enter keypress

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.
pull/1/head
Vytautas Šaltenis 2014-03-10 22:02:27 +02:00 committed by Michael Stapelberg
parent 178b858116
commit 4ff1d7fc5c
1 changed files with 17 additions and 1 deletions

View File

@ -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");