diff -r e47a47bd3ed4 dwm.c --- a/dwm.c Tue Jul 21 10:57:54 2009 +0100 +++ b/dwm.c Mon Aug 24 18:28:57 2009 +0200 @@ -169,6 +169,7 @@ static Monitor *dirtomon(int dir); static void drawbar(Monitor *m); static void drawbars(void); +static void drawvline(unsigned long col[ColLast]); static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]); static void drawtext(const char *text, unsigned long col[ColLast], Bool invert); static void enternotify(XEvent *e); @@ -648,10 +649,11 @@ void drawbar(Monitor *m) { - int x; + int x, ow, mw = 0, extra, tw; unsigned int i, n = 0, occ = 0, urg = 0; unsigned long *col; - Client *c; + Client *c, *firstvis, *lastvis = NULL; + DC seldc; for(c = m->clients; c; c = c->next) { if(ISVISIBLE(c)) @@ -689,16 +691,62 @@ } else dc.x = m->ww; - if((dc.w = dc.x - x) > bh) { - dc.x = x; - if(m->sel) { - col = m == selmon ? dc.sel : dc.norm; - drawtext(m->sel->name, col, False); - drawsquare(m->sel->isfixed, m->sel->isfloating, False, col); + + for(c = m->clients; c && !ISVISIBLE(c); c = c->next); + firstvis = c; + + col = m == selmon ? dc.sel : dc.norm; + dc.w = dc.x - x; + dc.x = x; + + if(n > 0) { + mw = dc.w / n; + extra = 0; + seldc = dc; + i = 0; + + while(c) { + lastvis = c; + tw = TEXTW(c->name); + if(tw < mw) extra += (mw - tw); else i++; + for(c = c->next; c && !ISVISIBLE(c); c = c->next); } - else + + if(i > 0) mw += extra / i; + + c = firstvis; + x = dc.x; + } + + while(dc.w > bh) { + if(c) { + ow = dc.w; + tw = TEXTW(c->name); + dc.w = MIN(ow, tw); + + if(dc.w > mw) dc.w = mw; + if(m->sel == c) seldc = dc; + if(c == lastvis) dc.w = ow; + + drawtext(c->name, col, False); + if(c != firstvis) drawvline(col); + drawsquare(c->isfixed, c->isfloating, False, col); + + dc.x += dc.w; + dc.w = ow - dc.w; + for(c = c->next; c && !ISVISIBLE(c); c = c->next); + } else { drawtext(NULL, dc.norm, False); + break; + } } + + if(m == selmon && m->sel && ISVISIBLE(m->sel)) { + dc = seldc; + drawtext(m->sel->name, col, True); + drawsquare(m->sel->isfixed, m->sel->isfloating, True, col); + } + XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->ww, bh, 0, 0); XSync(dpy, False); } @@ -709,6 +757,15 @@ for(m = mons; m; m = m->next) drawbar(m); +} + +void +drawvline(unsigned long col[ColLast]) { + XGCValues gcv; + + gcv.foreground = col[ColFG]; + XChangeGC(dpy, dc.gc, GCForeground, &gcv); + XDrawLine(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.x, dc.y + (dc.font.ascent + dc.font.descent + 2)); } void @@ -1235,8 +1292,7 @@ } if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { updatetitle(c); - if(c == selmon->sel) - drawbars(); + drawbars(); } } }