Compare commits

..

3 Commits

Author SHA1 Message Date
mrsu 38027bafb0 removed fullgaps patch 2024-06-23 19:41:27 +01:00
mrsu 06be37e0e4 patches functional gaps 2024-06-23 19:40:58 +01:00
mrsu a8e00a6821 unpatched fullgaps 2024-06-23 19:30:21 +01:00
4 changed files with 299 additions and 119 deletions

View File

@ -4,7 +4,8 @@
/* appearance */ /* appearance */
static unsigned int borderpx = 6; /* border pixel of windows */ static unsigned int borderpx = 6; /* border pixel of windows */
static const unsigned int gappx = 10; /* gaps between windows */ static const int startwithgaps[] = { 0 }; /* 1 means gaps are used by default, this can be customized for each tag */
static const unsigned int gappx[] = { 10 }; /* default gap between windows in pixels, this can be customized for each tag */
static unsigned int snap = 32; /* snap pixel */ static unsigned int snap = 32; /* snap pixel */
static const int swallowfloating = 0; /* 1 means swallow floating windows by default */ static const int swallowfloating = 0; /* 1 means swallow floating windows by default */
static int showbar = 1; /* 0 means no bar */ static int showbar = 1; /* 0 means no bar */
@ -143,6 +144,10 @@ static const Key keys[] = {
{ MODKEY, XK_minus, setgaps, {.i = -1 } }, { MODKEY, XK_minus, setgaps, {.i = -1 } },
{ MODKEY, XK_equal, setgaps, {.i = +1 } }, { MODKEY, XK_equal, setgaps, {.i = +1 } },
{ MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } }, { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } },
{ MODKEY, XK_minus, setgaps, {.i = -5 } },
{ MODKEY, XK_equal, setgaps, {.i = +5 } },
{ MODKEY|ShiftMask, XK_minus, setgaps, {.i = GAP_RESET } },
{ MODKEY|ShiftMask, XK_equal, setgaps, {.i = GAP_TOGGLE} },
TAGKEYS( XK_1, 0) TAGKEYS( XK_1, 0)
TAGKEYS( XK_2, 1) TAGKEYS( XK_2, 1)
TAGKEYS( XK_3, 2) TAGKEYS( XK_3, 2)

110
dwm.c
View File

