diff options
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | draw.c | 137 | ||||
| -rw-r--r-- | dwm.h | 10 | ||||
| -rw-r--r-- | main.c | 128 | 
4 files changed, 144 insertions, 133 deletions
@@ -3,7 +3,7 @@  include config.mk -SRC = client.c event.c layout.c main.c tag.c util.c +SRC = client.c draw.c event.c layout.c main.c tag.c util.c  OBJ = ${SRC:.c=.o}  all: options dwm @@ -0,0 +1,137 @@ +/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com> + * See LICENSE file for license details. + */ +#include "dwm.h" +#include <string.h> + +/* static */ + +static unsigned int +textnw(const char *text, unsigned int len) { +	XRectangle r; + +	if(dc.font.set) { +		XmbTextExtents(dc.font.set, text, len, NULL, &r); +		return r.width; +	} +	return XTextWidth(dc.font.xfont, text, len); +} + +static void +drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) { +	int x; +	XGCValues gcv; +	XRectangle r = { dc.x, dc.y, dc.w, dc.h }; + +	gcv.foreground = col[ColFG]; +	XChangeGC(dpy, dc.gc, GCForeground, &gcv); +	x = (dc.font.ascent + dc.font.descent + 2) / 4; +	r.x = dc.x + 1; +	r.y = dc.y + 1; +	if(filled) { +		r.width = r.height = x + 1; +		XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); +	} +	else if(empty) { +		r.width = r.height = x; +		XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1); +	} +} + +static Bool +isoccupied(unsigned int t) { +	Client *c; + +	for(c = clients; c; c = c->next) +		if(c->tags[t]) +			return True; +	return False; +} + +/* extern */ + +void +drawstatus(void) { +	int i, x; + +	dc.x = dc.y = 0; +	for(i = 0; i < ntags; i++) { +		dc.w = textw(tags[i]); +		if(seltag[i]) { +			drawtext(tags[i], dc.sel); +			drawsquare(sel && sel->tags[i], isoccupied(i), dc.sel); +		} +		else { +			drawtext(tags[i], dc.norm); +			drawsquare(sel && sel->tags[i], isoccupied(i), dc.norm); +		} +		dc.x += dc.w; +	} +	dc.w = blw; +	drawtext(lt->symbol, dc.norm); +	x = dc.x + dc.w; +	dc.w = textw(stext); +	dc.x = sw - dc.w; +	if(dc.x < x) { +		dc.x = x; +		dc.w = sw - x; +	} +	drawtext(stext, dc.norm); +	if((dc.w = dc.x - x) > bh) { +		dc.x = x; +		drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm); +	} +	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0); +	XSync(dpy, False); +} + +void +drawtext(const char *text, unsigned long col[ColLast]) { +	int x, y, w, h; +	static char buf[256]; +	unsigned int len, olen; +	XGCValues gcv; +	XRectangle r = { dc.x, dc.y, dc.w, dc.h }; + +	XSetForeground(dpy, dc.gc, col[ColBG]); +	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); +	if(!text) +		return; +	w = 0; +	olen = len = strlen(text); +	if(len >= sizeof buf) +		len = sizeof buf - 1; +	memcpy(buf, text, len); +	buf[len] = 0; +	h = dc.font.ascent + dc.font.descent; +	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; +	x = dc.x + (h / 2); +	/* shorten text if necessary */ +	while(len && (w = textnw(buf, len)) > dc.w - h) +		buf[--len] = 0; +	if(len < olen) { +		if(len > 1) +			buf[len - 1] = '.'; +		if(len > 2) +			buf[len - 2] = '.'; +		if(len > 3) +			buf[len - 3] = '.'; +	} +	if(w > dc.w) +		return; /* too long */ +	gcv.foreground = col[ColFG]; +	if(dc.font.set) { +		XChangeGC(dpy, dc.gc, GCForeground, &gcv); +		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); +	} +	else { +		gcv.font = dc.font.xfont->fid; +		XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv); +		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); +	} +} + +unsigned int +textw(const char *text) { +	return textnw(text, strlen(text)) + dc.font.height; +} @@ -117,6 +117,12 @@ extern void updatetitle(Client *c);		/* update the name of c */  extern void unmanage(Client *c);		/* destroy c */  extern void zoom(Arg *arg);			/* zooms the focused client to master area, arg is ignored */ +/* draw.c */ +extern void drawstatus(void);			/* draw the bar */ +extern void drawtext(const char *text, +		unsigned long col[ColLast]);	/* draw text */ +extern unsigned int textw(const char *text);	/* return the width of text in px*/ +  /* event.c */  extern void grabkeys(void);			/* grab all keys defined in config.h */ @@ -130,10 +136,6 @@ extern void toggleversatile(Arg *arg);		/* toggles focusesd client between versa  extern void versatile(void);			/* arranges all windows versatile */  /* main.c */ -extern void drawstatus(void);			/* draw the bar */ -extern void drawtext(const char *text, -		unsigned long col[ColLast]);	/* draw text */ -extern unsigned int textw(const char *text);	/* return the width of text in px*/  extern void quit(Arg *arg);			/* quit dwm nicely */  extern void sendevent(Window w, Atom a, long value);	/* send synthetic event to w */  extern int xerror(Display *dsply, XErrorEvent *ee);	/* dwm's X error handler */ @@ -61,38 +61,6 @@ cleanup(void) {  	free(seltag);  } -static unsigned int -textnw(const char *text, unsigned int len) { -	XRectangle r; - -	if(dc.font.set) { -		XmbTextExtents(dc.font.set, text, len, NULL, &r); -		return r.width; -	} -	return XTextWidth(dc.font.xfont, text, len); -} - -static void -drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) { -	int x; -	XGCValues gcv; -	XRectangle r = { dc.x, dc.y, dc.w, dc.h }; - -	gcv.foreground = col[ColFG]; -	XChangeGC(dpy, dc.gc, GCForeground, &gcv); -	x = (dc.font.ascent + dc.font.descent + 2) / 4; -	r.x = dc.x + 1; -	r.y = dc.y + 1; -	if(filled) { -		r.width = r.height = x + 1; -		XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); -	} -	else if(empty) { -		r.width = r.height = x; -		XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1); -	} -} -  static unsigned long  getcolor(const char *colstr) {  	Colormap cmap = DefaultColormap(dpy, screen); @@ -103,16 +71,6 @@ getcolor(const char *colstr) {  	return color.pixel;  } -static Bool -isoccupied(unsigned int t) { -	Client *c; - -	for(c = clients; c; c = c->next) -		if(c->tags[t]) -			return True; -	return False; -} -  static void  scan(void) {  	unsigned int i, num; @@ -264,87 +222,6 @@ xerrorstart(Display *dsply, XErrorEvent *ee) {  /* extern */  void -drawstatus(void) { -	int i, x; - -	dc.x = dc.y = 0; -	for(i = 0; i < ntags; i++) { -		dc.w = textw(tags[i]); -		if(seltag[i]) { -			drawtext(tags[i], dc.sel); -			drawsquare(sel && sel->tags[i], isoccupied(i), dc.sel); -		} -		else { -			drawtext(tags[i], dc.norm); -			drawsquare(sel && sel->tags[i], isoccupied(i), dc.norm); -		} -		dc.x += dc.w; -	} -	dc.w = blw; -	drawtext(lt->symbol, dc.norm); -	x = dc.x + dc.w; -	dc.w = textw(stext); -	dc.x = sw - dc.w; -	if(dc.x < x) { -		dc.x = x; -		dc.w = sw - x; -	} -	drawtext(stext, dc.norm); -	if((dc.w = dc.x - x) > bh) { -		dc.x = x; -		drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm); -	} -	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0); -	XSync(dpy, False); -} - -void -drawtext(const char *text, unsigned long col[ColLast]) { -	int x, y, w, h; -	static char buf[256]; -	unsigned int len, olen; -	XGCValues gcv; -	XRectangle r = { dc.x, dc.y, dc.w, dc.h }; - -	XSetForeground(dpy, dc.gc, col[ColBG]); -	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); -	if(!text) -		return; -	w = 0; -	olen = len = strlen(text); -	if(len >= sizeof buf) -		len = sizeof buf - 1; -	memcpy(buf, text, len); -	buf[len] = 0; -	h = dc.font.ascent + dc.font.descent; -	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; -	x = dc.x + (h / 2); -	/* shorten text if necessary */ -	while(len && (w = textnw(buf, len)) > dc.w - h) -		buf[--len] = 0; -	if(len < olen) { -		if(len > 1) -			buf[len - 1] = '.'; -		if(len > 2) -			buf[len - 2] = '.'; -		if(len > 3) -			buf[len - 3] = '.'; -	} -	if(w > dc.w) -		return; /* too long */ -	gcv.foreground = col[ColFG]; -	if(dc.font.set) { -		XChangeGC(dpy, dc.gc, GCForeground, &gcv); -		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); -	} -	else { -		gcv.font = dc.font.xfont->fid; -		XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv); -		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); -	} -} - -void  sendevent(Window w, Atom a, long value) {  	XEvent e; @@ -358,11 +235,6 @@ sendevent(Window w, Atom a, long value) {  	XSync(dpy, False);  } -unsigned int -textw(const char *text) { -	return textnw(text, strlen(text)) + dc.font.height; -} -  void  quit(Arg *arg) {  	readin = running = False;  | 
