t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 3a69c5173cdd24959410870bec2a10a76272e034
   DIR parent 439e15d09f6fa9271d3b49ef97194f0c80ebe161
   URI Author: Anselm R. Garbe <garbeam@wmii.de>
       Date:   Tue, 11 Jul 2006 11:10:05 +0200
       
       implemented pipe_spawn
       
       Diffstat:
         M config.h                            |       2 ++
         M event.c                             |       6 ++----
         M menu.c                              |       9 +++++++++
         M util.c                              |      56 ++++++++++++++++++++++++++++---
         M util.h                              |       3 ++-
         M wm.c                                |       7 ++-----
         M wm.h                                |       2 +-
       
       7 files changed, 70 insertions(+), 15 deletions(-)
       ---
   DIR diff --git a/config.h b/config.h
       t@@ -7,3 +7,5 @@
        #define BGCOLOR                "#000000"
        #define FGCOLOR                "#ffaa00"
        #define BORDERCOLOR        "#000000"
       +#define STATUSCMD        "echo -n `date` `uptime | sed 's/.*://; s/,//g'`" \
       +                                        " `acpi | awk '{print $4}' | sed 's/,//'`"
   DIR diff --git a/event.c b/event.c
       t@@ -218,7 +218,6 @@ keymapnotify(XEvent *e)
        static void
        maprequest(XEvent *e)
        {
       -#if 0
                XMapRequestEvent *ev = &e->xmaprequest;
                static XWindowAttributes wa;
        
       t@@ -231,9 +230,8 @@ maprequest(XEvent *e)
                        return;
                }
        
       -        if(!client_of_win(ev->window))
       -                manage_client(create_client(ev->window, &wa));
       -#endif
       +        /*if(!client_of_win(ev->window))*/
       +                manage(create_client(ev->window, &wa));
        }
        
        static void
   DIR diff --git a/menu.c b/menu.c
       t@@ -356,6 +356,15 @@ main(int argc, char *argv[])
                char *maxname;
                XEvent ev;
        
       +        char buf[256];
       +
       +        fputs(STATUSCMD, stdout);
       +        fputs("\n", stdout);
       +        pipe_spawn(buf, sizeof(buf), NULL, STATUSCMD);
       +        fputs(buf, stderr);
       +
       +        return 0;
       +
                /* command line args */
                for(i = 1; i < argc; i++) {
                        if (argv[i][0] == '-')
   DIR diff --git a/util.c b/util.c
       t@@ -13,6 +13,8 @@
        
        #include "util.h"
        
       +static char *shell = NULL;
       +
        void
        error(char *errstr, ...) {
                va_list ap;
       t@@ -82,19 +84,65 @@ swap(void **p1, void **p2)
        }
        
        void
       -spawn(Display *dpy, const char *shell, const char *cmd)
       +spawn(Display *dpy, const char *cmd)
        {
       -        if(!cmd || !shell)
       +        if(!shell && !(shell = getenv("SHELL")))
       +                shell = "/bin/sh";
       +
       +        if(!cmd)
                        return;
                if(fork() == 0) {
                        if(fork() == 0) {
       +                        setsid();
                                if(dpy)
                                        close(ConnectionNumber(dpy));
       -                        execl(shell, shell, "-c", cmd, (const char *)0);
       -                        fprintf(stderr, "gridwm: execl %s", shell);
       +                        execlp(shell, "shell", "-c", cmd, NULL);
       +                        fprintf(stderr, "gridwm: execvp %s", cmd);
                                perror(" failed");
                        }
                        exit (0);
                }
                wait(0);
        }
       +
       +void
       +pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd)
       +{
       +        unsigned int l, n;
       +        int pfd[2];
       +
       +        if(!shell && !(shell = getenv("SHELL")))
       +                shell = "/bin/sh";
       +
       +        if(!cmd)
       +                return;
       +
       +        if(pipe(pfd) == -1) {
       +                perror("pipe");
       +                exit(1);
       +        }
       +
       +        if(fork() == 0) {
       +                setsid();
       +                if(dpy)
       +                        close(ConnectionNumber(dpy));
       +                dup2(pfd[1], STDOUT_FILENO);
       +                close(pfd[0]);
       +                close(pfd[1]);
       +                execlp(shell, "shell", "-c", cmd, NULL);
       +                fprintf(stderr, "gridwm: execvp %s", cmd);
       +                perror(" failed");
       +        }
       +        else {
       +                n = 0;
       +                close(pfd[1]);
       +                while(l > n) {
       +                        if((l = read(pfd[0], buf + n, len - n)) < 1)
       +                                break;
       +                        n += l;
       +                }
       +                close(pfd[0]);
       +                buf[n - 1] = 0;
       +        }
       +        wait(0);
       +}
   DIR diff --git a/util.h b/util.h
       t@@ -14,5 +14,6 @@ extern char *estrdup(const char *str);
                                failed_assert(#a, __FILE__, __LINE__); \
                } while (0)
        extern void failed_assert(char *a, char *file, int line);
       +void pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd);
       +extern void spawn(Display *dpy, const char *cmd);
        extern void swap(void **p1, void **p2);
       -extern void spawn(Display *dpy, const char *shell, const char *cmd);
   DIR diff --git a/wm.c b/wm.c
       t@@ -21,7 +21,7 @@ Cursor cursor[CurLast];
        XRectangle rect, barrect;
        Bool running = True;
        
       -char *bartext, *shell;
       +char *bartext;
        int screen, sel_screen;
        unsigned int lock_mask, numlock_mask;
        
       t@@ -56,7 +56,7 @@ scan_wins()
                                if(wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
                                        continue;
                                if(wa.map_state == IsViewable)
       -                                /*manage*/;
       +                                manage(create_client(wins[i], &wa));
                        }
                }
                if(wins)
       t@@ -219,9 +219,6 @@ main(int argc, char *argv[])
                if(other_wm_running)
                        error("gridwm: another window manager is already running\n");
        
       -        if(!(shell = getenv("SHELL")))
       -                shell = "/bin/sh";
       -
                rect.x = rect.y = 0;
                rect.width = DisplayWidth(dpy, screen);
                rect.height = DisplayHeight(dpy, screen);
   DIR diff --git a/wm.h b/wm.h
       t@@ -55,7 +55,7 @@ extern void (*handler[LASTEvent]) (XEvent *);
        
        extern int screen, sel_screen;
        extern unsigned int lock_mask, numlock_mask;
       -extern char *bartext, *shell;
       +extern char *bartext;
        
        extern Brush brush;