X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=slock.c;h=04665ffc8fd196828c07b5657c7cf6908599e94d;hb=d95b61cf2e94487c623cce9bfb9aa0ed1de4f7f0;hp=2a3027e5eeada19c451d7becf99c86195f298129;hpb=0a43b78d00ebac574376ffd93223a751e21e265e;p=slock.git diff --git a/slock.c b/slock.c index 2a3027e..04665ff 100644 --- a/slock.c +++ b/slock.c @@ -31,8 +31,6 @@ enum { NUMCOLS }; -#include "config.h" - struct lock { int screen; Window root, win; @@ -46,6 +44,8 @@ struct xrandr { int errbase; }; +#include "config.h" + static void die(const char *errstr, ...) { @@ -100,7 +100,7 @@ gethash(void) hash = pw->pw_passwd; #if HAVE_SHADOW_H - if (hash[0] == 'x' && hash[1] == '\0') { + if (!strcmp(hash, "x")) { struct spwd *sp; if (!(sp = getspnam(pw->pw_name))) die("slock: getspnam: cannot retrieve shadow entry. " @@ -108,7 +108,7 @@ gethash(void) hash = sp->sp_pwdp; } #else - if (hash[0] == '*' && hash[1] == '\0') { + if (!strcmp(hash, "*")) { #ifdef __OpenBSD__ if (!(pw = getpwuid_shadow(getuid()))) die("slock: getpwnam_shadow: cannot retrieve shadow entry. " @@ -130,15 +130,15 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, { XRRScreenChangeNotifyEvent *rre; char buf[32], passwd[256], *inputhash; - int num, screen, running, failure; + int num, screen, running, failure, oldc; unsigned int len, color; KeySym ksym; XEvent ev; - static int oldc = INIT; len = 0; running = 1; failure = 0; + oldc = INIT; while (running && !XNextEvent(dpy, &ev)) { if (ev.type == KeyPress) { @@ -156,9 +156,25 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, IsPFKey(ksym) || IsPrivateKeypadKey(ksym)) continue; + if (ev.xkey.state & ControlMask) { + switch (ksym) { + case XK_u: + ksym = XK_Escape; + break; + case XK_m: + ksym = XK_Return; + break; + case XK_j: + ksym = XK_Return; + break; + case XK_h: + ksym = XK_BackSpace; + break; + } + } switch (ksym) { case XK_Return: - passwd[len] = 0; + passwd[len] = '\0'; errno = 0; if (!(inputhash = crypt(passwd, hash))) fprintf(stderr, "slock: crypt: %s\n", strerror(errno)); @@ -166,7 +182,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, running = !!strcmp(inputhash, hash); if (running) { XBell(dpy, 100); - failure = True; + failure = 1; } explicit_bzero(&passwd, sizeof(passwd)); len = 0; @@ -177,7 +193,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, break; case XK_BackSpace: if (len) - passwd[len--] = 0; + passwd[--len] = '\0'; break; default: if (num && !iscntrl((int)buf[0]) && @@ -201,13 +217,21 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, rre = (XRRScreenChangeNotifyEvent*)&ev; for (screen = 0; screen < nscreens; screen++) { if (locks[screen]->win == rre->window) { - XResizeWindow(dpy, locks[screen]->win, - rre->width, rre->height); + if (rre->rotation == RR_Rotate_90 || + rre->rotation == RR_Rotate_270) + XResizeWindow(dpy, locks[screen]->win, + rre->height, rre->width); + else + XResizeWindow(dpy, locks[screen]->win, + rre->width, rre->height); XClearWindow(dpy, locks[screen]->win); + break; } } - } else for (screen = 0; screen < nscreens; screen++) - XRaiseWindow(dpy, locks[screen]->win); + } else { + for (screen = 0; screen < nscreens; screen++) + XRaiseWindow(dpy, locks[screen]->win); + } } }