t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 586f66331d1105be03c42e6faeae1672b974a98a
   DIR parent 33996500763b04119a6867dfa4040a4236c21a41
   URI Author: Anselm R. Garbe <garbeam@wmii.de>
       Date:   Tue, 11 Jul 2006 18:15:11 +0200
       
       added bar event timer
       
       Diffstat:
         M bar.c                               |      12 +++++++++++-
         M client.c                            |       9 +++++++++
         M cmd.c                               |      10 +++++-----
         M config.h                            |      12 ++----------
         M key.c                               |      16 ++++++++++++++--
         M util.c                              |      25 ++++++++-----------------
         M util.h                              |      12 ++++++++----
         M wm.c                                |      33 +++++++++++++++++++++++--------
         M wm.h                                |       9 +++++----
       
       9 files changed, 87 insertions(+), 51 deletions(-)
       ---
   DIR diff --git a/bar.c b/bar.c
       t@@ -5,12 +5,22 @@
        
        #include "wm.h"
        
       +static const char *status[] = {
       +        "sh", "-c", "echo -n `date` `uptime | sed 's/.*://; s/,//g'`"
       +                " `acpi | awk '{print $4}' | sed 's/,//'`", 0 \
       +};
       +
        void
        draw_bar()
        {
       +        static char buf[1024];
       +
       +        buf[0] = 0;
       +        pipe_spawn(buf, sizeof(buf), dpy, (char **)status);
       +
                brush.rect = barrect;
                brush.rect.x = brush.rect.y = 0;
       -        draw(dpy, &brush, False, 0);
       +        draw(dpy, &brush, False, buf);
        
                XCopyArea(dpy, brush.drawable, barwin, brush.gc, 0, 0, barrect.width,
                                barrect.height, 0, 0);
   DIR diff --git a/client.c b/client.c
       t@@ -122,6 +122,8 @@ unmanage(Client *c)
                XSetErrorHandler(error_handler);
                XUngrabServer(dpy);
                flush_events(EnterWindowMask);
       +        if(stack)
       +                focus(stack);
        }
        
        
       t@@ -135,3 +137,10 @@ getclient(Window w)
                return NULL;
        }
        
       +void
       +draw_client(Client *c)
       +{
       +        
       +
       +
       +}
   DIR diff --git a/cmd.c b/cmd.c
       t@@ -5,22 +5,22 @@
        
        #include "wm.h"
        #include <stdio.h>
       +#include <string.h>
        
        void
       -run(char *arg)
       +run(void *aux)
        {
       -        spawn(dpy, arg);
       +        spawn(dpy, aux);
        }
        
        void
       -quit(char *arg)
       +quit(void *aux)
        {
       -        fputs("quit\n", stderr);
                running = False;
        }
        
        void
       -kill(char *arg)
       +kill(void *aux)
        {
                Client *c = stack;
        
   DIR diff --git a/config.h b/config.h
       t@@ -3,16 +3,8 @@
         * See LICENSE file for license details.
         */
        
       -#define FONT                "-*-terminus-medium-*-*-*-14-*-*-*-*-*-iso10646-*"
       +#define FONT                "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*"
        #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/,//'`"
       -#define PLCMD                "`ls -lL /bin /sbin /usr/bin /usr/local/bin 2>/dev/null | awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | gridmenu`"
       -
       -#define KEYS                \
       -        { Mod1Mask, XK_Return, run, "xterm -u8 -bg black -fg white -fn '-*-terminus-medium-*-*-*-14-*-*-*-*-*-iso10646-*'" }, \
       -        { Mod1Mask, XK_p, run, PLCMD }, \
       -        { Mod1Mask | ShiftMask, XK_q, quit, NULL},
       -
       +#define STATUSDELAY 1 /* milliseconds */
   DIR diff --git a/key.c b/key.c
       t@@ -7,8 +7,20 @@
        
        #include <X11/keysym.h>
        
       +static const char *term[] = { 
       +        "xterm", "-u8", "-bg", "black", "-fg", "white", "-fn",
       +        "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*", 0 
       +};
       +
       +static const char *proglist[] = {
       +                "sh", "-c", "exec `ls -lL /bin /sbin /usr/bin /usr/local/bin 2>/dev/null | awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | gridmenu`", 0
       +};
       +
        static Key key[] = {
       -        KEYS
       +        { Mod1Mask, XK_Return, run, term },
       +        { Mod1Mask, XK_p, run, proglist }, 
       +        { Mod1Mask | ShiftMask, XK_c, kill, NULL}, 
       +        { Mod1Mask | ShiftMask, XK_q, quit, NULL},
        };
        
        void
       t@@ -37,7 +49,7 @@ keypress(XEvent *e)
                for(i = 0; i < len; i++)
                        if((keysym == key[i].keysym) && (key[i].mod == ev->state)) {
                                if(key[i].func)
       -                                key[i].func(key[i].arg);
       +                                key[i].func(key[i].aux);
                                return;
                        }
        }
   DIR diff --git a/util.c b/util.c
       t@@ -14,8 +14,6 @@
        
        #include "util.h"
        
       -static char *shell = NULL;
       -
        void
        error(char *errstr, ...) {
                va_list ap;
       t@@ -85,21 +83,17 @@ swap(void **p1, void **p2)
        }
        
        void
       -spawn(Display *dpy, const char *cmd)
       +spawn(Display *dpy, char *argv[])
        {
       -        if(!shell && !(shell = getenv("SHELL")))
       -                shell = "/bin/sh";
       -
       -        if(!cmd)
       +        if(!argv || !argv[0])
                        return;
                if(fork() == 0) {
                        if(fork() == 0) {
                                if(dpy)
                                        close(ConnectionNumber(dpy));
                                setsid();
       -                        fprintf(stderr, "gridwm: execlp %s %s -c %s", shell, shell, cmd);
       -                        execlp(shell, shell, "-c", cmd, NULL);
       -                        fprintf(stderr, "gridwm: execlp %s", cmd);
       +                        execvp(argv[0], argv);
       +                        fprintf(stderr, "gridwm: execvp %s", argv[0]);
                                perror(" failed");
                        }
                        exit (0);
       t@@ -108,15 +102,12 @@ spawn(Display *dpy, const char *cmd)
        }
        
        void
       -pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd)
       +pipe_spawn(char *buf, unsigned int len, Display *dpy, char *argv[])
        {
                unsigned int l, n;
                int pfd[2];
        
       -        if(!shell && !(shell = getenv("SHELL")))
       -                shell = "/bin/sh";
       -
       -        if(!cmd)
       +        if(!argv || !argv[0])
                        return;
        
                if(pipe(pfd) == -1) {
       t@@ -131,8 +122,8 @@ pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd)
                        dup2(pfd[1], STDOUT_FILENO);
                        close(pfd[0]);
                        close(pfd[1]);
       -                execlp(shell, shell, "-c", cmd, NULL);
       -                fprintf(stderr, "gridwm: execlp %s", cmd);
       +                execvp(argv[0], argv);
       +                fprintf(stderr, "gridwm: execvp %s", argv[0]);
                        perror(" failed");
                }
                else {
   DIR diff --git a/util.h b/util.h
       t@@ -9,12 +9,16 @@ extern void *emallocz(unsigned int size);
        extern void *emalloc(unsigned int size);
        extern void *erealloc(void *ptr, unsigned int size);
        extern char *estrdup(const char *str);
       -#define eassert(a) do { \
       +#define eassert(a) \
       +        do { \
                        if(!(a)) \
                                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 pipe_spawn(char *buf, unsigned int len, Display *dpy, char *argv[]);
       +extern void spawn(Display *dpy, char *argv[]);
        extern void swap(void **p1, void **p2);
       -unsigned char *getselection(unsigned long offset, unsigned long *len, unsigned long *remain);
       +extern unsigned char *getselection(unsigned long offset, unsigned long *len,
       +                unsigned long *remain);
       +extern unsigned int tokenize(char **result, unsigned int reslen,
       +                char *str, char delim);
   DIR diff --git a/wm.c b/wm.c
       t@@ -3,10 +3,15 @@
         * See LICENSE file for license details.
         */
        
       +#include <errno.h>
       +
        #include <stdarg.h>
        #include <stdio.h>
        #include <stdlib.h>
        
       +#include <sys/types.h>
       +#include <sys/time.h>
       +
        #include <X11/cursorfont.h>
        #include <X11/Xatom.h>
        #include <X11/Xproto.h>
       t@@ -160,12 +165,9 @@ startup_error_handler(Display *dpy, XErrorEvent *error)
        static void
        cleanup()
        {
       -        /*
       -        Client *c;
       -        for(c=client; c; c=c->next)
       -                reparent_client(c, root, c->sel->rect.x, c->sel->rect.y);
       +        while(clients)
       +                unmanage(clients);
                XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
       -        */
        }
        
        int
       t@@ -176,6 +178,11 @@ main(int argc, char *argv[])
                unsigned int mask;
                Window w;
                XEvent ev;
       +        fd_set fds;
       +        struct timeval t, timeout = {
       +                .tv_usec = 0,
       +                .tv_sec = STATUSDELAY,
       +        };
        
                /* command line args */
                for(i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
       t@@ -264,9 +271,19 @@ main(int argc, char *argv[])
                scan_wins();
        
                while(running) {
       -                XNextEvent(dpy, &ev);
       -                if(handler[ev.type])
       -                        (handler[ev.type]) (&ev); /* call handler */
       +                if(XPending(dpy) > 0) {
       +                        XNextEvent(dpy, &ev);
       +                        if(handler[ev.type])
       +                                (handler[ev.type]) (&ev); /* call handler */
       +                        continue;
       +                }
       +                FD_ZERO(&fds);
       +                FD_SET(ConnectionNumber(dpy), &fds);
       +                t = timeout;
       +                if(select(ConnectionNumber(dpy) + 1, &fds, NULL, NULL, &t) > 0)
       +                        continue;
       +                else if(errno != EINTR)
       +                        draw_bar();
                }
        
                cleanup();
   DIR diff --git a/wm.h b/wm.h
       t@@ -42,8 +42,8 @@ struct Client {
        struct Key {
                unsigned long mod;
                KeySym keysym;
       -        void (*func)(char *arg);
       -        char *arg;
       +        void (*func)(void *aux);
       +        void *aux;
        };
        
        extern Display *dpy;
       t@@ -64,8 +64,9 @@ extern Client *clients, *stack;
        extern void draw_bar();
        
        /* cmd.c */
       -extern void run(char *arg);
       -extern void quit(char *arg);
       +extern void run(void *aux);
       +extern void quit(void *aux);
       +extern void kill(void *aux);
        
        /* client.c */
        extern void manage(Window w, XWindowAttributes *wa);