dwm-noxz

[fork] suckless dwm - personal fork
git clone https://noxz.tech/git/dwm-noxz.git
Log | Files | README | LICENSE

commit: 6870660d92204ec3fc7508b8df0d9ccc5d194d5e
parent: d8ccaa44015c401d262de0fdf9e276e9dbf6ea63
author: Chris Noxz <chris@noxz.tech>
date:   Tue, 8 Jun 2021 15:39:09 +0200
Implement gaps for nrowgrid
Mconfig.def.h6+++
Mdwm.c53++++++++++++++++----
2 files changed, 48 insertions(+), 11 deletions(-)
diff --git a/config.def.h b/config.def.h
@@ -5,6 +5,7 @@
 /* appearance */
 static unsigned int borderpx    = 2;        /* border pixel of windows */
 static unsigned int snap        = 32;       /* snap pixel */
+static unsigned int gap         = 10;       /* inner and outer gap between windows */
 static int showbar              = 1;        /* 0 means no bar */
 static int topbar               = 1;        /* 0 means bottom bar */
 static int viewontag            = 1;
@@ -111,6 +112,7 @@ ResourcePref resources[] = {
 	{ "font",                       STRING,     &font },
 	{ "borderpx",                   INTEGER,    &borderpx },
 	{ "snap",                       INTEGER,    &snap },
+	{ "gap",                        INTEGER,    &gap },
 	{ "showbar",                    INTEGER,    &showbar },
 	{ "topbar",                     INTEGER,    &topbar },
 	{ "viewontag",                  INTEGER,    &viewontag },
@@ -147,6 +149,10 @@ static Command commands[] = {
 	{ "rotate layout +",    rotatelayout,   {.i = +1} },
 	{ "rotate layout -",    rotatelayout,   {.i = -1} },
 
+	{ "toggle gaps",        togglegaps,     {0} },
+	{ "inc gaps +",         incgaps,        {.i = +1} },
+	{ "inc gaps -",         incgaps,        {.i = -1} },
+
 	{ "toggle floating",    togglefloating, {0} },
 	{ "toggle sticky",      togglesticky,   {0} },
 	{ "focus mon +",        focusmon,       {.i = +1} },
diff --git a/dwm.c b/dwm.c
@@ -119,6 +119,7 @@ struct Monitor {
 	int by;               /* bar geometry */
 	int mx, my, mw, mh;   /* screen size */
 	int wx, wy, ww, wh;   /* window area  */
+	int gap;
 	unsigned int seltags;
 	unsigned int sellt;
 	unsigned int tagset[2];
@@ -199,6 +200,7 @@ static int getrootptr(int *x, int *y);
 static long getstate(Window w);
 static int gettextprop(Window w, Atom atom, char *text, unsigned int size);
 static void grabbuttons(Client *c, int focused);
+static void incgaps(const Arg *arg);
 static void incnmaster(const Arg *arg);
 static void killclient(const Arg *arg);
 static void load_xresources(void);
@@ -240,6 +242,7 @@ static void tile(Monitor *);
 static void nrowgrid(Monitor *);
 static void togglebar(const Arg *arg);
 static void togglefloating(const Arg *arg);
+static void togglegaps(const Arg *arg);
 static void togglesticky(const Arg *arg);
 static void toggletag(const Arg *arg);
 static void toggleview(const Arg *arg);
@@ -305,6 +308,7 @@ struct Pertag {
 	unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */
 	const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes  */
 	int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */
+	int enablegaps[LENGTH(tags) + 1];
 };
 
 /* compile-time check if all tags fit into an unsigned int bit array. */
@@ -680,6 +684,7 @@ createmon(void)
 	m->nmaster = nmaster;
 	m->showbar = showbar;
 	m->topbar = topbar;
+	m->gap = gap;
 	m->lt[0] = &layouts[0];
 	m->lt[1] = &layouts[1 % LENGTH(layouts)];
 	strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
@@ -692,6 +697,7 @@ createmon(void)
 		m->pertag->ltidxs[i][0] = m->lt[0];
 		m->pertag->ltidxs[i][1] = m->lt[1];
 		m->pertag->sellts[i] = m->sellt;
+		m->pertag->enablegaps[i] = 1;
 
 		m->pertag->showbars[i] = m->showbar;
 	}
@@ -1138,6 +1144,13 @@ grabbuttons(Client *c, int focused)
 	}
 }
 
