[hackers] [dwm][PATCH] add a dwm-init file and the ability to reload dwm

From: Abanoub Sameh <abanoubsameh_AT_protonmail.com>
Date: Mon, 20 Jul 2020 08:20:44 +0000

From: Abanoub Sameh <abanoubsameh_AT_protonmail.com>
Date: Tue, 14 Jul 2020 09:21:46 +0200

This patch allows dwm to be reloaded, it also includes a dwm-init file that can be used to used to start some programs once like xsetroot, dwmblocks, and a program to set the background etc. Also commands can be put at the end of the file to be run when dwm exits.

---
 Makefile     |  3 +++
 config.def.h |  3 ++-
 dwm-init     |  9 +++++++++
 dwm.c        | 12 ++++++++++++
 4 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644 dwm-init
diff --git a/Makefile b/Makefile
index 77bcbc0..be24b24 100644
--- a/Makefile
+++ b/Makefile
_AT_@ -40,12 +40,15 @@ install: all
 	mkdir -p ${DESTDIR}${PREFIX}/bin
 	cp -f dwm ${DESTDIR}${PREFIX}/bin
 	chmod 755 ${DESTDIR}${PREFIX}/bin/dwm
+	cp -f dwm-init ${DESTDIR}${PREFIX}/bin
+	chmod 755 ${DESTDIR}${PREFIX}/bin/dwm-init
 	mkdir -p ${DESTDIR}${MANPREFIX}/man1
 	sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
 	chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1
 
 uninstall:
 	rm -f ${DESTDIR}${PREFIX}/bin/dwm\
+		${DESTDIR}${PREFIX}/bin/dwm-init\
 		${DESTDIR}${MANPREFIX}/man1/dwm.1
 
 .PHONY: all options clean dist install uninstall
diff --git a/config.def.h b/config.def.h
index 1c0b587..a4d26da 100644
--- a/config.def.h
+++ b/config.def.h
_AT_@ -93,7 +93,8 @@ static Key keys[] = {
 	TAGKEYS(                        XK_7,                      6)
 	TAGKEYS(                        XK_8,                      7)
 	TAGKEYS(                        XK_9,                      8)
-	{ MODKEY|ShiftMask,             XK_q,      quit,           {0} },
+	{ MODKEY|ShiftMask,             XK_r,      quit,           {0} },
+	{ MODKEY|ShiftMask,             XK_q,      quitnoreload,   {0} },
 };
 
 /* button definitions */
diff --git a/dwm-init b/dwm-init
new file mode 100644
index 0000000..db111a3
--- /dev/null
+++ b/dwm-init
_AT_@ -0,0 +1,9 @@
+#!/bin/sh
+
+EXIT_NORELOAD=64
+# put stuff here to run once
+
+while true; do
+    dwm
+    [ $? = $EXIT_NORELOAD ] && break
+done
diff --git a/dwm.c b/dwm.c
index 9fd0286..b9feb50 100644
--- a/dwm.c
+++ b/dwm.c
_AT_@ -56,6 +56,7 @@
 #define HEIGHT(X)               ((X)->h + 2 * (X)->bw)
 #define TAGMASK                 ((1 << LENGTH(tags)) - 1)
 #define TEXTW(X)                (drw_fontset_getwidth(drw, (X)) + lrpad)
+#define EXIT_NORELOAD           64
 
 /* enums */
 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
_AT_@ -188,6 +189,7 @@ static Client *nexttiled(Client *c);
 static void pop(Client *);
 static void propertynotify(XEvent *e);
 static void quit(const Arg *arg);
+static void quitnoreload(const Arg *arg);
 static Monitor *recttomon(int x, int y, int w, int h);
 static void resize(Client *c, int x, int y, int w, int h, int interact);
 static void resizeclient(Client *c, int x, int y, int w, int h);
_AT_@ -268,6 +270,7 @@ static Display *dpy;
 static Drw *drw;
 static Monitor *mons, *selmon;
 static Window root, wmcheckwin;
+static int noreload = 0;
 
 /* configuration, allows nested code to access above variables */
 #include "config.h"
_AT_@ -1252,6 +1255,13 @@ quit(const Arg *arg)
 	running = 0;
 }
 
+void
+quitnoreload(const Arg *arg)
+{
+    noreload = 1;
+	running = 0;
+}
+
 Monitor *
 recttomon(int x, int y, int w, int h)
 {
_AT_@ -1649,6 +1659,7 @@ spawn(const Arg *arg)
 		execvp(((char **)arg->v)[0], (char **)arg->v);
 		fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]);
 		perror(" failed");
+        if (noreload) exit(EXIT_NORELOAD);
 		exit(EXIT_SUCCESS);
 	}
 }
_AT_@ -2148,5 +2159,6 @@ main(int argc, char *argv[])
 	run();
 	cleanup();
 	XCloseDisplay(dpy);
+    if (noreload) return EXIT_NORELOAD;
 	return EXIT_SUCCESS;
 }
-- 
2.27.0



Received on Mon Jul 20 2020 - 10:20:44 CEST

This archive was generated by hypermail 2.3.0 : Mon Jul 20 2020 - 10:24:34 CEST