aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaghuram Subramani <raghus2247@gmail.com>2024-05-05 14:16:53 +0530
committerRaghuram Subramani <raghus2247@gmail.com>2024-05-05 14:16:53 +0530
commit2ff92ffad11cad902dad037c24780e0dbf451551 (patch)
treeecdf0fd545460949085a1b9b10923a3eaf08e9e7
parentc17629aaa71380618c356e8083c7b38a756948d8 (diff)
Revert "monfig patch"
This reverts commit 18e363b5bb655859660eb6177fadc67192914f61.
-rw-r--r--config.def.h11
-rw-r--r--dwl.c25
-rw-r--r--patches/XF86keysym.patch41
-rw-r--r--patches/alwayscenter.patch25
-rw-r--r--patches/attachbottom.patch26
-rw-r--r--patches/autostart.patch147
-rw-r--r--patches/naturalscrolltrackpad.patch27
-rw-r--r--patches/pertag.patch167
-rw-r--r--patches/smartborders.patch203
9 files changed, 646 insertions, 26 deletions
diff --git a/config.def.h b/config.def.h
index 210bbc9..8aa7d91 100644
--- a/config.def.h
+++ b/config.def.h
@@ -50,15 +50,12 @@ static const Layout layouts[] = {
/* monitors */
/* NOTE: ALWAYS add a fallback rule, even if you are completely sure it won't be used */
static const MonitorRule monrules[] = {
- /* name mfact nmaster scale layout rotate/reflect x y resx resy rate mode adaptive*/
- /* example of a HiDPI laptop monitor at 120Hz:
- { "eDP-1", 0.5f, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, 0, 0, 0, 0, 120.000f, 1, 1},
+ /* name mfact nmaster scale layout rotate/reflect x y */
+ /* example of a HiDPI laptop monitor:
+ { "eDP-1", 0.5f, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 },
*/
/* defaults */
- { NULL, 0.55f, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, 0, 0, 0, 0, 0.0f, 0 ,1},
- // mode let's the user decide on how dwl should implement the modes:
- // -1 Sets a custom mode following the users choice
- // All other number's set the mode at the index n, 0 is the standard mode; see wlr-randr
+ { NULL, 0.55f, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 },
};
/* keyboard */
diff --git a/dwl.c b/dwl.c
index 83caffe..a1c7ebf 100644
--- a/dwl.c
+++ b/dwl.c
@@ -217,11 +217,6 @@ typedef struct {
const Layout *lt;
enum wl_output_transform rr;
int x, y;
- int resx;
- int resy;
- float rate;
- int mode;
- int adaptive;
} MonitorRule;
typedef struct {
@@ -922,7 +917,6 @@ createmon(struct wl_listener *listener, void *data)
/* This event is raised by the backend when a new output (aka a display or
* monitor) becomes available. */
struct wlr_output *wlr_output = data;
- struct wlr_output_mode *mode = wl_container_of(wlr_output->modes.next, mode, link);
const MonitorRule *r;
size_t i;
struct wlr_output_state state;
@@ -951,23 +945,16 @@ createmon(struct wl_listener *listener, void *data)
strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, LENGTH(m->ltsymbol));
wlr_output_state_set_scale(&state, r->scale);
wlr_output_state_set_transform(&state, r->rr);
-
- wlr_output_state_set_adaptive_sync_enabled(&state, r->adaptive);
-
- if(r->mode == -1)
- wlr_output_state_set_custom_mode(&state, r->resx, r->resy,
- (int) (r->rate > 0 ? r->rate * 1000 : 0));
- else if (!wl_list_empty(&wlr_output->modes)) {
- for (int j = 0; j < r->mode; j++) {
- mode = wl_container_of(mode->link.next, mode, link);
- }
- wlr_output_state_set_mode(&state, mode);
- }
-
break;
}
}
+ /* The mode is a tuple of (width, height, refresh rate), and each
+ * monitor supports only a specific set of modes. We just pick the
+ * monitor's preferred mode; a more sophisticated compositor would let
+ * the user configure it. */
+ wlr_output_state_set_mode(&state, wlr_output_preferred_mode(wlr_output));
+
/* Set up event listeners */
LISTEN(&wlr_output->events.frame, &m->frame, rendermon);
LISTEN(&wlr_output->events.destroy, &m->destroy, cleanupmon);
diff --git a/patches/XF86keysym.patch b/patches/XF86keysym.patch
new file mode 100644
index 0000000..9255b9a
--- /dev/null
+++ b/patches/XF86keysym.patch
@@ -0,0 +1,41 @@
+From 7182343aaf6c1fed1f5802aff948cfb4f3c82e69 Mon Sep 17 00:00:00 2001
+From: 917Wolf <none>
+Date: Thu, 6 May 2021 11:04:23 +0200
+Subject: [PATCH] Found this in my old dwm config, moved it into dwl ... It
+ made my volum keys work again :)
+
+---
+ config.def.h | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/config.def.h b/config.def.h
+index 089aa3795..29a6d624f 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -1,3 +1,4 @@
++#include <X11/XF86keysym.h>
+ /* appearance */
+ static const int sloppyfocus = 1; /* focus follows mouse */
+ static const unsigned int borderpx = 1; /* border pixel of windows */
+@@ -62,6 +63,11 @@ static const int natural_scrolling = 0;
+ #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
+
+ /* commands */
++// for cahnging the volume via alsa amixer //
++static const char *upvol[] = { "amixer", "-q", "-c", "0", "set", "Master", "2+", NULL };
++static const char *downvol[] = { "amixer", "-q", "-c", "0", "set", "Master", "2-", NULL };
++// for muting/unmuting //
++static const char *mute[] = { "amixer", "-q", "set", "Master", "toggle", NULL };
+ static const char *termcmd[] = { "alacritty", NULL };
+ static const char *menucmd[] = { "bemenu-run", NULL };
+
+@@ -107,6 +113,9 @@ static const Key keys[] = {
+ #define CHVT(n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_XF86Switch_VT_##n, chvt, {.ui = (n)} }
+ CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6),
+ CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12),
++ { 0,XF86XK_AudioRaiseVolume, spawn,{.v = upvol } },
++ { 0,XF86XK_AudioLowerVolume, spawn,{.v = downvol } },
++ { 0,XF86XK_AudioMute,spawn,{.v = mute } },
+ };
+
+ static const Button buttons[] = {
diff --git a/patches/alwayscenter.patch b/patches/alwayscenter.patch
new file mode 100644
index 0000000..3664763
--- /dev/null
+++ b/patches/alwayscenter.patch
@@ -0,0 +1,25 @@
+From 95ac2fd73af8cee3ce3e556c254e60a2ca985515 Mon Sep 17 00:00:00 2001
+From: Guido Cella <guido@guidocella.xyz>
+Date: Tue, 16 Jan 2024 18:14:50 +0100
+Subject: [PATCH] center floating windows
+
+---
+ dwl.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/dwl.c b/dwl.c
+index 95ebee8..ac077e3 100644
+--- a/dwl.c
++++ b/dwl.c
+@@ -453,6 +453,8 @@ applyrules(Client *c)
+ }
+ }
+ }
++ c->geom.x = (mon->w.width - c->geom.width) / 2 + mon->m.x;
++ c->geom.y = (mon->w.height - c->geom.height) / 2 + mon->m.y;
+ setmon(c, mon, newtags);
+ }
+
+--
+2.43.0
+
diff --git a/patches/attachbottom.patch b/patches/attachbottom.patch
new file mode 100644
index 0000000..7c0ad52
--- /dev/null
+++ b/patches/attachbottom.patch
@@ -0,0 +1,26 @@
+From 396531c8e7905cb226be0a4c3cddc60726fa2794 Mon Sep 17 00:00:00 2001
+From: Dmitry Zakharchenko <dmitz@disroot.org>
+Date: Tue, 3 Jan 2023 20:01:34 +0200
+Subject: [PATCH] attachbottom: sync with 0.4
+
+---
+ dwl.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/dwl.c b/dwl.c
+index 19bb6ce34..7f940c45f 100644
+--- a/dwl.c
++++ b/dwl.c
+@@ -1511,7 +1511,11 @@ mapnotify(struct wl_listener *listener, void *data)
+ c->geom.height += 2 * c->bw;
+
+ /* Insert this client into client lists. */
+- wl_list_insert(&clients, &c->link);
++ if (clients.prev)
++ // tile at the bottom
++ wl_list_insert(clients.prev, &c->link);
++ else
++ wl_list_insert(&clients, &c->link);
+ wl_list_insert(&fstack, &c->flink);
+
+ /* Set initial monitor, tags, floating status, and focus:
diff --git a/patches/autostart.patch b/patches/autostart.patch
new file mode 100644
index 0000000..9efed3e
--- /dev/null
+++ b/patches/autostart.patch
@@ -0,0 +1,147 @@
+From 44044d45a32d4a0091422f4c803a4ddd98b7f7a9 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?=
+ <leohdz172@proton.me>
+Date: Sat, 8 Jul 2023 17:11:36 -0600
+Subject: [PATCH] port autostart patch from dwm
+
+https://dwm.suckless.org/patches/cool_autostart/
+---
+ config.def.h | 7 +++++++
+ dwl.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++-----
+ 2 files changed, 61 insertions(+), 5 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index db0babc..2b6a5ad 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -19,6 +19,13 @@ static const float fullscreen_bg[] = {0.1, 0.1, 0.1, 1.0}; /* You can al
+ /* logging */
+ static int log_level = WLR_ERROR;
+
++/* Autostart */
++static const char *const autostart[] = {
++ "wbg", "/path/to/your/image", NULL,
++ NULL /* terminate */
++};
++
++
+ static const Rule rules[] = {
+ /* app_id title tags mask isfloating monitor */
+ /* examples:
+diff --git a/dwl.c b/dwl.c
+index 6a96179..d387c06 100644
+--- a/dwl.c
++++ b/dwl.c
+@@ -233,6 +233,7 @@ static void arrange(Monitor *m);
+ static void arrangelayer(Monitor *m, struct wl_list *list,
+ struct wlr_box *usable_area, int exclusive);
+ static void arrangelayers(Monitor *m);
++static void autostartexec(void);
+ static void axisnotify(struct wl_listener *listener, void *data);
+ static void buttonpress(struct wl_listener *listener, void *data);
+ static void chvt(const Arg *arg);
+@@ -396,6 +397,9 @@ static xcb_atom_t netatom[NetLast];
+ /* attempt to encapsulate suck into one file */
+ #include "client.h"
+
++static pid_t *autostart_pids;
++static size_t autostart_len;
++
+ /* function implementations */
+ void
+ applybounds(Client *c, struct wlr_box *bbox)
+@@ -529,6 +533,27 @@ arrangelayers(Monitor *m)
+ }
+ }
+
++void
++autostartexec(void) {
++ const char *const *p;
++ size_t i = 0;
++
++ /* count entries */
++ for (p = autostart; *p; autostart_len++, p++)
++ while (*++p);
++
++ autostart_pids = calloc(autostart_len, sizeof(pid_t));
++ for (p = autostart; *p; i++, p++) {
++ if ((autostart_pids[i] = fork()) == 0) {
++ setsid();
++ execvp(*p, (char *const *)p);
++ die("dwl: execvp %s:", *p);
++ }
++ /* skip arguments */
++ while (*++p);
++ }
++}
++
+ void
+ axisnotify(struct wl_listener *listener, void *data)
+ {
+@@ -624,11 +649,21 @@ checkidleinhibitor(struct wlr_surface *exclude)
+ void
+ cleanup(void)
+ {
++ size_t i;
+ #ifdef XWAYLAND
+ wlr_xwayland_destroy(xwayland);
+ xwayland = NULL;
+ #endif
+ wl_display_destroy_clients(dpy);
++
++ /* kill child processes */
++ for (i = 0; i < autostart_len; i++) {
++ if (0 < autostart_pids[i]) {
++ kill(autostart_pids[i], SIGTERM);
++ waitpid(autostart_pids[i], NULL, 0);
++ }
++ }
++
+ if (child_pid > 0) {
+ kill(child_pid, SIGTERM);
+ waitpid(child_pid, NULL, 0);
+@@ -1306,18 +1341,31 @@ void
+ handlesig(int signo)
+ {
+ if (signo == SIGCHLD) {
+-#ifdef XWAYLAND
+ siginfo_t in;
+ /* wlroots expects to reap the XWayland process itself, so we
+ * use WNOWAIT to keep the child waitable until we know it's not
+ * XWayland.
+ */
+ while (!waitid(P_ALL, 0, &in, WEXITED|WNOHANG|WNOWAIT) && in.si_pid
+- && (!xwayland || in.si_pid != xwayland->server->pid))
+- waitpid(in.si_pid, NULL, 0);
+-#else
+- while (waitpid(-1, NULL, WNOHANG) > 0);
++#ifdef XWAYLAND
++ && (!xwayland || in.si_pid != xwayland->server->pid)
+ #endif
++ ) {
++ pid_t *p, *lim;
++ waitpid(in.si_pid, NULL, 0);
++ if (in.si_pid == child_pid)
++ child_pid = -1;
++ if (!(p = autostart_pids))
++ continue;
++ lim = &p[autostart_len];
++
++ for (; p < lim; p++) {
++ if (*p == in.si_pid) {
++ *p = -1;
++ break;
++ }
++ }
++ }
+ } else if (signo == SIGINT || signo == SIGTERM) {
+ quit(NULL);
+ }
+@@ -1973,6 +2021,7 @@ run(char *startup_cmd)
+ die("startup: backend_start");
+
+ /* Now that the socket exists and the backend is started, run the startup command */
++ autostartexec();
+ if (startup_cmd) {
+ int piperw[2];
+ if (pipe(piperw) < 0)
diff --git a/patches/naturalscrolltrackpad.patch b/patches/naturalscrolltrackpad.patch
new file mode 100644
index 0000000..5cd3742
--- /dev/null
+++ b/patches/naturalscrolltrackpad.patch
@@ -0,0 +1,27 @@
+From 8b523453aefdc9d2920c8f9a52de009da251fbb0 Mon Sep 17 00:00:00 2001
+From: neuromagus <neuromagus@mail.ru>
+Date: Sun, 7 Jan 2024 05:11:24 +0300
+Subject: [PATCH] apply patch naturalscrolltrackpad
+
+---
+ dwl.c | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/dwl.c b/dwl.c
+index 4d19357..26f394b 100644
+--- a/dwl.c
++++ b/dwl.c
+@@ -974,11 +974,10 @@ createpointer(struct wlr_pointer *pointer)
+ libinput_device_config_tap_set_drag_enabled(device, tap_and_drag);
+ libinput_device_config_tap_set_drag_lock_enabled(device, drag_lock);
+ libinput_device_config_tap_set_button_map(device, button_map);
++ if (libinput_device_config_scroll_has_natural_scroll(device))
++ libinput_device_config_scroll_set_natural_scroll_enabled(device, natural_scrolling);
+ }
+
+- if (libinput_device_config_scroll_has_natural_scroll(device))
+- libinput_device_config_scroll_set_natural_scroll_enabled(device, natural_scrolling);
+-
+ if (libinput_device_config_dwt_is_available(device))
+ libinput_device_config_dwt_set_enabled(device, disable_while_typing);
+
diff --git a/patches/pertag.patch b/patches/pertag.patch
new file mode 100644
index 0000000..a0c66d8
--- /dev/null
+++ b/patches/pertag.patch
@@ -0,0 +1,167 @@
+From 8750e1255f6c8b799165186cd6cfdfa7af3ee56d Mon Sep 17 00:00:00 2001
+From: mortezadadgar <mortezadadgar97@gmail.com>
+Date: Sat, 26 Aug 2023 20:37:22 +0330
+Subject: [PATCH] Applied pertag
+
+---
+ dwl.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 70 insertions(+), 5 deletions(-)
+
+diff --git a/dwl.c b/dwl.c
+index 4ff5c37f7..6c104bbb0 100644
+--- a/dwl.c
++++ b/dwl.c
+@@ -94,6 +94,7 @@ typedef struct {
+ const Arg arg;
+ } Button;
+
++typedef struct Pertag Pertag;
+ typedef struct Monitor Monitor;
+ typedef struct {
+ /* Must keep these three elements in this order */
+@@ -185,6 +186,7 @@ struct Monitor {
+ struct wlr_box w; /* window area, layout-relative */
+ struct wl_list layers[4]; /* LayerSurface::link */
+ const Layout *lt[2];
++ Pertag *pertag;
+ unsigned int seltags;
+ unsigned int sellt;
+ uint32_t tagset[2];
+@@ -413,6 +415,14 @@ static Atom netatom[NetLast];
+ /* attempt to encapsulate suck into one file */
+ #include "client.h"
+
++struct Pertag {
++ unsigned int curtag, prevtag; /* current and previous tag */
++ int nmasters[TAGCOUNT + 1]; /* number of windows in master area */
++ float mfacts[TAGCOUNT + 1]; /* mfacts per tag */
++ unsigned int sellts[TAGCOUNT + 1]; /* selected layouts */
++ const Layout *ltidxs[TAGCOUNT + 1][2]; /* matrix of tags and layouts indexes */
++};
++
+ /* function implementations */
+ void
+ applybounds(Client *c, struct wlr_box *bbox)
+@@ -703,6 +713,7 @@ cleanupmon(struct wl_listener *listener, void *data)
+ wlr_scene_output_destroy(m->scene_output);
+ wlr_scene_node_destroy(&m->fullscreen_bg->node);
+
++ free(m->pertag);
+ closemon(m);
+ free(m);
+ }
+@@ -944,6 +955,18 @@ createmon(struct wl_listener *listener, void *data)
+ wl_list_insert(&mons, &m->link);
+ printstatus();
+
++ m->pertag = calloc(1, sizeof(Pertag));
++ m->pertag->curtag = m->pertag->prevtag = 1;
++
++ for (i = 0; i <= TAGCOUNT; i++) {
++ m->pertag->nmasters[i] = m->nmaster;
++ m->pertag->mfacts[i] = m->mfact;
++
++ m->pertag->ltidxs[i][0] = m->lt[0];
++ m->pertag->ltidxs[i][1] = m->lt[1];
++ m->pertag->sellts[i] = m->sellt;
++ }
++
+ /* The xdg-protocol specifies:
+ *
+ * If the fullscreened surface is not opaque, the compositor must make
+@@ -1355,7 +1378,7 @@ incnmaster(const Arg *arg)
+ {
+ if (!arg || !selmon)
+ return;
+- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
++ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0);
+ arrange(selmon);
+ }
+
+@@ -2060,9 +2083,9 @@ setlayout(const Arg *arg)
+ if (!selmon)
+ return;
+ if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
+- selmon->sellt ^= 1;
++ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1;
+ if (arg && arg->v)
+- selmon->lt[selmon->sellt] = (Layout *)arg->v;
++ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v;
+ strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, LENGTH(selmon->ltsymbol));
+ arrange(selmon);
+ printstatus();
+@@ -2079,7 +2102,7 @@ setmfact(const Arg *arg)
+ f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
+ if (f < 0.1 || f > 0.9)
+ return;
+- selmon->mfact = f;
++ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f;
+ arrange(selmon);
+ }
+
+@@ -2423,10 +2446,30 @@ void
+ toggleview(const Arg *arg)
+ {
+ uint32_t newtagset = selmon ? selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK) : 0;
++ size_t i;
+
+ if (!newtagset)
+ return;
+
++ if (newtagset == ~0) {
++ selmon->pertag->prevtag = selmon->pertag->curtag;
++ selmon->pertag->curtag = 0;
++ }
++
++ /* test if the user did not select the same tag */
++ if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) {
++ selmon->pertag->prevtag = selmon->pertag->curtag;
++ for (i = 0; !(newtagset & 1 << i); i++) ;
++ selmon->pertag->curtag = i + 1;
++ }
++
++ /* apply settings for this view */
++ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
++ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
++ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
++ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
++ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
++
+ selmon->tagset[selmon->seltags] = newtagset;
+ focusclient(focustop(selmon), 1);
+ arrange(selmon);
+@@ -2596,11 +2639,33 @@ urgent(struct wl_listener *listener, void *data)
+ void
+ view(const Arg *arg)
+ {
++ size_t i, tmptag;
++
+ if (!selmon || (arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
+ return;
+ selmon->seltags ^= 1; /* toggle sel tagset */
+- if (arg->ui & TAGMASK)
++ if (arg->ui & TAGMASK) {
+ selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
++ selmon->pertag->prevtag = selmon->pertag->curtag;
++
++ if (arg->ui == ~0)
++ selmon->pertag->curtag = 0;
++ else {
++ for (i = 0; !(arg->ui & 1 << i); i++) ;
++ selmon->pertag->curtag = i + 1;
++ }
++ } else {
++ tmptag = selmon->pertag->prevtag;
++ selmon->pertag->prevtag = selmon->pertag->curtag;
++ selmon->pertag->curtag = tmptag;
++ }
++
++ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
++ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
++ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
++ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
++ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
++
+ focusclient(focustop(selmon), 1);
+ arrange(selmon);
+ printstatus();
diff --git a/patches/smartborders.patch b/patches/smartborders.patch
new file mode 100644
index 0000000..98dafe3
--- /dev/null
+++ b/patches/smartborders.patch
@@ -0,0 +1,203 @@
+From c7120b651b1a6f1ae3277088d4de9af9686c71ae 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
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Co-authored-by: A Frederick Christensen <dwl@ivories.org>
+Co-authored-by: Andrey Proskurin <andreyproskurin@protonmail.com>
+Signed-off-by: Leonardo Hernández Hernández <leohdz172@proton.me>
+---
+ config.def.h | 1 +
+ dwl.c | 48 ++++++++++++++++++++++++++++++++----------------
+ 2 files changed, 33 insertions(+), 16 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index a8ed61d..f07cf07 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -6,6 +6,7 @@
+ /* appearance */
+ static const int sloppyfocus = 1; /* focus follows mouse */
+ static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */
++static const int smartborders = 1;
+ static const unsigned int borderpx = 1; /* border pixel of windows */
+ static const float rootcolor[] = COLOR(0x222222ff);
+ static const float bordercolor[] = COLOR(0x444444ff);
+diff --git a/dwl.c b/dwl.c
+index 10d5a5b..903afc6 100644
+--- a/dwl.c
++++ b/dwl.c
+@@ -297,7 +297,7 @@ static void rendermon(struct wl_listener *listener, void *data);
+ static void requestdecorationmode(struct wl_listener *listener, void *data);
+ static void requeststartdrag(struct wl_listener *listener, void *data);
+ static void requestmonstate(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 void setcursor(struct wl_listener *listener, void *data);
+ static void setcursorshape(struct wl_listener *listener, void *data);
+@@ -696,7 +696,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);
+ }
+@@ -731,8 +731,12 @@ commitnotify(struct wl_listener *listener, void *data)
+ {
+ Client *c = wl_container_of(listener, c, commit);
+
+- if (client_surface(c)->mapped)
+- resize(c, c->geom, (c->isfloating && !c->isfullscreen));
++ if (client_surface(c)->mapped) {
++ if (c->mon && c->mon->lt[c->mon->sellt]->arrange && !c->isfullscreen && !c->isfloating)
++ c->mon->lt[c->mon->sellt]->arrange(c->mon);
++ else
++ resize(c, c->geom, (c->isfloating && !c->isfullscreen), (c->isfloating && !c->isfullscreen));
++ }
+
+ /* mark a pending resize as completed */
+ if (c->resize && c->resize <= c->surface.xdg->current.configure_serial)
+@@ -1579,7 +1583,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);
+ n++;
+ }
+ if (n)
+@@ -1626,11 +1630,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;
+ }
+
+@@ -1924,12 +1928,13 @@ requestmonstate(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;
+ struct wlr_box clip;
+ client_set_bounds(c, geo.width, geo.height);
+ c->geom = geo;
++ c->bw = draw_borders ? borderpx : 0;
+ applybounds(c, bbox);
+
+ /* Update scene-graph, including borders */
+@@ -2044,6 +2049,8 @@ setfloating(Client *c, int floating)
+ return;
+ wlr_scene_node_reparent(&c->scene->node, layers[c->isfullscreen
+ ? LyrFS : c->isfloating ? LyrFloat : LyrTile]);
++ if (c->isfloating && !c->bw)
++ resize(c, c->mon->m, 0, 1);
+ arrange(c->mon);
+ printstatus();
+ }
+@@ -2061,11 +2068,11 @@ setfullscreen(Client *c, int fullscreen)
+
+ if (fullscreen) {
+ c->prev = c->geom;
+- resize(c, c->mon->m, 0);
++ resize(c, c->mon->m, 0, 0);
+ } 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);
+ }
+ arrange(c->mon);
+ printstatus();
+@@ -2090,6 +2097,12 @@ setlayout(const Arg *arg)
+ if (arg && arg->v)
+ selmon->lt[selmon->sellt] = (Layout *)arg->v;
+ strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, LENGTH(selmon->ltsymbol));
++ 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);
++ }
+ arrange(selmon);
+ printstatus();
+ }
+@@ -2124,7 +2137,7 @@ setmon(Client *c, Monitor *m, uint32_t newtags)
+ arrange(oldmon);
+ if (m) {
+ /* Make sure window actually overlaps with the monitor */
+- resize(c, c->geom, 0);
++ resize(c, c->geom, 0, 1);
+ c->tags = newtags ? newtags : m->tagset[m->seltags]; /* assign tags of target monitor */
+ setfullscreen(c, c->isfullscreen); /* This will call arrange(c->mon) */
+ setfloating(c, c->isfloating);
+@@ -2452,7 +2465,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)
+@@ -2461,6 +2474,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
+@@ -2471,11 +2487,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++;
+@@ -2644,7 +2660,7 @@ updatemons(struct wl_listener *listener, void *data)
+ arrange(m);
+ /* make sure fullscreen clients have the right size */
+ if ((c = focustop(m)) && c->isfullscreen)
+- resize(c, m->m, 0);
++ resize(c, m->m, 0, 0);
+
+ /* Try to re-set the gamma LUT when updating monitors,
+ * it's only really needed when enabling a disabled output, but meh. */
+@@ -2826,7 +2842,7 @@ configurex11(struct wl_listener *listener, void *data)
+ return;
+ if (c->isfloating || client_is_unmanaged(c))
+ resize(c, (struct wlr_box){.x = event->x, .y = event->y,
+- .width = event->width, .height = event->height}, 0);
++ .width = event->width, .height = event->height}, 0, 1);
+ else
+ arrange(c->mon);
+ }
+--
+2.43.0
+