summaryrefslogtreecommitdiff
path: root/patch/autostart.c
diff options
context:
space:
mode:
Diffstat (limited to 'patch/autostart.c')
-rw-r--r--patch/autostart.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/patch/autostart.c b/patch/autostart.c
new file mode 100644
index 0000000..03477bb
--- /dev/null
+++ b/patch/autostart.c
@@ -0,0 +1,84 @@
+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);
+ }
+}
+