personal/dotfiles

patches/slstatus-notify.diff in master
Repositories | Summary | Log | Files | README.md | LICENSE

slstatus-notify.diff (3183B) download


  1diff --git a/config.def.h b/config.def.h
  2index d805331..c37c675 100644
  3--- a/config.def.h
  4+++ b/config.def.h
  5@@ -6,6 +6,9 @@ const unsigned int interval = 1000;
  6 /* text to show if no value can be retrieved */
  7 static const char unknown_str[] = "n/a";
  8 
  9+/* if message is displayed, last max cycles, set to 0 to disable listening */
 10+const static int maxmsgcycle = 5;
 11+
 12 /* maximum output string length */
 13 #define MAXLEN 2048
 14 
 15diff --git a/slstatus.c b/slstatus.c
 16index fd31313..b9f8784 100644
 17--- a/slstatus.c
 18+++ b/slstatus.c
 19@@ -1,10 +1,13 @@
 20 /* See LICENSE file for copyright and license details. */
 21 #include <errno.h>
 22+#include <fcntl.h>
 23 #include <signal.h>
 24 #include <stdio.h>
 25 #include <stdlib.h>
 26 #include <string.h>
 27 #include <time.h>
 28+#include <unistd.h>
 29+#include <poll.h>
 30 #include <X11/Xlib.h>
 31 
 32 #include "arg.h"
 33@@ -13,6 +16,7 @@
 34 
 35 struct arg {
 36 	const char *(*func)(const char *);
 37+	int (*doenable)(const char *);
 38 	const char *fmt;
 39 	const char *args;
 40 };
 41@@ -21,6 +25,16 @@ char buf[1024];
 42 static volatile sig_atomic_t done;
 43 static Display *dpy;
 44 
 45+int always(const char *unused) {
 46+	(void)unused;
 47+	return 1;
 48+}
 49+
 50+int never(const char *unused) {
 51+	(void)unused;
 52+	return 0;
 53+}
 54+
 55 #include "config.h"
 56 
 57 static void
 58@@ -38,10 +52,25 @@ difftimespec(struct timespec *res, struct timespec *a, struct timespec *b)
 59 	               (a->tv_nsec < b->tv_nsec) * 1E9;
 60 }
 61 
 62+static int
 63+getnotify(int fifo, char* buffer, size_t size)
 64+{
 65+	struct pollfd fds = { fifo, POLLIN, 0 };
 66+
 67+	if (poll(&fds, 1, 0) <= 0)
 68+		return 0;
 69+
 70+	int len = 0;
 71+	while (read(fifo, buffer + len, 1) > 0 && buffer[len] != '\n' && len < size)
 72+		len++;
 73+	buffer[len] = '\0';
 74+	return len;
 75+}
 76+
 77 static void
 78 usage(void)
 79 {
 80-	die("usage: %s [-v] [-s] [-1]", argv0);
 81+	die("usage: %s [-v] [-s] [-1] [-p fifo]", argv0);
 82 }
 83 
 84 int
 85@@ -51,8 +80,11 @@ main(int argc, char *argv[])
 86 	struct timespec start, current, diff, intspec, wait;
 87 	size_t i, len;
 88 	int sflag, ret;
 89+	int fifo, msgcycle = 0;
 90 	char status[MAXLEN];
 91 	const char *res;
 92+	const char *fifopath = NULL;
 93+	char *nl;
 94 
 95 	sflag = 0;
 96 	ARGBEGIN {
 97@@ -64,6 +96,9 @@ main(int argc, char *argv[])
 98 	case 's':
 99 		sflag = 1;
100 		break;
101+	case 'p':
102+		fifopath = EARGF(usage());
103+		break;
104 	default:
105 		usage();
106 	} ARGEND
107@@ -78,6 +113,9 @@ main(int argc, char *argv[])
108 	act.sa_flags |= SA_RESTART;
109 	sigaction(SIGUSR1, &act, NULL);
110 
111+	if (fifopath && (fifo = open(fifopath, O_RDONLY)) == -1)
112+		die("open(fifo): ");
113+
114 	if (!sflag && !(dpy = XOpenDisplay(NULL)))
115 		die("XOpenDisplay: Failed to open display");
116 
117@@ -85,8 +123,19 @@ main(int argc, char *argv[])
118 		if (clock_gettime(CLOCK_MONOTONIC, &start) < 0)
119 			die("clock_gettime:");
120 
121+		if (msgcycle > 0) {
122+			msgcycle--;
123+		} else if (fifopath && getnotify(fifo, status, sizeof(status)) > 0) {
124+			if (!*status)
125+				continue;
126+		
127+			msgcycle = maxmsgcycle;
128+		} else {
129 		status[0] = '\0';
130 		for (i = len = 0; i < LEN(args); i++) {
131+				if (!args[i].doenable(args[i].args))
132+					continue;
133+
134 			if (!(res = args[i].func(args[i].args)))
135 				res = unknown_str;
136 
137@@ -95,6 +144,7 @@ main(int argc, char *argv[])
138 				break;
139 
140 			len += ret;
141+			}
142 		}
143 
144 		if (sflag) {