diff --git a/config.def.h b/config.def.h index 22d2171..0322dbf 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 rootcolor[] = COLOR(0x222222ff); static const float bordercolor[] = COLOR(0x444444ff); static const float focuscolor[] = COLOR(0x005577ff); diff --git a/dwl.c b/dwl.c index a2711f6..2d64341 100644 --- a/dwl.c +++ b/dwl.c @@ -107,6 +107,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; @@ -320,7 +321,8 @@ 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 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); @@ -413,6 +415,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); @@ -481,6 +485,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 - (int)borderpx) { + geom.width -= borderpx; + } + + if (geom.y < m->w.y) { + geom.y += borderpx; + geom.height -= borderpx; + } + if (geom.y + geom.height > m->w.height - (int)borderpx) { + geom.height -= borderpx; + } + + resize(c, geom, 0); +} + void arrange(Monitor *m) { @@ -515,8 +548,28 @@ arrange(Monitor *m) : c->scene->node.parent); } - 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, NULL, 0, 0, 0, 0); checkidleinhibitor(NULL); } @@ -2011,8 +2064,13 @@ pointerfocus(Client *c, struct wlr_surface *surface, double sx, double sy, struct timespec now; if (surface != seat->pointer_state.focused_surface && - sloppyfocus && time && c && !client_is_unmanaged(c)) - focusclient(c, 0); + sloppyfocus && time && 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) { @@ -2178,7 +2236,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; struct wlr_box clip; @@ -2210,6 +2268,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) {