77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 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 != '\0') {
 | |
| 		/* 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
 | |
| 		 */
 | |
| 		char *pathpfx_new = realloc(pathpfx, strlen(home) + strlen(dwmdir) + 3);
 | |
| 		if(pathpfx_new == NULL) {
 | |
| 			free(pathpfx);
 | |
| 			return;
 | |
| 		}
 | |
| 		pathpfx = pathpfx_new;
 | |
| 
 | |
| 		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);
 | |
| }
 |