Before this commit, only pressing Escape would reset the input.  This commit
makes Ctrl-u do the same.  Rationale: it more closely mimics behavior of
login(1)/getpass(3).
---
 slock.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/slock.c b/slock.c
index c9cdee2..c3c3ebc 100644
--- a/slock.c
+++ b/slock.c
@@ -125,6 +125,7 @@ readpw(Display *dpy, const char *pws)
        KeySym ksym;
        XEvent ev;
        static int oldc = INIT;
+       Bool control_pressed;

        len = 0;
        running = True;
@@ -137,6 +138,7 @@ readpw(Display *dpy, const char *pws)
                if (ev.type == KeyPress) {
                        buf[0] = 0;
                        num = XLookupString(&ev.xkey, buf, sizeof(buf), &ksym, 
0);
+                       control_pressed = !!(ev.xkey.state & ControlMask);
                        if (IsKeypadKey(ksym)) {
                                if (ksym == XK_KP_Enter)
                                        ksym = XK_Return;
@@ -171,7 +173,9 @@ readpw(Display *dpy, const char *pws)
                                        --len;
                                break;
                        default:
-                               if (num && !iscntrl((int)buf[0]) && (len + num 
< sizeof(passwd))) {
+                               if (control_pressed && ksym == XK_u) {
+                                       len = 0;
+                               } else if (num && !iscntrl((int)buf[0]) && (len 
+ num < sizeof(passwd))) {
                                        memcpy(passwd + len, buf, num);
                                        len += num;
                                }

Reply via email to