From 974db1c4a01a38e2c2af9460e4d9c5f48e7974f7 Mon Sep 17 00:00:00 2001 From: Guido Cella Date: Mon, 9 Feb 2026 10:21:33 +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 13c5322..aef03cb 100644 --- a/config.def.h +++ b/config.def.h @@ -138,6 +138,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_0, tag, {.ui = ~0} }, { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, diff --git a/dwl.c b/dwl.c index f7bda0b..cfdd4d1 100644 --- a/dwl.c +++ b/dwl.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -158,6 +159,7 @@ typedef struct { unsigned int bw; uint32_t tags; int isfloating, isurgent, isfullscreen; + bool centered; } Client; typedef struct { @@ -354,6 +356,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); @@ -460,6 +463,8 @@ static struct wl_listener start_drag = {.notify = startdrag}; static struct wl_listener new_session_lock = {.notify = locksession}; static struct wl_listener new_foreign_toplevel_capture_request = {.notify = capturerequest}; +static bool center; + #ifdef XWAYLAND static void activatex11(struct wl_listener *listener, void *data); static void associatex11(struct wl_listener *listener, void *data); @@ -534,6 +539,9 @@ applyrules(Client *c) } } + if (!strcasecmp(appid, termcmd[0])) + c->centered = true; + c->isfloating |= client_is_float_type(c); setmon(c, mon, newtags); } @@ -2886,6 +2894,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; @@ -2898,6 +2911,13 @@ tile(Monitor *m) } } +void +togglecenter(const Arg *arg) +{ + center = !center; + tile(selmon); +} + void togglefloating(const Arg *arg) { -- 2.55.0