URI: 
       revise drawbar and related mechanisms. - tabbed - tab interface for application supporting Xembed
  HTML git clone git://git.suckless.org/tabbed
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 74115f685f6b874b4e40874f4f3bd14d71df5e97
   DIR parent 829980f28aa91f4837e047bd9e3b599bf6d655a6
  HTML Author: Markus Teich <markus.teich@stusta.mhn.de>
       Date:   Wed, 21 Jan 2015 03:46:38 +0100
       
       revise drawbar and related mechanisms.
       
       This also fixes a bug, where the last tab was hidden and no "after" text was
       displayed.
       
       Signed-off-by: Christoph Lohmann <20h@r-36.net>
       
       Diffstat:
         M tabbed.c                            |      50 +++++++++++++-------------------
       
       1 file changed, 20 insertions(+), 30 deletions(-)
       ---
   DIR diff --git a/tabbed.c b/tabbed.c
       @@ -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:
       @@ -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) {
       @@ -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);
       @@ -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;
                        }
       @@ -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