From 5214f4e3ea62575ad3f214493436f6aafc0eb7a0 Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Sat, 5 Mar 2022 15:26:44 -0500 Subject: Rewrite with dwmlogo pam xresources --- config.def.h | 58 ++++--- config.mk | 14 +- patch/slock-dwmlogo-20210324.diff | 246 +++++++++++++++++++++++++++ patch/slock-pam_auth-20190207-35633d4.diff | 154 +++++++++++++++++ patch/slock-xresources-20191126-53e56c7.diff | 159 +++++++++++++++++ patches/slock-dpms-1.4.diff | 62 ------- patches/slock-key-feedback.diff | 113 ------------ patches/slock-pam_auth-20190207-35633d4.diff | 154 ----------------- patches/slock-quickcancel-1.4.diff | 66 ------- slock.c | 223 +++++++++++++++--------- util.h | 3 + 11 files changed, 752 insertions(+), 500 deletions(-) create mode 100644 patch/slock-dwmlogo-20210324.diff create mode 100644 patch/slock-pam_auth-20190207-35633d4.diff create mode 100644 patch/slock-xresources-20191126-53e56c7.diff delete mode 100644 patches/slock-dpms-1.4.diff delete mode 100644 patches/slock-key-feedback.diff delete mode 100644 patches/slock-pam_auth-20190207-35633d4.diff delete mode 100644 patches/slock-quickcancel-1.4.diff diff --git a/config.def.h b/config.def.h index 6c22796..9a0dac3 100644 --- a/config.def.h +++ b/config.def.h @@ -3,34 +3,44 @@ static const char *user = "master"; static const char *group = "wheel"; static const char *colorname[NUMCOLS] = { - [INIT] = "black", /* after initialization */ - [INPUT] = "#7D4B23", /* during input */ - [FAILED] = "#B7416E", /* wrong password */ - [BLOCKS] = "#f2f1f0", /* key feedback block */ - [PAM] = "#19B596", /* waiting for PAM */ + [BACKGROUND] = "black", /* after initialization */ + [INIT] = "#2d2d2d", /* after initialization */ + [INPUT] = "#005577", /* during input */ + [FAILED] = "#cc3333", /* wrong password */ + [PAM] = "#9400d3", /* waiting for PAM */ +}; + +/* + * Xresources preferences to load at startup + */ +ResourcePref resources[] = { + { "color11", STRING, &colorname[INIT] }, + { "color6", STRING, &colorname[INPUT] }, + { "color4", STRING, &colorname[FAILED] }, + { "color2", STRING, &colorname[PAM] }, }; /* treat a cleared input like a wrong password (color) */ static const int failonclear = 1; -/* PAM service that's used for authentication */ -static const char* pam_service = "login"; - -// ### Blocks bar ### -static short int blocks_enabled = 1; // 0 = don't show blocks -static const int blocks_width = 0; // 0 = full width -static const int blocks_height = 16; - -// position -static const int blocks_x = 0; -static const int blocks_y = 0; - -// Number of blocks -static const int blocks_count = 10; -// ### \Blocks bar ### +/* insert grid pattern with scale 1:1, the size can be changed with logosize */ +static const int logosize = 75; +static const int logow = 12; /* grid width and height for right center alignment*/ +static const int logoh = 6; + +static XRectangle rectangles[9] = { + /* x y w h */ + { 0, 3, 1, 3 }, + { 1, 3, 2, 1 }, + { 0, 5, 8, 1 }, + { 3, 0, 1, 5 }, + { 5, 3, 1, 2 }, + { 7, 3, 1, 2 }, + { 8, 3, 4, 1 }, + { 9, 4, 1, 2 }, + { 11, 4, 1, 2 }, +}; -/* time in seconds to cancel lock with mouse movement */ -static const int timetocancel = 4; -/* time in seconds before the monitor shuts down */ -static const int monitortime = 5; +/* PAM service that's used for authentication */ +static const char* pam_service = "login"; diff --git a/config.mk b/config.mk index 2f85023..3fd23fb 100644 --- a/config.mk +++ b/config.mk @@ -10,12 +10,20 @@ MANPREFIX = ${PREFIX}/share/man X11INC = /usr/X11R6/include X11LIB = /usr/X11R6/lib +# Xinerama, comment if you don't want it +XINERAMALIBS = -lXinerama +XINERAMAFLAGS = -DXINERAMA + +# freetype +FREETYPELIBS = -lXft +FREETYPEINC = /usr/include/freetype2 + # includes and libs -INCS = -I. -I/usr/include -I${X11INC} -LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lpam +INCS = -I. -I/usr/include -I${X11INC} -I${FREETYPEINC} +LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lXext -lXrandr -lpam # flags -CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H +CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H ${XINERAMAFLAGS} CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} LDFLAGS = -s ${LIBS} COMPATSRC = explicit_bzero.c diff --git a/patch/slock-dwmlogo-20210324.diff b/patch/slock-dwmlogo-20210324.diff new file mode 100644 index 0000000..90625ea --- /dev/null +++ b/patch/slock-dwmlogo-20210324.diff @@ -0,0 +1,246 @@ +diff --git a/config.def.h b/config.def.h +index 9855e21..0940fb8 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -3,10 +3,30 @@ static const char *user = "nobody"; + static const char *group = "nogroup"; + + static const char *colorname[NUMCOLS] = { +- [INIT] = "black", /* after initialization */ ++ [BACKGROUND] = "black", /* after initialization */ ++ [INIT] = "#2d2d2d", /* after initialization */ + [INPUT] = "#005577", /* during input */ + [FAILED] = "#CC3333", /* wrong password */ + }; + + /* treat a cleared input like a wrong password (color) */ + static const int failonclear = 1; ++ ++/* insert grid pattern with scale 1:1, the size can be changed with logosize */ ++static const int logosize = 75; ++static const int logow = 12; /* grid width and height for right center alignment*/ ++static const int logoh = 6; ++ ++static XRectangle rectangles[9] = { ++ /* x y w h */ ++ { 0, 3, 1, 3 }, ++ { 1, 3, 2, 1 }, ++ { 0, 5, 8, 1 }, ++ { 3, 0, 1, 5 }, ++ { 5, 3, 1, 2 }, ++ { 7, 3, 1, 2 }, ++ { 8, 3, 4, 1 }, ++ { 9, 4, 1, 2 }, ++ { 11, 4, 1, 2 }, ++ ++}; +diff --git a/config.mk b/config.mk +index 74429ae..08356e8 100644 +--- a/config.mk ++++ b/config.mk +@@ -10,12 +10,20 @@ MANPREFIX = ${PREFIX}/share/man + X11INC = /usr/X11R6/include + X11LIB = /usr/X11R6/lib + ++# Xinerama, comment if you don't want it ++XINERAMALIBS = -lXinerama ++XINERAMAFLAGS = -DXINERAMA ++ ++# freetype ++FREETYPELIBS = -lXft ++FREETYPEINC = /usr/include/freetype2 ++ + # includes and libs +-INCS = -I. -I/usr/include -I${X11INC} +-LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr ++INCS = -I. -I/usr/include -I${X11INC} -I${FREETYPEINC} ++LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lXext -lXrandr + + # flags +-CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H ++CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H ${XINERAMAFLAGS} + CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} + LDFLAGS = -s ${LIBS} + COMPATSRC = explicit_bzero.c +diff --git a/slock.c b/slock.c +index 5ae738c..3ea9b7f 100644 +--- a/slock.c ++++ b/slock.c +@@ -1,5 +1,6 @@ + /* See LICENSE file for license details. */ +-#define _XOPEN_SOURCE 500 ++#define _XOPEN_SOURCE 500 ++#define LENGTH(X) (sizeof X / sizeof X[0]) + #if HAVE_SHADOW_H + #include + #endif +@@ -15,9 +16,13 @@ + #include + #include + #include ++#ifdef XINERAMA ++#include ++#endif + #include + #include + #include ++#include + + #include "arg.h" + #include "util.h" +@@ -25,17 +30,25 @@ + char *argv0; + + enum { ++ BACKGROUND, + INIT, + INPUT, + FAILED, + NUMCOLS + }; + ++#include "config.h" ++ + struct lock { + int screen; + Window root, win; + Pixmap pmap; + unsigned long colors[NUMCOLS]; ++ unsigned int x, y; ++ unsigned int xoff, yoff, mw, mh; ++ Drawable drawable; ++ GC gc; ++ XRectangle rectangles[LENGTH(rectangles)]; + }; + + struct xrandr { +@@ -44,8 +57,6 @@ struct xrandr { + int errbase; + }; + +-#include "config.h" +- + static void + die(const char *errstr, ...) + { +@@ -124,6 +135,32 @@ gethash(void) + return hash; + } + ++static void ++resizerectangles(struct lock *lock) ++{ ++ int i; ++ ++ for (i = 0; i < LENGTH(rectangles); i++){ ++ lock->rectangles[i].x = (rectangles[i].x * logosize) ++ + lock->xoff + ((lock->mw) / 2) - (logow / 2 * logosize); ++ lock->rectangles[i].y = (rectangles[i].y * logosize) ++ + lock->yoff + ((lock->mh) / 2) - (logoh / 2 * logosize); ++ lock->rectangles[i].width = rectangles[i].width * logosize; ++ lock->rectangles[i].height = rectangles[i].height * logosize; ++ } ++} ++ ++static void ++drawlogo(Display *dpy, struct lock *lock, int color) ++{ ++ XSetForeground(dpy, lock->gc, lock->colors[BACKGROUND]); ++ XFillRectangle(dpy, lock->drawable, lock->gc, 0, 0, lock->x, lock->y); ++ XSetForeground(dpy, lock->gc, lock->colors[color]); ++ XFillRectangles(dpy, lock->drawable, lock->gc, lock->rectangles, LENGTH(rectangles)); ++ XCopyArea(dpy, lock->drawable, lock->win, lock->gc, 0, 0, lock->x, lock->y, 0, 0); ++ XSync(dpy, False); ++} ++ + static void + readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, + const char *hash) +@@ -190,10 +227,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, + color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT); + if (running && oldc != color) { + for (screen = 0; screen < nscreens; screen++) { +- XSetWindowBackground(dpy, +- locks[screen]->win, +- locks[screen]->colors[color]); +- XClearWindow(dpy, locks[screen]->win); ++ drawlogo(dpy, locks[screen], color); + } + oldc = color; + } +@@ -228,6 +262,10 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) + XColor color, dummy; + XSetWindowAttributes wa; + Cursor invisible; ++#ifdef XINERAMA ++ XineramaScreenInfo *info; ++ int n; ++#endif + + if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(struct lock)))) + return NULL; +@@ -241,12 +279,31 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) + lock->colors[i] = color.pixel; + } + ++ lock->x = DisplayWidth(dpy, lock->screen); ++ lock->y = DisplayHeight(dpy, lock->screen); ++#ifdef XINERAMA ++ if ((info = XineramaQueryScreens(dpy, &n))) { ++ lock->xoff = info[0].x_org; ++ lock->yoff = info[0].y_org; ++ lock->mw = info[0].width; ++ lock->mh = info[0].height; ++ } else ++#endif ++ { ++ lock->xoff = lock->yoff = 0; ++ lock->mw = lock->x; ++ lock->mh = lock->y; ++ } ++ lock->drawable = XCreatePixmap(dpy, lock->root, ++ lock->x, lock->y, DefaultDepth(dpy, screen)); ++ lock->gc = XCreateGC(dpy, lock->root, 0, NULL); ++ XSetLineAttributes(dpy, lock->gc, 1, LineSolid, CapButt, JoinMiter); ++ + /* init */ + wa.override_redirect = 1; +- wa.background_pixel = lock->colors[INIT]; ++ wa.background_pixel = lock->colors[BACKGROUND]; + lock->win = XCreateWindow(dpy, lock->root, 0, 0, +- DisplayWidth(dpy, lock->screen), +- DisplayHeight(dpy, lock->screen), ++ lock->x, lock->y, + 0, DefaultDepth(dpy, lock->screen), + CopyFromParent, + DefaultVisual(dpy, lock->screen), +@@ -256,6 +313,8 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) + &color, &color, 0, 0); + XDefineCursor(dpy, lock->win, invisible); + ++ resizerectangles(lock); ++ + /* Try to grab mouse pointer *and* keyboard for 600ms, else fail the lock */ + for (i = 0, ptgrab = kbgrab = -1; i < 6; i++) { + if (ptgrab != GrabSuccess) { +@@ -276,6 +335,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) + XRRSelectInput(dpy, lock->win, RRScreenChangeNotifyMask); + + XSelectInput(dpy, lock->root, SubstructureNotifyMask); ++ drawlogo(dpy, lock, INIT); + return lock; + } + +@@ -391,5 +451,12 @@ main(int argc, char **argv) { + /* everything is now blank. Wait for the correct password */ + readpw(dpy, &rr, locks, nscreens, hash); + ++ for (nlocks = 0, s = 0; s < nscreens; s++) { ++ XFreePixmap(dpy, locks[s]->drawable); ++ XFreeGC(dpy, locks[s]->gc); ++ } ++ ++ XSync(dpy, 0); ++ XCloseDisplay(dpy); + return 0; + } diff --git a/patch/slock-pam_auth-20190207-35633d4.diff b/patch/slock-pam_auth-20190207-35633d4.diff new file mode 100644 index 0000000..136f4b5 --- /dev/null +++ b/patch/slock-pam_auth-20190207-35633d4.diff @@ -0,0 +1,154 @@ +diff --git a/config.def.h b/config.def.h +index 9855e21..19e7f62 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -6,7 +6,11 @@ static const char *colorname[NUMCOLS] = { + [INIT] = "black", /* after initialization */ + [INPUT] = "#005577", /* during input */ + [FAILED] = "#CC3333", /* wrong password */ ++ [PAM] = "#9400D3", /* waiting for PAM */ + }; + + /* treat a cleared input like a wrong password (color) */ + static const int failonclear = 1; ++ ++/* PAM service that's used for authentication */ ++static const char* pam_service = "login"; +diff --git a/config.mk b/config.mk +index 74429ae..6e82074 100644 +--- a/config.mk ++++ b/config.mk +@@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib + + # includes and libs + INCS = -I. -I/usr/include -I${X11INC} +-LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr ++LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lpam + + # flags + CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H +diff --git a/slock.c b/slock.c +index 5ae738c..3a8da42 100644 +--- a/slock.c ++++ b/slock.c +@@ -18,16 +18,22 @@ + #include + #include + #include ++#include ++#include + + #include "arg.h" + #include "util.h" + + char *argv0; ++static int pam_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr); ++struct pam_conv pamc = {pam_conv, NULL}; ++char passwd[256]; + + enum { + INIT, + INPUT, + FAILED, ++ PAM, + NUMCOLS + }; + +@@ -57,6 +63,31 @@ die(const char *errstr, ...) + exit(1); + } + ++static int ++pam_conv(int num_msg, const struct pam_message **msg, ++ struct pam_response **resp, void *appdata_ptr) ++{ ++ int retval = PAM_CONV_ERR; ++ for(int i=0; imsg_style == PAM_PROMPT_ECHO_OFF && ++ strncmp(msg[i]->msg, "Password: ", 10) == 0) { ++ struct pam_response *resp_msg = malloc(sizeof(struct pam_response)); ++ if (!resp_msg) ++ die("malloc failed\n"); ++ char *password = malloc(strlen(passwd) + 1); ++ if (!password) ++ die("malloc failed\n"); ++ memset(password, 0, strlen(passwd) + 1); ++ strcpy(password, passwd); ++ resp_msg->resp_retcode = 0; ++ resp_msg->resp = password; ++ resp[i] = resp_msg; ++ retval = PAM_SUCCESS; ++ } ++ } ++ return retval; ++} ++ + #ifdef __linux__ + #include + #include +@@ -121,6 +152,8 @@ gethash(void) + } + #endif /* HAVE_SHADOW_H */ + ++ /* pam, store user name */ ++ hash = pw->pw_name; + return hash; + } + +@@ -129,11 +162,12 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, + const char *hash) + { + XRRScreenChangeNotifyEvent *rre; +- char buf[32], passwd[256], *inputhash; +- int num, screen, running, failure, oldc; ++ char buf[32]; ++ int num, screen, running, failure, oldc, retval; + unsigned int len, color; + KeySym ksym; + XEvent ev; ++ pam_handle_t *pamh; + + len = 0; + running = 1; +@@ -160,10 +194,26 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, + case XK_Return: + passwd[len] = '\0'; + errno = 0; +- if (!(inputhash = crypt(passwd, hash))) +- fprintf(stderr, "slock: crypt: %s\n", strerror(errno)); ++ retval = pam_start(pam_service, hash, &pamc, &pamh); ++ color = PAM; ++ for (screen = 0; screen < nscreens; screen++) { ++ XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[color]); ++ XClearWindow(dpy, locks[screen]->win); ++ XRaiseWindow(dpy, locks[screen]->win); ++ } ++ XSync(dpy, False); ++ ++ if (retval == PAM_SUCCESS) ++ retval = pam_authenticate(pamh, 0); ++ if (retval == PAM_SUCCESS) ++ retval = pam_acct_mgmt(pamh, 0); ++ ++ running = 1; ++ if (retval == PAM_SUCCESS) ++ running = 0; + else +- running = !!strcmp(inputhash, hash); ++ fprintf(stderr, "slock: %s\n", pam_strerror(pamh, retval)); ++ pam_end(pamh, retval); + if (running) { + XBell(dpy, 100); + failure = 1; +@@ -339,10 +389,9 @@ main(int argc, char **argv) { + dontkillme(); + #endif + ++ /* the contents of hash are used to transport the current user name */ + hash = gethash(); + errno = 0; +- if (!crypt("", hash)) +- die("slock: crypt: %s\n", strerror(errno)); + + if (!(dpy = XOpenDisplay(NULL))) + die("slock: cannot open display\n"); diff --git a/patch/slock-xresources-20191126-53e56c7.diff b/patch/slock-xresources-20191126-53e56c7.diff new file mode 100644 index 0000000..524e338 --- /dev/null +++ b/patch/slock-xresources-20191126-53e56c7.diff @@ -0,0 +1,159 @@ +From 53e56c751b3f2be4154760788850c51dbffc0add Mon Sep 17 00:00:00 2001 +From: Arnas Udovicius +Date: Tue, 26 Nov 2019 16:16:15 +0200 +Subject: [PATCH] Read colors from Xresources + +--- + config.def.h | 14 +++++++++-- + slock.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + util.h | 3 +++ + 3 files changed, 83 insertions(+), 2 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 6288856..bfc1ba0 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -3,11 +3,21 @@ static const char *user = "nobody"; + static const char *group = "nogroup"; + + static const char *colorname[NUMCOLS] = { +- [INIT] = "black", /* after initialization */ +- [INPUT] = "#005577", /* during input */ ++ [INIT] = "black", /* after initialization */ ++ [INPUT] = "#005577", /* during input */ + [FAILED] = "#CC3333", /* wrong password */ + [CAPS] = "red", /* CapsLock on */ + }; + ++/* ++ * Xresources preferences to load at startup ++ */ ++ResourcePref resources[] = { ++ { "color0", STRING, &colorname[INIT] }, ++ { "color4", STRING, &colorname[INPUT] }, ++ { "color1", STRING, &colorname[FAILED] }, ++ { "color3", STRING, &colorname[CAPS] }, ++}; ++ + /* treat a cleared input like a wrong password (color) */ + static const int failonclear = 1; +diff --git a/slock.c b/slock.c +index 5f4fb7a..2395547 100644 +--- a/slock.c ++++ b/slock.c +@@ -6,6 +6,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -19,6 +20,7 @@ + #include + #include + #include ++#include + + #include "arg.h" + #include "util.h" +@@ -46,6 +48,19 @@ 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 +@@ -306,6 +321,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) + { +@@ -364,6 +430,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); + +diff --git a/util.h b/util.h +index 6f748b8..148dbc1 100644 +--- a/util.h ++++ b/util.h +@@ -1,2 +1,5 @@ ++/* macros */ ++#define LEN(a) (sizeof(a) / sizeof(a)[0]) ++ + #undef explicit_bzero + void explicit_bzero(void *, size_t); +-- +2.24.0 + diff --git a/patches/slock-dpms-1.4.diff b/patches/slock-dpms-1.4.diff deleted file mode 100644 index 027bbf7..0000000 --- a/patches/slock-dpms-1.4.diff +++ /dev/null @@ -1,62 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index 9855e21..d01bd38 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -10,3 +10,6 @@ static const char *colorname[NUMCOLS] = { - - /* treat a cleared input like a wrong password (color) */ - static const int failonclear = 1; -+ -+/* time in seconds before the monitor shuts down */ -+static const int monitortime = 5; -diff --git a/slock.c b/slock.c -index d2f0886..f65a43b 100644 ---- a/slock.c -+++ b/slock.c -@@ -15,6 +15,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -306,6 +307,7 @@ main(int argc, char **argv) { - const char *hash; - Display *dpy; - int s, nlocks, nscreens; -+ CARD16 standby, suspend, off; - - ARGBEGIN { - case 'v': -@@ -366,6 +368,20 @@ main(int argc, char **argv) { - if (nlocks != nscreens) - return 1; - -+ /* DPMS magic to disable the monitor */ -+ if (!DPMSCapable(dpy)) -+ die("slock: DPMSCapable failed\n"); -+ if (!DPMSEnable(dpy)) -+ die("slock: DPMSEnable failed\n"); -+ if (!DPMSGetTimeouts(dpy, &standby, &suspend, &off)) -+ die("slock: DPMSGetTimeouts failed\n"); -+ if (!standby || !suspend || !off) -+ die("slock: at least one DPMS variable is zero\n"); -+ if (!DPMSSetTimeouts(dpy, monitortime, monitortime, monitortime)) -+ die("slock: DPMSSetTimeouts failed\n"); -+ -+ XSync(dpy, 0); -+ - /* run post-lock command */ - if (argc > 0) { - switch (fork()) { -@@ -383,5 +399,9 @@ main(int argc, char **argv) { - /* everything is now blank. Wait for the correct password */ - readpw(dpy, &rr, locks, nscreens, hash); - -+ /* reset DPMS values to inital ones */ -+ DPMSSetTimeouts(dpy, standby, suspend, off); -+ XSync(dpy, 0); -+ - return 0; - } diff --git a/patches/slock-key-feedback.diff b/patches/slock-key-feedback.diff deleted file mode 100644 index b479518..0000000 --- a/patches/slock-key-feedback.diff +++ /dev/null @@ -1,113 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index 9855e21..29734e2 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -6,7 +6,23 @@ static const char *colorname[NUMCOLS] = { - [INIT] = "black", /* after initialization */ - [INPUT] = "#005577", /* during input */ - [FAILED] = "#CC3333", /* wrong password */ -+ [BLOCKS] = "#ffffff", /* key feedback block */ - }; - - /* treat a cleared input like a wrong password (color) */ - static const int failonclear = 1; -+ -+ -+// ### Blocks bar ### -+static short int blocks_enabled = 1; // 0 = don't show blocks -+static const int blocks_width = 0; // 0 = full width -+static const int blocks_height = 16; -+ -+// position -+static const int blocks_x = 0; -+static const int blocks_y = 0; -+ -+// Number of blocks -+static const int blocks_count = 10; -+// ### \Blocks bar ### -+ -diff --git a/slock.c b/slock.c -index 5ae738c..cf52710 100644 ---- a/slock.c -+++ b/slock.c -@@ -13,6 +13,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -28,7 +29,8 @@ enum { - INIT, - INPUT, - FAILED, -- NUMCOLS -+ BLOCKS, -+ NUMCOLS, - }; - - struct lock { -@@ -83,7 +85,40 @@ dontkillme(void) - } - #endif - --static const char * -+static void -+draw_key_feedback(Display *dpy, struct lock **locks, int screen) -+{ -+ XGCValues gr_values; -+ -+ Window win = locks[screen]->win; -+ Window root_win; -+ -+ gr_values.foreground = locks[screen]->colors[BLOCKS]; -+ GC gc = XCreateGC(dpy, win, GCForeground, &gr_values); -+ -+ int width = blocks_width, -+ height = blocks_height, -+ x = blocks_x, -+ y = blocks_y; -+ -+ if (height == 0 || width == 0) { -+ int _x, _y; -+ unsigned int screen_width, screen_height, _b, _d; -+ XGetGeometry(dpy, win, &root_win, &_x, &_y, &screen_width, &screen_height, &_b, &_d); -+ width = width ? width : screen_width; -+ height = height ? height : screen_height; -+ } -+ -+ unsigned int block_width = width / blocks_count; -+ unsigned int position = rand() % blocks_count; -+ -+ XClearWindow(dpy, win); -+ XFillRectangle(dpy, win, gc, x + position*block_width, y, block_width, height); -+ -+ XFreeGC(dpy, gc); -+} -+ -+ static const char * - gethash(void) - { - const char *hash; -@@ -185,6 +220,9 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, - memcpy(passwd + len, buf, num); - len += num; - } -+ if (blocks_enabled) -+ for (screen = 0; screen < nscreens; screen++) -+ draw_key_feedback(dpy, locks, screen); - break; - } - color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT); -@@ -355,6 +393,10 @@ main(int argc, char **argv) { - if (setuid(duid) < 0) - die("slock: setuid: %s\n", strerror(errno)); - -+ time_t t; -+ srand((unsigned) time(&t)); -+ -+ - /* check for Xrandr support */ - rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase); - diff --git a/patches/slock-pam_auth-20190207-35633d4.diff b/patches/slock-pam_auth-20190207-35633d4.diff deleted file mode 100644 index 136f4b5..0000000 --- a/patches/slock-pam_auth-20190207-35633d4.diff +++ /dev/null @@ -1,154 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index 9855e21..19e7f62 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -6,7 +6,11 @@ static const char *colorname[NUMCOLS] = { - [INIT] = "black", /* after initialization */ - [INPUT] = "#005577", /* during input */ - [FAILED] = "#CC3333", /* wrong password */ -+ [PAM] = "#9400D3", /* waiting for PAM */ - }; - - /* treat a cleared input like a wrong password (color) */ - static const int failonclear = 1; -+ -+/* PAM service that's used for authentication */ -+static const char* pam_service = "login"; -diff --git a/config.mk b/config.mk -index 74429ae..6e82074 100644 ---- a/config.mk -+++ b/config.mk -@@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib - - # includes and libs - INCS = -I. -I/usr/include -I${X11INC} --LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -+LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lpam - - # flags - CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H -diff --git a/slock.c b/slock.c -index 5ae738c..3a8da42 100644 ---- a/slock.c -+++ b/slock.c -@@ -18,16 +18,22 @@ - #include - #include - #include -+#include -+#include - - #include "arg.h" - #include "util.h" - - char *argv0; -+static int pam_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr); -+struct pam_conv pamc = {pam_conv, NULL}; -+char passwd[256]; - - enum { - INIT, - INPUT, - FAILED, -+ PAM, - NUMCOLS - }; - -@@ -57,6 +63,31 @@ die(const char *errstr, ...) - exit(1); - } - -+static int -+pam_conv(int num_msg, const struct pam_message **msg, -+ struct pam_response **resp, void *appdata_ptr) -+{ -+ int retval = PAM_CONV_ERR; -+ for(int i=0; imsg_style == PAM_PROMPT_ECHO_OFF && -+ strncmp(msg[i]->msg, "Password: ", 10) == 0) { -+ struct pam_response *resp_msg = malloc(sizeof(struct pam_response)); -+ if (!resp_msg) -+ die("malloc failed\n"); -+ char *password = malloc(strlen(passwd) + 1); -+ if (!password) -+ die("malloc failed\n"); -+ memset(password, 0, strlen(passwd) + 1); -+ strcpy(password, passwd); -+ resp_msg->resp_retcode = 0; -+ resp_msg->resp = password; -+ resp[i] = resp_msg; -+ retval = PAM_SUCCESS; -+ } -+ } -+ return retval; -+} -+ - #ifdef __linux__ - #include - #include -@@ -121,6 +152,8 @@ gethash(void) - } - #endif /* HAVE_SHADOW_H */ - -+ /* pam, store user name */ -+ hash = pw->pw_name; - return hash; - } - -@@ -129,11 +162,12 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, - const char *hash) - { - XRRScreenChangeNotifyEvent *rre; -- char buf[32], passwd[256], *inputhash; -- int num, screen, running, failure, oldc; -+ char buf[32]; -+ int num, screen, running, failure, oldc, retval; - unsigned int len, color; - KeySym ksym; - XEvent ev; -+ pam_handle_t *pamh; - - len = 0; - running = 1; -@@ -160,10 +194,26 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, - case XK_Return: - passwd[len] = '\0'; - errno = 0; -- if (!(inputhash = crypt(passwd, hash))) -- fprintf(stderr, "slock: crypt: %s\n", strerror(errno)); -+ retval = pam_start(pam_service, hash, &pamc, &pamh); -+ color = PAM; -+ for (screen = 0; screen < nscreens; screen++) { -+ XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[color]); -+ XClearWindow(dpy, locks[screen]->win); -+ XRaiseWindow(dpy, locks[screen]->win); -+ } -+ XSync(dpy, False); -+ -+ if (retval == PAM_SUCCESS) -+ retval = pam_authenticate(pamh, 0); -+ if (retval == PAM_SUCCESS) -+ retval = pam_acct_mgmt(pamh, 0); -+ -+ running = 1; -+ if (retval == PAM_SUCCESS) -+ running = 0; - else -- running = !!strcmp(inputhash, hash); -+ fprintf(stderr, "slock: %s\n", pam_strerror(pamh, retval)); -+ pam_end(pamh, retval); - if (running) { - XBell(dpy, 100); - failure = 1; -@@ -339,10 +389,9 @@ main(int argc, char **argv) { - dontkillme(); - #endif - -+ /* the contents of hash are used to transport the current user name */ - hash = gethash(); - errno = 0; -- if (!crypt("", hash)) -- die("slock: crypt: %s\n", strerror(errno)); - - if (!(dpy = XOpenDisplay(NULL))) - die("slock: cannot open display\n"); diff --git a/patches/slock-quickcancel-1.4.diff b/patches/slock-quickcancel-1.4.diff deleted file mode 100644 index f990806..0000000 --- a/patches/slock-quickcancel-1.4.diff +++ /dev/null @@ -1,66 +0,0 @@ -From e37f8981efe54bc620cb2f2280832cdab3959a32 Mon Sep 17 00:00:00 2001 -From: aleks -Date: Thu, 10 Oct 2019 17:35:27 +0200 -Subject: [PATCH] Apply quickcancel - -Cancel slock by moving the mouse within a certain time-period after -slock started. The time-period can be defined in seconds with the -setting *timetocancel* in the config.h. This is useful if you forgot to -disable `xautolock` during an activity that requires no input (e.g. -reading text, watching video). ---- - config.def.h | 3 +++ - slock.c | 5 +++++ - 2 files changed, 8 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 9855e21..e0bf95a 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -10,3 +10,6 @@ static const char *colorname[NUMCOLS] = { - - /* treat a cleared input like a wrong password (color) */ - static const int failonclear = 1; -+ -+/* time in seconds to cancel lock with mouse movement */ -+static const int timetocancel = 4; -diff --git a/slock.c b/slock.c -index d2f0886..f7462ee 100644 ---- a/slock.c -+++ b/slock.c -@@ -13,6 +13,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -24,6 +25,8 @@ - - char *argv0; - -+static time_t locktime; -+ - enum { - INIT, - INPUT, -@@ -141,6 +144,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, - oldc = INIT; - - while (running && !XNextEvent(dpy, &ev)) { -+ running = !((time(NULL) - locktime < timetocancel) && (ev.type == MotionNotify)); - if (ev.type == KeyPress) { - explicit_bzero(&buf, sizeof(buf)); - num = XLookupString(&ev.xkey, buf, sizeof(buf), &ksym, 0); -@@ -268,6 +272,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) - XRRSelectInput(dpy, lock->win, RRScreenChangeNotifyMask); - - XSelectInput(dpy, lock->root, SubstructureNotifyMask); -+ locktime = time(NULL); - return lock; - } - --- -2.23.0 - diff --git a/slock.c b/slock.c index 6d73074..fd275b0 100644 --- a/slock.c +++ b/slock.c @@ -1,11 +1,13 @@ /* See LICENSE file for license details. */ -#define _XOPEN_SOURCE 500 +#define _XOPEN_SOURCE 500 +#define LENGTH(X) (sizeof X / sizeof X[0]) #if HAVE_SHADOW_H #include #endif #include #include +#include #include #include #include @@ -13,13 +15,16 @@ #include #include #include -#include #include #include -#include +#ifdef XINERAMA +#include +#endif #include #include #include +#include +#include #include #include @@ -31,22 +36,40 @@ static int pam_conv(int num_msg, const struct pam_message **msg, struct pam_resp struct pam_conv pamc = {pam_conv, NULL}; char passwd[256]; -static time_t locktime; - enum { + BACKGROUND, INIT, INPUT, FAILED, - BLOCKS, - PAM, + PAM, NUMCOLS }; +/* 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" + struct lock { int screen; Window root, win; Pixmap pmap; unsigned long colors[NUMCOLS]; + unsigned int x, y; + unsigned int xoff, yoff, mw, mh; + Drawable drawable; + GC gc; + XRectangle rectangles[LENGTH(rectangles)]; }; struct xrandr { @@ -55,8 +78,6 @@ struct xrandr { int errbase; }; -#include "config.h" - static void die(const char *errstr, ...) { @@ -119,39 +140,6 @@ dontkillme(void) } #endif -static void -draw_key_feedback(Display *dpy, struct lock **locks, int screen) -{ - XGCValues gr_values; - - Window win = locks[screen]->win; - Window root_win; - - gr_values.foreground = locks[screen]->colors[BLOCKS]; - GC gc = XCreateGC(dpy, win, GCForeground, &gr_values); - - int width = blocks_width, - height = blocks_height, - x = blocks_x, - y = blocks_y; - - if (height == 0 || width == 0) { - int _x, _y; - unsigned int screen_width, screen_height, _b, _d; - XGetGeometry(dpy, win, &root_win, &_x, &_y, &screen_width, &screen_height, &_b, &_d); - width = width ? width : screen_width; - height = height ? height : screen_height; - } - - unsigned int block_width = width / blocks_count; - unsigned int position = rand() % blocks_count; - - XClearWindow(dpy, win); - XFillRectangle(dpy, win, gc, x + position*block_width, y, block_width, height); - - XFreeGC(dpy, gc); -} - static const char * gethash(void) { @@ -195,6 +183,32 @@ gethash(void) return hash; } +static void +resizerectangles(struct lock *lock) +{ + int i; + + for (i = 0; i < LENGTH(rectangles); i++){ + lock->rectangles[i].x = (rectangles[i].x * logosize) + + lock->xoff + ((lock->mw) / 2) - (logow / 2 * logosize); + lock->rectangles[i].y = (rectangles[i].y * logosize) + + lock->yoff + ((lock->mh) / 2) - (logoh / 2 * logosize); + lock->rectangles[i].width = rectangles[i].width * logosize; + lock->rectangles[i].height = rectangles[i].height * logosize; + } +} + +static void +drawlogo(Display *dpy, struct lock *lock, int color) +{ + XSetForeground(dpy, lock->gc, lock->colors[BACKGROUND]); + XFillRectangle(dpy, lock->drawable, lock->gc, 0, 0, lock->x, lock->y); + XSetForeground(dpy, lock->gc, lock->colors[color]); + XFillRectangles(dpy, lock->drawable, lock->gc, lock->rectangles, LENGTH(rectangles)); + XCopyArea(dpy, lock->drawable, lock->win, lock->gc, 0, 0, lock->x, lock->y, 0, 0); + XSync(dpy, False); +} + static void readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, const char *hash) @@ -213,7 +227,6 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, oldc = INIT; while (running && !XNextEvent(dpy, &ev)) { - running = !((time(NULL) - locktime < timetocancel) && (ev.type == MotionNotify)); if (ev.type == KeyPress) { explicit_bzero(&buf, sizeof(buf)); num = XLookupString(&ev.xkey, buf, sizeof(buf), &ksym, 0); @@ -234,10 +247,8 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, passwd[len] = '\0'; errno = 0; retval = pam_start(pam_service, hash, &pamc, &pamh); - color = PAM; for (screen = 0; screen < nscreens; screen++) { - XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[color]); - XClearWindow(dpy, locks[screen]->win); + drawlogo(dpy, locks[screen], PAM); XRaiseWindow(dpy, locks[screen]->win); } XSync(dpy, False); @@ -274,18 +285,12 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, memcpy(passwd + len, buf, num); len += num; } - if (blocks_enabled) - for (screen = 0; screen < nscreens; screen++) - draw_key_feedback(dpy, locks, screen); break; } color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT); if (running && oldc != color) { for (screen = 0; screen < nscreens; screen++) { - XSetWindowBackground(dpy, - locks[screen]->win, - locks[screen]->colors[color]); - XClearWindow(dpy, locks[screen]->win); + drawlogo(dpy, locks[screen], color); } oldc = color; } @@ -320,6 +325,10 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) XColor color, dummy; XSetWindowAttributes wa; Cursor invisible; +#ifdef XINERAMA + XineramaScreenInfo *info; + int n; +#endif if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(struct lock)))) return NULL; @@ -333,12 +342,31 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) lock->colors[i] = color.pixel; } + lock->x = DisplayWidth(dpy, lock->screen); + lock->y = DisplayHeight(dpy, lock->screen); +#ifdef XINERAMA + if ((info = XineramaQueryScreens(dpy, &n))) { + lock->xoff = info[0].x_org; + lock->yoff = info[0].y_org; + lock->mw = info[0].width; + lock->mh = info[0].height; + } else +#endif + { + lock->xoff = lock->yoff = 0; + lock->mw = lock->x; + lock->mh = lock->y; + } + lock->drawable = XCreatePixmap(dpy, lock->root, + lock->x, lock->y, DefaultDepth(dpy, screen)); + lock->gc = XCreateGC(dpy, lock->root, 0, NULL); + XSetLineAttributes(dpy, lock->gc, 1, LineSolid, CapButt, JoinMiter); + /* init */ wa.override_redirect = 1; - wa.background_pixel = lock->colors[INIT]; + wa.background_pixel = lock->colors[BACKGROUND]; lock->win = XCreateWindow(dpy, lock->root, 0, 0, - DisplayWidth(dpy, lock->screen), - DisplayHeight(dpy, lock->screen), + lock->x, lock->y, 0, DefaultDepth(dpy, lock->screen), CopyFromParent, DefaultVisual(dpy, lock->screen), @@ -348,6 +376,8 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) &color, &color, 0, 0); XDefineCursor(dpy, lock->win, invisible); + resizerectangles(lock); + /* Try to grab mouse pointer *and* keyboard for 600ms, else fail the lock */ for (i = 0, ptgrab = kbgrab = -1; i < 6; i++) { if (ptgrab != GrabSuccess) { @@ -368,7 +398,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) XRRSelectInput(dpy, lock->win, RRScreenChangeNotifyMask); XSelectInput(dpy, lock->root, SubstructureNotifyMask); - locktime = time(NULL); + drawlogo(dpy, lock, INIT); return lock; } @@ -390,6 +420,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) { @@ -407,7 +488,6 @@ main(int argc, char **argv) { const char *hash; Display *dpy; int s, nlocks, nscreens; - CARD16 standby, suspend, off; ARGBEGIN { case 'v': @@ -448,9 +528,7 @@ main(int argc, char **argv) { if (setuid(duid) < 0) die("slock: setuid: %s\n", strerror(errno)); - time_t t; - srand((unsigned) time(&t)); - + config_init(dpy); /* check for Xrandr support */ rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase); @@ -471,20 +549,6 @@ main(int argc, char **argv) { if (nlocks != nscreens) return 1; - /* DPMS magic to disable the monitor */ - if (!DPMSCapable(dpy)) - die("slock: DPMSCapable failed\n"); - if (!DPMSEnable(dpy)) - die("slock: DPMSEnable failed\n"); - if (!DPMSGetTimeouts(dpy, &standby, &suspend, &off)) - die("slock: DPMSGetTimeouts failed\n"); - if (!standby || !suspend || !off) - die("slock: at least one DPMS variable is zero\n"); - if (!DPMSSetTimeouts(dpy, monitortime, monitortime, monitortime)) - die("slock: DPMSSetTimeouts failed\n"); - - XSync(dpy, 0); - /* run post-lock command */ if (argc > 0) { switch (fork()) { @@ -502,9 +566,12 @@ main(int argc, char **argv) { /* everything is now blank. Wait for the correct password */ readpw(dpy, &rr, locks, nscreens, hash); - /* reset DPMS values to inital ones */ - DPMSSetTimeouts(dpy, standby, suspend, off); - XSync(dpy, 0); + for (nlocks = 0, s = 0; s < nscreens; s++) { + XFreePixmap(dpy, locks[s]->drawable); + XFreeGC(dpy, locks[s]->gc); + } + XSync(dpy, 0); + XCloseDisplay(dpy); return 0; } diff --git a/util.h b/util.h index 6f748b8..148dbc1 100644 --- a/util.h +++ b/util.h @@ -1,2 +1,5 @@ +/* macros */ +#define LEN(a) (sizeof(a) / sizeof(a)[0]) + #undef explicit_bzero void explicit_bzero(void *, size_t); -- cgit v1.2.3