# HG changeset patch # User Anselm R. Garbe # Date 1152634511 -7200 # Node ID 5c078b66347b13df5d04682f974d895bb2c72b97 # Parent 5cc5e55a132d40bdec74005b434e46260b3ff1da added bar event timer diff -r 5cc5e55a132d -r 5c078b66347b bar.c --- a/bar.c Tue Jul 11 16:14:22 2006 +0200 +++ b/bar.c Tue Jul 11 18:15:11 2006 +0200 @@ -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); diff -r 5cc5e55a132d -r 5c078b66347b client.c --- a/client.c Tue Jul 11 16:14:22 2006 +0200 +++ b/client.c Tue Jul 11 18:15:11 2006 +0200 @@ -122,6 +122,8 @@ XSetErrorHandler(error_handler); XUngrabServer(dpy); flush_events(EnterWindowMask); + if(stack) + focus(stack); } @@ -135,3 +137,10 @@ return NULL; } +void +draw_client(Client *c) +{ + + + +} diff -r 5cc5e55a132d -r 5c078b66347b cmd.c --- a/cmd.c Tue Jul 11 16:14:22 2006 +0200 +++ b/cmd.c Tue Jul 11 18:15:11 2006 +0200 @@ -5,22 +5,22 @@ #include "wm.h" #include +#include 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; diff -r 5cc5e55a132d -r 5c078b66347b config.h --- a/config.h Tue Jul 11 16:14:22 2006 +0200 +++ b/config.h Tue Jul 11 18:15:11 2006 +0200 @@ -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 */ diff -r 5cc5e55a132d -r 5c078b66347b key.c --- a/key.c Tue Jul 11 16:14:22 2006 +0200 +++ b/key.c Tue Jul 11 18:15:11 2006 +0200 @@ -7,8 +7,20 @@ #include +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 @@ -37,7 +49,7 @@ 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; } } diff -r 5cc5e55a132d -r 5c078b66347b util.c --- a/util.c Tue Jul 11 16:14:22 2006 +0200 +++ b/util.c Tue Jul 11 18:15:11 2006 +0200 @@ -14,8 +14,6 @@ #include "util.h" -static char *shell = NULL; - void error(char *errstr, ...) { va_list ap; @@ -85,21 +83,17 @@ } 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); @@ -108,15 +102,12 @@ } 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) { @@ -131,8 +122,8 @@ 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 { diff -r 5cc5e55a132d -r 5c078b66347b util.h --- a/util.h Tue Jul 11 16:14:22 2006 +0200 +++ b/util.h Tue Jul 11 18:15:11 2006 +0200 @@ -9,12 +9,16 @@ 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); diff -r 5cc5e55a132d -r 5c078b66347b wm.c --- a/wm.c Tue Jul 11 16:14:22 2006 +0200 +++ b/wm.c Tue Jul 11 18:15:11 2006 +0200 @@ -3,10 +3,15 @@ * See LICENSE file for license details. */ +#include + #include #include #include +#include +#include + #include #include #include @@ -160,12 +165,9 @@ 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 @@ -176,6 +178,11 @@ 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++) { @@ -264,9 +271,19 @@ 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(); diff -r 5cc5e55a132d -r 5c078b66347b wm.h --- a/wm.h Tue Jul 11 16:14:22 2006 +0200 +++ b/wm.h Tue Jul 11 18:15:11 2006 +0200 @@ -42,8 +42,8 @@ struct Key { unsigned long mod; KeySym keysym; - void (*func)(char *arg); - char *arg; + void (*func)(void *aux); + void *aux; }; extern Display *dpy; @@ -64,8 +64,9 @@ 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);