---- - 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/dwm-autostart-20200610-cb3f58a.diff b/dwm.suckless.org/patches/autostart/dwm-autostart-20200610-cb3f58a.diff new file mode 100644 index 00000000..5245ace2 --- /dev/null +++ b/dwm.suckless.org/patches/autostart/dwm-autostart-20200610-cb3f58a.diff _AT_@ -0,0 +1,177 @@ +From 37e970479dc5d40e57fc0cbfeaa5e39941483237 Mon Sep 17 00:00:00 2001 +From: Gan Ainm <gan.ainm.riomhphost_AT_gmail.com> +Date: Wed, 10 Jun 2020 10:59:02 +0000 +Subject: [PATCH] dwm-xdgautostart-6.2.diff + +=================================================================== +--- + dwm.1 | 23 +++++++++++++++++ + dwm.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 105 insertions(+) + +diff --git a/dwm.1 b/dwm.1 +index 13b3729..9533aa6 100644 +--- a/dwm.1 ++++ b/dwm.1 +_AT_@ -30,6 +30,14 @@ top left corner. The tags which are applied to one or more windows are + indicated with an empty square in the top left corner. + .P + dwm draws a small border around windows to indicate the focus state. ++.P ++On start, dwm can start additional programs that may be specified in two special ++shell scripts (see the FILES section below), autostart_blocking.sh and ++autostart.sh. The former is executed first and dwm will wait for its ++termination before starting. The latter is executed in the background before ++dwm enters its handler loop. ++.P ++Either of these files may be omitted. + .SH OPTIONS + .TP + .B \-v +_AT_@ -152,6 +160,21 @@ Toggles focused window between floating and tiled state. + .TP + .B Mod1\-Button3 + Resize focused window while dragging. Tiled windows will be toggled to the floating state. ++.SH FILES ++The files containing programs to be started along with dwm are searched for in ++the following directories: ++.IP "1. $XDG_DATA_HOME/dwm" ++.IP "2. $HOME/.local/share/dwm" ++.IP "3. $HOME/.dwm" ++.P ++The first existing directory is scanned for any of the autostart files below. ++.TP 15 ++autostart.sh ++This file is started as a shell background process before dwm enters its handler ++loop. ++.TP 15 ++autostart_blocking.sh ++This file is started before any autostart.sh; dwm waits for its termination. + .SH CUSTOMIZATION + dwm is customized by creating a custom config.h and (re)compiling the source + code. This keeps it fast, secure and simple. +diff --git a/dwm.c b/dwm.c +index 4465af1..2156b49 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,81 @@ run(void) + handler[ev.type](&ev); /* call handler */ + } + ++void ++runautostart(void) ++{ ++ char *pathpfx; ++ char *path; ++ char *xdgdatahome; ++ char *home; ++ struct stat sb; ++ ++ if ((home = getenv("HOME")) == NULL) ++ /* this is almost impossible */ ++ return; ++ ++ /* if $XDG_DATA_HOME is set and not empty, use $XDG_DATA_HOME/dwm, ++ * otherwise use ~/.local/share/dwm as autostart script directory ++ */ ++ xdgdatahome = getenv("XDG_DATA_HOME"); ++ if (xdgdatahome != NULL && *xdgdatahome != '++ /* space for path segments, separators and nul */ ++ pathpfx = ecalloc(1, strlen(xdgdatahome) + strlen(dwmdir) + 2); ++ ++ if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0) { ++ free(pathpfx); ++ return; ++ } ++ } else { ++ /* space for path segments, separators and nul */ ++ pathpfx = ecalloc(1, strlen(home) + strlen(localshare) ++ + strlen(dwmdir) + 3); ++ ++ if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmdir) < 0) { ++ free(pathpfx); ++ return; ++ } ++ } ++ ++ /* check if the autostart script directory exists */ ++ if (! (stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) { ++ /* the XDG conformant path does not exist or is no directory ++ * 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 */ ++ path = ecalloc(1, strlen(pathpfx) + strlen(autostartblocksh) + 2); ++ 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 (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 +2223,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 3e2568cb..db295f18 100644 --- a/dwm.suckless.org/patches/autostart/index.md +++ b/dwm.suckless.org/patches/autostart/index.md _AT_@ -14,7 +14,7 @@ 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) +* [dwm-autostart-20200610-cb3f58a.diff](dwm-autostart-20200610-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).Received on Wed Jun 10 2020 - 13:50:13 CEST
This archive was generated by hypermail 2.3.0 : Wed Jun 10 2020 - 14:00:44 CEST