+void
+incgaps(const Arg *arg)
+{
+	selmon->gap = MAX(selmon->gap + arg->i, 0);
+	arrange(selmon);
+}
+
 void
 incnmaster(const Arg *arg)
 {
@@ -1993,8 +2006,9 @@ tile(Monitor *m)
 void
 nrowgrid(Monitor *m)
 {
-	unsigned int n, i = 0, ri = 0, ci = 0;      /* counters */
+	unsigned int n, ri = 0, ci = 0;             /* counters */
 	unsigned int cx, cy, cw, ch;                /* client geometry */
+	unsigned int oh, ov, ih, iv;                /* gaps */
 	unsigned int uw = 0, uh = 0, uc = 0;        /* utilization trackers */
 	unsigned int cols, rows = m->nmaster + 1;
 	Client *c;
@@ -2003,18 +2017,28 @@ nrowgrid(Monitor *m)
 	if (n == 0)
 		return;
 
+	/* get gaps */
+	if (selmon->pertag->enablegaps[selmon->pertag->curtag] && n > 1) {
+		oh = m->gap;    /* outer horizontal */
+		ov = m->gap;    /* outer vertical */
+		ih = m->gap;    /* inner horizontal */
+		iv = m->gap;    /* inner vertical */
+	} else { oh = ov = ih = iv = 0; }
+
 	/* never allow empty rows */
 	if (n < rows)
 		rows = n;
 
+	/* TODO :: check if gaps are to large */
+
 	/* define first row */
 	cols = n / rows;
 	uc = cols;
-	cy = m->wy;
-	ch = m->wh / rows;
-	uh = ch;
+	cy = m->wy + oh;
+	ch = (m->wh - 2*oh - (ih * (rows - 1))) / rows;
+	uh = ch + ih;
 
-	for (c = nexttiled(m->clients); c; c = nexttiled(c->next), i++, ci++) {
+	for (c = nexttiled(m->clients); c; c = nexttiled(c->next), ci++) {
 		if (ci == cols) {
 			uw = 0;
 			ci = 0;
@@ -2023,14 +2047,14 @@ nrowgrid(Monitor *m)
 			/* next row */
 			cols = (n - uc) / (rows - ri);
 			uc += cols;
-			cy = m->wy + uh;
-			ch = (m->wh - uh) / (rows - ri);
-			uh += ch;
+			cy = m->wy + uh + oh;
+			ch = ((m->wh - 2*oh) - uh - (ih * (rows - ri - 1))) / (rows - ri);
+			uh += ch + ih;
 		}
 
-		cx = m->wx + uw;
-		cw = (m->ww - uw) / (cols - ci);
-		uw += cw;
+		cx = m->wx + uw + ov;
+		cw = ((m->ww - 2*ov) - uw - (iv * (cols - ci - 1))) / (cols - ci);
+		uw += cw + iv;
 
 		resize(c, cx, cy, cw - (2*c->bw), ch - (2*c->bw), 0);
 	}
@@ -2063,6 +2087,13 @@ togglefloating(const Arg *arg)
 	arrange(selmon);
 }
 
+void
+togglegaps(const Arg *arg)
+{
+	selmon->pertag->enablegaps[selmon->pertag->curtag] = !selmon->pertag->enablegaps[selmon->pertag->curtag];
+	arrange(selmon);
+}
+
 void
 togglesticky(const Arg *arg)
 {