URI: 
       using execl now, argv changed, using cmd and const char defs directly in the KEYS struct - dwm - dynamic window manager
  HTML git clone https://git.parazyd.org/dwm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 9955ddc978c2e6acfe246f29f1d317b55d860757
   DIR parent 0dfe729f90069de070495c82ddc72cc476a4f3ab
  HTML Author: arg@10ksloc.org <unknown>
       Date:   Fri,  4 Aug 2006 12:00:55 +0200
       
       using execl now, argv changed, using cmd and const char defs directly in the KEYS struct
       
       Diffstat:
         M config.arg.h                        |      17 ++++++-----------
         M config.default.h                    |       6 ++++--
         M dwm.h                               |       2 +-
         M util.c                              |      11 +++++++----
       
       4 files changed, 18 insertions(+), 18 deletions(-)
       ---
   DIR diff --git a/config.arg.h b/config.arg.h
       @@ -17,13 +17,6 @@ const char *tags[] = { "fnord", "dev", "net", "work", "misc", NULL };
        #define MASTERW                        60 /* percent */
        
        #define KEYS \
       -        const char *browse[] = { "firefox", NULL }; \
       -        const char *gimp[] = { "gimp", NULL }; \
       -        const char *term[] = { \
       -                "urxvt", "-tr", "+sb", "-bg", "black", "-fg", "white", "-cr", "white", \
       -                "-fn", "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*", NULL \
       -        }; \
       -        const char *xlock[] = { "xlock", NULL }; \
        static Key key[] = { \
                /* modifier                key                function        arguments */ \
                { MODKEY,                XK_0,                view,                { .i = 0 } }, \
       @@ -50,10 +43,12 @@ static Key key[] = { \
                { MODKEY|ShiftMask,        XK_4,                replacetag,        { .i = 5 } }, \
                { MODKEY|ShiftMask,        XK_c,                killclient,        { 0 } }, \
                { MODKEY|ShiftMask,        XK_q,                quit,                { 0 } }, \
       -        { MODKEY|ShiftMask,        XK_Return,        spawn,                { .argv = term } }, \
       -        { MODKEY|ShiftMask,        XK_g,                spawn,                { .argv = gimp } }, \
       -        { MODKEY|ShiftMask,        XK_l,                spawn,                { .argv = xlock } }, \
       -        { MODKEY|ShiftMask,        XK_w,                spawn,                { .argv = browse } }, \
       +        { MODKEY|ShiftMask,        XK_x,                spawn, \
       +                { .cmd = "exec `ls -lL /usr/bin /usr/local/bin 2>/dev/null |" \
       +                " awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | dmenu`" } }, \
       +        { MODKEY|ShiftMask,        XK_Return,        spawn, \
       +                { .cmd = "exec urxvt -tr +sb -bg black -fg white -cr white " \
       +                        "-fn '-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*'" } }, \
        };
        
        #define RULES \
   DIR diff --git a/config.default.h b/config.default.h
       @@ -17,7 +17,6 @@ const char *tags[] = { "0", "1", "2", "3", "4", NULL };
        #define MASTERW                        60 /* percent */
        
        #define KEYS \
       -        const char *term[] = { "xterm", NULL }; \
        static Key key[] = { \
                /* modifier                key                function        arguments */ \
                { MODKEY,                XK_0,                view,                { .i = 0 } }, \
       @@ -44,7 +43,10 @@ static Key key[] = { \
                { MODKEY|ShiftMask,        XK_4,                replacetag,        { .i = 4 } }, \
                { MODKEY|ShiftMask,        XK_c,                killclient,        { 0 } }, \
                { MODKEY|ShiftMask,        XK_q,                quit,                { 0 } }, \
       -        { MODKEY|ShiftMask,        XK_Return,        spawn,                { .argv = term } }, \
       +        /* { MODKEY|ShiftMask,        XK_x,                spawn, */ \
       +        /*        { .cmd = "exec `ls -lL /usr/bin /usr/local/bin 2>/dev/null |" */ \
       +        /*        " awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | dmenu`" } }, */ \
       +        { MODKEY|ShiftMask,        XK_Return,        spawn,                { .cmd = "exec xterm" } }, \
        };
        
        #define RULES \
   DIR diff --git a/dwm.h b/dwm.h
       @@ -17,7 +17,7 @@ typedef struct DC DC;
        typedef struct Fnt Fnt;
        
        union Arg {
       -        const char **argv;
       +        const char *cmd;
                int i;
        };
        
   DIR diff --git a/util.c b/util.c
       @@ -43,17 +43,20 @@ eprint(const char *errstr, ...)
        void
        spawn(Arg *arg)
        {
       -        char **argv = (char **)arg->argv;
       +        static char *shell = NULL;
        
       -        if(!argv || !argv[0])
       +        if(!shell && !(shell = getenv("SHELL")))
       +                shell = "/bin/sh";
       +
       +        if(!arg->cmd)
                        return;
                if(fork() == 0) {
                        if(fork() == 0) {
                                if(dpy)
                                        close(ConnectionNumber(dpy));
                                setsid();
       -                        execvp(argv[0], argv);
       -                        fprintf(stderr, "dwm: execvp %s", argv[0]);
       +                        execl(shell, shell, "-c", arg->cmd, NULL);
       +                        fprintf(stderr, "dwm: execl '%s'", arg->cmd);
                                perror(" failed");
                        }
                        exit(0);