using execl now, argv changed, using cmd and const char defs directly in the KEYS struct
9955ddc9
4 file(s) · +18 −18
| 17 | 17 | #define MASTERW 60 /* percent */ |
|
| 18 | 18 | ||
| 19 | 19 | #define KEYS \ |
|
| 20 | - | const char *browse[] = { "firefox", NULL }; \ |
|
| 21 | - | const char *gimp[] = { "gimp", NULL }; \ |
|
| 22 | - | const char *term[] = { \ |
|
| 23 | - | "urxvt", "-tr", "+sb", "-bg", "black", "-fg", "white", "-cr", "white", \ |
|
| 24 | - | "-fn", "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*", NULL \ |
|
| 25 | - | }; \ |
|
| 26 | - | const char *xlock[] = { "xlock", NULL }; \ |
|
| 27 | 20 | static Key key[] = { \ |
|
| 28 | 21 | /* modifier key function arguments */ \ |
|
| 29 | 22 | { MODKEY, XK_0, view, { .i = 0 } }, \ |
|
| 50 | 43 | { MODKEY|ShiftMask, XK_4, replacetag, { .i = 5 } }, \ |
|
| 51 | 44 | { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ |
|
| 52 | 45 | { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ |
|
| 53 | - | { MODKEY|ShiftMask, XK_Return, spawn, { .argv = term } }, \ |
|
| 54 | - | { MODKEY|ShiftMask, XK_g, spawn, { .argv = gimp } }, \ |
|
| 55 | - | { MODKEY|ShiftMask, XK_l, spawn, { .argv = xlock } }, \ |
|
| 56 | - | { MODKEY|ShiftMask, XK_w, spawn, { .argv = browse } }, \ |
|
| 46 | + | { MODKEY|ShiftMask, XK_x, spawn, \ |
|
| 47 | + | { .cmd = "exec `ls -lL /usr/bin /usr/local/bin 2>/dev/null |" \ |
|
| 48 | + | " awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | dmenu`" } }, \ |
|
| 49 | + | { MODKEY|ShiftMask, XK_Return, spawn, \ |
|
| 50 | + | { .cmd = "exec urxvt -tr +sb -bg black -fg white -cr white " \ |
|
| 51 | + | "-fn '-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*'" } }, \ |
|
| 57 | 52 | }; |
|
| 58 | 53 | ||
| 59 | 54 | #define RULES \ |
|
| 17 | 17 | #define MASTERW 60 /* percent */ |
|
| 18 | 18 | ||
| 19 | 19 | #define KEYS \ |
|
| 20 | - | const char *term[] = { "xterm", NULL }; \ |
|
| 21 | 20 | static Key key[] = { \ |
|
| 22 | 21 | /* modifier key function arguments */ \ |
|
| 23 | 22 | { MODKEY, XK_0, view, { .i = 0 } }, \ |
|
| 44 | 43 | { MODKEY|ShiftMask, XK_4, replacetag, { .i = 4 } }, \ |
|
| 45 | 44 | { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ |
|
| 46 | 45 | { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ |
|
| 47 | - | { MODKEY|ShiftMask, XK_Return, spawn, { .argv = term } }, \ |
|
| 46 | + | /* { MODKEY|ShiftMask, XK_x, spawn, */ \ |
|
| 47 | + | /* { .cmd = "exec `ls -lL /usr/bin /usr/local/bin 2>/dev/null |" */ \ |
|
| 48 | + | /* " awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | dmenu`" } }, */ \ |
|
| 49 | + | { MODKEY|ShiftMask, XK_Return, spawn, { .cmd = "exec xterm" } }, \ |
|
| 48 | 50 | }; |
|
| 49 | 51 | ||
| 50 | 52 | #define RULES \ |
|
| 17 | 17 | typedef struct Fnt Fnt; |
|
| 18 | 18 | ||
| 19 | 19 | union Arg { |
|
| 20 | - | const char **argv; |
|
| 20 | + | const char *cmd; |
|
| 21 | 21 | int i; |
|
| 22 | 22 | }; |
|
| 23 | 23 |
| 43 | 43 | void |
|
| 44 | 44 | spawn(Arg *arg) |
|
| 45 | 45 | { |
|
| 46 | - | char **argv = (char **)arg->argv; |
|
| 46 | + | static char *shell = NULL; |
|
| 47 | 47 | ||
| 48 | - | if(!argv || !argv[0]) |
|
| 48 | + | if(!shell && !(shell = getenv("SHELL"))) |
|
| 49 | + | shell = "/bin/sh"; |
|
| 50 | + | ||
| 51 | + | if(!arg->cmd) |
|
| 49 | 52 | return; |
|
| 50 | 53 | if(fork() == 0) { |
|
| 51 | 54 | if(fork() == 0) { |
|
| 52 | 55 | if(dpy) |
|
| 53 | 56 | close(ConnectionNumber(dpy)); |
|
| 54 | 57 | setsid(); |
|
| 55 | - | execvp(argv[0], argv); |
|
| 56 | - | fprintf(stderr, "dwm: execvp %s", argv[0]); |
|
| 58 | + | execl(shell, shell, "-c", arg->cmd, NULL); |
|
| 59 | + | fprintf(stderr, "dwm: execl '%s'", arg->cmd); |
|
| 57 | 60 | perror(" failed"); |
|
| 58 | 61 | } |
|
| 59 | 62 | exit(0); |