summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMalfurious <m@lfurio.us>2022-01-27 03:46:21 -0500
committerMalfurious <m@lfurio.us>2024-03-05 21:04:47 -0500
commitec2fc9d5bd5de54ee8709c300c85c6cc591076a5 (patch)
tree47cbad4ec7e696f9da652168f79826e12b732633
parent72bcdd4d6be18975843637ad0a5e2f21de5fea82 (diff)
downloaddwm-ec2fc9d5bd5de54ee8709c300c85c6cc591076a5.tar.gz
dwm-ec2fc9d5bd5de54ee8709c300c85c6cc591076a5.zip
patch: columns
This patch adds an extra layout to dwm called col in which the windows in the master area are arranged in colums of equal size. The number of columns is always nmaster + 1, and the last column is a stack of leftover windows just like the normal tile layout. It effectively acts like the default tiling mode, except provides for vertical instead of horizontal master windows.
-rw-r--r--config.def.h2
-rw-r--r--dwm.c27
2 files changed, 29 insertions, 0 deletions
diff --git a/config.def.h b/config.def.h
index 62319e2..63d328a 100644
--- a/config.def.h
+++ b/config.def.h
@@ -50,6 +50,7 @@ static const Layout layouts[] = {
{ "><>", NULL }, /* no layout function means floating behavior */
{ "[M]", monocle },
{ "|M|", centeredmaster },
+ { "||=", col },
};
/* key definitions */
@@ -98,6 +99,7 @@ static const Key keys[] = {
{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
{ MODKEY, XK_u, setlayout, {.v = &layouts[3]} },
+ { MODKEY, XK_o, setlayout, {.v = &layouts[4]} },
{ MODKEY, XK_comma, focusmon, {.i = -1 } },
{ MODKEY, XK_period, focusmon, {.i = +1 } },
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
diff --git a/dwm.c b/dwm.c
index b178c0e..1114e78 100644
--- a/dwm.c
+++ b/dwm.c
@@ -157,6 +157,7 @@ static void checkotherwm(void);
static void cleanup(void);
static void cleanupmon(Monitor *mon);
static void clientmessage(XEvent *e);
+static void col(Monitor *);
static void configure(Client *c);
static void configurenotify(XEvent *e);
static void configurerequest(XEvent *e);
@@ -1763,6 +1764,32 @@ tagmon(const Arg *arg)
}
void
+col(Monitor *m)
+{
+ unsigned int i, n, h, w, x, y, mw;
+ Client *c;
+
+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+ if (n == 0)
+ return;
+
+ if (n > m->nmaster)
+ mw = m->nmaster ? m->ww * m->mfact : 0;
+ else
+ mw = m->ww;
+ for (i = x = y = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
+ if (i < m->nmaster) {
+ w = (mw - x) / (MIN(n, m->nmaster) - i);
+ resize(c, x + m->wx, m->wy, w - (2 * c->bw), m->wh - (2 * c->bw), 0);
+ x += WIDTH(c);
+ } else {
+ h = (m->wh - y) / (n - i);
+ resize(c, x + m->wx, m->wy + y, m->ww - x - (2 * c->bw), h - (2 * c->bw), 0);
+ y += HEIGHT(c);
+ }
+}
+
+void
tile(Monitor *m)
{
unsigned int i, n, h, mw, my, ty;