diff --git a/include/swaylock.h b/include/swaylock.h index 56cee3b..f3ed374 100644 --- a/include/swaylock.h +++ b/include/swaylock.h @@ -50,6 +50,7 @@ struct swaylock_args { bool show_indicator; bool show_caps_lock_text; bool show_caps_lock_indicator; + bool show_failed_attempts; bool daemonize; }; @@ -73,6 +74,7 @@ struct swaylock_state { struct swaylock_password password; struct swaylock_xkb xkb; enum auth_state auth_state; + int failed_attempts; bool run_display; struct zxdg_output_manager_v1 *zxdg_output_manager; }; diff --git a/main.c b/main.c index 488d46f..c16dba3 100644 --- a/main.c +++ b/main.c @@ -508,6 +508,7 @@ static int parse_options(int argc, char **argv, struct swaylock_state *state, {"scaling", required_argument, NULL, 's'}, {"tiling", no_argument, NULL, 't'}, {"no-unlock-indicator", no_argument, NULL, 'u'}, + {"show-failed-attempts", no_argument, NULL, 'F'}, {"version", no_argument, NULL, 'v'}, {"bs-hl-color", required_argument, NULL, LO_BS_HL_COLOR}, {"caps-lock-bs-hl-color", required_argument, NULL, LO_CAPS_LOCK_BS_HL_COLOR}, @@ -567,6 +568,8 @@ static int parse_options(int argc, char **argv, struct swaylock_state *state, "Same as --scaling=tile.\n" " -u, --no-unlock-indicator " "Disable the unlock indicator.\n" + " -F, --show-failed-attempts " + "Show current count of failed authentication attempts.\n" " -v, --version " "Show the version number and quit.\n" " --bs-hl-color " @@ -644,7 +647,7 @@ static int parse_options(int argc, char **argv, struct swaylock_state *state, optind = 1; while (1) { int opt_idx = 0; - c = getopt_long(argc, argv, "c:defhi:Llnrs:tuvC:", long_options, + c = getopt_long(argc, argv, "c:deFfhi:Llnrs:tuvC:", long_options, &opt_idx); if (c == -1) { break; @@ -716,6 +719,11 @@ static int parse_options(int argc, char **argv, struct swaylock_state *state, state->args.show_indicator = false; } break; + case 'F': + if (state) { + state->args.show_failed_attempts = true; + } + break; case 'v': fprintf(stdout, "swaylock version " SWAYLOCK_VERSION "\n"); exit(EXIT_SUCCESS); @@ -961,6 +969,7 @@ static void comm_in(int fd, short mask, void *data) { } else { state.auth_state = AUTH_STATE_INVALID; schedule_indicator_clear(&state); + ++state.failed_attempts; damage_state(&state); } } @@ -970,6 +979,7 @@ int main(int argc, char **argv) { initialize_pw_backend(argc, argv); enum line_mode line_mode = LM_LINE; + state.failed_attempts = 0; state.args = (struct swaylock_args){ .mode = BACKGROUND_MODE_FILL, .font = strdup("sans-serif"), @@ -978,7 +988,8 @@ int main(int argc, char **argv) { .ignore_empty = false, .show_indicator = true, .show_caps_lock_indicator = false, - .show_caps_lock_text = true + .show_caps_lock_text = true, + .show_failed_attempts = false }; wl_list_init(&state.images); set_default_colors(&state.args.colors); diff --git a/render.c b/render.c index 25b75f0..cf6de2a 100644 --- a/render.c +++ b/render.c @@ -86,6 +86,7 @@ void render_frame(struct swaylock_surface *surface) { // Draw a message char *text = NULL; + char attempts[4]; // like i3lock: count no more than 999 set_color_for_state(cairo, state, &state->args.colors.text); cairo_select_font_face(cairo, state->args.font, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); @@ -103,8 +104,17 @@ void render_frame(struct swaylock_surface *surface) { case AUTH_STATE_INPUT: case AUTH_STATE_INPUT_NOP: case AUTH_STATE_BACKSPACE: + // Caps Lock has higher priority if (state->xkb.caps_lock && state->args.show_caps_lock_text) { text = "Caps Lock"; + } else if (state->args.show_failed_attempts && + state->failed_attempts > 0) { + if (state->failed_attempts > 999) { + text = "999+"; + } else { + snprintf(attempts, sizeof(attempts), "%d", state->failed_attempts); + text = attempts; + } } break; default: diff --git a/swaylock.1.scd b/swaylock.1.scd index 9f7d88c..9c5ab46 100644 --- a/swaylock.1.scd +++ b/swaylock.1.scd @@ -54,6 +54,9 @@ Locks your Wayland session. *-l, --indicator-caps-lock* Show the current Caps Lock state also on the indicator. +*-F, --show-failed-attempts* + Show the number of failed authentication attempts on the indicator. + *-s, --scaling* Scaling mode for images: _stretch_, _fill_, _fit_, _center_, or _tile_. Use the additional mode _solid\_color_ to display only the background color, even