@ -67,6 +67,9 @@
#define SPTAGMASK (((1 << LENGTH(scratchpads))-1) << LENGTH(tags)) #define SPTAGMASK (((1 << LENGTH(scratchpads))-1) << LENGTH(tags))
#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
#define GAP_TOGGLE 100
#define GAP_RESET 0
/* enums */ /* enums */
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
enum { SchemeNorm, SchemeSel, SchemeStatus, SchemeTagsSel, SchemeTagsNorm, SchemeInfoSel, SchemeInfoNorm }; /* color schemes */ enum { SchemeNorm, SchemeSel, SchemeStatus, SchemeTagsSel, SchemeTagsNorm, SchemeInfoSel, SchemeInfoNorm }; /* color schemes */
@ -124,6 +127,7 @@ typedef struct {
} Layout; } Layout;
typedef struct Pertag Pertag; typedef struct Pertag Pertag;
struct Monitor { struct Monitor {
char ltsymbol[16]; char ltsymbol[16];
float mfact; float mfact;
@ -132,7 +136,6 @@ struct Monitor {
int by; /* bar geometry */ int by; /* bar geometry */
int mx, my, mw, mh; /* screen size */ int mx, my, mw, mh; /* screen size */
int wx, wy, ww, wh; /* window area */ int wx, wy, ww, wh; /* window area */
int gappx; /* gaps between windows */
unsigned int seltags; unsigned int seltags;
unsigned int sellt; unsigned int sellt;
unsigned int tagset[2]; unsigned int tagset[2];
@ -329,6 +332,9 @@ struct Pertag {
unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */
const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */ 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 showbars[LENGTH(tags) + 1]; /* display bar for the current tag */
int drawwithgaps[LENGTH(tags) + 1]; /* gaps toggle for each tag */
int gappx[LENGTH(tags) + 1]; /* gaps for each tag */
}; };
/* compile-time check if all tags fit into an unsigned int bit array. */ /* compile-time check if all tags fit into an unsigned int bit array. */
@ -755,7 +761,6 @@ createmon(void)
m->nmaster = nmaster; m->nmaster = nmaster;
m->showbar = showbar; m->showbar = showbar;
m->topbar = topbar; m->topbar = topbar;
m->gappx = gappx;
m->lt[0] = &layouts[0]; m->lt[0] = &layouts[0];
m->lt[1] = &layouts[1 % LENGTH(layouts)]; m->lt[1] = &layouts[1 % LENGTH(layouts)];
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
@ -771,7 +776,13 @@ createmon(void)
m->pertag->sellts[i] = m->sellt; m->pertag->sellts[i] = m->sellt;
m->pertag->showbars[i] = m->showbar; m->pertag->showbars[i] = m->showbar;
if (i > 0) {
m->pertag->drawwithgaps[i] = startwithgaps[(i - 1) % LENGTH(gappx)];
m->pertag->gappx[i] = gappx[(i - 1) % LENGTH(gappx)];
}
} }
m->pertag->drawwithgaps[0] = startwithgaps[0];
m->pertag->gappx[0] = gappx[0];
return m; return m;
} }
@ -933,6 +944,12 @@ focus(Client *c)
attachstack(c); attachstack(c);
grabbuttons(c, 1); grabbuttons(c, 1);
XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel);
if (!selmon->pertag->drawwithgaps[selmon->pertag->curtag] && !c->isfloating) {
XWindowChanges wc;
wc.sibling = selmon->barwin;
wc.stack_mode = Below;
XConfigureWindow(dpy, c->win, CWSibling | CWStackMode, &wc);
}
setfocus(c); setfocus(c);
} else { } else {
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
@ -1260,7 +1277,10 @@ monocle(Monitor *m)
if (n > 0) /* override layout symbol */ if (n > 0) /* override layout symbol */
snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
for (c = nexttiled(m->clients); c; c = nexttiled(c->next)) for (c = nexttiled(m->clients); c; c = nexttiled(c->next))
resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); if (selmon->pertag->drawwithgaps[selmon->pertag->curtag])
resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0);
else
resize(c, m->wx - c->bw, m->wy, m->ww, m->wh, False);
} }
void void
@ -1483,6 +1503,15 @@ resizeclient(Client *c, int x, int y, int w, int h)
c->oldw = c->w; c->w = wc.width = w; c->oldw = c->w; c->w = wc.width = w;
c->oldh = c->h; c->h = wc.height = h; c->oldh = c->h; c->h = wc.height = h;
wc.border_width = c->bw; wc.border_width = c->bw;
if (!selmon->pertag->drawwithgaps[selmon->pertag->curtag] && /* this is the noborderfloatingfix patch, slightly modified so that it will work if, and only if, gaps are disabled. */
(((nexttiled(c->mon->clients) == c && !nexttiled(c->next)) /* these two first lines are the only ones changed. if you are manually patching and have noborder installed already, just change these lines; or conversely, just remove this section if the noborder patch is not desired;) */
|| &monocle == c->mon->lt[c->mon->sellt]->arrange))
&& !c->isfullscreen && !c->isfloating
&& NULL != c->mon->lt[c->mon->sellt]->arrange) {
c->w = wc.width += c->bw * 2;
c->h = wc.height += c->bw * 2;
wc.border_width = 0;
}
XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
configure(c); configure(c);
XSync(dpy, False); XSync(dpy, False);
@ -1703,10 +1732,23 @@ setfullscreen(Client *c, int fullscreen)
void void
setgaps(const Arg *arg) setgaps(const Arg *arg)
{ {
if ((arg->i == 0) || (selmon->gappx + arg->i < 0)) switch(arg->i)
selmon->gappx = 0; {
else case GAP_TOGGLE:
selmon->gappx += arg->i; selmon->pertag->drawwithgaps[selmon->pertag->curtag] = !selmon->pertag->drawwithgaps[selmon->pertag->curtag];
break;
case GAP_RESET:
if (selmon->pertag->curtag > 0)
selmon->pertag->gappx[selmon->pertag->curtag] = gappx[selmon->pertag->curtag - 1 % LENGTH(gappx)];
else
selmon->pertag->gappx[0] = gappx[0];
break;
default:
if (selmon->pertag->gappx[selmon->pertag->curtag] + arg->i < 0)
selmon->pertag->gappx[selmon->pertag->curtag] = 0;
else
selmon->pertag->gappx[selmon->pertag->curtag] += arg->i;
}
arrange(selmon); arrange(selmon);
} }
@ -1918,28 +1960,48 @@ tile(Monitor *m)
if (n == 0) if (n == 0)
return; return;
if (n > m->nmaster) if (m->pertag->drawwithgaps[m->pertag->curtag]) { /* draw with fullgaps logic */
mw = m->nmaster ? m->ww * m->mfact : 0; if (n > m->nmaster)
else mw = m->nmaster ? m->ww * m->mfact : 0;
mw = m->ww - m->gappx; else
for (i = 0, my = ty = m->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) mw = m->ww - m->pertag->gappx[m->pertag->curtag];
if (i < m->nmaster) { for (i = 0, my = ty = m->pertag->gappx[m->pertag->curtag], c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gappx; if (i < m->nmaster) {
resize(c, m->wx + m->gappx, m->wy + my, mw - (2*c->bw) - m->gappx, h - (2*c->bw), 0); h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->pertag->gappx[m->pertag->curtag];
if (my + HEIGHT(c) + m->gappx < m->wh) resize(c, m->wx + m->pertag->gappx[m->pertag->curtag], m->wy + my, mw - (2*c->bw) - m->pertag->gappx[m->pertag->curtag], h - (2*c->bw), 0);
my += HEIGHT(c) + m->gappx; if (my + HEIGHT(c) + m->pertag->gappx[m->pertag->curtag] < m->wh)
} else { my += HEIGHT(c) + m->pertag->gappx[m->pertag->curtag];
h = (m->wh - ty) / (n - i) - m->gappx; } else {
resize(c, m->wx + mw + m->gappx, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gappx, h - (2*c->bw), 0); h = (m->wh - ty) / (n - i) - m->pertag->gappx[m->pertag->curtag];
if (ty + HEIGHT(c) + m->gappx < m->wh) resize(c, m->wx + mw + m->pertag->gappx[m->pertag->curtag], m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->pertag->gappx[m->pertag->curtag], h - (2*c->bw), 0);
ty += HEIGHT(c) + m->gappx; if (ty + HEIGHT(c) + m->pertag->gappx[m->pertag->curtag] < m->wh)
} ty += HEIGHT(c) + m->pertag->gappx[m->pertag->curtag];
}
} else { /* draw with singularborders logic */
if (n > m->nmaster)
mw = m->nmaster ? m->ww * m->mfact : 0;
else
mw = m->ww;
for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
if (i < m->nmaster) {
h = (m->wh - my) / (MIN(n, m->nmaster) - i);
if (n == 1)
resize(c, m->wx - c->bw, m->wy, m->ww, m->wh, False);
else
resize(c, m->wx - c->bw, m->wy + my, mw - c->bw, h - c->bw, False);
my += HEIGHT(c) - c->bw;
} else {
h = (m->wh - ty) / (n - i);
resize(c, m->wx + mw - c->bw, m->wy + ty, m->ww - mw, h - c->bw, False);
ty += HEIGHT(c) - c->bw;
}
}
} }
void void
togglebar(const Arg *arg) togglebar(const Arg *arg)
{ {
selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; selmon->showbar = !selmon->showbar;
updatebarpos(selmon); updatebarpos(selmon);
XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
arrange(selmon); arrange(selmon);

View File

@ -1,94 +0,0 @@
diff -up a/config.def.h b/config.def.h
--- a/config.def.h
+++ b/config.def.h
@@ -2,6 +2,7 @@
/* appearance */
static const unsigned int borderpx = 1; /* border pixel of windows */
+static const unsigned int gappx = 5; /* gaps between windows */
static const unsigned int snap = 32; /* snap pixel */
static const int showbar = 1; /* 0 means no bar */
static const int topbar = 1; /* 0 means bottom bar */
@@ -85,6 +86,9 @@ static const Key keys[] = {
{ MODKEY, XK_period, focusmon, {.i = +1 } },
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
+ { MODKEY, XK_minus, setgaps, {.i = -1 } },
+ { MODKEY, XK_equal, setgaps, {.i = +1 } },
+ { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } },
TAGKEYS( XK_1, 0)
TAGKEYS( XK_2, 1)
TAGKEYS( XK_3, 2)
diff -up a/dwm.c b/dwm.c
--- a/dwm.c 2023-04-30
+++ b/dwm.c 2023-04-30
@@ -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 gappx; /* gaps between windows */
unsigned int seltags;
unsigned int sellt;
unsigned int tagset[2];
@@ -200,6 +201,7 @@ static void sendmon(Client *c, Monitor *
static void setclientstate(Client *c, long state);
static void setfocus(Client *c);
static void setfullscreen(Client *c, int fullscreen);
+static void setgaps(const Arg *arg);
static void setlayout(const Arg *arg);
static void setmfact(const Arg *arg);
static void setup(void);
@@ -641,6 +643,7 @@ createmon(void)
m->nmaster = nmaster;
m->showbar = showbar;
m->topbar = topbar;
+ m->gappx = gappx;
m->lt[0] = &layouts[0];
m->lt[1] = &layouts[1 % LENGTH(layouts)];
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
@@ -1508,6 +1511,16 @@ setfullscreen(Client *c, int fullscreen)
}
void
+setgaps(const Arg *arg)
+{
+ if ((arg->i == 0) || (selmon->gappx + arg->i < 0))
+ selmon->gappx = 0;
+ else
+ selmon->gappx += arg->i;
+ arrange(selmon);
+}
+
+void
setlayout(const Arg *arg)
{
if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
@@ -1697,18 +1710,18 @@ tile(Monitor *m)
if (n > m->nmaster)
mw = m->nmaster ? m->ww * m->mfact : 0;
else
- mw = m->ww;
- for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
- if (i < m->nmaster) {
- h = (m->wh - my) / (MIN(n, m->nmaster) - i);
- resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0);
- if (my + HEIGHT(c) < m->wh)
- my += HEIGHT(c);
+ mw = m->ww - m->gappx;
+ for (i = 0, my = ty = m->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
+ if (i < m->nmaster) {
+ h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gappx;
+ resize(c, m->wx + m->gappx, m->wy + my, mw - (2*c->bw) - m->gappx, h - (2*c->bw), 0);
+ if (my + HEIGHT(c) + m->gappx < m->wh)
+ my += HEIGHT(c) + m->gappx;
} else {
- h = (m->wh - ty) / (n - i);
- resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0);
- if (ty + HEIGHT(c) < m->wh)
- ty += HEIGHT(c);
+ h = (m->wh - ty) / (n - i) - m->gappx;
+ resize(c, m->wx + mw + m->gappx, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gappx, h - (2*c->bw), 0);
+ if (ty + HEIGHT(c) + m->gappx < m->wh)
+ ty += HEIGHT(c) + m->gappx;
}
}

View File

@ -0,0 +1,207 @@
diff -pu dwm.withpertag/config.def.h dwm.functionalgapspertag/config.def.h
--- dwm.withpertag/config.def.h 2021-02-27 23:47:22.426092186 -0600
+++ dwm.functionalgapspertag/config.def.h 2021-03-01 15:40:07.312696974 -0600
@@ -2,6 +2,8 @@
/* appearance */
static const unsigned int borderpx = 1; /* border pixel of windows */
+static const int startwithgaps[] = { 0 }; /* 1 means gaps are used by default, this can be customized for each tag */
+static const unsigned int gappx[] = { 10 }; /* default gap between windows in pixels, this can be customized for each tag */
static const unsigned int snap = 32; /* snap pixel */
static const int showbar = 1; /* 0 means no bar */
static const int topbar = 1; /* 0 means bottom bar */
@@ -84,6 +86,10 @@ static Key keys[] = {
{ MODKEY, XK_period, focusmon, {.i = +1 } },
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
+ { MODKEY, XK_minus, setgaps, {.i = -5 } },
+ { MODKEY, XK_equal, setgaps, {.i = +5 } },
+ { MODKEY|ShiftMask, XK_minus, setgaps, {.i = GAP_RESET } },
+ { MODKEY|ShiftMask, XK_equal, setgaps, {.i = GAP_TOGGLE} },
TAGKEYS( XK_1, 0)
TAGKEYS( XK_2, 1)
TAGKEYS( XK_3, 2)
diff -pu dwm.withpertag/dwm.c dwm.functionalgapspertag/dwm.c
--- dwm.withpertag/dwm.c 2021-02-27 23:47:41.352759785 -0600
+++ dwm.functionalgapspertag/dwm.c 2021-03-01 17:10:10.402964866 -0600
@@ -57,6 +57,9 @@
#define TAGMASK ((1 << LENGTH(tags)) - 1)
#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
+#define GAP_TOGGLE 100
+#define GAP_RESET 0
+
/* enums */
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
enum { SchemeNorm, SchemeSel }; /* color schemes */
@@ -112,6 +115,7 @@ typedef struct {
} Layout;
typedef struct Pertag Pertag;
+
struct Monitor {
char ltsymbol[16];
float mfact;
@@ -202,6 +206,7 @@ static void sendmon(Client *c, Monitor *
static void setclientstate(Client *c, long state);
static void setfocus(Client *c);
static void setfullscreen(Client *c, int fullscreen);
+static void setgaps(const Arg *arg);
static void setlayout(const Arg *arg);
static void setmfact(const Arg *arg);
static void setup(void);
@@ -281,6 +286,9 @@ 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 drawwithgaps[LENGTH(tags) + 1]; /* gaps toggle for each tag */
+ int gappx[LENGTH(tags) + 1]; /* gaps for each tag */
};
/* compile-time check if all tags fit into an unsigned int bit array. */
@@ -666,7 +674,13 @@ createmon(void)
m->pertag->sellts[i] = m->sellt;
m->pertag->showbars[i] = m->showbar;
+ if (i > 0) {
+ m->pertag->drawwithgaps[i] = startwithgaps[(i - 1) % LENGTH(gappx)];
+ m->pertag->gappx[i] = gappx[(i - 1) % LENGTH(gappx)];
+ }
}
+ m->pertag->drawwithgaps[0] = startwithgaps[0];
+ m->pertag->gappx[0] = gappx[0];
return m;
}
@@ -823,6 +837,12 @@ focus(Client *c)
attachstack(c);
grabbuttons(c, 1);
XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel);
+ if (!selmon->pertag->drawwithgaps[selmon->pertag->curtag] && !c->isfloating) {
+ XWindowChanges wc;
+ wc.sibling = selmon->barwin;
+ wc.stack_mode = Below;
+ XConfigureWindow(dpy, c->win, CWSibling | CWStackMode, &wc);
+ }
setfocus(c);
} else {
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
@@ -1139,7 +1159,10 @@ monocle(Monitor *m)
if (n > 0) /* override layout symbol */
snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
for (c = nexttiled(m->clients); c; c = nexttiled(c->next))
- resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0);
+ if (selmon->pertag->drawwithgaps[selmon->pertag->curtag])
+ resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0);
+ else
+ resize(c, m->wx - c->bw, m->wy, m->ww, m->wh, False);
}
void
@@ -1309,6 +1332,15 @@ resizeclient(Client *c, int x, int y, in
c->oldw = c->w; c->w = wc.width = w;
c->oldh = c->h; c->h = wc.height = h;
wc.border_width = c->bw;
+ if (!selmon->pertag->drawwithgaps[selmon->pertag->curtag] && /* this is the noborderfloatingfix patch, slightly modified so that it will work if, and only if, gaps are disabled. */
+ (((nexttiled(c->mon->clients) == c && !nexttiled(c->next)) /* these two first lines are the only ones changed. if you are manually patching and have noborder installed already, just change these lines; or conversely, just remove this section if the noborder patch is not desired;) */
+ || &monocle == c->mon->lt[c->mon->sellt]->arrange))
+ && !c->isfullscreen && !c->isfloating
+ && NULL != c->mon->lt[c->mon->sellt]->arrange) {
+ c->w = wc.width += c->bw * 2;
+ c->h = wc.height += c->bw * 2;
+ wc.border_width = 0;
+ }
XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
configure(c);
XSync(dpy, False);
@@ -1525,6 +1557,29 @@ setfullscreen(Client *c, int fullscreen)
}
void
+setgaps(const Arg *arg)
+{
+ switch(arg->i)
+ {
+ case GAP_TOGGLE:
+ selmon->pertag->drawwithgaps[selmon->pertag->curtag] = !selmon->pertag->drawwithgaps[selmon->pertag->curtag];
+ break;
+ case GAP_RESET:
+ if (selmon->pertag->curtag > 0)
+ selmon->pertag->gappx[selmon->pertag->curtag] = gappx[selmon->pertag->curtag - 1 % LENGTH(gappx)];
+ else
+ selmon->pertag->gappx[0] = gappx[0];
+ break;
+ default:
+ if (selmon->pertag->gappx[selmon->pertag->curtag] + arg->i < 0)
+ selmon->pertag->gappx[selmon->pertag->curtag] = 0;
+ else
+ selmon->pertag->gappx[selmon->pertag->curtag] += arg->i;
+ }
+ arrange(selmon);
+}
+
+void
setlayout(const Arg *arg)
{
if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
@@ -1706,23 +1761,42 @@ tile(Monitor *m)
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
if (n == 0)
return;
-
- if (n > m->nmaster)
- mw = m->nmaster ? m->ww * m->mfact : 0;
- else
- mw = m->ww;
- for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
- if (i < m->nmaster) {
- h = (m->wh - my) / (MIN(n, m->nmaster) - i);
- resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0);
- if (my + HEIGHT(c) < m->wh)
- my += HEIGHT(c);
- } else {
- h = (m->wh - ty) / (n - i);
- resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0);
- if (ty + HEIGHT(c) < m->wh)
- ty += HEIGHT(c);
- }
+ if (m->pertag->drawwithgaps[m->pertag->curtag]) { /* draw with fullgaps logic */
+ if (n > m->nmaster)
+ mw = m->nmaster ? m->ww * m->mfact : 0;
+ else
+ mw = m->ww - m->pertag->gappx[m->pertag->curtag];
+ for (i = 0, my = ty = m->pertag->gappx[m->pertag->curtag], c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
+ if (i < m->nmaster) {
+ h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->pertag->gappx[m->pertag->curtag];
+ resize(c, m->wx + m->pertag->gappx[m->pertag->curtag], m->wy + my, mw - (2*c->bw) - m->pertag->gappx[m->pertag->curtag], h - (2*c->bw), 0);
+ if (my + HEIGHT(c) + m->pertag->gappx[m->pertag->curtag] < m->wh)
+ my += HEIGHT(c) + m->pertag->gappx[m->pertag->curtag];
+ } else {
+ h = (m->wh - ty) / (n - i) - m->pertag->gappx[m->pertag->curtag];
+ resize(c, m->wx + mw + m->pertag->gappx[m->pertag->curtag], m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->pertag->gappx[m->pertag->curtag], h - (2*c->bw), 0);
+ if (ty + HEIGHT(c) + m->pertag->gappx[m->pertag->curtag] < m->wh)
+ ty += HEIGHT(c) + m->pertag->gappx[m->pertag->curtag];
+ }
+ } else { /* draw with singularborders logic */
+ if (n > m->nmaster)
+ mw = m->nmaster ? m->ww * m->mfact : 0;
+ else
+ mw = m->ww;
+ for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
+ if (i < m->nmaster) {
+ h = (m->wh - my) / (MIN(n, m->nmaster) - i);
+ if (n == 1)
+ resize(c, m->wx - c->bw, m->wy, m->ww, m->wh, False);
+ else
+ resize(c, m->wx - c->bw, m->wy + my, mw - c->bw, h - c->bw, False);
+ my += HEIGHT(c) - c->bw;
+ } else {
+ h = (m->wh - ty) / (n - i);
+ resize(c, m->wx + mw - c->bw, m->wy + ty, m->ww - mw, h - c->bw, False);
+ ty += HEIGHT(c) - c->bw;
+ }
+ }
}
void