diff --git a/dwm.c b/dwm.c index 0362114..b74e787 100644 --- a/dwm.c +++ b/dwm.c @@ -704,13 +704,15 @@ dirtomon(int dir) void drawbar(Monitor *m) { - int x, xx, w, dx; - unsigned int i, occ = 0, urg = 0; + int x, xx, w, dx, tw, mw; + unsigned int i, occ = 0, urg = 0, n = 0, extra = 0; Client *c; dx = (drw->fonts[0]->ascent + drw->fonts[0]->descent + 2) / 4; for (c = m->clients; c; c = c->next) { + if (ISVISIBLE(c)) + n++; occ |= c->tags; if (c->isurgent) urg |= c->tags; @@ -741,14 +743,40 @@ drawbar(Monitor *m) x = m->ww; if ((w = x - xx) > bh) { x = xx; - if (m->sel) { - drw_setscheme(drw, m == selmon ? &scheme[SchemeSel] : &scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, m->sel->name, 0); - drw_rect(drw, x + 1, 1, dx, dx, m->sel->isfixed, m->sel->isfloating, 0); - } else { - drw_setscheme(drw, &scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 0, 1); + if (n > 0) { + tw = m->sel->name ? TEXTW(m->sel->name) : 0; + mw = (tw >= w || n == 1) ? 0 : (w - tw) / (n - 1); + + i = 0; + for (c = m->clients; c; c = c->next) { + if (!ISVISIBLE(c) || c == m->sel) + continue; + tw = TEXTW(c->name); + if(tw < mw) + extra += (mw - tw); + else + i++; + } + if (i > 0) + mw += extra / i; + + for (c = m->clients; c; c = c->next) { + if (!ISVISIBLE(c)) + continue; + xx = x + w; + tw = TEXTW(c->name); + w = MIN(m->sel == c ? w : mw, tw); + + drw_setscheme(drw, m->sel == c ? &scheme[SchemeSel] : &scheme[SchemeNorm]); + drw_text(drw, x, 0, w, bh, c->name, 0); + drw_rect(drw, x + 1, 1, dx, dx, c->isfixed, c->isfloating, 0); + + x += w; + w = xx - x; + } } + drw_setscheme(drw, &scheme[SchemeNorm]); + drw_rect(drw, x, 0, w, bh, 1, 0, 1); } drw_map(drw, m->barwin, 0, 0, m->ww, bh); }