You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
1.9 KiB
84 lines
1.9 KiB
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); |
|
} |
|
} |
|
|
|
|