On Sat, Jun 16, 2007 at 03:55:13PM -0400, James Turner wrote:
> On Sat, Jun 16, 2007 at 07:44:18PM +0200, Anydot wrote:
> > On (16/06/07 10:26), James Turner wrote:
> > > Attached is a patch to add the bottomstack layouts to a clean 4.2 install.
> > > I also changed somethings in the portrait layout in order to remove the
> > > gap between the master and other windows.
> > > 
> > 
> > please, use ban/unban functions to ban/unban client. See tile() for
> > example of use :)
> > 
> > -- 
> > Premysl "Anydot" Hruby >> http://na.srck.net <<
> 
> Thanks, attached is a new diff.  Hopefully I made the correct fixes.
> I'm sure if the original patch created released a new diff it would be
> ten times better then mine :).
> 
> -- 
> James Turner
> BSD Group Consulting
> http://www.bsdgroup.org

> --- layout.c  Wed May 30 06:20:42 2007
> +++ layout.c  Sat Jun 16 15:50:31 2007
> @@ -28,7 +28,7 @@ unban(Client *c) {
>  }
>  
>  static void
> -tile(void) {
> +_tile(const Bool right) {
>       unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th;
>       Client *c;
>  
> @@ -49,6 +49,8 @@ tile(void) {
>                       nx = wax;
>                       ny = way;
>                       if(i < nmaster) {
> +        if(!right)
> +          nx += tw;
>                               ny += i * mh;
>                               nw = mw - 2 * c->border;
>                               nh = mh;
> @@ -57,7 +59,8 @@ tile(void) {
>                               nh -= 2 * c->border;
>                       }
>                       else {  /* tile window */
> -                             nx += mw;
> +        if(right)
> +                               nx += mw;
>                               nw = tw - 2 * c->border;
>                               if(th > 2 * c->border) {
>                                       ny += (i - nmaster) * th;
> @@ -78,6 +81,85 @@ tile(void) {
>       restack();
>  }
>  
> +static void
> +_bstack(const Bool portrait) {
> + 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))
> +   n++;
> + /* window geoms */
> + mh = (n > nmaster) ? ((wah * masterw) / 1000) / nmaster : wah / (n > 0 ? n 
> : 1);
> + mw = waw;
> + th = (n > nmaster) ? ((wah * (1000 - masterw)) / 1000) / (portrait ? 1 : n 
> - nmaster) : 0;
> + tw = (n > nmaster) ? waw / (portrait ? n - nmaster : 1) : 0;
> +
> + for(i = 0, c = clients; c; c = c->next)
> +   if(isvisible(c)) {
> +     if(c->isbanned)
> +       XMoveWindow(dpy, c->win, c->x, c->y);
> +     /*c->isbanned = False;*/
> +     unban(c);
> +     if(c->isfloating)
> +       continue;
> +     c->ismax = False;
> +     nx = wax;
> +     ny = way;
> +     if(i < nmaster) {
> +       ny += i * mh;
> +       nw = mw - 2 * c->border;
> +       nh = mh - 2 * c->border;
> +     }
> +     else if(portrait) { /* portrait bstack tiles */
> +       nx += (i - nmaster) * tw;
> +       ny += mh * nmaster;
> +       nw = tw - 2 * c->border;
> +       nh = th - 2 * c->border + 1;
> +     } else { /* landscape bstack tiles */
> +       ny += mh * nmaster;
> +       nw = tw - 2 * c->border;
> +       if(th > 2 * c->border) {
> +         ny += (i - nmaster) * th;
> +         nh = th - 2 * c->border;
> +         if (i == n - 1)
> +           nh += (n > nmaster) ? wah - mh - th * (n - nmaster) : 0;
> +       }
> +       else /* fallback if th <= 2 * c->border */
> +         nh = wah - 2 * c->border;
> +     }
> +     resize(c, nx, ny, nw, nh, False);
> +     i++;
> +   }
> +   else {
> +     /*c->isbanned = True;*/
> +     ban(c);
> +     XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
> +   }
> + if(!sel || !isvisible(sel)) 
> +   focus(c);
> + restack();
> +}
> +
> +static void
> +tile(void) {
> + _tile(True);
> +}
> +
> +static void
> +tileleft(void) {
> + _tile(False);
> +}
> +
> +static void
> +bstackportrait(void) {
> + _bstack(True);
> +}
> +
> +static void
> +bstacklandscape(void) {
> + _bstack(False);
> +}
> +
>  LAYOUTS
>  
>  /* extern */
> @@ -126,7 +208,7 @@ focusclient(const char *arg) {
>  void
>  incmasterw(const char *arg) {
>       int i;
> -     if(lt->arrange != tile)
> +     if(lt->arrange == floating)
>               return;
>       if(!arg)
>               masterw = MASTERWIDTH;
> @@ -148,7 +230,7 @@ incnmaster(const char *arg) {
>               nmaster = NMASTER;
>       else {
>               i = atoi(arg);
> -             if((lt->arrange != tile) || (nmaster + i < 1)
> +             if((lt->arrange == floating) || (nmaster + i < 1)
>               || (wah / (nmaster + i) <= 2 * BORDERPX))
>                       return;
>               nmaster += i;
> --- config.default.h  Wed May 30 06:20:42 2007
> +++ config.default.h  Fri Jun 15 23:03:30 2007
> @@ -29,6 +29,9 @@ static Rule rule[] = { \
>  static Layout layout[] = { \
>       /* symbol               function */ \
>       { "[]=",                tile }, /* first entry is default */ \
> +  { "=[]",    tileleft }, \
> +  { "TTT",    bstackportrait }, \
> +  { "===",    bstacklandscape }, \
>       { "><>",                floating }, \
>  };
>  #define MASTERWIDTH          600             /* master width per thousand */

Right after I send the last diff, I realized I didn't remove all the code
that are in the ban/unban functions.  The attached diff should be good
now.

-- 
James Turner
BSD Group Consulting
http://www.bsdgroup.org
--- layout.c    Wed May 30 06:20:42 2007
+++ layout.c    Sat Jun 16 15:57:05 2007
@@ -28,7 +28,7 @@ unban(Client *c) {
 }
 
 static void
-tile(void) {
+_tile(const Bool right) {
        unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th;
        Client *c;
 
@@ -49,6 +49,8 @@ tile(void) {
                        nx = wax;
                        ny = way;
                        if(i < nmaster) {
+        if(!right)
+          nx += tw;
                                ny += i * mh;
                                nw = mw - 2 * c->border;
                                nh = mh;
@@ -57,7 +59,8 @@ tile(void) {
                                nh -= 2 * c->border;
                        }
                        else {  /* tile window */
-                               nx += mw;
+        if(right)
+                                 nx += mw;
                                nw = tw - 2 * c->border;
                                if(th > 2 * c->border) {
                                        ny += (i - nmaster) * th;
@@ -78,6 +81,80 @@ tile(void) {
        restack();
 }
 
+static void
+_bstack(const Bool portrait) {
+ 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))
+   n++;
+ /* window geoms */
+ mh = (n > nmaster) ? ((wah * masterw) / 1000) / nmaster : wah / (n > 0 ? n : 
1);
+ mw = waw;
+ th = (n > nmaster) ? ((wah * (1000 - masterw)) / 1000) / (portrait ? 1 : n - 
nmaster) : 0;
+ tw = (n > nmaster) ? waw / (portrait ? n - nmaster : 1) : 0;
+
+ for(i = 0, c = clients; c; c = c->next)
+   if(isvisible(c)) {
+     unban(c);
+     if(c->isfloating)
+       continue;
+     c->ismax = False;
+     nx = wax;
+     ny = way;
+     if(i < nmaster) {
+       ny += i * mh;
+       nw = mw - 2 * c->border;
+       nh = mh - 2 * c->border;
+     }
+     else if(portrait) { /* portrait bstack tiles */
+       nx += (i - nmaster) * tw;
+       ny += mh * nmaster;
+       nw = tw - 2 * c->border;
+       nh = th - 2 * c->border + 1;
+     } else { /* landscape bstack tiles */
+       ny += mh * nmaster;
+       nw = tw - 2 * c->border;
+       if(th > 2 * c->border) {
+         ny += (i - nmaster) * th;
+         nh = th - 2 * c->border;
+         if (i == n - 1)
+           nh += (n > nmaster) ? wah - mh - th * (n - nmaster) : 0;
+       }
+       else /* fallback if th <= 2 * c->border */
+         nh = wah - 2 * c->border;
+     }
+     resize(c, nx, ny, nw, nh, False);
+     i++;
+   }
+   else {
+     ban(c);
+   }
+ if(!sel || !isvisible(sel)) 
+   focus(c);
+ restack();
+}
+
+static void
+tile(void) {
+ _tile(True);
+}
+
+static void
+tileleft(void) {
+ _tile(False);
+}
+
+static void
+bstackportrait(void) {
+ _bstack(True);
+}
+
+static void
+bstacklandscape(void) {
+ _bstack(False);
+}
+
 LAYOUTS
 
 /* extern */
@@ -126,7 +203,7 @@ focusclient(const char *arg) {
 void
 incmasterw(const char *arg) {
        int i;
-       if(lt->arrange != tile)
+       if(lt->arrange == floating)
                return;
        if(!arg)
                masterw = MASTERWIDTH;
@@ -148,7 +225,7 @@ incnmaster(const char *arg) {
                nmaster = NMASTER;
        else {
                i = atoi(arg);
-               if((lt->arrange != tile) || (nmaster + i < 1)
+               if((lt->arrange == floating) || (nmaster + i < 1)
                || (wah / (nmaster + i) <= 2 * BORDERPX))
                        return;
                nmaster += i;
--- config.default.h    Wed May 30 06:20:42 2007
+++ config.default.h    Fri Jun 15 23:03:30 2007
@@ -29,6 +29,9 @@ static Rule rule[] = { \
 static Layout layout[] = { \
        /* symbol               function */ \
        { "[]=",                tile }, /* first entry is default */ \
+  { "=[]",    tileleft }, \
+  { "TTT",    bstackportrait }, \
+  { "===",    bstacklandscape }, \
        { "><>",                floating }, \
 };
 #define MASTERWIDTH            600             /* master width per thousand */

Reply via email to