| dwm-6.0-spawn_cwd.diff - sites - public wiki contents of suckless.org | |
| git clone git://git.suckless.org/sites | |
| Log | |
| Files | |
| Refs | |
| --- | |
| dwm-6.0-spawn_cwd.diff (1836B) | |
| --- | |
| 1 https://github.com/sunaku/.dwm/compare/tip...spawn_cwd | |
| 2 --- | |
| 3 diff --git a/dwm.c b/dwm.c | |
| 4 index 1d78655..156ee60 100644 | |
| 5 --- a/dwm.c | |
| 6 +++ b/dwm.c | |
| 7 @@ -20,6 +20,7 @@ | |
| 8 * | |
| 9 * To understand everything else, start reading main(). | |
| 10 */ | |
| 11 +#include <assert.h> | |
| 12 #include <errno.h> | |
| 13 #include <locale.h> | |
| 14 #include <stdarg.h> | |
| 15 @@ -28,6 +29,8 @@ | |
| 16 #include <stdlib.h> | |
| 17 #include <string.h> | |
| 18 #include <unistd.h> | |
| 19 +#include <libgen.h> | |
| 20 +#include <sys/stat.h> | |
| 21 #include <sys/types.h> | |
| 22 #include <sys/wait.h> | |
| 23 #include <X11/cursorfont.h> | |
| 24 @@ -1661,11 +1664,45 @@ sigchld(int unused) { | |
| 25 while(0 < waitpid(-1, NULL, WNOHANG)); | |
| 26 } | |
| 27 | |
| 28 +#define SPAWN_CWD_DELIM " []{}()<>\"':" | |
| 29 + | |
| 30 void | |
| 31 spawn(const Arg *arg) { | |
| 32 if(fork() == 0) { | |
| 33 if(dpy) | |
| 34 close(ConnectionNumber(dpy)); | |
| 35 + if(selmon->sel) { | |
| 36 + const char* const home = getenv("HOME"); | |
| 37 + assert(home && strchr(home, '/')); | |
| 38 + const size_t homelen = strlen(home); | |
| 39 + char *cwd, *pathbuf = NULL; | |
| 40 + struct stat statbuf; | |
| 41 + | |
| 42 + cwd = strtok(selmon->sel->name, SPAWN_CWD_DELIM… | |
| 43 + /* NOTE: strtok() alters selmon->sel->name in-p… | |
| 44 + * but that does not matter because we are goin… | |
| 45 + * exec() below anyway; nothing else will use i… | |
| 46 + while(cwd) { | |
| 47 + if(*cwd == '~') { /* replace ~ with $HO… | |
| 48 + if(!(pathbuf = malloc(homelen +… | |
| 49 + die("fatal: could not m… | |
| 50 + strcpy(strcpy(pathbuf, home) + … | |
| 51 + cwd = pathbuf; | |
| 52 + } | |
| 53 + | |
| 54 + if(strchr(cwd, '/') && !stat(cwd, &stat… | |
| 55 + if(!S_ISDIR(statbuf.st_mode)) | |
| 56 + cwd = dirname(cwd); | |
| 57 + | |
| 58 + if(!chdir(cwd)) | |
| 59 + break; | |
| 60 + } | |
| 61 + | |
| 62 + cwd = strtok(NULL, SPAWN_CWD_DELIM); | |
| 63 + } | |
| 64 + | |
| 65 + free(pathbuf); | |
| 66 + } | |
| 67 setsid(); | |
| 68 execvp(((char **)arg->v)[0], (char **)arg->v); | |
| 69 fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]); |