dwm

dynamic window manager
git clone git://git.suckless.org/dwm
Log | Files | Refs | README | LICENSE

commit 586f66331d1105be03c42e6faeae1672b974a98a
parent 33996500763b04119a6867dfa4040a4236c21a41
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Tue, 11 Jul 2006 18:15:11 +0200

added bar event timer

Diffstat:
Mbar.c | 12+++++++++++-
Mclient.c | 9+++++++++
Mcmd.c | 10+++++-----
Mconfig.h | 12++----------
Mkey.c | 16++++++++++++++--
Mutil.c | 25++++++++-----------------
Mutil.h | 12++++++++----
Mwm.c | 33+++++++++++++++++++++++++--------
Mwm.h | 9+++++----
9 files changed, 87 insertions(+), 51 deletions(-)

diff --git a/bar.c b/bar.c @@ -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 --git a/client.c b/client.c @@ -122,6 +122,8 @@ unmanage(Client *c) XSetErrorHandler(error_handler); XUngrabServer(dpy); flush_events(EnterWindowMask); + if(stack) + focus(stack); } @@ -135,3 +137,10 @@ getclient(Window w) return NULL; } +void +draw_client(Client *c) +{ + + + +} diff --git a/cmd.c b/cmd.c @@ -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; diff --git a/config.h b/config.h @@ -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 --git a/key.c b/key.c @@ -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 @@ -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; } } diff --git a/util.c b/util.c @@ -14,8 +14,6 @@ #include "util.h" -static char *shell = NULL; - void error(char *errstr, ...) { va_list ap; @@ -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); @@ -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) { @@ -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 { diff --git a/util.h b/util.h @@ -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); diff --git a/wm.c b/wm.c @@ -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> @@ -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 @@ -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++) { @@ -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(); diff --git a/wm.h b/wm.h @@ -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; @@ -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);