slock-auto-timeout-20221002-35633d4.diff (1932B)
1 diff --git a/config.def.h b/config.def.h 2 index 9855e21..354980b 100644 3 --- a/config.def.h 4 +++ b/config.def.h 5 @@ -10,3 +10,12 @@ static const char *colorname[NUMCOLS] = { 6 7 /* treat a cleared input like a wrong password (color) */ 8 static const int failonclear = 1; 9 + 10 +/* length of time (seconds) until [command] is executed */ 11 +static const int timeoffset = 60; 12 + 13 +/* should [command] be run only once? */ 14 +static const int runonce = 0; 15 + 16 +/* command to be run after [timeoffset] seconds has passed */ 17 +static const char *command = "doas poweroff"; 18 diff --git a/slock.c b/slock.c 19 index 5ae738c..7644bd9 100644 20 --- a/slock.c 21 +++ b/slock.c 22 @@ -19,11 +19,16 @@ 23 #include <X11/Xlib.h> 24 #include <X11/Xutil.h> 25 26 +#include <time.h> 27 + 28 #include "arg.h" 29 #include "util.h" 30 31 char *argv0; 32 33 +time_t lasttouched; 34 +int runflag = 0; 35 + 36 enum { 37 INIT, 38 INPUT, 39 @@ -140,7 +145,9 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, 40 failure = 0; 41 oldc = INIT; 42 43 - while (running && !XNextEvent(dpy, &ev)) { 44 + while (running) { 45 + while (XPending(dpy)) { 46 + XNextEvent(dpy, &ev); 47 if (ev.type == KeyPress) { 48 explicit_bzero(&buf, sizeof(buf)); 49 num = XLookupString(&ev.xkey, buf, sizeof(buf), &ksym, 0); 50 @@ -217,6 +224,17 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, 51 XRaiseWindow(dpy, locks[screen]->win); 52 } 53 } 54 + 55 + time_t currenttime; 56 + time(¤ttime); 57 + 58 + if (currenttime >= lasttouched + timeoffset){ 59 + if (!runonce || !runflag){ 60 + runflag = 1; 61 + system(command); 62 + } 63 + } 64 + } 65 } 66 67 static struct lock * 68 @@ -229,6 +247,8 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) 69 XSetWindowAttributes wa; 70 Cursor invisible; 71 72 + time(&lasttouched); 73 + 74 if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(struct lock)))) 75 return NULL; 76