commit e5a9d8539b2ec56aacb1db455a4235e4d1ff41ca
parent 35fd53f6f2f5c911532572e889333c4b43927afa
Author: bakkeby <bakkeby@gmail.com>
Date: Thu, 9 Sep 2021 11:54:37 +0200
Adding auto-timeout patch
Diffstat:
4 files changed, 60 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
@@ -26,7 +26,7 @@ slock tool, how to install it and how it works.
### Changelog:
-2021-09-09 - Added the failure-command and secret-password patches
+2021-09-09 - Added the auto-timeout, failure-command and secret-password patches
2021-06-08 - Added the color message patch
@@ -44,6 +44,9 @@ slock tool, how to install it and how it works.
- enables transparency for slock
- intended to be combined with a compositor that can blur the transparent background
+ - [auto-timeout](https://tools.suckless.org/slock/patches/auto-timeout/)
+ - allows for a command to be executed after a specified time of inactivity
+
- [blur_pixelated_screen](https://tools.suckless.org/slock/patches/blur-pixelated-screen/)
- sets the lockscreen picture to a blured or pixelated screenshot
diff --git a/config.def.h b/config.def.h
@@ -56,6 +56,17 @@ static const float alpha = 0.9;
/* treat a cleared input like a wrong password (color) */
static const int failonclear = 1;
+#if AUTO_TIMEOUT_PATCH
+/* length of time (seconds) until */
+static const int timeoffset = 60;
+
+/* should [command] be run only once? */
+static const int runonce = 0;
+
+/* command to be run after [time] has passed */
+static const char *command = "doas poweroff";
+#endif // AUTO_TIMEOUT_PATCH
+
#if FAILURE_COMMAND_PATCH
/* number of failed password attempts until failcommand is executed.
Set to 0 to disable */
diff --git a/patches.def.h b/patches.def.h
@@ -16,6 +16,11 @@
*/
#define ALPHA_PATCH 0
+/* This patch allows for a command to be executed after a specified time of inactivity.
+ * https://tools.suckless.org/slock/patches/auto-timeout/
+ */
+#define AUTO_TIMEOUT_PATCH 0
+
/* This patch sets the lockscreen picture to a blured or pixelated screenshot.
* This patch depends on the Imlib2 library, uncomment the relevant line in
* config.mk when enabling this patch.
diff --git a/slock.c b/slock.c
@@ -33,9 +33,9 @@
#if MEDIAKEYS_PATCH
#include <X11/XF86keysym.h>
#endif // MEDIAKEYS_PATCH
-#if QUICKCANCEL_PATCH
+#if QUICKCANCEL_PATCH || AUTO_TIMEOUT_PATCH
#include <time.h>
-#endif // QUICKCANCEL_PATCH
+#endif // QUICKCANCEL_PATCH / AUTO_TIMEOUT_PATCH
#if DPMS_PATCH
#include <X11/extensions/dpms.h>
#endif // DPMS_PATCH
@@ -48,6 +48,10 @@ char *argv0;
int failtrack = 0;
#endif // FAILURE_COMMAND_PATCH
+#if AUTO_TIMEOUT_PATCH
+static time_t lasttouched;
+int runflag = 0;
+#endif // AUTO_TIMEOUT_PATCH
#if QUICKCANCEL_PATCH
static time_t locktime;
#endif // QUICKCANCEL_PATCH
@@ -193,6 +197,9 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
#endif // PAMAUTH_PATCH
int num, screen, running, failure, oldc;
unsigned int len, color;
+ #if AUTO_TIMEOUT_PATCH
+ time_t currenttime;
+ #endif // AUTO_TIMEOUT_PATCH
#if CAPSCOLOR_PATCH
int caps;
unsigned int indicators;
@@ -213,11 +220,23 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
caps = indicators & 1;
#endif // CAPSCOLOR_PATCH
- while (running && !XNextEvent(dpy, &ev)) {
+ #if AUTO_TIMEOUT_PATCH
+ while (running)
+ #else
+ while (running && !XNextEvent(dpy, &ev))
+ #endif // AUTO_TIMEOUT_PATCH
+ {
+ #if AUTO_TIMEOUT_PATCH
+ while (XPending(dpy)) {
+ XNextEvent(dpy, &ev);
+ #endif // AUTO_TIMEOUT_PATCH
#if QUICKCANCEL_PATCH
running = !((time(NULL) - locktime < timetocancel) && (ev.type == MotionNotify));
#endif // QUICKCANCEL_PATCH
if (ev.type == KeyPress) {
+ #if AUTO_TIMEOUT_PATCH
+ time(&lasttouched);
+ #endif // AUTO_TIMEOUT_PATCH
explicit_bzero(&buf, sizeof(buf));
num = XLookupString(&ev.xkey, buf, sizeof(buf), &ksym, 0);
if (IsKeypadKey(ksym)) {
@@ -394,6 +413,20 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
for (screen = 0; screen < nscreens; screen++)
XRaiseWindow(dpy, locks[screen]->win);
}
+
+ #if AUTO_TIMEOUT_PATCH
+ }
+
+ time(¤ttime);
+
+ if (currenttime >= lasttouched + timeoffset) {
+ if (!runonce || !runflag) {
+ runflag = 1;
+ system(command);
+ }
+ lasttouched = currenttime;
+ }
+ #endif // AUTO_TIMEOUT_PATCH
}
}
@@ -407,6 +440,10 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
XSetWindowAttributes wa;
Cursor invisible;
+ #if AUTO_TIMEOUT_PATCH
+ time(&lasttouched);
+ #endif // AUTO_TIMEOUT_PATCH
+
if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(struct lock))))
return NULL;