From d2b8292c3416770462784fd9f05d2759e3747ce2 Mon Sep 17 00:00:00 2001 From: wochap Date: Wed, 6 Mar 2024 10:45:39 -0500 Subject: [PATCH] apply minimal borders dynamically adjusts the borders between adjacent clients to make them visually merge --- config.def.h | 1 + dwl.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 72 insertions(+), 6 deletions(-) diff --git a/config.def.h b/config.def.h index db0babc..8677c12 100644 --- a/config.def.h +++ b/config.def.h @@ -7,6 +7,7 @@ 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 unsigned int borderpx = 1; /* border pixel of windows */ +static const int draw_minimal_borders = 1; /* merge adjacent borders */ static const float bordercolor[] = COLOR(0x444444ff); static const float focuscolor[] = COLOR(0x005577ff); static const float urgentcolor[] = COLOR(0xff0000ff); diff --git a/dwl.c b/dwl.c index ef27a1d..a35cec5 100644 --- a/dwl.c +++ b/dwl.c @@ -99,6 +99,7 @@ typedef struct Monitor Monitor; typedef struct { /* Must keep these three elements in this order */ unsigned int type; /* XDGShell or X11* */ + int interact; struct wlr_box geom; /* layout-relative, includes border */ Monitor *mon; struct wlr_scene_tree *scene; @@ -293,7 +294,8 @@ static void quit(const Arg *arg); static void rendermon(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 resizeapply(Client *c, struct wlr_box geo, int interact); +static void resizenoapply(Client *c, struct wlr_box geo, int interact); static void run(char *startup_cmd); static void setcursor(struct wl_listener *listener, void *data); static void setcursorshape(struct wl_listener *listener, void *data); @@ -377,6 +379,8 @@ static struct wlr_box sgeom; static struct wl_list mons; static Monitor *selmon; +static void (*resize)(Client *c, struct wlr_box geo, int interact) = resizeapply; + #ifdef XWAYLAND static void activatex11(struct wl_listener *listener, void *data); static void associatex11(struct wl_listener *listener, void *data); @@ -444,6 +448,35 @@ applyrules(Client *c) setmon(c, mon, newtags); } +void +applyminimalborders(Client *c, Monitor *m) +{ + struct wlr_box geom = c->geom; + + geom.x -= borderpx; + geom.width += borderpx; + geom.y -= borderpx; + geom.height += borderpx; + + if (geom.x < m->w.x) { + geom.x += borderpx; + geom.width -= borderpx; + } + if (geom.x + geom.width > m->w.width - borderpx) { + geom.width -= borderpx; + } + + if (geom.y < m->w.y) { + geom.y += borderpx; + geom.height -= borderpx; + } + if (geom.y + geom.height > m->w.height - borderpx) { + geom.height -= borderpx; + } + + resize(c, geom, 0); +} + void arrange(Monitor *m) { @@ -460,8 +493,28 @@ arrange(Monitor *m) strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, LENGTH(m->ltsymbol)); - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); + if (m->lt[m->sellt]->arrange) { + if (draw_minimal_borders) { + int save_width = m->w.width; + int save_height = m->w.height; + m->w.width += borderpx; + m->w.height += borderpx; + resize = resizenoapply; + m->lt[m->sellt]->arrange(m); + wl_list_for_each(c, &clients, link) { + if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) + continue; + if (draw_minimal_borders) + applyminimalborders(c, m); + resizeapply(c, c->geom, c->interact); + } + m->w.width = save_width; + m->w.height = save_height; + resize = resizeapply; + } else { + m->lt[m->sellt]->arrange(m); + } + } motionnotify(0); checkidleinhibitor(NULL); } @@ -1792,8 +1845,13 @@ pointerfocus(Client *c, struct wlr_surface *surface, double sx, double sy, struct timespec now; int internal_call = !time; - if (sloppyfocus && !internal_call && c && !client_is_unmanaged(c)) - focusclient(c, 0); + if (sloppyfocus && !internal_call && c && !client_is_unmanaged(c)) { + if (c->isfloating || c->isfullscreen) { + focusclient(c, 0); + } else { + focusclient(c, 1); + } + } /* If surface is NULL, clear pointer focus */ if (!surface) { @@ -1932,7 +1990,7 @@ requestmonstate(struct wl_listener *listener, void *data) } void -resize(Client *c, struct wlr_box geo, int interact) +resizeapply(Client *c, struct wlr_box geo, int interact) { struct wlr_box *bbox = interact ? &sgeom : &c->mon->w; struct wlr_box clip; @@ -1958,6 +2016,13 @@ resize(Client *c, struct wlr_box geo, int interact) wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip); } +void +resizenoapply(Client *c, struct wlr_box geo, int interact) +{ + c->geom = geo; + c->interact = interact; +} + void run(char *startup_cmd) { -- 2.42.0