]> git.sur5r.net Git - i3/i3lock/commitdiff
Show unlock indicator if password was entered during PAM verification
authorMichael Stapelberg <michael@stapelberg.de>
Fri, 25 Dec 2015 21:10:06 +0000 (22:10 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Fri, 25 Dec 2015 21:10:06 +0000 (22:10 +0100)
fixes #51

i3lock.c
unlock_indicator.c

index 3989e993242b29e2f90ba971f57442e39ad44a72..df5d952f2c1ab6b8f0436cad8943c446a672c735 100644 (file)
--- 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
index a81cef8635deb06132ff76c660013937bc0142cc..3b94d1765f2d02bb0c80df4dc8779c41231365c3 100644 (file)
@@ -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