Attached is an updated patch for the bottom stack layout.  The setmhfact
and bzoom functions can be removed once the normal setmwfact and zoom
function are updated to use isarrange(floating) mentioned in a previous
email.  Let me know of any issues.

-- 
James Turner
BSD Group Consulting
http://www.bsdgroup.org
--- bstack.c    Wed Dec 31 19:00:00 1969
+++ bstack.c    Sat Sep 22 15:10:39 2007
@@ -0,0 +1,73 @@
+void
+bstack(void) {
+    unsigned int i, n, nx, ny, nw, nh, mh, tw, th;
+    Client *c;
+
+    for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
+        n++;
+
+    /* window geoms */
+    mh = (n > 1) ? (wah * mwfact) / 1 : wah / (n > 0 ? n : 1);
+    th = (n > 1) ? (wah * (1 - mwfact)) / 1 : 0;
+    tw = (n > 1) ? waw / (n - 1) : 0;
+    
+    for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next), i++) {
+        c->ismax = False;
+        nx = wax;
+        ny = way;
+        if(i < 1) {
+            ny += i * mh;
+            nw = waw - 2 * c->border;
+            nh = mh - 2 * c->border;
+        }
+        else {
+            nx += (i - 1) * tw;
+            ny += mh * 1;
+            if(i + 1 == n) { /* remainder */
+                nw = (wax + waw) - nx - 2 * c->border;
+            }
+            else {
+                nw = tw - 2 * c->border;
+            }
+            nh = th - 2 * c->border + 1;
+        }
+        resize(c, nx, ny, nw, nh, RESIZEHINTS);
+    }
+}
+
+void
+setmhfact(const char *arg) {
+    double delta;
+
+    if(!isarrange(bstack))
+        return;
+    /* arg handling, manipulate mwfact */
+    if(arg == NULL)
+        mwfact = MWFACT;
+    else if(1 == sscanf(arg, "%lf", &delta)) {
+        if(arg[0] == '+' || arg[0] == '-')
+            mwfact += delta;
+        else
+            mwfact = delta;
+        if(mwfact < 0.1)
+            mwfact = 0.1;
+        else if(mwfact > 0.9)
+            mwfact = 0.9;
+    }
+    arrange();
+}
+
+void
+bzoom(const char *arg) {
+    Client *c;
+
+    if(!sel || !isarrange(bstack) || sel->isfloating)
+        return; 
+    if((c = sel) == nexttiled(clients))
+        if(!(c = nexttiled(c->next)))
+            return;
+    detach(c);
+    attach(c);
+    focus(c);
+    arrange();
+}
--- config.h    Sat Sep 22 03:11:13 2007
+++ config.h    Sat Sep 22 15:11:09 2007
@@ -21,14 +21,16 @@ Rule rules[] = {
        { "Acroread",                   NULL,           True },
 };
 
+#define RESIZEHINTS     True    /* False - respect size hints in tiled 
resizals */
+#define MWFACT          0.6 /* master width factor [0.1 .. 0.9] */
 /* layout(s) */
+#include "bstack.c"
 Layout layouts[] = {
        /* symbol               function */
        { "[]=",                tile }, /* first entry is default */
        { "><>",                floating },
+    { "TTT",        bstack },
 };
-#define RESIZEHINTS            True    /* False - respect size hints in tiled 
resizals */
-#define MWFACT                 0.6     /* master width factor [0.1 .. 0.9] */
 #define SNAP                   32      /* snap pixel */
 
 /* key definitions */
@@ -47,8 +49,11 @@ Key keys[] = { \
        { MODKEY,                       XK_k,           focusprev,      NULL }, 
\
        { MODKEY,                       XK_h,           setmwfact,      "-0.05" 
}, \
        { MODKEY,                       XK_l,           setmwfact,      "+0.05" 
}, \
+    { MODKEY,           XK_h,       setmhfact,  "-0.05" }, \
+    { MODKEY,           XK_l,       setmhfact,  "+0.05" }, \
        { MODKEY,                       XK_m,           togglemax,      NULL }, 
\
        { MODKEY,                       XK_Return,      zoom,           NULL }, 
\
+    { MODKEY,           XK_Return,  bzoom,       NULL }, \
        { MODKEY|ShiftMask,             XK_space,       togglefloating, NULL }, 
\
        { MODKEY|ShiftMask,             XK_c,           killclient,     NULL }, 
\
        { MODKEY,                       XK_0,           view,           NULL }, 
\

Reply via email to