Last active
December 7, 2023 14:01
-
-
Save marendowski/f60a1371e3a4d16c891f026b5917bc0b to your computer and use it in GitHub Desktop.
Smartborders patch for dwl (2023-12-07)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From ee4887ce283d44bb1fa63cdf714b6d41a9dfe2d6 Mon Sep 17 00:00:00 2001 | |
From: Piotr Marendowski <[email protected]> | |
Date: Thu, 7 Dec 2023 14:14:00 +0100 | |
Subject: [PATCH] Fix smartborders patch | |
--- | |
config.def.h | 1 + | |
dwl.c | 42 +++++++++++++++++++++++++++--------------- | |
2 files changed, 28 insertions(+), 15 deletions(-) | |
diff --git a/config.def.h b/config.def.h | |
index db0babc..bd802b5 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 bordercolor[] = COLOR(0x444444ff); | |
static const float focuscolor[] = COLOR(0x005577ff); | |
diff --git a/dwl.c b/dwl.c | |
index bbb27e4..adc4536 100644 | |
--- a/dwl.c | |
+++ b/dwl.c | |
@@ -293,7 +293,7 @@ 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 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); | |
@@ -694,7 +694,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,7 +731,7 @@ 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)); | |
+ resize(c, c->geom, (c->isfloating && !c->isfullscreen), c->bw > 0); | |
/* mark a pending resize as completed */ | |
if (c->resize && c->resize <= c->surface.xdg->current.configure_serial) | |
@@ -1587,7 +1587,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) | |
@@ -1635,11 +1635,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; | |
} | |
@@ -1926,12 +1926,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 */ | |
@@ -2046,6 +2047,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(); | |
} | |
@@ -2063,11 +2066,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(); | |
@@ -2092,6 +2095,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(); | |
} | |
@@ -2126,7 +2135,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); | |
@@ -2401,7 +2410,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) | |
@@ -2410,6 +2419,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 | |
@@ -2420,11 +2432,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++; | |
@@ -2594,7 +2606,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, 1); | |
m->gamma_lut_changed = 1; | |
config_head->state.enabled = 1; | |
@@ -2767,7 +2779,7 @@ configurex11(struct wl_listener *listener, void *data) | |
return; | |
if (c->isfloating || c->type == X11Unmanaged) | |
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 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment