diff options
| author | Anselm R. Garbe <garbeam@wmii.de> | 2006-07-11 18:15:11 +0200 | 
|---|---|---|
| committer | Anselm R. Garbe <garbeam@wmii.de> | 2006-07-11 18:15:11 +0200 | 
| commit | 586f66331d1105be03c42e6faeae1672b974a98a (patch) | |
| tree | b5a4f654969baf431ac0f10dad2354d70e7efc2b | |
| parent | 33996500763b04119a6867dfa4040a4236c21a41 (diff) | |
| download | dwm-586f66331d1105be03c42e6faeae1672b974a98a.tar.gz | |
added bar event timer
| -rw-r--r-- | bar.c | 12 | ||||
| -rw-r--r-- | client.c | 9 | ||||
| -rw-r--r-- | cmd.c | 10 | ||||
| -rw-r--r-- | config.h | 12 | ||||
| -rw-r--r-- | key.c | 16 | ||||
| -rw-r--r-- | util.c | 25 | ||||
| -rw-r--r-- | util.h | 12 | ||||
| -rw-r--r-- | wm.c | 33 | ||||
| -rw-r--r-- | wm.h | 9 | 
9 files changed, 87 insertions, 51 deletions
| @@ -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); @@ -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) +{ +	 + + +} @@ -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; @@ -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 */ @@ -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;  		}  } @@ -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 { @@ -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); @@ -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(); @@ -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); | 
