--- Heyho, I noticed a inconvenient little bug with tabbed. With tabwidth=200, a window width of around 1280px and 9 tabs when the 8th tab was selected, it was displayed on the right, but neither the ">" (the after text icon) nor tab 9 were displayed. I looked at the code and since the problem was not immediately apparent to me, I decided to overhaul the respective part. This patch saves 10 SLoC and also tries to display every tab at the same width (min. tabwidth still working). Before this patch every tab had a constant width, only the selected one took all the remaining space. --Markus tabbed.c | 50 ++++++++++++++++++++------------------------------ 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/tabbed.c b/tabbed.c index cdd6bd3..d24b299 100644 --- a/tabbed.c +++ b/tabbed.c _AT_@ -179,15 +179,13 @@ buttonpress(const XEvent *e) { int fc; Arg arg; - fc = getfirsttab(); - - if((fc > 0 && ev->x < TEXTW(before)) || ev->x < 0) + if(ev->y < 0 || ev->y > bh) return; - if(ev->y < 0 || ev-> y > bh) + if(((fc = getfirsttab()) > 0 && ev->x < TEXTW(before)) || ev->x < 0) return; - for(i = (fc > 0) ? fc : 0; i < nclients; i++) { + for(i = fc; i < nclients; i++) { if(clients[i]->tabx > ev->x) { switch(ev->button) { case Button1: _AT_@ -318,7 +316,7 @@ die(const char *errstr, ...) { void drawbar(void) { unsigned long *col; - int c, fc, width, n = 0; + int c, cc, fc, width; char *name = NULL; if(nclients == 0) { _AT_@ -333,12 +331,11 @@ drawbar(void) { } width = ww; - clients[nclients-1]->tabx = -1; - fc = getfirsttab(); - if(fc > -1) - n = nclients - fc; + cc = ww / tabwidth; + if(nclients > cc) + cc = (ww - TEXTW(before) - TEXTW(after)) / tabwidth; - if((n * tabwidth) > width) { + if((fc = getfirsttab()) + cc < nclients) { dc.w = TEXTW(after); dc.x = width - dc.w; drawtext(after, dc.sel); _AT_@ -353,15 +350,12 @@ drawbar(void) { width -= dc.w; } - for(c = (fc > 0)? fc : 0; c < nclients && dc.x < width; c++) { - dc.w = tabwidth; + cc = MIN(cc, nclients); + for(c = fc; c < fc + cc; c++) { + dc.w = width / cc; if(c == sel) { col = dc.sel; - if((n * tabwidth) > width) { - dc.w += width % tabwidth; - } else { - dc.w = width - (n - 1) * tabwidth; - } + dc.w += width % cc; } else { col = clients[c]->urgent ? dc.urg : dc.norm; } _AT_@ -556,21 +550,17 @@ getcolor(const char *colstr) { int getfirsttab(void) { - int c, n, fc; + int cc, ret; if(sel < 0) - return -1; - - c = sel; - fc = 0; - n = nclients; - if((n * tabwidth) > ww) { - for(; (c * tabwidth) > (ww / 2) - && (n * tabwidth) > ww; - c--, n--, fc++); - } + return 0; + + cc = ww / tabwidth; + if(nclients > cc) + cc = (ww - TEXTW(before) - TEXTW(after)) / tabwidth; - return fc; + ret = sel - cc / 2 + (cc + 1) % 2; + return ret < 0 ? 0 : (ret + cc > nclients ? MAX(0, nclients - cc) : ret); } Bool -- 2.0.5Received on Wed Jan 21 2015 - 03:46:38 CET
This archive was generated by hypermail 2.3.0 : Wed Jan 21 2015 - 03:48:07 CET