X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=slock.c;h=e336974bae8eaf282e703a78bb29e3d34b71241c;hb=d8185d94e32f770bcf6d96a56f07fde81f1761e0;hp=47d2e2134bedea54f8ae8831ef03eb4dddef5260;hpb=b099d2fd1868a5497069b85e5af0e6148077a6ba;p=slock.git diff --git a/slock.c b/slock.c index 47d2e21..e336974 100644 --- a/slock.c +++ b/slock.c @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -18,6 +19,7 @@ #include #include #include +#include #include "arg.h" #include "util.h" @@ -31,8 +33,6 @@ enum { NUMCOLS }; -#include "config.h" - struct lock { int screen; Window root, win; @@ -46,6 +46,21 @@ struct xrandr { int errbase; }; +/* Xresources preferences */ +enum resource_type { + STRING = 0, + INTEGER = 1, + FLOAT = 2 +}; + +typedef struct { + char *name; + enum resource_type type; + void *dst; +} ResourcePref; + +#include "config.h" + static void die(const char *errstr, ...) { @@ -100,7 +115,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 +123,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 +145,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) { @@ -166,7 +181,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 +192,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 +216,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); + } } } @@ -289,6 +312,57 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) return NULL; } +int +resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) +{ + char **sdst = dst; + int *idst = dst; + float *fdst = dst; + + char fullname[256]; + char fullclass[256]; + char *type; + XrmValue ret; + + snprintf(fullname, sizeof(fullname), "%s.%s", "slock", name); + snprintf(fullclass, sizeof(fullclass), "%s.%s", "Slock", name); + fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0'; + + XrmGetResource(db, fullname, fullclass, &type, &ret); + if (ret.addr == NULL || strncmp("String", type, 64)) + return 1; + + switch (rtype) { + case STRING: + *sdst = ret.addr; + break; + case INTEGER: + *idst = strtoul(ret.addr, NULL, 10); + break; + case FLOAT: + *fdst = strtof(ret.addr, NULL); + break; + } + return 0; +} + +void +config_init(Display *dpy) +{ + char *resm; + XrmDatabase db; + ResourcePref *p; + + XrmInitialize(); + resm = XResourceManagerString(dpy); + if (!resm) + return; + + db = XrmGetStringDatabase(resm); + for (p = resources; p < resources + LEN(resources); p++) + resource_load(db, p->name, p->type, p->dst); +} + static void usage(void) { @@ -347,6 +421,8 @@ main(int argc, char **argv) { if (setuid(duid) < 0) die("slock: setuid: %s\n", strerror(errno)); + config_init(dpy); + /* check for Xrandr support */ rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase);