nmaster_bstack patch updated for dwm-5.7.
--- a/config.def.h	2009-09-27 01:08:37.000000000 +0200
+++ b/config.def.h	2009-09-27 01:17:26.000000000 +0200
@@ -24,11 +24,13 @@ static const Rule rules[] = {
 
 /* layout(s) */
 static const float mfact      = 0.55; /* factor of master area size [0.05..0.95] */
+static const int nmaster      = 1;    /* default number of master windows */
 static const Bool resizehints = True; /* True means respect size hints in tiled resizals */
 
 static const Layout layouts[] = {
 	/* symbol     arrange function */
 	{ "[]=",      tile },    /* first entry is default */
+	{ "TTT",      bstack },
 	{ "><>",      NULL },    /* no layout function means floating behavior */
 	{ "[M]",      monocle },
 };
@@ -57,12 +59,15 @@ static Key keys[] = {
 	{ MODKEY,                       XK_k,      focusstack,     {.i = -1 } },
 	{ MODKEY,                       XK_h,      setmfact,       {.f = -0.05} },
 	{ MODKEY,                       XK_l,      setmfact,       {.f = +0.05} },
+	{ MODKEY|ShiftMask,             XK_h,      incnmaster,     {.i = +1 } },
+	{ MODKEY|ShiftMask,             XK_l,      incnmaster,     {.i = -1 } },
 	{ MODKEY,                       XK_Return, zoom,           {0} },
 	{ MODKEY,                       XK_Tab,    view,           {0} },
 	{ MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
 	{ MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} },
-	{ MODKEY,                       XK_f,      setlayout,      {.v = &layouts[1]} },
-	{ MODKEY,                       XK_m,      setlayout,      {.v = &layouts[2]} },
+	{ MODKEY,                       XK_o,      setlayout,      {.v = &layouts[1]} },
+	{ MODKEY,                       XK_f,      setlayout,      {.v = &layouts[2]} },
+	{ MODKEY,                       XK_m,      setlayout,      {.v = &layouts[3]} },
 	{ MODKEY,                       XK_space,  setlayout,      {0} },
 	{ MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
 	{ MODKEY,                       XK_0,      view,           {.ui = ~0 } },

--- a/dwm.c	2009-09-26 20:52:12.000000000 +0200
+++ b/dwm.c	2009-09-27 00:34:55.000000000 +0200
@@ -123,6 +123,7 @@ typedef struct {
 struct Monitor {
 	char ltsymbol[16];
 	float mfact;
+	int nmaster;
 	int num;
 	int by;               /* bar geometry */
 	int mx, my, mw, mh;   /* screen size */
@@ -207,6 +208,8 @@ static void sendmon(Client *c, Monitor *
 static void setclientstate(Client *c, long state);
 static void setlayout(const Arg *arg);
 static void setmfact(const Arg *arg);
+static void incnmaster(const Arg *arg);
+static void setnmaster(const Arg *arg);
 static void setup(void);
 static void showhide(Client *c);
 static void sigchld(int unused);
@@ -215,6 +218,7 @@ static void tag(const Arg *arg);
 static void tagmon(const Arg *arg);
 static int textnw(const char *text, unsigned int len);
 static void tile(Monitor *);
+static void bstack(Monitor *);
 static void togglebar(const Arg *arg);
 static void togglefloating(const Arg *arg);
 static void toggletag(const Arg *arg);
@@ -604,6 +608,7 @@ createmon(void) {
 		die("fatal: could not malloc() %u bytes\n", sizeof(Monitor));
 	m->tagset[0] = m->tagset[1] = 1;
 	m->mfact = mfact;
+	m->nmaster = nmaster;
 	m->showbar = showbar;
 	m->topbar = topbar;
 	m->lt[0] = &layouts[0];
@@ -1465,6 +1470,24 @@ setmfact(const Arg *arg) {
 }
 
 void
+incnmaster(const Arg *arg) {
+	if(!arg || !selmon->lt[selmon->sellt]->arrange)
+		return;
+	selmon->nmaster += arg->i;
+	if(selmon->nmaster < 0) selmon->nmaster = 0;
+	arrange();
+}
+
+void
+setnmaster(const Arg *arg) {
+	if(!arg || !selmon->lt[selmon->sellt]->arrange)
+		return;
+	selmon->nmaster = arg->i;
+	if(selmon->nmaster < 0) selmon->nmaster = 0;
+	arrange();
+}
+
+void
 setup(void) {
 	XSetWindowAttributes wa;
 
@@ -1582,7 +1605,7 @@ textnw(const char *text, unsigned int le
 
 void
 tile(Monitor *m) {
-	int x, y, h, w, mw;
+	int x, y, h, w, mw, nm;
 	unsigned int i, n;
 	Client *c;
 
@@ -1590,19 +1613,32 @@ tile(Monitor *m) {
 	if(n == 0)
 		return;
 	/* master */
-	c = nexttiled(m->clients);
-	mw = m->mfact * m->ww;
-	resize(c, m->wx, m->wy, (n == 1 ? m->ww : mw) - 2 * c->bw, m->wh - 2 * c->bw, False);
-	if(--n == 0)
-		return;
+	if(m->nmaster > 0) {
+		nm = n < m->nmaster ? n : m->nmaster;
+		c = nexttiled(m->clients);
+		mw = m->mfact * m->ww;
+		h = m->wh / nm;
+		y = m->wy;
+		for(i=0; i<nm; i++, c = nexttiled(c->next)) {
+			resize(c, m->wx, y, (n == nm ? m->ww : mw) - 2 * c->bw,
+					((i + 1 == nm) ? m->wy + m->wh - y : h) - 2 * c->bw, False);
+			if(h != m->wh)
+				y = c->y + HEIGHT(c);
+		}
+		n -= nm;
+		if(n == 0) return;
+	} else {
+		mw = 0;
+		c = nexttiled(m->clients);
+	}
 	/* tile stack */
-	x = (m->wx + mw > c->x + c->w) ? c->x + c->w + 2 * c->bw : m->wx + mw;
+	x = m->wx + mw;
 	y = m->wy;
-	w = (m->wx + mw > c->x + c->w) ? m->wx + m->ww - x : m->ww - mw;
+	w = m->ww - mw;
 	h = m->wh / n;
 	if(h < bh)
 		h = m->wh;
-	for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
+	for(i = 0; c; c = nexttiled(c->next), i++) {
 		resize(c, x, y, w - 2 * c->bw, /* remainder */ ((i + 1 == n)
 		       ? m->wy + m->wh - y - 2 * c->bw : h - 2 * c->bw), False);
 		if(h != m->wh)
@@ -1611,6 +1647,51 @@ tile(Monitor *m) {
 }
 
 void
+bstack(Monitor *m) {
+	int x, y, h, w, mh, nm;
+	unsigned int i, n;
+	Client *c;
+
+	for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+	if(n == 0)
+		return;
+
+	if(m->nmaster > 0) {
+		nm = n < m->nmaster ? n : m->nmaster;
+		c = nexttiled(m->clients);
+		mh = m->mfact * m->wh;
+		x = m->wx;
+		h = m->wh;
+		w = m->ww / nm;
+		for(i=0; i<nm; i++, c = nexttiled(c->next)) {
+			resize(c, x, m->wy, ((i + 1 == nm) ? m->wx + m->ww - x : w) - 2 * c->bw,
+					(n == nm ? m->wh : mh) - 2 * c->bw, False);
+			if(w != m->ww)
+				x = c->x + WIDTH(c);
+		}
+		n -= nm;
+		if(n == 0) return;
+	} else {
+		mh = 0;
+		c = nexttiled(m->clients);
+	}
+
+	x = m->wx;
+	y = m->wy + mh;
+	w = m->ww / n;
+	h = m->wh - mh;
+	if(h < bh)
+		h = m->wh;
+
+	for(i = 0; c; c = nexttiled(c->next), i++) {
+		resize(c, x, y, ((i + 1 == n) ? m->wx + m->ww - x : w) - 2 * c->bw,
+		       h - 2 * c->bw, False);
+		if(w != m->ww)
+			x = c->x + WIDTH(c);
+	}
+}
+
+void
 togglebar(const Arg *arg) {
 	selmon->showbar = !selmon->showbar;
 	updatebarpos(selmon);

Reply via email to