summaryrefslogtreecommitdiff
path: root/patches/dwl-smartborders.diff
diff options
context:
space:
mode:
Diffstat (limited to 'patches/dwl-smartborders.diff')
-rw-r--r--patches/dwl-smartborders.diff164
1 files changed, 164 insertions, 0 deletions
diff --git a/patches/dwl-smartborders.diff b/patches/dwl-smartborders.diff
new file mode 100644
index 0000000..9f21db9
--- /dev/null
+++ b/patches/dwl-smartborders.diff
@@ -0,0 +1,164 @@
+From 24d23869dc7c27feddf33753946aac02197fdb67 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?=
+ <leohdz172@protonmail.com>
+Date: Tue, 16 Aug 2022 15:28:00 -0500
+Subject: [PATCH] don't draw borders if there is only one window
+
+Co-authored-by: Andrey Proskurin <andreyproskurin@protonmail.com>
+---
+ config.def.h | 1 +
+ dwl.c | 36 ++++++++++++++++++++++++------------
+ 2 files changed, 25 insertions(+), 12 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 29c6dbf8..19632a50 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -2,6 +2,7 @@
+ static const int sloppyfocus = 1; /* focus follows mouse */
+ static const unsigned int borderpx = 1; /* border pixel of windows */
+ static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
++static const int smartborders = 1;
+ static const float rootcolor[] = {0.3, 0.3, 0.3, 1.0};
+ static const float bordercolor[] = {0.5, 0.5, 0.5, 1.0};
+ static const float focuscolor[] = {1.0, 0.0, 0.0, 1.0};
+diff --git a/dwl.c b/dwl.c
+index 40ea05a6..8f654f69 100644
+--- a/dwl.c
++++ b/dwl.c
+@@ -262,7 +262,7 @@ static void quit(const Arg *arg);
+ static void quitsignal(int signo);
+ static void rendermon(struct wl_listener *listener, void *data);
+ static void requeststartdrag(struct wl_listener *listener, void *data);
+-static void resize(Client *c, struct wlr_box geo, int interact);
++static void resize(Client *c, struct wlr_box geo, int interact, int draw_borders);
+ static void run(char *startup_cmd);
+ static Client *selclient(void);
+ static void setcursor(struct wl_listener *listener, void *data);
+@@ -754,7 +754,7 @@ closemon(Monitor *m)
+ wl_list_for_each(c, &clients, link) {
+ if (c->isfloating && c->geom.x > m->m.width)
+ resize(c, (struct wlr_box){.x = c->geom.x - m->w.width, .y = c->geom.y,
+- .width = c->geom.width, .height = c->geom.height}, 0);
++ .width = c->geom.width, .height = c->geom.height}, 0, 1);
+ if (c->mon == m)
+ setmon(c, selmon, c->tags);
+ }
+@@ -1456,7 +1456,7 @@ monocle(Monitor *m)
+ wl_list_for_each(c, &clients, link) {
+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen)
+ continue;
+- resize(c, m->w, 0);
++ resize(c, m->w, 0, !smartborders);
+ }
+ focusclient(focustop(m), 1);
+ }
+@@ -1499,11 +1499,11 @@ motionnotify(uint32_t time)
+ if (cursor_mode == CurMove) {
+ /* Move the grabbed client to the new position. */
+ resize(grabc, (struct wlr_box){.x = cursor->x - grabcx, .y = cursor->y - grabcy,
+- .width = grabc->geom.width, .height = grabc->geom.height}, 1);
++ .width = grabc->geom.width, .height = grabc->geom.height}, 1, 1);
+ return;
+ } else if (cursor_mode == CurResize) {
+ resize(grabc, (struct wlr_box){.x = grabc->geom.x, .y = grabc->geom.y,
+- .width = cursor->x - grabc->geom.x, .height = cursor->y - grabc->geom.y}, 1);
++ .width = cursor->x - grabc->geom.x, .height = cursor->y - grabc->geom.y}, 1, 1);
+ return;
+ }
+
+@@ -1776,10 +1776,11 @@ requeststartdrag(struct wl_listener *listener, void *data)
+ }
+
+ void
+-resize(Client *c, struct wlr_box geo, int interact)
++resize(Client *c, struct wlr_box geo, int interact, int draw_borders)
+ {
+ struct wlr_box *bbox = interact ? &sgeom : &c->mon->w;
+ c->geom = geo;
++ c->bw = draw_borders ? borderpx : 0;
+ applybounds(c, bbox);
+
+ /* Update scene-graph, including borders */
+@@ -1885,6 +1886,8 @@ setfloating(Client *c, int floating)
+ {
+ c->isfloating = floating;
+ wlr_scene_node_reparent(c->scene, layers[c->isfloating ? LyrFloat : LyrTile]);
++ if (c->isfloating && !c->bw)
++ resize(c, c->mon->m, 0, 1);
+ arrange(c->mon);
+ printstatus();
+ }
+@@ -1898,7 +1901,7 @@ setfullscreen(Client *c, int fullscreen)
+
+ if (fullscreen) {
+ c->prev = c->geom;
+- resize(c, c->mon->m, 0);
++ resize(c, c->mon->m, 0, 0);
+ /* The xdg-protocol specifies:
+ *
+ * If the fullscreened surface is not opaque, the compositor must make
+@@ -1916,7 +1919,7 @@ setfullscreen(Client *c, int fullscreen)
+ } else {
+ /* restore previous size instead of arrange for floating windows since
+ * client positions are set by the user and cannot be recalculated */
+- resize(c, c->prev, 0);
++ resize(c, c->prev, 0, 1);
+ if (c->fullscreen_bg) {
+ wlr_scene_node_destroy(&c->fullscreen_bg->node);
+ c->fullscreen_bg = NULL;
+@@ -1933,6 +1936,12 @@ setlayout(const Arg *arg)
+ selmon->sellt ^= 1;
+ if (arg && arg->v)
+ selmon->lt[selmon->sellt] = (Layout *)arg->v;
++ if (!selmon->lt[selmon->sellt]->arrange) {
++ /* floating layout, draw borders around all clients */
++ Client *c;
++ wl_list_for_each(c, &clients, link)
++ resize(c, c->mon->m, 0, 1);
++ }
+ /* TODO change layout symbol? */
+ arrange(selmon);
+ printstatus();
+@@ -1969,7 +1978,7 @@ setmon(Client *c, Monitor *m, unsigned int newtags)
+ }
+ if (m) {
+ /* Make sure window actually overlaps with the monitor */
+- resize(c, c->geom, 0);
++ resize(c, c->geom, 0, 1);
+ wlr_surface_send_enter(client_surface(c), m->wlr_output);
+ c->tags = newtags ? newtags : m->tagset[m->seltags]; /* assign tags of target monitor */
+ arrange(m);
+@@ -2238,7 +2247,7 @@ tagmon(const Arg *arg)
+ void
+ tile(Monitor *m)
+ {
+- unsigned int i, n = 0, mw, my, ty;
++ unsigned int i, n = 0, mw, my, ty, draw_borders = 1;
+ Client *c;
+
+ wl_list_for_each(c, &clients, link)
+@@ -2247,6 +2256,9 @@ tile(Monitor *m)
+ if (n == 0)
+ return;
+
++ if (n == smartborders)
++ draw_borders = 0;
++
+ if (n > m->nmaster)
+ mw = m->nmaster ? m->w.width * m->mfact : 0;
+ else
+@@ -2257,11 +2269,11 @@ tile(Monitor *m)
+ continue;
+ if (i < m->nmaster) {
+ 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);
++ .height = (m->w.height - my) / (MIN(n, m->nmaster) - i)}, 0, draw_borders);
+ my += c->geom.height;
+ } else {
+ resize(c, (struct wlr_box){.x = m->w.x + mw, .y = m->w.y + ty,
+- .width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0);
++ .width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0, draw_borders);
+ ty += c->geom.height;
+ }
+ i++;