From 0baee1546d3e278ec0304afdc25ec3b553eff9c9 Mon Sep 17 00:00:00 2001
From: Jarkko Toivanen <jt@jakest.us>
Date: Tue, 18 Mar 2025 10:07:50 +0200
Subject: [PATCH] Three pane layout

---
 config.h |  3 +++
 tcl.c    | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 77 insertions(+)
 create mode 100644 tcl.c

diff --git a/config.h b/config.h
index c61a50c..7386db5 100644
--- a/config.h
+++ b/config.h
@@ -47,11 +47,13 @@ static const int nmaster     = 1;    /* number of clients in master area */
 static const int resizehints = 0;    /* 1 means respect size hints in tiled resizals */
 static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
 
+#include "tcl.c"
 static const Layout layouts[] = {
 	/* symbol     arrange function */
 	{ "[]=",      tile },    /* first entry is default */
 	{ "><>",      NULL },    /* no layout function means floating behavior */
 	{ "[M]",      monocle },
+	{ "|||",      tcl },
 };
 
 /* key definitions */
@@ -110,6 +112,7 @@ static const Key keys[] = {
 	{ MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} },
 	{ MODKEY,                       XK_f,      setlayout,      {.v = &layouts[1]} },
 	{ MODKEY,                       XK_m,      setlayout,      {.v = &layouts[2]} },
+	{ MODKEY,                       XK_c,      setlayout,      {.v = &layouts[3]} },
 //	{ MODKEY,                       XK_space,  setlayout,      {0} },
 	{ MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
 	{ MODKEY,                       XK_0,      view,           {.ui = ~0 } },
diff --git a/tcl.c b/tcl.c
new file mode 100644
index 0000000..4c94914
--- /dev/null
+++ b/tcl.c
@@ -0,0 +1,74 @@
+void
+tcl(Monitor * m)
+{
+	int x, y, h, w, mw, sw, bdw;
+	unsigned int i, n;
+	Client * c;
+
+	for (n = 0, c = nexttiled(m->clients); c;
+	        c = nexttiled(c->next), n++);
+
+	if (n == 0)
+		return;
+
+	c = nexttiled(m->clients);
+
+	mw = m->mfact * m->ww;
+	sw = (m->ww - mw) / 2;
+	bdw = (2 * c->bw);
+	resize(c,
+	       n < 3 ? m->wx : m->wx + sw,
+	       m->wy,
+	       n == 1 ? m->ww - bdw : mw - bdw,
+	       m->wh - bdw,
+	       False);
+
+	if (--n == 0)
+		return;
+
+	w = (m->ww - mw) / ((n > 1) + 1);
+	c = nexttiled(c->next);
+
+	if (n > 1)
+	{
+		x = m->wx + ((n > 1) ? mw + sw : mw);
+		y = m->wy;
+		h = m->wh / (n / 2);
+
+		if (h < bh)
+			h = m->wh;
+
+		for (i = 0; c && i < n / 2; c = nexttiled(c->next), i++)
+		{
+			resize(c,
+			       x,
+			       y,
+			       w - bdw,
+			       (i + 1 == n / 2) ? m->wy + m->wh - y - bdw : h - bdw,
+			       False);
+
+			if (h != m->wh)
+				y = c->y + HEIGHT(c);
+		}
+	}
+
+	x = (n + 1 / 2) == 1 ? mw : m->wx;
+	y = m->wy;
+	h = m->wh / ((n + 1) / 2);
+
+	if (h < bh)
+		h = m->wh;
+
+	for (i = 0; c; c = nexttiled(c->next), i++)
+	{
+		resize(c,
+		       x,
+		       y,
+		       (i + 1 == (n + 1) / 2) ? w - bdw : w - bdw,
+		       (i + 1 == (n + 1) / 2) ? m->wy + m->wh - y - bdw : h - bdw,
+		       False);
+
+		if (h != m->wh)
+			y = c->y + HEIGHT(c);
+	}
+}