diff options
| author | Anselm R. Garbe <arg@suckless.org> | 2007-02-20 13:40:31 +0100 | 
|---|---|---|
| committer | Anselm R. Garbe <arg@suckless.org> | 2007-02-20 13:40:31 +0100 | 
| commit | f4d15b1fec52bdd6d512577fd96490efaddb55eb (patch) | |
| tree | 15543a14e188515cdd33297113e5c0d9d2344c09 | |
| parent | 355beb53f085f51f49159bc9822922c11fbddd26 (diff) | |
| download | dwm-f4d15b1fec52bdd6d512577fd96490efaddb55eb.tar.gz | |
separating drawsquare from drawtext, made drawtext extern
| -rw-r--r-- | dwm.h | 2 | ||||
| -rw-r--r-- | main.c | 112 | 
2 files changed, 65 insertions, 49 deletions
| @@ -131,6 +131,8 @@ 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 */ @@ -73,57 +73,21 @@ textnw(const char *text, unsigned int len) {  }  static void -drawtext(const char *text, unsigned long col[ColLast], Bool filledsquare, Bool emptysquare) { -	int x, y, w, h; -	static char buf[256]; -	unsigned int len, olen; +drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) { +	int x;  	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); -	} -	x = (h + 2) / 4; +	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(filledsquare) { +	if(filled) {  		r.width = r.height = x + 1;  		XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);  	} -	else if(emptysquare) { +	else if(empty) {  		r.width = r.height = x;  		XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1);  	} @@ -306,14 +270,18 @@ drawstatus(void) {  	dc.x = dc.y = 0;  	for(i = 0; i < ntags; i++) {  		dc.w = textw(tags[i]); -		if(seltag[i]) -			drawtext(tags[i], dc.sel, sel && sel->tags[i], isoccupied(i)); -		else -			drawtext(tags[i], dc.norm, sel && sel->tags[i], isoccupied(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, False, False); +	drawtext(lt->symbol, dc.norm);  	x = dc.x + dc.w;  	dc.w = textw(stext);  	dc.x = sw - dc.w; @@ -321,16 +289,62 @@ drawstatus(void) {  		dc.x = x;  		dc.w = sw - x;  	} -	drawtext(stext, dc.norm, False, False); +	drawtext(stext, dc.norm);  	if((dc.w = dc.x - x) > bh) {  		dc.x = x; -		drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm, False, False); +		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; | 
