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 */