[wiki][sites][dwm][patch][autostart] Make autostart conform to XDG Base Directory specification

From: Gan Ainm <gan.ainm.riomhphost_AT_gmail.com>
Date: Wed, 10 Jun 2020 10:42:45 +0200

From e2e4429d93b1b4a94401b67a00f761cfd8a92f58 Mon Sep 17 00:00:00 2001
From: Gan Ainm <gan.ainm.riomphost_AT_gmail.com>
Date: Tue, 9 Jun 2020 19:59:31 +0000
Subject: [PATCH] [dwm][patch][autostart] Make autostart conform to XDG Base
 Directory specification

---
 .../dwm-autostart-20200609-cb3f58a.diff       | 144 ++++++++++++++++++
 dwm.suckless.org/patches/autostart/index.md   |   9 ++
 2 files changed, 153 insertions(+)
 create mode 100644 dwm.suckless.org/patches/autostart/dwm-autostart-20200609-cb3f58a.diff
diff --git a/dwm.suckless.org/patches/autostart/dwm-autostart-20200609-cb3f58a.diff b/dwm.suckless.org/patches/autostart/dwm-autostart-20200609-cb3f58a.diff
new file mode 100644
index 00000000..86db1579
--- /dev/null
+++ b/dwm.suckless.org/patches/autostart/dwm-autostart-20200609-cb3f58a.diff
_AT_@ -0,0 +1,144 @@
+From 63ed18e9ee236bb88426fddee2d311e090aee71d Mon Sep 17 00:00:00 2001
+From: Gan Ainm <gan.ainm.riomhphost_AT_gmail.com>
+Date: Tue, 9 Jun 2020 16:03:30 +0000
+Subject: [PATCH] Make autostart patch XDG conformant
+
+---
+ dwm.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 92 insertions(+)
+
+diff --git a/dwm.c b/dwm.c
+index 4465af1..ac6ed5e 100644
+--- a/dwm.c
++++ b/dwm.c
+_AT_@ -29,6 +29,7 @@
+ #include <string.h>
+ #include <unistd.h>
+ #include <sys/types.h>
++#include <sys/stat.h>
+ #include <sys/wait.h>
+ #include <X11/cursorfont.h>
+ #include <X11/keysym.h>
+_AT_@ -193,6 +194,7 @@ static void resizeclient(Client *c, int x, int y, int w, int h);
+ static void resizemouse(const Arg *arg);
+ static void restack(Monitor *m);
+ static void run(void);
++static void runautostart(void);
+ static void scan(void);
+ static int sendevent(Client *c, Atom proto);
+ static void sendmon(Client *c, Monitor *m);
+_AT_@ -235,7 +237,11 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee);
+ static void zoom(const Arg *arg);
+ 
+ /* variables */
++static const char autostartblocksh[] = "autostart_blocking.sh";
++static const char autostartsh[] = "autostart.sh";
+ static const char broken[] = "broken";
++static const char dwmdir[] = "dwm";
++static const char localshare[] = ".local/share";
+ static char stext[256];
+ static int screen;
+ static int sw, sh;           /* X display screen geometry width, height */
+_AT_@ -1380,6 +1386,91 @@ run(void)
+ 			handler[ev.type](&ev); /* call handler */
+ }
+ 
++void
++runautostart(void)
++{
++	char *pathpfx;
++	char *path;
++	char *xdgdatahome;
++	char *home;
++
++	if ((home = getenv("HOME")) == NULL)
++		/* this is almost impossible */
++		return;
++
++	/* if $XDG_DATA_HOME is defined, use $XDG_DATA_HOME/dwm,
++	 * otherwise use ~/.local/share/dwm as autostart script directory
++	 */
++	if ((xdgdatahome = getenv("XDG_DATA_HOME")) != NULL) {
++		/* space for path segments, separators and nul */
++		if ((pathpfx = malloc(strlen(xdgdatahome) + strlen(dwmdir) + 2)) == NULL)
++			return;
++
++		if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0) {
++			free(pathpfx);
++			return;
++		}
++	} else {
++		/* space for path segments, separators and nul */
++		if ((pathpfx = malloc(strlen(home) + strlen(localshare) + strlen(dwmdir) + 3)) == NULL)
++			return;
++
++		if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmdir) < 0) {
++			free(pathpfx);
++			return;
++		}
++	}
++
++	/* check if the autostart script directory exists */
++	struct stat sb;
++
++	if (! (stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) {
++		/* the XDG conformant path does not exist or are not directories
++		 * so we try ~/.dwm instead
++		 */
++		if (realloc(pathpfx, strlen(home) + strlen(dwmdir) + 3) == NULL) {
++			free(pathpfx);
++			return;
++		}
++
++		if (sprintf(pathpfx, "%s/.%s", home, dwmdir) <= 0) {
++			free(pathpfx);
++			return;
++		}
++	}
++
++	/* try the blocking script first */
++	if ((path = malloc(strlen(pathpfx) + strlen(autostartblocksh) + 2)) == NULL) {
++		free(pathpfx);
++		return;
++	} else
++		if (sprintf(path, "%s/%s", pathpfx, autostartblocksh) <= 0) {
++			free(path);
++			free(pathpfx);
++		}
++
++	if (access(path, X_OK) == 0) {
++		system(path);
++	}
++
++	/* now the non-blocking script */
++	if ((path = realloc(path, strlen(pathpfx) + strlen(autostartsh) + 4)) == NULL) {
++		free(pathpfx);
++		free(path);
++		return;
++	} else
++		if (sprintf(path, "%s/%s", pathpfx, autostartsh) <= 0) {
++			free(path);
++			free(pathpfx);
++		}
++
++	if (access(path, X_OK) == 0) {
++		system(strcat(path, " &"));
++		free(pathpfx);
++		free(path);
++	}
++}
++
+ void
+ scan(void)
+ {
+_AT_@ -2142,6 +2233,7 @@ main(int argc, char *argv[])
+ 		die("pledge");
+ #endif /* __OpenBSD__ */
+ 	scan();
++	runautostart();
+ 	run();
+ 	cleanup();
+ 	XCloseDisplay(dpy);
+-- 
+2.27.0
+
diff --git a/dwm.suckless.org/patches/autostart/index.md b/dwm.suckless.org/patches/autostart/index.md
index 18a1c122..3e2568cb 100644
--- a/dwm.suckless.org/patches/autostart/index.md
+++ b/dwm.suckless.org/patches/autostart/index.md
_AT_@ -14,8 +14,17 @@ bad idea to start X-applications here :)
 Download
 --------
 * [dwm-autostart-20161205-bb3bd6f.diff](dwm-autostart-20161205-bb3bd6f.diff)
+* [dwm-autostart-20200609-cb3f58a.diff](dwm-autostart-20200609-cb3f58a.diff)
+
+  This patch modifies the dwm autostart feature to conform to the
+  [XDG Base Directory specification](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html).
+
+  The files listed above are looked up in the directories "$XDG\_DATA\_HOME/dwm",
+  "$HOME/.local/share/dwm", and "$HOME/.dwm" respectively.  The first existing
+  directory is used, no matter if it actually contains any file.
 
 Authors
 -------
 * Pulled from: [https://github.com/axelGschaider/dwm-patch-autostart.sh/](https://github.com/axelGschaider/dwm-patch-autostart.sh/)
 * Adapted to recent version Simon Bremer <simon.bremer_AT_sys24.org>
+* XDG Base Directory conformance additions Gan Ainm <gan.ainm.riomhphost_AT_gmail.com>
-- 
2.27.0

Received on Wed Jun 10 2020 - 10:42:45 CEST

This archive was generated by hypermail 2.3.0 : Wed Jun 10 2020 - 10:48:47 CEST