diff options
| -rw-r--r-- | client.c | 22 | ||||
| -rw-r--r-- | config.arg.h | 5 | ||||
| -rw-r--r-- | draw.c | 96 | ||||
| -rw-r--r-- | dwm.1 | 8 | ||||
| -rw-r--r-- | dwm.h | 2 | ||||
| -rw-r--r-- | tag.c | 2 | ||||
| -rw-r--r-- | view.c | 8 | 
7 files changed, 69 insertions, 74 deletions
| @@ -28,19 +28,15 @@ resizetitle(Client *c)  {  	int i; -	c->tw = 0; -	for(i = 0; i < ntags; i++) -		if(c->tags[i]) -			c->tw += textw(tags[i]); -	c->tw += textw(c->name); +	c->tw = textw(c->name);  	if(c->tw > c->w)  		c->tw = c->w + 2;  	c->tx = c->x + c->w - c->tw + 2;  	c->ty = c->y;  	if(isvisible(c)) -		XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th); +		XMoveResizeWindow(dpy, c->twin, c->tx, c->ty, c->tw, c->th);  	else -		XMoveResizeWindow(dpy, c->title, c->tx + 2 * sw, c->ty, c->tw, c->th); +		XMoveResizeWindow(dpy, c->twin, c->tx + 2 * sw, c->ty, c->tw, c->th);  } @@ -65,7 +61,7 @@ void  ban(Client *c)  {  	XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); -	XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty); +	XMoveWindow(dpy, c->twin, c->tx + 2 * sw, c->ty);  }  void @@ -106,7 +102,7 @@ getctitle(Window w)  	Client *c;  	for(c = clients; c; c = c->next) -		if(c->title == w) +		if(c->twin == w)  			return c;  	return NULL;  } @@ -214,7 +210,7 @@ manage(Window w, XWindowAttributes *wa)  	twa.background_pixmap = ParentRelative;  	twa.event_mask = ExposureMask | EnterWindowMask; -	c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th, +	c->twin = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th,  			0, DefaultDepth(dpy, screen), CopyFromParent,  			DefaultVisual(dpy, screen),  			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); @@ -242,7 +238,7 @@ manage(Window w, XWindowAttributes *wa)  		sel = c;  	arrange(NULL);  	XMapWindow(dpy, c->win); -	XMapWindow(dpy, c->title); +	XMapWindow(dpy, c->twin);  	if(isvisible(c))  		focus(c);  } @@ -329,7 +325,7 @@ void  settitle(Client *c)  {  	char **list = NULL; -	int n; +	int i, n;  	XTextProperty name;  	name.nitems = 0; @@ -392,7 +388,7 @@ unmanage(Client *c)  	XSetErrorHandler(xerrordummy);  	XUngrabButton(dpy, AnyButton, AnyModifier, c->win); -	XDestroyWindow(dpy, c->title); +	XDestroyWindow(dpy, c->twin);  	if(c->prev)  		c->prev->next = c->next; diff --git a/config.arg.h b/config.arg.h index 70c245f..0e6b480 100644 --- a/config.arg.h +++ b/config.arg.h @@ -7,8 +7,7 @@  const char *tags[] = { "work", "net", "fnord", NULL };  #define DEFMODE			dotile /* dofloat */ -#define TFONT			"-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*" -#define FONT			"-*-snap-*-*-*-*-*-*-*-*-*-*-*-*" +#define FONT			"-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*"  #define BGCOLOR			"#0d121d"  #define FGCOLOR			"#eeeeee"  #define BORDERCOLOR		"#3f484d" @@ -19,7 +18,7 @@ const char *tags[] = { "work", "net", "fnord", NULL };  static Key key[] = { \  	/* modifier			key		function	arguments */ \  	{ MODKEY|ShiftMask,		XK_Return,	spawn, \ -		{ .cmd = "exec uxterm +sb -bg black -fg '#eeeeee' -fn '"TFONT"'" } }, \ +		{ .cmd = "exec uxterm +sb -bg black -fg '#eeeeee' -fn '"FONT"'" } }, \  	{ MODKEY,			XK_p,		spawn, \  		{ .cmd = "exec `ls -lL /usr/bin /usr/X11R6/bin /usr/local/bin 2>/dev/null | " \  			"awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort -u | dmenu`" } }, \ @@ -22,19 +22,9 @@ textnw(const char *text, unsigned int len)  }  static void -drawtext(const char *text, Bool invert) +drawborder()  { -	int x, y, w, h; -	static char buf[256]; -	unsigned int len, olen; -	XGCValues gcv;  	XPoint points[5]; -	XRectangle r = { dc.x, dc.y, dc.w, dc.h }; - -	XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); -	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); -	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); -	XSetForeground(dpy, dc.gc, dc.border);  	points[0].x = dc.x;  	points[0].y = dc.y;  	points[1].x = dc.w - 1; @@ -46,6 +36,23 @@ drawtext(const char *text, Bool invert)  	points[4].x = 0;  	points[4].y = -(dc.h - 1);  	XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); +} + +static void +drawtext(const char *text, Bool invert, Bool highlight) +{ +	int x, y, w, h; +	static char buf[256]; +	unsigned int len, olen; +	DC tmp; +	XGCValues gcv; +	XRectangle r = { dc.x, dc.y, dc.w, dc.h }; + +	XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); +	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); +	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); +	XSetForeground(dpy, dc.gc, dc.border); +	drawborder();  	if(!text)  		return; @@ -75,18 +82,25 @@ drawtext(const char *text, Bool invert)  	if(w > dc.w)  		return; /* too long */ -  	gcv.foreground = invert ? dc.bg : dc.fg;  	gcv.background = invert ? dc.fg : dc.bg;  	if(dc.font.set) {  		XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv); -		XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc, -				x, y, buf, len); +		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 | GCBackground | GCFont, &gcv); -		XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len); +		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); +	} +	if(highlight) { +		tmp = dc; +		dc.x += 2; +		dc.y += 2; +		dc.w -= 4; +		dc.h -= 4; +		drawborder(); +		dc = tmp;  	}  } @@ -110,36 +124,29 @@ drawstatus()  	dc.x = dc.y = 0;  	dc.w = bw; -	drawtext(NULL, !istile); +	drawtext(NULL, !istile, False);  	dc.w = 0;  	for(i = 0; i < ntags; i++) {  		dc.x += dc.w;  		dc.w = textw(tags[i]);  		if(istile) -			drawtext(tags[i], seltag[i]); +			drawtext(tags[i], seltag[i], sel && sel->tags[i]);  		else -			drawtext(tags[i], !seltag[i]); +			drawtext(tags[i], !seltag[i], sel && sel->tags[i]);  	}  	x = dc.x + dc.w;  	dc.w = textw(stext);  	dc.x = bx + bw - dc.w; -	drawtext(stext, !istile); - -	if(sel) { -		for(i = 0; i < ntags; i++) -			if(sel->tags[i]) { -				dc.w = textw(tags[i]); -				dc.x -= dc.w; -				if(dc.x < x) -					break; -				drawtext(tags[i], istile); -			} -		if(dc.x > x && (dc.x - x) > bh) { -			dc.w = dc.x - x; -			dc.x = x; -			drawtext(sel->name, istile); -		} +	if(dc.x < x) { +		dc.x = x; +		dc.w = bw - x; +	} +	drawtext(stext, !istile, False); + +	if(sel && ((dc.w = dc.x - x) > bh)) { +		dc.x = x; +		drawtext(sel->name, istile, False);  	}  	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);  	XSync(dpy, False); @@ -153,26 +160,17 @@ drawtitle(Client *c)  	if(c == sel && issel) {  		drawstatus(); -		XUnmapWindow(dpy, c->title); +		XUnmapWindow(dpy, c->twin);  		XSetWindowBorder(dpy, c->win, dc.fg);  		return;  	}  	XSetWindowBorder(dpy, c->win, dc.bg); -	XMapWindow(dpy, c->title); - -	dc.y = dc.w = 0; -	dc.x = c->tw; -	for(i = 0; i < ntags; i++) -		if(c->tags[i]) { -			dc.w = textw(tags[i]); -			dc.x -= dc.w; -			drawtext(tags[i], !istile); -		} -	dc.w = dc.x; -	dc.x = 0; -	drawtext(c->name, !istile); -	XCopyArea(dpy, dc.drawable, c->title, dc.gc, 0, 0, c->tw, c->th, 0, 0); +	XMapWindow(dpy, c->twin); +	dc.x = dc.y = 0; +	dc.w = c->tw; +	drawtext(c->name, !istile, False); +	XCopyArea(dpy, dc.drawable, c->twin, dc.gc, 0, 0, c->tw, c->th, 0, 0);  	XSync(dpy, False);  } @@ -21,12 +21,12 @@ tags. Selecting a certain tag for viewing will display all windows with that  tag.  .P  .B dwm -contains a small status bar which displays all available tags, the title and the -tags of the focused window, and the text read from standard input. +contains a small status bar which displays all available tags, the title  +of the focused window, and the text read from standard input. The tags of the +focused window are highlighted.  .P  .B dwm draws a 1-pixel border around windows to indicate the focus state. -Unfocused windows contain a small bar in front of them displaying their title -and tags. +Unfocused windows contain a small bar in front of them displaying their title.  .SH OPTIONS  .TP  .B \-v @@ -60,7 +60,7 @@ struct Client {  	Client *next;  	Client *prev;  	Window win; -	Window title; +	Window twin;  };  extern const char *tags[]; @@ -141,4 +141,6 @@ toggletag(Arg *arg)  	settitle(sel);  	if(!isvisible(sel))  		arrange(NULL); +	else +		drawstatus();  } @@ -168,21 +168,21 @@ restack()  	fi = 0;  	mi = 2 * f;  	if(sel->isfloat || arrange == dofloat) { -		wins[fi++] = sel->title; +		wins[fi++] = sel->twin;  		wins[fi++] = sel->win;  	}  	else { -		wins[mi++] = sel->title; +		wins[mi++] = sel->twin;  		wins[mi++] = sel->win;  	}  	for(c = clients; c; c = c->next)  		if(isvisible(c) && c != sel) {  			if(c->isfloat || arrange == dofloat) { -				wins[fi++] = c->title; +				wins[fi++] = c->twin;  				wins[fi++] = c->win;  			}  			else { -				wins[mi++] = c->title; +				wins[mi++] = c->twin;  				wins[mi++] = c->win;  			}  		} | 
