]> git.sur5r.net Git - i3/i3lock/commitdiff
Add `-e` option to not validate empty password.
authorVincent Bernat <bernat@luffy.cx>
Mon, 26 Aug 2013 21:39:38 +0000 (23:39 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 31 Aug 2013 18:41:12 +0000 (20:41 +0200)
When the XF86ScreenSaver key is used to put a laptop to sleep (or to
trigger the screensaver), the key may "bounce" on resume. This is
annoying as i3lock will try to validate several empty passwords and
wait several seconds before accepting a legit password.

Some users may want to validate an empty password: PAM may rely on
other sources to unlock the screen, like the presence of a token or
the proximity of some Bluetooth device. Hence, we don't forbid this
possibility and provide an command-line option for users not willing
to validate empty passwords.

i3lock.1
i3lock.c

index 8bc00f530a1bb518a3b28e50cb58d0735006ec63..9c349b1665e114304ee2d919345ca498551f9c31 100644 (file)
--- a/i3lock.1
+++ b/i3lock.1
@@ -27,6 +27,7 @@ i3lock \- improved screen locker
 .RB [\|\-p
 .IR pointer\|]
 .RB [\|\-u\|]
+.RB [\|\-e\|]
 
 .SH DESCRIPTION
 .B i3lock
@@ -100,6 +101,15 @@ does not hide your Mousepointer. If you specify "win",
 displays a hardcoded Windows-Pointer (thus enabling you to fuck with your
 friends by using a Screenshot of a Windows-Desktop as a locking-screen).
 
+.TP
+.B \-e, \-\-ignore-empty-password
+When an empty password is provided by the user, do not validate
+it. Without this option, the empty password will be provided to PAM
+and, if invalid, the user will have to wait a few seconds before
+another try. This can be useful if the XF86ScreenSaver key is used to
+put a laptop to sleep and bounce on resume or if you happen to wake up
+your computer with the enter key.
+
 .SH SEE ALSO
 .IR xautolock(1)
 \- use i3lock as your screen saver
index e5654d61a326e2e7bbed032c36e23ae9dc75d6d6..a4e087058124c9eea45f3c59c8ef66fc01244299 100644 (file)
--- a/i3lock.c
+++ b/i3lock.c
@@ -60,6 +60,7 @@ static struct xkb_keymap *xkb_keymap;
 
 cairo_surface_t *img = NULL;
 bool tile = false;
+bool ignore_empty_password = false;
 
 /* isutf, u8_dec © 2005 Jeff Bezanson, public domain */
 #define isutf(c) (((c) & 0xC0) != 0x80)
@@ -267,6 +268,10 @@ 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) {
+            clear_input();
+            return;
+        }
         password[input_position] = '\0';
         unlock_state = STATE_KEY_PRESSED;
         redraw_screen();
@@ -533,13 +538,14 @@ int main(int argc, char *argv[]) {
         {"no-unlock-indicator", no_argument, NULL, 'u'},
         {"image", required_argument, NULL, 'i'},
         {"tiling", no_argument, NULL, 't'},
+        {"ignore-empty-password", no_argument, NULL, 'e'},
         {NULL, no_argument, NULL, 0}
     };
 
     if ((username = getenv("USER")) == NULL)
         errx(1, "USER environment variable not set, please set it.\n");
 
-    while ((o = getopt_long(argc, argv, "hvnbdc:p:ui:t", longopts, &optind)) != -1) {
+    while ((o = getopt_long(argc, argv, "hvnbdc:p:ui:te", longopts, &optind)) != -1) {
         switch (o) {
         case 'v':
             errx(EXIT_SUCCESS, "version " VERSION " © 2010-2012 Michael Stapelberg");
@@ -582,6 +588,9 @@ int main(int argc, char *argv[]) {
                 errx(1, "i3lock: Invalid pointer type given. Expected one of \"win\" or \"default\".\n");
             }
             break;
+        case 'e':
+            ignore_empty_password = true;
+            break;
         case 0:
             if (strcmp(longopts[optind].name, "debug") == 0)
                 debug_mode = true;