From 340cc5ef90dfcc495bdad045f3f76ae07405cffd Mon Sep 17 00:00:00 2001
From: Guido Cella <guido@guidocella.xyz>
Date: Tue, 6 Feb 2024 09:20:48 +0100
Subject: [PATCH] add a keybinding to center the terminal

Add a keybinding that toggles centering the terminally horizontally when
it's the only window, while still tiling multiple windows.

This limits the width of long text making it easier to read, and avoids
covering the wallpaper more than necessary.
---
 config.def.h |  1 +
 dwl.c        | 20 ++++++++++++++++++++
 2 files changed, 21 insertions(+)

diff --git a/config.def.h b/config.def.h
index 22d2171..8229fcc 100644
--- a/config.def.h
+++ b/config.def.h
@@ -142,6 +142,7 @@ static const Key keys[] = {
 	{ MODKEY,                    XKB_KEY_space,      setlayout,      {0} },
 	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space,      togglefloating, {0} },
 	{ MODKEY,                    XKB_KEY_e,         togglefullscreen, {0} },
+	{ MODKEY,                    XKB_KEY_v,          togglecenter,   {0} },
 	{ MODKEY,                    XKB_KEY_0,          view,           {.ui = ~0} },
 	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag,            {.ui = ~0} },
 	{ MODKEY,                    XKB_KEY_comma,      focusmon,       {.i = WLR_DIRECTION_LEFT} },
diff --git a/dwl.c b/dwl.c
index 12f441e..3b15748 100644
--- a/dwl.c
+++ b/dwl.c
@@ -8,6 +8,7 @@
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <strings.h>
 #include <sys/wait.h>
 #include <time.h>
 #include <unistd.h>
@@ -138,6 +139,7 @@ typedef struct {
 	unsigned int bw;
 	uint32_t tags;
 	int isfloating, isurgent, isfullscreen;
+	bool centered;
 	uint32_t resize; /* configure serial of a pending resize */
 } Client;
 
@@ -334,6 +336,7 @@ static void startdrag(struct wl_listener *listener, void *data);
 static void tag(const Arg *arg);
 static void tagmon(const Arg *arg);
 static void tile(Monitor *m);
+static void togglecenter(const Arg *arg);
 static void togglefloating(const Arg *arg);
 static void togglefullscreen(const Arg *arg);
 static void toggletag(const Arg *arg);
@@ -436,6 +439,8 @@ static struct wl_listener request_start_drag = {.notify = requeststartdrag};
 static struct wl_listener start_drag = {.notify = startdrag};
 static struct wl_listener new_session_lock = {.notify = locksession};
 
+static bool center;
+
 #ifdef XWAYLAND
 static void activatex11(struct wl_listener *listener, void *data);
 static void associatex11(struct wl_listener *listener, void *data);
@@ -499,6 +504,9 @@ applyrules(Client *c)
 		}
 	}
 
+	if (!strcasecmp(appid, termcmd[0]))
+		c->centered = true;
+
 	c->isfloating |= client_is_float_type(c);
 	setmon(c, mon, newtags);
 }
@@ -2730,6 +2738,11 @@ tile(Monitor *m)
 		if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen)
 			continue;
 		if (i < m->nmaster) {
+			if (n == 1 && center && c->centered) {
+				resize(c, (struct wlr_box){.x = m->w.width / 4, .y = m->w.y,
+						.width = m->w.width / 2, .height = m->w.height - 2 * c->bw}, 0);
+				return;
+			}
 			resize(c, (struct wlr_box){.x = m->w.x, .y = m->w.y + my, .width = mw,
 				.height = (m->w.height - my) / (MIN(n, m->nmaster) - i)}, 0);
 			my += c->geom.height;
@@ -2742,6 +2755,13 @@ tile(Monitor *m)
 	}
 }
 
+void
+togglecenter(const Arg *arg)
+{
+	center = !center;
+	tile(selmon);
+}
+
 void
 togglefloating(const Arg *arg)
 {
-- 
2.49.0

