X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=i3lock.c;h=761ed3250f4a133df008fce62df7ce73a919c7ac;hb=5aff9594aa1805af793fc670c350ae7b2cd35dfb;hp=524463f0f813445c974ca576f6175edfe9ea6a16;hpb=463d38fed634ef569dfd524a7ab7bc19ae659b00;p=i3%2Fi3lock diff --git a/i3lock.c b/i3lock.c index 524463f..761ed32 100644 --- a/i3lock.c +++ b/i3lock.c @@ -43,9 +43,9 @@ timer_obj = stop_timer(timer_obj) typedef void (*ev_callback_t)(EV_P_ ev_timer *w, int revents); +static void input_done(void); char color[7] = "ffffff"; -int inactivity_timeout = 30; uint32_t last_resolution[2]; xcb_window_t win; static xcb_cursor_t cursor; @@ -66,6 +66,7 @@ extern unlock_state_t unlock_state; extern pam_state_t pam_state; int failed_attempts = 0; bool show_failed_attempts = false; +bool retry_verification = false; static struct xkb_state *xkb_state; static struct xkb_context *xkb_context; @@ -193,6 +194,17 @@ ev_timer *stop_timer(ev_timer *timer_obj) { return NULL; } +/* + * Neccessary calls after ending input via enter or others + * + */ +static void finish_input(void) { + password[input_position] = '\0'; + unlock_state = STATE_KEY_PRESSED; + redraw_screen(); + input_done(); +} + /* * Resets pam_state to STATE_PAM_IDLE 2 seconds after an unsuccessful * authentication event. @@ -211,6 +223,12 @@ static void clear_pam_wrong(EV_P_ ev_timer *w, int revents) { /* Now free this timeout. */ STOP_TIMER(clear_pam_wrong_timeout); + + /* retry with input done during pam verification */ + if (retry_verification) { + retry_verification = false; + finish_input(); + } } static void clear_indicator_cb(EV_P_ ev_timer *w, int revents) { @@ -368,23 +386,23 @@ static void handle_key_press(xcb_key_press_event_t *event) { switch (ksym) { case XKB_KEY_j: + case XKB_KEY_m: case XKB_KEY_Return: case XKB_KEY_KP_Enter: case XKB_KEY_XF86ScreenSaver: - if (ksym == XKB_KEY_j && !ctrl) + if ((ksym == XKB_KEY_j || ksym == XKB_KEY_m) && !ctrl) break; - if (pam_state == STATE_PAM_WRONG) + if (pam_state == STATE_PAM_WRONG) { + retry_verification = true; return; + } if (skip_without_validation()) { clear_input(); return; } - password[input_position] = '\0'; - unlock_state = STATE_KEY_PRESSED; - redraw_screen(); - input_done(); + finish_input(); skip_repeated_empty_password = true; return; default: @@ -636,10 +654,10 @@ static void maybe_close_sleep_lock_fd(void) { const char *sleep_lock_fd = getenv("XSS_SLEEP_LOCK_FD"); char *endptr; if (sleep_lock_fd && *sleep_lock_fd != 0) { - long int fd = strtol(sleep_lock_fd, &endptr, 10); - if (*endptr == 0) { - close(fd); - } + long int fd = strtol(sleep_lock_fd, &endptr, 10); + if (*endptr == 0) { + close(fd); + } } } @@ -806,10 +824,7 @@ int main(int argc, char *argv[]) { fprintf(stderr, "DPMS support has been removed from i3lock. Please see the manpage i3lock(1).\n"); break; case 'I': { - int time = 0; - if (sscanf(optarg, "%d", &time) != 1 || time < 0) - errx(EXIT_FAILURE, "invalid timeout, it must be a positive integer\n"); - inactivity_timeout = time; + fprintf(stderr, "Inactivity timeout only makes sense with DPMS, which was removed. Please see the manpage i3lock(1).\n"); break; } case 'c': { @@ -957,15 +972,22 @@ int main(int argc, char *argv[]) { image_path, cairo_status_to_string(cairo_surface_status(img))); img = NULL; } + free(image_path); } /* Pixmap on which the image is rendered to (if any) */ xcb_pixmap_t bg_pixmap = draw_image(last_resolution); - /* open the fullscreen window, already with the correct pixmap in place */ + /* Open the fullscreen window, already with the correct pixmap in place */ win = open_fullscreen_window(conn, screen, color, bg_pixmap); xcb_free_pixmap(conn, bg_pixmap); + cursor = create_cursor(conn, screen, win, curs_choice); + + /* Display the "locking…" message while trying to grab the pointer/keyboard. */ + pam_state = STATE_PAM_LOCK; + grab_pointer_and_keyboard(conn, screen, cursor); + pid_t pid = fork(); /* The pid == -1 case is intentionally ignored here: * While the child process is useful for preventing other windows from @@ -978,9 +1000,6 @@ int main(int argc, char *argv[]) { exit(EXIT_SUCCESS); } - cursor = create_cursor(conn, screen, win, curs_choice); - - grab_pointer_and_keyboard(conn, screen, cursor); /* Load the keymap again to sync the current modifier state. Since we first * loaded the keymap, there might have been changes, but starting from now, * we should get all key presses/releases due to having grabbed the @@ -992,6 +1011,10 @@ int main(int argc, char *argv[]) { if (main_loop == NULL) errx(EXIT_FAILURE, "Could not initialize libev. Bad LIBEV_FLAGS?\n"); + /* Explicitly call the screen redraw in case "locking…" message was displayed */ + pam_state = STATE_PAM_IDLE; + redraw_screen(); + struct ev_io *xcb_watcher = calloc(sizeof(struct ev_io), 1); struct ev_check *xcb_check = calloc(sizeof(struct ev_check), 1); struct ev_prepare *xcb_prepare = calloc(sizeof(struct ev_prepare), 1);