From 59705b05b5533bcb78d4c92966379914aa7b656d Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 25 Dec 2015 22:10:06 +0100 Subject: [PATCH] Show unlock indicator if password was entered during PAM verification fixes #51 --- i3lock.c | 27 ++++++++++++--------------- unlock_indicator.c | 4 +++- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/i3lock.c b/i3lock.c index 3989e99..df5d952 100644 --- a/i3lock.c +++ b/i3lock.c @@ -201,7 +201,6 @@ ev_timer *stop_timer(ev_timer *timer_obj) { static void clear_pam_wrong(EV_P_ ev_timer *w, int revents) { DEBUG("clearing pam wrong\n"); pam_state = STATE_PAM_IDLE; - unlock_state = STATE_STARTED; redraw_screen(); /* Clear modifier string. */ @@ -223,15 +222,6 @@ static void clear_input(void) { input_position = 0; clear_password_memory(); password[input_position] = '\0'; - - /* Hide the unlock indicator after a bit if the password buffer is - * empty. */ - if (unlock_indicator) { - START_TIMER(clear_indicator_timeout, 1.0, clear_indicator_cb); - unlock_state = STATE_BACKSPACE_ACTIVE; - redraw_screen(); - unlock_state = STATE_KEY_PRESSED; - } } static void discard_passwd_cb(EV_P_ ev_timer *w, int revents) { @@ -242,6 +232,7 @@ static void discard_passwd_cb(EV_P_ ev_timer *w, int revents) { static void input_done(void) { STOP_TIMER(clear_pam_wrong_timeout); pam_state = STATE_PAM_VERIFY; + unlock_state = STATE_STARTED; redraw_screen(); if (pam_authenticate(pam_handle, 0) == PAM_SUCCESS) { @@ -398,17 +389,23 @@ static void handle_key_press(xcb_key_press_event_t *event) { switch (ksym) { case XKB_KEY_u: - if (ctrl) { + case XKB_KEY_Escape: + if ((ksym == XKB_KEY_u && ctrl) || + ksym == XKB_KEY_Escape) { DEBUG("C-u pressed\n"); clear_input(); + /* Hide the unlock indicator after a bit if the password buffer is + * empty. */ + if (unlock_indicator) { + START_TIMER(clear_indicator_timeout, 1.0, clear_indicator_cb); + unlock_state = STATE_BACKSPACE_ACTIVE; + redraw_screen(); + unlock_state = STATE_KEY_PRESSED; + } return; } break; - case XKB_KEY_Escape: - clear_input(); - return; - case XKB_KEY_Delete: case XKB_KEY_KP_Delete: /* Deleting forward doesn’t make sense, as i3lock doesn’t allow you diff --git a/unlock_indicator.c b/unlock_indicator.c index a81cef8..3b94d17 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -140,7 +140,8 @@ xcb_pixmap_t draw_image(uint32_t *resolution) { cairo_fill(xcb_ctx); } - if (unlock_state >= STATE_KEY_PRESSED && unlock_indicator) { + if (unlock_indicator && + (unlock_state >= STATE_KEY_PRESSED || pam_state > STATE_PAM_IDLE)) { cairo_scale(ctx, scaling_factor(), scaling_factor()); /* Draw a (centered) circle with transparent background. */ cairo_set_line_width(ctx, 10.0); @@ -322,6 +323,7 @@ xcb_pixmap_t draw_image(uint32_t *resolution) { * */ void redraw_screen(void) { + DEBUG("redraw_screen(unlock_state = %d, pam_state = %d)\n", unlock_state, pam_state); xcb_pixmap_t bg_pixmap = draw_image(last_resolution); xcb_change_window_attributes(conn, win, XCB_CW_BACK_PIXMAP, (uint32_t[1]){bg_pixmap}); /* XXX: Possible optimization: Only update the area in the middle of the -- 2.39.2