commit 6e61eaf94bc625cf85b5f9cfc29a9e82020c250f
parent 7675ccbae1719447fbc5fc2b24bdc4e5fa2d5378
Author: Milutin Popovic <mika@popovic.xyz>
Date: Tue, 18 Nov 2025 01:03:34 +0000
rebase:
Diffstat:
14 files changed, 610 insertions(+), 442 deletions(-)
diff --git a/LICENSE b/LICENSE
@@ -4,6 +4,7 @@ MIT/X Consortium License
© 2014 Dimitris Papastamos <sin@2f30.org>
© 2006-2014 Anselm R Garbe <anselm@garbe.us>
© 2014-2016 Laslo Hunhold <dev@frign.de>
+© 2016-2023 Hiltjo Posthuma <hiltjo@codemadness.org>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
diff --git a/Makefile b/Makefile
@@ -6,56 +6,41 @@ include config.mk
SRC = slock.c ${COMPATSRC}
OBJ = ${SRC:.c=.o}
-all: options slock
-
-options:
- @echo slock build options:
- @echo "CFLAGS = ${CFLAGS}"
- @echo "LDFLAGS = ${LDFLAGS}"
- @echo "CC = ${CC}"
+all: slock
.c.o:
- @echo CC $<
- @${CC} -c ${CFLAGS} $<
+ ${CC} -c ${CFLAGS} $<
${OBJ}: config.h config.mk arg.h util.h
config.h:
- @echo creating $@ from config.def.h
- @cp config.def.h $@
+ cp config.def.h $@
slock: ${OBJ}
- @echo CC -o $@
- @${CC} -o $@ ${OBJ} ${LDFLAGS}
+ ${CC} -o $@ ${OBJ} ${LDFLAGS}
clean:
- @echo cleaning
- @rm -f slock ${OBJ} slock-${VERSION}.tar.gz config.h
+ rm -f slock ${OBJ} slock-${VERSION}.tar.gz
dist: clean
- @echo creating dist tarball
- @mkdir -p slock-${VERSION}
- @cp -R LICENSE Makefile README slock.1 config.mk \
- ${SRC} explicit_bzero.c config.def.h arg.h util.h slock-${VERSION}
- @tar -cf slock-${VERSION}.tar slock-${VERSION}
- @gzip slock-${VERSION}.tar
- @rm -rf slock-${VERSION}
+ mkdir -p slock-${VERSION}
+ cp -R LICENSE Makefile README slock.1 config.mk \
+ ${SRC} config.def.h arg.h util.h slock-${VERSION}
+ tar -cf slock-${VERSION}.tar slock-${VERSION}
+ gzip slock-${VERSION}.tar
+ rm -rf slock-${VERSION}
install: all
- @echo installing executable file to ${DESTDIR}${PREFIX}/bin
- @mkdir -p ${DESTDIR}${PREFIX}/bin
- @cp -f slock ${DESTDIR}${PREFIX}/bin
- @chmod 755 ${DESTDIR}${PREFIX}/bin/slock
- @chmod u+s ${DESTDIR}${PREFIX}/bin/slock
- @echo installing manual page to ${DESTDIR}${MANPREFIX}/man1
- @mkdir -p ${DESTDIR}${MANPREFIX}/man1
- @sed "s/VERSION/${VERSION}/g" <slock.1 >${DESTDIR}${MANPREFIX}/man1/slock.1
- @chmod 644 ${DESTDIR}${MANPREFIX}/man1/slock.1
+ mkdir -p ${DESTDIR}${PREFIX}/bin
+ cp -f slock ${DESTDIR}${PREFIX}/bin
+ chmod 755 ${DESTDIR}${PREFIX}/bin/slock
+ chmod u+s ${DESTDIR}${PREFIX}/bin/slock
+ mkdir -p ${DESTDIR}${MANPREFIX}/man1
+ sed "s/VERSION/${VERSION}/g" <slock.1 >${DESTDIR}${MANPREFIX}/man1/slock.1
+ chmod 644 ${DESTDIR}${MANPREFIX}/man1/slock.1
uninstall:
- @echo removing executable file from ${DESTDIR}${PREFIX}/bin
- @rm -f ${DESTDIR}${PREFIX}/bin/slock
- @echo removing manual page from ${DESTDIR}${MANPREFIX}/man1
- @rm -f ${DESTDIR}${MANPREFIX}/man1/slock.1
+ rm -f ${DESTDIR}${PREFIX}/bin/slock
+ rm -f ${DESTDIR}${MANPREFIX}/man1/slock.1
-.PHONY: all options clean dist install uninstall
+.PHONY: all clean dist install uninstall
diff --git a/config.def.h b/config.def.h
@@ -3,45 +3,39 @@ static const char *user = "mika";
static const char *group = "mika";
static const char *colorname[NUMCOLS] = {
- [BACKGROUND] = "black", /* after initialization */
- [INIT] = "#A96C8A", /* after initialization */
- [INPUT] = "#A96C8A", /* during input */
- [FAILED] = "#2d2d2d", /* wrong password */
- [CAPS] = "#6CA98A", /* CapsLock on */
+ [BACKGROUND] = "white",
+ [INIT] = "2d2d2d", /* after initialization */
+ [INPUT] = "#005577", /* during input */
+ [FAILED] = "#CC3333", /* wrong password */
+ [CAPS] = "red", /* CapsLock on */
};
/* treat a cleared input like a wrong password (color) */
-static const int failonclear = 0;
+static const int failonclear = 1;
-/* time in seconds before the monitor shuts down */
static const int monitortime = 5;
-/* insert grid pattern with scale 1:1, the size can be changed with logosize */
-static const int logosize = 26;
-static const int logow = 10; /* grid width and height for right center alignment*/
-static const int logoh = 16;
+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 },
-
-};
-*/
static XRectangle rectangles[9] = {
- /* x y w h */
- { 0, 4, 1, 2 },
- { 1, 2, 1, 2 },
- { 2, 0, 1, 2 },
- { 4, 0, 1, 6 },
- { 4, 0, 3, 1 },
- { 4, 5, 3, 1 },
- { 6, 0, 1, 6 },
+ {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},
};
+
+/*Enable blur*/
+#define BLUR
+/*Set blur radius*/
+static const int blurRadius=5;
+/*Enable Pixelation*/
+//#define PIXELATION
+/*Set pixelation radius*/
+static const int pixelSize=0;
diff --git a/config.h b/config.h
@@ -11,30 +11,14 @@ static const char *colorname[NUMCOLS] = {
};
/* treat a cleared input like a wrong password (color) */
-static const int failonclear = 0;
+static const int failonclear = 1;
-/* time in seconds before the monitor shuts down */
static const int monitortime = 5;
-/* insert grid pattern with scale 1:1, the size can be changed with logosize */
-static const int logosize = 26;
-static const int logow = 10; /* grid width and height for right center alignment*/
-static const int logoh = 16;
+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 },
-
-};
-*/
static XRectangle rectangles[9] = {
/* x y w h */
{ 0, 4, 1, 2 },
@@ -45,3 +29,12 @@ static XRectangle rectangles[9] = {
{ 4, 5, 3, 1 },
{ 6, 0, 1, 6 },
};
+
+/*Enable blur*/
+#define BLUR
+/*Set blur radius*/
+static const int blurRadius=10;
+/*Enable Pixelation*/
+//#define PIXELATION
+/*Set pixelation radius*/
+static const int pixelSize=100;
diff --git a/config.mk b/config.mk
@@ -1,5 +1,5 @@
# slock version
-VERSION = 1.4
+VERSION = 1.6
# Customize below to fit your system
@@ -11,7 +11,7 @@ X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib
# Xinerama, comment if you don't want it
-XINERAMALIBS = -lXinerama
+XINERAMALIBS = -lXinerama
XINERAMAFLAGS = -DXINERAMA
# freetype
@@ -20,11 +20,11 @@ FREETYPEINC = /usr/include/freetype2
# includes and libs
INCS = -I. -I/usr/include -I${X11INC} -I${FREETYPEINC}
-LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lXext -lXrandr
+LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lImlib2 ${XINERAMALIBS} ${FREETYPELIBS} -lXext -lXrandr
# flags
CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H ${XINERAMAFLAGS}
-CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
+CFLAGS = -std=c99 -pedantic -Wall -Ofast ${INCS} ${CPPFLAGS}
LDFLAGS = -s ${LIBS}
COMPATSRC = explicit_bzero.c
@@ -35,6 +35,3 @@ COMPATSRC = explicit_bzero.c
#CPPFLAGS = -DVERSION=\"${VERSION}\" -D_BSD_SOURCE -D_NETBSD_SOURCE
# On OpenBSD set COMPATSRC to empty
#COMPATSRC =
-
-# compiler and linker
-CC = cc
diff --git a/explicit_bzero.o b/explicit_bzero.o
Binary files differ.
diff --git a/patches/slock-dpms-1.4.diff b/patches/slock-dpms-1.4.diff
@@ -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 <unistd.h>
- #include <sys/types.h>
- #include <X11/extensions/Xrandr.h>
-+#include <X11/extensions/dpms.h>
- #include <X11/keysym.h>
- #include <X11/Xlib.h>
- #include <X11/Xutil.h>
-@@ -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-dpms-20231017-4f04554.diff b/patches/slock-dpms-20231017-4f04554.diff
@@ -0,0 +1,86 @@
+From 4259049ca8d06a34c828c70298f3a8fdb8c5104c Mon Sep 17 00:00:00 2001
+From: mortezadadgar <mortezadadgar97@gmail.com>
+Date: Sat, 23 Sep 2023 18:45:58 +0330
+Subject: [PATCH] Update to respect prevoius state of dpms
+
+---
+ config.def.h | 3 +++
+ slock.c | 26 ++++++++++++++++++++++++++
+ 2 files changed, 29 insertions(+)
+
+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 5ae738c..b5ac721 100644
+--- a/slock.c
++++ b/slock.c
+@@ -1,4 +1,5 @@
+ /* See LICENSE file for license details. */
++#include <X11/Xmd.h>
+ #define _XOPEN_SOURCE 500
+ #if HAVE_SHADOW_H
+ #include <shadow.h>
+@@ -15,6 +16,7 @@
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <X11/extensions/Xrandr.h>
++#include <X11/extensions/dpms.h>
+ #include <X11/keysym.h>
+ #include <X11/Xlib.h>
+ #include <X11/Xutil.h>
+@@ -314,6 +316,8 @@ main(int argc, char **argv) {
+ const char *hash;
+ Display *dpy;
+ int s, nlocks, nscreens;
++ CARD16 standby, suspend, off;
++ BOOL dpms_state;
+
+ ARGBEGIN {
+ case 'v':
+@@ -374,6 +378,22 @@ 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 (!DPMSInfo(dpy, &standby, &dpms_state))
++ die("slock: DPMSInfo failed\n");
++ if (!DPMSEnable(dpy) && !dpms_state)
++ 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()) {
+@@ -391,5 +411,11 @@ 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);
++ if (!dpms_state)
++ DPMSDisable(dpy);
++ XSync(dpy, 0);
++
+ return 0;
+ }
+--
+2.42.0
+
diff --git a/patches/slock-dwmlogo-20210324.diff b/patches/slock-dwmlogo-20210324.diff
@@ -1,246 +0,0 @@
-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 <shadow.h>
- #endif
-@@ -15,9 +16,13 @@
- #include <unistd.h>
- #include <sys/types.h>
- #include <X11/extensions/Xrandr.h>
-+#ifdef XINERAMA
-+#include <X11/extensions/Xinerama.h>
-+#endif
- #include <X11/keysym.h>
- #include <X11/Xlib.h>
- #include <X11/Xutil.h>
-+#include <X11/Xft/Xft.h>
-
- #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/patches/slock-dwmlogoandblurscreen-1.0.diff b/patches/slock-dwmlogoandblurscreen-1.0.diff
@@ -0,0 +1,336 @@
+diff -u ../slock-orig/config.def.h ./config.def.h
+--- ../slock-orig/config.def.h 2022-04-29 17:07:13.872268452 -0400
++++ ./config.def.h 2022-04-29 16:44:38.573566776 -0400
+@@ -3,10 +3,36 @@
+ static const char *group = "nogroup";
+
+ static const char *colorname[NUMCOLS] = {
+- [INIT] = "black", /* after initialization */
++ [BACKGROUND] = "white",
++ [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;
++
++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] = {
++ {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},
++};
++
++/*Enable blur*/
++#define BLUR
++/*Set blur radius*/
++static const int blurRadius=5;
++/*Enable Pixelation*/
++//#define PIXELATION
++/*Set pixelation radius*/
++static const int pixelSize=0;
+diff -u ../slock-orig/config.mk ./config.mk
+--- ../slock-orig/config.mk 2022-04-29 17:07:13.872268452 -0400
++++ ./config.mk 2022-04-29 17:14:49.416921212 -0400
+@@ -10,13 +10,21 @@
+ 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 -lImlib2 ${XINERAMALIBS} ${FREETYPELIBS} -lXext -lXrandr
+
+ # flags
+-CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H
+-CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
++CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H ${XINERAMAFLAGS}
++CFLAGS = -std=c99 -pedantic -Wall -Ofast ${INCS} ${CPPFLAGS}
+ LDFLAGS = -s ${LIBS}
+ COMPATSRC = explicit_bzero.c
+
+diff -u ../slock-orig/slock.c ./slock.c
+--- ../slock-orig/slock.c 2022-04-29 17:07:13.872268452 -0400
++++ ./slock.c 2022-04-29 17:04:53.424073165 -0400
+@@ -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 <shadow.h>
+ #endif
+@@ -15,9 +16,13 @@
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <X11/extensions/Xrandr.h>
++#ifdef XINERAMA
++#include <X11/extensions/Xinerama.h>
++#endif
+ #include <X11/keysym.h>
+ #include <X11/Xlib.h>
+ #include <X11/Xutil.h>
++#include <Imlib2.h>
+
+ #include "arg.h"
+ #include "util.h"
+@@ -25,17 +30,26 @@
+ char *argv0;
+
+ enum {
++ BACKGROUND,
+ INIT,
+ INPUT,
+ FAILED,
+ NUMCOLS
+ };
+
++#include "config.h"
++
+ struct lock {
+ int screen;
+ Window root, win;
+ Pixmap pmap;
++ Pixmap bgmap;
+ 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,7 +58,7 @@
+ int errbase;
+ };
+
+-#include "config.h"
++Imlib_Image image;
+
+ static void
+ die(const char *errstr, ...)
+@@ -125,6 +139,29 @@
+ }
+
+ 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[color]);
++ XFillRectangles(dpy, lock->win, lock->gc, lock->rectangles, LENGTH(rectangles));
++ XSync(dpy, False);
++}
++
++static void
+ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
+ const char *hash)
+ {
+@@ -190,10 +227,12 @@
+ 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);
++ if(locks[screen]->bgmap)
++ XSetWindowBackgroundPixmap(dpy, locks[screen]->win, locks[screen]->bgmap);
++ else
++ XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[0]);
++ //XClearWindow(dpy, locks[screen]->win);
++ drawlogo(dpy, locks[screen], color);
+ }
+ oldc = color;
+ }
+@@ -228,6 +267,10 @@
+ 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;
+@@ -235,27 +278,61 @@
+ lock->screen = screen;
+ lock->root = RootWindow(dpy, lock->screen);
+
++ if(image)
++ {
++ lock->bgmap = XCreatePixmap(dpy, lock->root, DisplayWidth(dpy, lock->screen), DisplayHeight(dpy, lock->screen), DefaultDepth(dpy, lock->screen));
++ imlib_context_set_image(image);
++ imlib_context_set_display(dpy);
++ imlib_context_set_visual(DefaultVisual(dpy, lock->screen));
++ imlib_context_set_colormap(DefaultColormap(dpy, lock->screen));
++ imlib_context_set_drawable(lock->bgmap);
++ imlib_render_image_on_drawable(0, 0);
++ imlib_free_image();
++ }
+ for (i = 0; i < NUMCOLS; i++) {
+ XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen),
+ colorname[i], &color, &dummy);
+ 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),
+ CWOverrideRedirect | CWBackPixel, &wa);
++ if(lock->bgmap)
++ XSetWindowBackgroundPixmap(dpy, lock->win, lock->bgmap);
+ lock->pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8);
+ invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap,
+ &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 +353,7 @@
+ XRRSelectInput(dpy, lock->win, RRScreenChangeNotifyMask);
+
+ XSelectInput(dpy, lock->root, SubstructureNotifyMask);
++ drawlogo(dpy, lock, INIT);
+ return lock;
+ }
+
+@@ -355,6 +433,60 @@
+ if (setuid(duid) < 0)
+ die("slock: setuid: %s\n", strerror(errno));
+
++ /*Create screenshot Image*/
++ Screen *scr = ScreenOfDisplay(dpy, DefaultScreen(dpy));
++ image = imlib_create_image(scr->width,scr->height);
++ imlib_context_set_image(image);
++ imlib_context_set_display(dpy);
++ imlib_context_set_visual(DefaultVisual(dpy,0));
++ imlib_context_set_drawable(RootWindow(dpy,XScreenNumberOfScreen(scr)));
++ imlib_copy_drawable_to_image(0,0,0,scr->width,scr->height,0,0,1);
++
++#ifdef BLUR
++
++ /*Blur function*/
++ imlib_image_blur(blurRadius);
++#endif // BLUR
++
++#ifdef PIXELATION
++ /*Pixelation*/
++ int width = scr->width;
++ int height = scr->height;
++
++ for(int y = 0; y < height; y += pixelSize)
++ {
++ for(int x = 0; x < width; x += pixelSize)
++ {
++ int red = 0;
++ int green = 0;
++ int blue = 0;
++
++ Imlib_Color pixel;
++ Imlib_Color* pp;
++ pp = &pixel;
++ for(int j = 0; j < pixelSize && j < height; j++)
++ {
++ for(int i = 0; i < pixelSize && i < width; i++)
++ {
++ imlib_image_query_pixel(x+i,y+j,pp);
++ red += pixel.red;
++ green += pixel.green;
++ blue += pixel.blue;
++ }
++ }
++ red /= (pixelSize*pixelSize);
++ green /= (pixelSize*pixelSize);
++ blue /= (pixelSize*pixelSize);
++ imlib_context_set_color(red,green,blue,pixel.alpha);
++ imlib_image_fill_rectangle(x,y,pixelSize,pixelSize);
++ red = 0;
++ green = 0;
++ blue = 0;
++ }
++ }
++
++
++#endif
+ /* check for Xrandr support */
+ rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase);
+
+@@ -391,5 +523,12 @@
+ /* 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/slock b/slock
Binary files differ.
diff --git a/slock.1 b/slock.1
@@ -1,5 +1,6 @@
-.Dd 2016-08-23
+.Dd October 6, 2023
.Dt SLOCK 1
+.Os
.Sh NAME
.Nm slock
.Nd simple X screen locker
@@ -9,31 +10,36 @@
.Op Ar cmd Op Ar arg ...
.Sh DESCRIPTION
.Nm
-is a simple X screen locker. If provided,
-.Ar cmd Op Ar arg ...
+is a simple X screen locker.
+If provided,
+.Ar cmd
is executed after the screen has been locked.
-.Sh OPTIONS
+.Pp
+The options are as follows:
.Bl -tag -width Ds
.It Fl v
Print version information to stdout and exit.
.El
+.Sh EXIT STATUS
+.Ex -std
+.Sh EXAMPLES
+$
+.Nm
+/usr/sbin/s2ram
.Sh SECURITY CONSIDERATIONS
To make sure a locked screen can not be bypassed by switching VTs
or killing the X server with Ctrl+Alt+Backspace, it is recommended
to disable both in
.Xr xorg.conf 5
for maximum security:
-.Bd -literal -offset left
+.Bd -literal
Section "ServerFlags"
Option "DontVTSwitch" "True"
Option "DontZap" "True"
EndSection
.Ed
-.Sh EXAMPLES
-$
-.Nm
-/usr/sbin/s2ram
.Sh CUSTOMIZATION
.Nm
can be customized by creating a custom config.h from config.def.h and
-(re)compiling the source code. This keeps it fast, secure and simple.
+(re)compiling the source code.
+This keeps it fast, secure and simple.
diff --git a/slock.c b/slock.c
@@ -14,17 +14,20 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
+#include <spawn.h>
#include <sys/types.h>
#include <X11/extensions/Xrandr.h>
#ifdef XINERAMA
#include <X11/extensions/Xinerama.h>
#endif
-#include <X11/extensions/dpms.h>
#include <X11/keysym.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/XKBlib.h>
-#include <X11/Xft/Xft.h>
+#include <X11/Xmd.h>
+#include <X11/extensions/dpms.h>
+
+#include <Imlib2.h>
#include "arg.h"
#include "util.h"
@@ -32,7 +35,7 @@
char *argv0;
enum {
- BACKGROUND,
+ BACKGROUND,
INIT,
INPUT,
FAILED,
@@ -46,12 +49,13 @@ struct lock {
int screen;
Window root, win;
Pixmap pmap;
+ Pixmap bgmap;
unsigned long colors[NUMCOLS];
- unsigned int x, y;
- unsigned int xoff, yoff, mw, mh;
- Drawable drawable;
- GC gc;
- XRectangle rectangles[LENGTH(rectangles)];
+ unsigned int x, y;
+ unsigned int xoff, yoff, mw, mh;
+ Drawable drawable;
+ GC gc;
+ XRectangle rectangles[LENGTH(rectangles)];
};
struct xrandr {
@@ -60,6 +64,8 @@ struct xrandr {
int errbase;
};
+Imlib_Image image;
+
static void
die(const char *errstr, ...)
{
@@ -156,11 +162,8 @@ resizerectangles(struct lock *lock)
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);
+ XFillRectangles(dpy, lock->win, lock->gc, lock->rectangles, LENGTH(rectangles));
XSync(dpy, False);
}
@@ -231,13 +234,21 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
(len + num < sizeof(passwd))) {
memcpy(passwd + len, buf, num);
len += num;
+ } else if (buf[0] == '\025') { /* ctrl-u clears input */
+ explicit_bzero(&passwd, sizeof(passwd));
+ len = 0;
}
break;
}
color = len ? (caps ? CAPS : INPUT) : (failure || failonclear ? FAILED : INIT);
if (running && oldc != color) {
for (screen = 0; screen < nscreens; screen++) {
- drawlogo(dpy, locks[screen], color);
+ if(locks[screen]->bgmap)
+ XSetWindowBackgroundPixmap(dpy, locks[screen]->win, locks[screen]->bgmap);
+ else
+ XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[0]);
+ //XClearWindow(dpy, locks[screen]->win);
+ drawlogo(dpy, locks[screen], color);
}
oldc = color;
}
@@ -283,6 +294,17 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
lock->screen = screen;
lock->root = RootWindow(dpy, lock->screen);
+ if(image)
+ {
+ lock->bgmap = XCreatePixmap(dpy, lock->root, DisplayWidth(dpy, lock->screen), DisplayHeight(dpy, lock->screen), DefaultDepth(dpy, lock->screen));
+ imlib_context_set_image(image);
+ imlib_context_set_display(dpy);
+ imlib_context_set_visual(DefaultVisual(dpy, lock->screen));
+ imlib_context_set_colormap(DefaultColormap(dpy, lock->screen));
+ imlib_context_set_drawable(lock->bgmap);
+ imlib_render_image_on_drawable(0, 0);
+ imlib_free_image();
+ }
for (i = 0; i < NUMCOLS; i++) {
XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen),
colorname[i], &color, &dummy);
@@ -318,6 +340,8 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
CopyFromParent,
DefaultVisual(dpy, lock->screen),
CWOverrideRedirect | CWBackPixel, &wa);
+ if(lock->bgmap)
+ XSetWindowBackgroundPixmap(dpy, lock->win, lock->bgmap);
lock->pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8);
invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap,
&color, &color, 0, 0);
@@ -385,10 +409,11 @@ main(int argc, char **argv) {
Display *dpy;
int s, nlocks, nscreens;
CARD16 standby, suspend, off;
+ BOOL dpms_state;
ARGBEGIN {
case 'v':
- fprintf(stderr, "slock-"VERSION"\n");
+ puts("slock-"VERSION);
return 0;
default:
usage();
@@ -426,6 +451,60 @@ main(int argc, char **argv) {
if (setuid(duid) < 0)
die("slock: setuid: %s\n", strerror(errno));
+ /*Create screenshot Image*/
+ Screen *scr = ScreenOfDisplay(dpy, DefaultScreen(dpy));
+ image = imlib_create_image(scr->width,scr->height);
+ imlib_context_set_image(image);
+ imlib_context_set_display(dpy);
+ imlib_context_set_visual(DefaultVisual(dpy,0));
+ imlib_context_set_drawable(RootWindow(dpy,XScreenNumberOfScreen(scr)));
+ imlib_copy_drawable_to_image(0,0,0,scr->width,scr->height,0,0,1);
+
+#ifdef BLUR
+
+ /*Blur function*/
+ imlib_image_blur(blurRadius);
+#endif // BLUR
+
+#ifdef PIXELATION
+ /*Pixelation*/
+ int width = scr->width;
+ int height = scr->height;
+
+ for(int y = 0; y < height; y += pixelSize)
+ {
+ for(int x = 0; x < width; x += pixelSize)
+ {
+ int red = 0;
+ int green = 0;
+ int blue = 0;
+
+ Imlib_Color pixel;
+ Imlib_Color* pp;
+ pp = &pixel;
+ for(int j = 0; j < pixelSize && j < height; j++)
+ {
+ for(int i = 0; i < pixelSize && i < width; i++)
+ {
+ imlib_image_query_pixel(x+i,y+j,pp);
+ red += pixel.red;
+ green += pixel.green;
+ blue += pixel.blue;
+ }
+ }
+ red /= (pixelSize*pixelSize);
+ green /= (pixelSize*pixelSize);
+ blue /= (pixelSize*pixelSize);
+ imlib_context_set_color(red,green,blue,pixel.alpha);
+ imlib_image_fill_rectangle(x,y,pixelSize,pixelSize);
+ red = 0;
+ green = 0;
+ blue = 0;
+ }
+ }
+
+
+#endif
/* check for Xrandr support */
rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase);
@@ -448,7 +527,9 @@ main(int argc, char **argv) {
/* DPMS magic to disable the monitor */
if (!DPMSCapable(dpy))
die("slock: DPMSCapable failed\n");
- if (!DPMSEnable(dpy))
+ if (!DPMSInfo(dpy, &standby, &dpms_state))
+ die("slock: DPMSInfo failed\n");
+ if (!DPMSEnable(dpy) && !dpms_state)
die("slock: DPMSEnable failed\n");
if (!DPMSGetTimeouts(dpy, &standby, &suspend, &off))
die("slock: DPMSGetTimeouts failed\n");
@@ -461,30 +542,27 @@ main(int argc, char **argv) {
/* run post-lock command */
if (argc > 0) {
- switch (fork()) {
- case -1:
- die("slock: fork failed: %s\n", strerror(errno));
- case 0:
- if (close(ConnectionNumber(dpy)) < 0)
- die("slock: close: %s\n", strerror(errno));
- execvp(argv[0], argv);
- fprintf(stderr, "slock: execvp %s: %s\n", argv[0], strerror(errno));
- _exit(1);
+ pid_t pid;
+ extern char **environ;
+ int err = posix_spawnp(&pid, argv[0], NULL, NULL, argv, environ);
+ if (err) {
+ die("slock: failed to execute post-lock command: %s: %s\n",
+ argv[0], strerror(err));
}
}
/* 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);
}
+ /* reset DPMS values to inital ones */
+ DPMSSetTimeouts(dpy, standby, suspend, off);
+ if (!dpms_state)
+ DPMSDisable(dpy);
XSync(dpy, 0);
XCloseDisplay(dpy);
return 0;
diff --git a/slock.o b/slock.o
Binary files differ.