~brown121407/dwm

586f66331d1105be03c42e6faeae1672b974a98a — Anselm R. Garbe 15 years ago 3399650
added bar event timer
9 files changed, 87 insertions(+), 51 deletions(-)

M bar.c
M client.c
M cmd.c
M config.h
M key.c
M util.c
M util.h
M wm.c
M wm.h
M bar.c => bar.c +11 -1
@@ 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);

M client.c => client.c +9 -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)
{
	


}

M cmd.c => cmd.c +5 -5
@@ 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;


M config.h => config.h +2 -10
@@ 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 */

M key.c => key.c +14 -2
@@ 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;
		}
}

M util.c => util.c +8 -17
@@ 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 {

M util.h => util.h +8 -4
@@ 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);

M wm.c => wm.c +25 -8
@@ 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();

M wm.h => wm.h +5 -4
@@ 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);