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);