JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
fix if n < nmaster of remainer calculation for master windows
[dwm.git] / layout.c
index 26e9de6..4b4e908 100644 (file)
--- a/layout.c
+++ b/layout.c
@@ -15,7 +15,7 @@ static unsigned int nmaster = NMASTER;
 
 static void
 tile(void) {
-       unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th, remainder;
+       unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th;
        Client *c;
 
        for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
@@ -24,7 +24,6 @@ tile(void) {
        mh = (n > nmaster) ? wah / nmaster : wah / (n > 0 ? n : 1);
        mw = (n > nmaster) ? (waw * masterw) / 1000 : waw;
        th = (n > nmaster) ? wah / (n - nmaster) : 0;
-       remainder = (n > nmaster) ? wah - th * (n - nmaster) : 0;
        tw = waw - mw;
 
        for(i = 0, c = clients; c; c = c->next)
@@ -40,16 +39,20 @@ tile(void) {
                        if(i < nmaster) {
                                ny += i * mh;
                                nw = mw - 2 * c->border;
-                               nh = mh - 2 * c->border;
+                               nh = mh;
+                               if(i + 1 == (n < nmaster ? n : nmaster)) /* remainder */
+                                       nh = wah - mh * i;
+                               nh -= 2 * c->border;
                        }
                        else {  /* tile window */
                                nx += mw;
                                nw = tw - 2 * c->border;
                                if(th > 2 * c->border) {
                                        ny += (i - nmaster) * th;
-                                       nh = th - 2 * c->border;
-                                       if (i == n - 1)
-                                               nh += remainder;
+                                       nh = th;
+                                       if(i + 1 == n) /* remainder */
+                                               nh = wah - th * (i - nmaster);
+                                       nh -= 2 * c->border;
                                }
                                else /* fallback if th <= 2 * c->border */
                                        nh = wah - 2 * c->border;
@@ -198,11 +201,9 @@ setlayout(const char *arg) {
        int i;
 
        if(!arg) {
-               for(i = 0; i < nlayouts && lt != &layout[i]; i++);
-               if(i == nlayouts - 1)
-                       lt = &layout[0];
-               else
-                       lt = &layout[++i];
+               lt++;
+               if(lt == layout + nlayouts)
+                       lt = layout;
        }
        else {
                i = atoi(arg);
@@ -218,7 +219,10 @@ setlayout(const char *arg) {
 
 void
 togglebar(const char *arg) {
-       bpos = (bpos == BarOff) ? BARPOS : BarOff;
+       if(bpos == BarOff)
+               bpos = (BARPOS == BarOff) ? BarTop : BARPOS;
+       else
+               bpos = BarOff;
        updatebarpos();
        lt->arrange();
 }
@@ -246,7 +250,7 @@ void
 zoom(const char *arg) {
        Client *c;
 
-       if(!sel || lt->arrange != tile || sel->isfloating)
+       if(!sel || lt->arrange == floating || sel->isfloating)
                return;
        if((c = sel) == nexttiled(clients))
                if(!(c = nexttiled(c->next)))