summaryrefslogtreecommitdiffstats
path: root/dwl.c
diff options
context:
space:
mode:
authorJoe <rbo@gmx.us>2025-02-28 21:58:54 +0100
committerJoe <rbo@gmx.us>2025-02-28 21:58:54 +0100
commitfe6867a4356e64d4db71192967e8a30bccdeb429 (patch)
tree650961fb959330c51ca59731caa08bcd8964b928 /dwl.c
parentunderlined2 (diff)
downloaddwl-fe6867a4356e64d4db71192967e8a30bccdeb429.tar.gz
dwl-fe6867a4356e64d4db71192967e8a30bccdeb429.tar.bz2
dwl-fe6867a4356e64d4db71192967e8a30bccdeb429.tar.xz
dwl-fe6867a4356e64d4db71192967e8a30bccdeb429.tar.zst
dwl-fe6867a4356e64d4db71192967e8a30bccdeb429.zip
oh good generic gaps
Diffstat (limited to 'dwl.c')
-rw-r--r--dwl.c171
1 files changed, 168 insertions, 3 deletions
diff --git a/dwl.c b/dwl.c
index 217e1df..9e4f6c5 100644
--- a/dwl.c
+++ b/dwl.c
@@ -117,6 +117,7 @@ typedef struct Client Client;
struct Client {
/* 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;
@@ -227,6 +228,10 @@ struct Monitor {
struct wl_list layers[4]; /* LayerSurface.link */
const Layout *lt[2];
Pertag *pertag;
+ int gappih; /* horizontal gap between windows */
+ int gappiv; /* vertical gap between windows */
+ int gappoh; /* horizontal outer gaps */
+ int gappov; /* vertical outer gaps */
unsigned int seltags;
unsigned int sellt;
uint32_t tagset[2];
@@ -313,6 +318,7 @@ static void createpopup(struct wl_listener *listener, void *data);
static void cursorconstrain(struct wlr_pointer_constraint_v1 *constraint);
static void cursorframe(struct wl_listener *listener, void *data);
static void cursorwarptohint(void);
+static void defaultgaps(const Arg *arg);
static void destroydecoration(struct wl_listener *listener, void *data);
static void destroydragicon(struct wl_listener *listener, void *data);
static void destroyidleinhibitor(struct wl_listener *listener, void *data);
@@ -335,6 +341,13 @@ static void fullscreennotify(struct wl_listener *listener, void *data);
static void gpureset(struct wl_listener *listener, void *data);
static void handlesig(int signo);
static void incnmaster(const Arg *arg);
+static void incgaps(const Arg *arg);
+static void incigaps(const Arg *arg);
+static void incihgaps(const Arg *arg);
+static void incivgaps(const Arg *arg);
+static void incogaps(const Arg *arg);
+static void incohgaps(const Arg *arg);
+static void incovgaps(const Arg *arg);
static void inputdevice(struct wl_listener *listener, void *data);
static int keybinding(uint32_t mods, xkb_keysym_t sym);
static void keypress(struct wl_listener *listener, void *data);
@@ -362,13 +375,15 @@ 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);
static void setfloating(Client *c, int floating);
static void setfullscreen(Client *c, int fullscreen);
static void setgamma(struct wl_listener *listener, void *data);
+static void setgaps(int oh, int ov, int ih, int iv);
static void setlayout(const Arg *arg);
static void setmfact(const Arg *arg);
static void setmon(Client *c, Monitor *m, uint32_t newtags);
@@ -384,6 +399,7 @@ static void tile(Monitor *m);
static void togglebar(const Arg *arg);
static void togglefloating(const Arg *arg);
static void togglefullscreen(const Arg *arg);
+static void togglegaps(const Arg *arg);
static void toggletag(const Arg *arg);
static void toggleview(const Arg *arg);
static void unlocksession(struct wl_listener *listener, void *data);
@@ -462,6 +478,9 @@ static struct wlr_box sgeom;
static struct wl_list mons;
static Monitor *selmon;
+static int enablegaps = 1; /* enables gaps, used by togglegaps */
+static void (*resize)(Client *c, struct wlr_box geo, int interact) = resizeapply;
+
static char stext[256];
static struct wl_event_source *status_event_source;
@@ -568,9 +587,25 @@ applyrules(Client *c)
}
void
+applygaps(Client *c)
+{
+ struct wlr_box geom = c->geom;
+
+ if (!c->mon)
+ return;
+
+ geom.x += c->mon->gappih + c->mon->gappoh;
+ geom.y += c->mon->gappiv + c->mon->gappov;
+ geom.width -= c->mon->gappih;
+ geom.height -= c->mon->gappiv;
+ resize(c, geom, 0);
+}
+
+void
arrange(Monitor *m)
{
Client *c;
+ int save_width, save_height;
if (!m->wlr_output->enabled)
return;
@@ -601,8 +636,26 @@ arrange(Monitor *m)
: c->scene->node.parent);
}
- if (m->lt[m->sellt]->arrange)
+ if (m->lt[m->sellt]->arrange) {
+ save_width = m->w.width;
+ save_height = m->w.height;
+ if (enablegaps) {
+ m->w.width -= m->gappih + 2 * m->gappoh;
+ m->w.height -= m->gappiv + 2 * m->gappov;
+ }
+ 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 (enablegaps)
+ applygaps(c);
+ resizeapply(c, c->geom, c->interact);
+ }
+ m->w.width = save_width;
+ m->w.height = save_height;
+ resize = resizeapply;
+ }
motionnotify(0, NULL, 0, 0, 0, 0);
checkidleinhibitor(NULL);
}
@@ -1192,6 +1245,11 @@ createmon(struct wl_listener *listener, void *data)
wlr_output_state_init(&state);
/* Initialize monitor state using configured rules */
+
+ m->gappih = gappih;
+ m->gappiv = gappiv;
+ m->gappoh = gappoh;
+ m->gappov = gappov;
m->tagset[0] = m->tagset[1] = 1;
for (r = monrules; r < END(monrules); r++) {
if (!r->name || strstr(wlr_output->name, r->name)) {
@@ -1395,6 +1453,12 @@ cursorwarptohint(void)
}
void
+defaultgaps(const Arg *arg)
+{
+ setgaps(gappoh, gappov, gappih, gappiv);
+}
+
+void
destroydecoration(struct wl_listener *listener, void *data)
{
Client *c = wl_container_of(listener, c, destroy_decoration);
@@ -1876,6 +1940,83 @@ incnmaster(const Arg *arg)
}
void
+incgaps(const Arg *arg)
+{
+ setgaps(
+ selmon->gappoh + arg->i,
+ selmon->gappov + arg->i,
+ selmon->gappih + arg->i,
+ selmon->gappiv + arg->i
+ );
+}
+
+void
+incigaps(const Arg *arg)
+{
+ setgaps(
+ selmon->gappoh,
+ selmon->gappov,
+ selmon->gappih + arg->i,
+ selmon->gappiv + arg->i
+ );
+}
+
+void
+incihgaps(const Arg *arg)
+{
+ setgaps(
+ selmon->gappoh,
+ selmon->gappov,
+ selmon->gappih + arg->i,
+ selmon->gappiv
+ );
+}
+
+void
+incivgaps(const Arg *arg)
+{
+ setgaps(
+ selmon->gappoh,
+ selmon->gappov,
+ selmon->gappih,
+ selmon->gappiv + arg->i
+ );
+}
+
+void
+incogaps(const Arg *arg)
+{
+ setgaps(
+ selmon->gappoh + arg->i,
+ selmon->gappov + arg->i,
+ selmon->gappih,
+ selmon->gappiv
+ );
+}
+
+void
+incohgaps(const Arg *arg)
+{
+ setgaps(
+ selmon->gappoh + arg->i,
+ selmon->gappov,
+ selmon->gappih,
+ selmon->gappiv
+ );
+}
+
+void
+incovgaps(const Arg *arg)
+{
+ setgaps(
+ selmon->gappoh,
+ selmon->gappov + arg->i,
+ selmon->gappih,
+ selmon->gappiv
+ );
+}
+
+void
inputdevice(struct wl_listener *listener, void *data)
{
/* This event is raised by the backend when a new input device becomes
@@ -2531,7 +2672,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;
@@ -2564,6 +2705,13 @@ resize(Client *c, struct wlr_box geo, int interact)
}
void
+resizenoapply(Client *c, struct wlr_box geo, int interact)
+{
+ c->geom = geo;
+ c->interact = interact;
+}
+
+void
run(char *startup_cmd)
{
/* Add a Unix socket to the Wayland display. */
@@ -2693,6 +2841,16 @@ setgamma(struct wl_listener *listener, void *data)
}
void
+setgaps(int oh, int ov, int ih, int iv)
+{
+ selmon->gappoh = MAX(oh, 0);
+ selmon->gappov = MAX(ov, 0);
+ selmon->gappih = MAX(ih, 0);
+ selmon->gappiv = MAX(iv, 0);
+ arrange(selmon);
+}
+
+void
setlayout(const Arg *arg)
{
if (!selmon)
@@ -3120,6 +3278,13 @@ togglefullscreen(const Arg *arg)
}
void
+togglegaps(const Arg *arg)
+{
+ enablegaps = !enablegaps;
+ arrange(selmon);
+}
+
+void
toggletag(const Arg *arg)
{
uint32_t newtags;