mirror of
https://codeberg.org/dwl/dwl-patches.git
synced 2026-06-11 10:23:19 +00:00
8588394282
A patch built on top of the snail patch to add gaps support to the layout.
161 lines
6.2 KiB
Diff
161 lines
6.2 KiB
Diff
From 804e69ca4bf586bcec46e018630f94c1c4e0b7e7 Mon Sep 17 00:00:00 2001
|
|
From: JoaoCostaIFG <joaocosta.work@posteo.net>
|
|
Date: Thu, 8 Aug 2024 00:05:27 +0100
|
|
Subject: [PATCH 2/2] Add gaps support to snail layout
|
|
|
|
---
|
|
dwl.c | 105 +++++++++++++++++++++++++++++++++-------------------------
|
|
1 file changed, 59 insertions(+), 46 deletions(-)
|
|
|
|
diff --git a/dwl.c b/dwl.c
|
|
index 46bdca1..a158dd6 100644
|
|
--- a/dwl.c
|
|
+++ b/dwl.c
|
|
@@ -2659,8 +2659,8 @@ void
|
|
snail(Monitor *m)
|
|
{
|
|
int i = 0, n = 0;
|
|
- unsigned int mw = m->w.width;
|
|
- Client *c, *prev;
|
|
+ unsigned int mw = m->w.width, e = m->gaps, w = 0, h = 0, egappx = 0;
|
|
+ Client *c, *prev = NULL;
|
|
enum wlr_direction dir = WLR_DIRECTION_RIGHT;
|
|
|
|
wl_list_for_each(c, &clients, link)
|
|
@@ -2668,9 +2668,12 @@ snail(Monitor *m)
|
|
n++;
|
|
if (n == 0)
|
|
return;
|
|
+ if (smartgaps == n)
|
|
+ e = 0;
|
|
+ egappx = e * gappx;
|
|
|
|
if (n > m->nmaster)
|
|
- mw = m->nmaster ? ROUND(m->w.width * m->mfact) : 0;
|
|
+ mw = m->nmaster ? (unsigned int)round((m->w.width + egappx) * m->mfact) : 0;
|
|
|
|
wl_list_for_each(c, &clients, link) {
|
|
if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen)
|
|
@@ -2681,8 +2684,8 @@ snail(Monitor *m)
|
|
* master area with this window
|
|
*/
|
|
if (mw > 0 && i == 0) {
|
|
- c->geom = (struct wlr_box){.x = m->w.x, .y = m->w.y,
|
|
- .width = mw, .height = m->w.height};
|
|
+ c->geom = (struct wlr_box){.x = m->w.x + egappx, .y = m->w.y + egappx,
|
|
+ .width = mw - 2*egappx, .height = m->w.height - 2*egappx};
|
|
/*
|
|
* If the first window in the master area is wide, split it
|
|
* horizontally and put next one on its right; otherwise, split it
|
|
@@ -2694,55 +2697,65 @@ snail(Monitor *m)
|
|
* m->nmaster-th window
|
|
*/
|
|
} else if (i == m->nmaster) {
|
|
- c->geom = (struct wlr_box){.x = m->w.x + mw, .y = m->w.y,
|
|
- .width = m->w.width - mw, .height = m->w.height};
|
|
+ c->geom = (struct wlr_box){.x = m->w.x + mw + egappx, .y = m->w.y + egappx,
|
|
+ .width = m->w.width - mw - 2*egappx, .height = m->w.height - 2*egappx};
|
|
/*
|
|
* If the first window in the stack is wide, split it horizontally
|
|
* and put next one on its right; otherwise, split it vertically and
|
|
* put the next one below it
|
|
*/
|
|
dir = c->geom.width > m->w.height ? WLR_DIRECTION_RIGHT : WLR_DIRECTION_DOWN;
|
|
- /*
|
|
- * Split the previous horizontally and put the current window on the right
|
|
- */
|
|
- } else if (dir == WLR_DIRECTION_RIGHT) {
|
|
- c->geom = (struct wlr_box){.x = prev->geom.x + prev->geom.width / 2, .y = prev->geom.y,
|
|
- .width = prev->geom.width / 2, .height = prev->geom.height};
|
|
- prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y,
|
|
- .width = prev->geom.width / 2, .height = prev->geom.height};
|
|
+ } else if (prev) {
|
|
/*
|
|
- * If it's a stack window or the first narrow window in the master
|
|
- * area, put the next one below it
|
|
+ * Split the previous horizontally and put the current window on the right
|
|
*/
|
|
- if (i >= m->nmaster || c->geom.width < m->w.height)
|
|
- dir = WLR_DIRECTION_DOWN;
|
|
- /*
|
|
- * Split the previous vertically and put the current window below it
|
|
- */
|
|
- } else if (dir == WLR_DIRECTION_DOWN) {
|
|
- c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y + prev->geom.height / 2,
|
|
- .width = prev->geom.width, .height = prev->geom.height / 2};
|
|
- prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y,
|
|
- .width = prev->geom.width, .height = prev->geom.height / 2};
|
|
- dir = WLR_DIRECTION_LEFT;
|
|
- /*
|
|
- * Split the previous horizontally and put the current window on the left
|
|
- */
|
|
- } else if (dir == WLR_DIRECTION_LEFT) {
|
|
- c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y,
|
|
- .width = prev->geom.width / 2, .height = prev->geom.height};
|
|
- prev->geom = (struct wlr_box){.x = prev->geom.x + prev->geom.width / 2, .y = prev->geom.y,
|
|
- .width = prev->geom.width / 2, .height = prev->geom.height};
|
|
- dir = WLR_DIRECTION_UP;
|
|
- /*
|
|
- * Split the previous vertically and put the current window above it
|
|
- */
|
|
- } else {
|
|
- c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y,
|
|
- .width = prev->geom.width, .height = prev->geom.height / 2};
|
|
- prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y + prev->geom.height / 2,
|
|
- .width = prev->geom.width, .height = prev->geom.height / 2};
|
|
- dir = WLR_DIRECTION_RIGHT;
|
|
+ if (dir == WLR_DIRECTION_RIGHT) {
|
|
+ w = prev->geom.width / 2 - egappx;
|
|
+ h = prev->geom.height;
|
|
+ c->geom = (struct wlr_box){.x = prev->geom.x + prev->geom.width / 2 + egappx, .y = prev->geom.y,
|
|
+ .width = w, .height = h};
|
|
+ prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y,
|
|
+ .width = w, .height = h};
|
|
+ /*
|
|
+ * If it's a stack window or the first narrow window in the master
|
|
+ * area, put the next one below it
|
|
+ */
|
|
+ if (i >= m->nmaster || c->geom.width < m->w.height)
|
|
+ dir = WLR_DIRECTION_DOWN;
|
|
+ /*
|
|
+ * Split the previous vertically and put the current window below it
|
|
+ */
|
|
+ } else if (dir == WLR_DIRECTION_DOWN) {
|
|
+ w = prev->geom.width;
|
|
+ h = prev->geom.height / 2 - egappx;
|
|
+ c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y + prev->geom.height / 2 + egappx,
|
|
+ .width = w, .height = h};
|
|
+ prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y,
|
|
+ .width = w, .height = h};
|
|
+ dir = WLR_DIRECTION_LEFT;
|
|
+ /*
|
|
+ * Split the previous horizontally and put the current window on the left
|
|
+ */
|
|
+ } else if (dir == WLR_DIRECTION_LEFT) {
|
|
+ w = prev->geom.width / 2 - egappx;
|
|
+ h = prev->geom.height;
|
|
+ c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y,
|
|
+ .width = w, .height = h};
|
|
+ prev->geom = (struct wlr_box){.x = prev->geom.x + prev->geom.width / 2 + egappx, .y = prev->geom.y,
|
|
+ .width = w, .height = h};
|
|
+ dir = WLR_DIRECTION_UP;
|
|
+ /*
|
|
+ * Split the previous vertically and put the current window above it
|
|
+ */
|
|
+ } else {
|
|
+ w = prev->geom.width;
|
|
+ h = prev->geom.height / 2 - egappx;
|
|
+ c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y,
|
|
+ .width = w, .height = h};
|
|
+ prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y + prev->geom.height / 2 + egappx,
|
|
+ .width = w, .height = h};
|
|
+ dir = WLR_DIRECTION_RIGHT;
|
|
+ }
|
|
}
|
|
i++;
|
|
prev = c;
|
|
--
|
|
2.46.0
|
|
|
|
|