commit 1e8125f674f7f90ccdf922832395af2bfe4f6f62
parent 183e74eee8040025b86e60feaeabad8c27caf36a
Author: sewn <sewn@disroot.org>
Date: Sat, 12 Oct 2024 20:48:10 +0300
[slstatus][patch][signals] overhaul logic
allows thread-safety and wait-time for signal catch.
Diffstat:
2 files changed, 38 insertions(+), 36 deletions(-)
diff --git a/tools.suckless.org/slstatus/patches/signals/index.md b/tools.suckless.org/slstatus/patches/signals/index.md
@@ -3,9 +3,13 @@ signals
Description
-----------
-This patch lets slstatus handle signals and use intervals
+This patch lets slstatus handle signals and uses 'turns'
to update modules in the status text.
+After each interval loop, that iteration is what is used to
+give a module its 'turn'. If the interval is simply 1000ms (default),
+the 'turn' will effectively function as a interval for that module.
+
This behavior is similar to that of [dwmblocks](https://github.com/torrinfail/dwmblocks).
Download
diff --git a/tools.suckless.org/slstatus/patches/signals/slstatus-signals-1.0.patch b/tools.suckless.org/slstatus/patches/signals/slstatus-signals-1.0.patch
@@ -1,15 +1,15 @@
-From 7ec52e9f292fa50fae646d89302a3aa0c326b83e Mon Sep 17 00:00:00 2001
+From 8eaf9e1d101d93c784b12902eb71d5b2985a6985 Mon Sep 17 00:00:00 2001
From: sewn <sewn@disroot.org>
-Date: Fri, 13 Sep 2024 11:51:02 +0300
-Subject: [PATCH] implement signals & intervals
+Date: Sat, 12 Oct 2024 20:45:16 +0300
+Subject: [PATCH] implement signals & turns
---
config.def.h | 11 ++++--
- slstatus.c | 109 +++++++++++++++++++++++++++++++++------------------
- 2 files changed, 77 insertions(+), 43 deletions(-)
+ slstatus.c | 108 ++++++++++++++++++++++++++++++++-------------------
+ 2 files changed, 75 insertions(+), 44 deletions(-)
diff --git a/config.def.h b/config.def.h
-index d805331..7fbd164 100644
+index d805331..a89127b 100644
--- a/config.def.h
+++ b/config.def.h
@@ -6,8 +6,8 @@ const unsigned int interval = 1000;
@@ -29,27 +29,28 @@ index d805331..7fbd164 100644
static const struct arg args[] = {
- /* function format argument */
- { datetime, "%s", "%F %T" },
-+ /* function format argument interval signal */
-+ { datetime, "%s", "%F %T", 1, -1 },
++ /* function format argument turn signal */
++ { datetime, "%s", "%F %T", 1, -1 },
};
+
+/* maximum output string length */
+#define MAXLEN CMDLEN * LEN(args)
diff --git a/slstatus.c b/slstatus.c
-index fd31313..41ef7a9 100644
+index fd31313..d5efd35 100644
--- a/slstatus.c
+++ b/slstatus.c
@@ -15,20 +15,19 @@ struct arg {
const char *(*func)(const char *);
const char *fmt;
const char *args;
-+ unsigned int interval;
++ unsigned int turn;
+ int signal;
};
char buf[1024];
+-static volatile sig_atomic_t done;
+static int sflag = 0;
- static volatile sig_atomic_t done;
++static volatile sig_atomic_t done, upsigno;
static Display *dpy;
#include "config.h"
@@ -65,26 +66,23 @@ index fd31313..41ef7a9 100644
static void
difftimespec(struct timespec *res, struct timespec *a, struct timespec *b)
-@@ -44,17 +43,68 @@ usage(void)
+@@ -44,17 +43,61 @@ usage(void)
die("usage: %s [-v] [-s] [-1]", argv0);
}
+static void
-+printstatus(int it, int upsig)
++printstatus(unsigned int iter)
+{
+ size_t i;
-+ int update = 0;
+ char status[MAXLEN];
+ const char *res;
+
+ for (i = 0; i < LEN(args); i++) {
-+ if (!((args[i].interval > 0 && !(it % args[i].interval)) ||
-+ (!it || (args[i].signal > -1 && upsig == args[i].signal)) ||
-+ (it < 0 && upsig < 0)))
++ if (!((!iter && !upsigno) || upsigno == SIGUSR1 ||
++ (!upsigno && args[i].turn > 0 && !(iter % args[i].turn)) ||
++ (args[i].signal >= 0 && upsigno - SIGRTMIN == args[i].signal)))
+ continue;
+
-+ update = 1;
-+
+ if (!(res = args[i].func(args[i].args)))
+ res = unknown_str;
+
@@ -92,9 +90,6 @@ index fd31313..41ef7a9 100644
+ break;
+ }
+
-+ if (!update)
-+ return;
-+
+ status[0] = '\0';
+ for (i = 0; i < LEN(args); i++)
+ strcat(status, statuses[i]);
@@ -116,10 +111,8 @@ index fd31313..41ef7a9 100644
+static void
+sighandler(const int signo)
+{
-+ if (signo <= SIGRTMAX && signo >= SIGRTMIN)
-+ printstatus(-1, signo - SIGRTMIN);
-+ else if (signo == SIGUSR1)
-+ printstatus(-1, -1);
++ if ((signo <= SIGRTMAX && signo >= SIGRTMIN) || signo == SIGUSR1)
++ upsigno = signo;
+ else
+ done = 1;
+}
@@ -133,13 +126,14 @@ index fd31313..41ef7a9 100644
- int sflag, ret;
- char status[MAXLEN];
- const char *res;
-+ int i, ret, time = 0;
++ unsigned int iter = 0;
++ int i, ret;
- sflag = 0;
ARGBEGIN {
case 'v':
die("slstatus-"VERSION);
-@@ -72,11 +122,12 @@ main(int argc, char *argv[])
+@@ -72,11 +115,12 @@ main(int argc, char *argv[])
usage();
memset(&act, 0, sizeof(act));
@@ -154,7 +148,7 @@ index fd31313..41ef7a9 100644
if (!sflag && !(dpy = XOpenDisplay(NULL)))
die("XOpenDisplay: Failed to open display");
-@@ -85,28 +136,7 @@ main(int argc, char *argv[])
+@@ -85,28 +129,7 @@ main(int argc, char *argv[])
if (clock_gettime(CLOCK_MONOTONIC, &start) < 0)
die("clock_gettime:");
@@ -180,11 +174,11 @@ index fd31313..41ef7a9 100644
- die("XStoreName: Allocation failed");
- XFlush(dpy);
- }
-+ printstatus(time++, -1);
++ printstatus(iter++);
if (!done) {
if (clock_gettime(CLOCK_MONOTONIC, ¤t) < 0)
-@@ -117,10 +147,11 @@ main(int argc, char *argv[])
+@@ -117,10 +140,15 @@ main(int argc, char *argv[])
intspec.tv_nsec = (interval % 1000) * 1E6;
difftimespec(&wait, &intspec, &diff);
@@ -192,14 +186,18 @@ index fd31313..41ef7a9 100644
- nanosleep(&wait, NULL) < 0 &&
- errno != EINTR)
- die("nanosleep:");
-+ do
-+ ret = nanosleep(&wait, &wait);
-+ while (wait.tv_sec >= 0 && ret < 0 && errno != EINTR && !done);
++ do {
++ if (errno == EINTR) {
++ printstatus(0);
++ errno = upsigno = 0;
++ }
++ ret = nanosleep(&wait, &wait);
++ } while (wait.tv_sec >= 0 && ret < 0 && !done);
+ if (ret < 0 && errno != EINTR)
+ die("nanosleep:");
}
} while (!done);
--
-2.46.0
+2.46.2