Add smart borders patch

new_dwm
Alex Selimov 4 years ago
parent 79edc68d93
commit 082c9fa90a

59
dwm.c

@ -149,7 +149,7 @@ typedef struct {
/* function declarations */ /* function declarations */
static void applyrules(Client *c); static void applyrules(Client *c);
static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int *bw, int interact);
static void arrange(Monitor *m); static void arrange(Monitor *m);
static void arrangemon(Monitor *m); static void arrangemon(Monitor *m);
static void attach(Client *c); static void attach(Client *c);
@ -196,8 +196,8 @@ static void pop(Client *);
static void propertynotify(XEvent *e); static void propertynotify(XEvent *e);
static void quit(const Arg *arg); static void quit(const Arg *arg);
static Monitor *recttomon(int x, int y, int w, int h); static Monitor *recttomon(int x, int y, int w, int h);
static void resize(Client *c, int x, int y, int w, int h, int interact); static void resize(Client *c, int x, int y, int w, int h, int bw, int interact);
static void resizeclient(Client *c, int x, int y, int w, int h); static void resizeclient(Client *c, int x, int y, int w, int h, int bw);
static void resizemouse(const Arg *arg); static void resizemouse(const Arg *arg);
static void restack(Monitor *m); static void restack(Monitor *m);
static void run(void); static void run(void);
@ -332,7 +332,7 @@ applyrules(Client *c)
} }
int int
applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) applysizehints(Client *c, int *x, int *y, int *w, int *h, int *bw, int interact)
{ {
int baseismin; int baseismin;
Monitor *m = c->mon; Monitor *m = c->mon;
@ -345,18 +345,18 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact)
*x = sw - WIDTH(c); *x = sw - WIDTH(c);
if (*y > sh) if (*y > sh)
*y = sh - HEIGHT(c); *y = sh - HEIGHT(c);
if (*x + *w + 2 * c->bw < 0) if (*x + *w + 2 * *bw < 0)
*x = 0; *x = 0;
if (*y + *h + 2 * c->bw < 0) if (*y + *h + 2 * *bw < 0)
*y = 0; *y = 0;
} else { } else {
if (*x >= m->wx + m->ww) if (*x >= m->wx + m->ww)
*x = m->wx + m->ww - WIDTH(c); *x = m->wx + m->ww - WIDTH(c);
if (*y >= m->wy + m->wh) if (*y >= m->wy + m->wh)
*y = m->wy + m->wh - HEIGHT(c); *y = m->wy + m->wh - HEIGHT(c);
if (*x + *w + 2 * c->bw <= m->wx) if (*x + *w + 2 * *bw <= m->wx)
*x = m->wx; *x = m->wx;
if (*y + *h + 2 * c->bw <= m->wy) if (*y + *h + 2 * *bw <= m->wy)
*y = m->wy; *y = m->wy;
} }
if (*h < bh) if (*h < bh)
@ -394,7 +394,7 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact)
if (c->maxh) if (c->maxh)
*h = MIN(*h, c->maxh); *h = MIN(*h, c->maxh);
} }
return *x != c->x || *y != c->y || *w != c->w || *h != c->h; return *x != c->x || *y != c->y || *w != c->w || *h != c->h || *bw != c->bw;
} }
void void
@ -414,9 +414,16 @@ arrange(Monitor *m)
void void
arrangemon(Monitor *m) arrangemon(Monitor *m)
{ {
Client *c;
strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol);
if (m->lt[m->sellt]->arrange) if (m->lt[m->sellt]->arrange)
m->lt[m->sellt]->arrange(m); m->lt[m->sellt]->arrange(m);
else
/* <>< case; rather than providing an arrange function and upsetting other logic that tests for its presence, simply add borders here */
for (c = selmon->clients; c; c = c->next)
if (ISVISIBLE(c) && c->bw == 0)
resize(c, c->x, c->y, c->w - 2*borderpx, c->h - 2*borderpx, borderpx, 0);
} }
void void
@ -586,7 +593,7 @@ configurenotify(XEvent *e)
for (m = mons; m; m = m->next) { for (m = mons; m; m = m->next) {
for (c = m->clients; c; c = c->next) for (c = m->clients; c; c = c->next)
if (c->isfullscreen) if (c->isfullscreen)
resizeclient(c, m->mx, m->my, m->mw, m->mh); resizeclient(c, m->mx, m->my, m->mw, m->mh, 0);
XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
} }
focus(NULL); focus(NULL);
@ -1161,7 +1168,7 @@ 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); resize(c, m->wx, m->wy, m->ww, m->wh, 0, 0);
} }
void void
@ -1229,7 +1236,7 @@ movemouse(const Arg *arg)
&& (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) && (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
togglefloating(NULL); togglefloating(NULL);
if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) if (!selmon->lt[selmon->sellt]->arrange || c->isfloating)
resize(c, nx, ny, c->w, c->h, 1); resize(c, nx, ny, c->w, c->h, c->bw, 1);
break; break;
} }
} while (ev.type != ButtonRelease); } while (ev.type != ButtonRelease);
@ -1295,7 +1302,7 @@ moveresize(const Arg *arg) {
XRaiseWindow(dpy, c->win); XRaiseWindow(dpy, c->win);
Bool xqp = XQueryPointer(dpy, root, &dummy, &dummy, &msx, &msy, &dx, &dy, &dui); Bool xqp = XQueryPointer(dpy, root, &dummy, &dummy, &msx, &msy, &dx, &dy, &dui);
resize(c, nx, ny, nw, nh, True); resize(c, nx, ny, nw, nh, borderpx, True);
/* move cursor along with the window to avoid problems caused by the sloppy focus */ /* move cursor along with the window to avoid problems caused by the sloppy focus */
if (xqp && ox <= msx && (ox + ow) >= msx && oy <= msy && (oy + oh) >= msy) if (xqp && ox <= msx && (ox + ow) >= msx && oy <= msy && (oy + oh) >= msy)
@ -1381,14 +1388,14 @@ recttomon(int x, int y, int w, int h)
} }
void void
resize(Client *c, int x, int y, int w, int h, int interact) resize(Client *c, int x, int y, int w, int h, int bw, int interact)
{ {
if (applysizehints(c, &x, &y, &w, &h, interact)) if (applysizehints(c, &x, &y, &w, &h, &bw, interact))
resizeclient(c, x, y, w, h); resizeclient(c, x, y, w, h, bw);
} }
void void
resizeclient(Client *c, int x, int y, int w, int h) resizeclient(Client *c, int x, int y, int w, int h, int bw)
{ {
XWindowChanges wc; XWindowChanges wc;
@ -1396,7 +1403,7 @@ resizeclient(Client *c, int x, int y, int w, int h)
c->oldy = c->y; c->y = wc.y = y; c->oldy = c->y; c->y = wc.y = y;
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; c->oldbw = c->bw; c->bw = wc.border_width = bw;
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);
@ -1445,7 +1452,7 @@ resizemouse(const Arg *arg)
togglefloating(NULL); togglefloating(NULL);
} }
if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) if (!selmon->lt[selmon->sellt]->arrange || c->isfloating)
resize(c, c->x, c->y, nw, nh, 1); resize(c, c->x, c->y, nw, nh, c->bw, 1);
break; break;
} }
} while (ev.type != ButtonRelease); } while (ev.type != ButtonRelease);
@ -1594,22 +1601,20 @@ setfullscreen(Client *c, int fullscreen)
PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1);
c->isfullscreen = 1; c->isfullscreen = 1;
c->oldstate = c->isfloating; c->oldstate = c->isfloating;
c->oldbw = c->bw;
c->bw = 0;
c->isfloating = 1; c->isfloating = 1;
resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh, 0);
XRaiseWindow(dpy, c->win); XRaiseWindow(dpy, c->win);
} else if (!fullscreen && c->isfullscreen){ } else if (!fullscreen && c->isfullscreen){
XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
PropModeReplace, (unsigned char*)0, 0); PropModeReplace, (unsigned char*)0, 0);
c->isfullscreen = 0; c->isfullscreen = 0;
c->isfloating = c->oldstate; c->isfloating = c->oldstate;
c->bw = c->oldbw;
c->x = c->oldx; c->x = c->oldx;
c->y = c->oldy; c->y = c->oldy;
c->w = c->oldw; c->w = c->oldw;
c->h = c->oldh; c->h = c->oldh;
resizeclient(c, c->x, c->y, c->w, c->h); c->bw = c->oldbw;
resizeclient(c, c->x, c->y, c->w, c->h, c->bw);
arrange(c->mon); arrange(c->mon);
} }
} }
@ -1765,7 +1770,7 @@ showhide(Client *c)
/* show clients top down */ /* show clients top down */
XMoveWindow(dpy, c->win, c->x, c->y); XMoveWindow(dpy, c->win, c->x, c->y);
if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen)
resize(c, c->x, c->y, c->w, c->h, 0); resize(c, c->x, c->y, c->w, c->h, c->bw, 0);
showhide(c->snext); showhide(c->snext);
} else { } else {
/* hide clients bottom up */ /* hide clients bottom up */
@ -1858,7 +1863,9 @@ togglefloating(const Arg *arg)
selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed;
if (selmon->sel->isfloating) if (selmon->sel->isfloating)
resize(selmon->sel, selmon->sel->x, selmon->sel->y, resize(selmon->sel, selmon->sel->x, selmon->sel->y,
selmon->sel->w, selmon->sel->h, 0); selmon->sel->w - 2 * (borderpx - selmon->sel->bw),
selmon->sel->h - 2 * (borderpx - selmon->sel->bw),
borderpx, 0);
arrange(selmon); arrange(selmon);
} }

@ -190,235 +190,6 @@ getfacts(Monitor *m, int msize, int ssize, float *mf, float *sf, int *mr, int *s
* Layouts * Layouts
*/ */
/*
* Bottomstack layout + gaps
* https://dwm.suckless.org/patches/bottomstack/
*/
static void
bstack(Monitor *m)
{
unsigned int i, n;
int oh, ov, ih, iv;
int mx = 0, my = 0, mh = 0, mw = 0;
int sx = 0, sy = 0, sh = 0, sw = 0;
float mfacts, sfacts;
int mrest, srest;
Client *c;
getgaps(m, &oh, &ov, &ih, &iv, &n);
if (n == 0)
return;
sx = mx = m->wx + ov;
sy = my = m->wy + oh;
sh = mh = m->wh - 2*oh;
mw = m->ww - 2*ov - iv * (MIN(n, m->nmaster) - 1);
sw = m->ww - 2*ov - iv * (n - m->nmaster - 1);
if (m->nmaster && n > m->nmaster) {
sh = (mh - ih) * (1 - m->mfact);
mh = mh - ih - sh;
sx = mx;
sy = my + mh + ih;
}
getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest);
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
if (i < m->nmaster) {
resize(c, mx, my, (mw / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
mx += WIDTH(c) + iv;
} else {
resize(c, sx, sy, (sw / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0);
sx += WIDTH(c) + iv;
}
}
}
static void
bstackhoriz(Monitor *m)
{
unsigned int i, n;
int oh, ov, ih, iv;
int mx = 0, my = 0, mh = 0, mw = 0;
int sx = 0, sy = 0, sh = 0, sw = 0;
float mfacts, sfacts;
int mrest, srest;
Client *c;
getgaps(m, &oh, &ov, &ih, &iv, &n);
if (n == 0)
return;
sx = mx = m->wx + ov;
sy = my = m->wy + oh;
mh = m->wh - 2*oh;
sh = m->wh - 2*oh - ih * (n - m->nmaster - 1);
mw = m->ww - 2*ov - iv * (MIN(n, m->nmaster) - 1);
sw = m->ww - 2*ov;
if (m->nmaster && n > m->nmaster) {
sh = (mh - ih) * (1 - m->mfact);
mh = mh - ih - sh;
sy = my + mh + ih;
sh = m->wh - mh - 2*oh - ih * (n - m->nmaster);
}
getfacts(m, mw, sh, &mfacts, &sfacts, &mrest, &srest);
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
if (i < m->nmaster) {
resize(c, mx, my, (mw / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
mx += WIDTH(c) + iv;
} else {
resize(c, sx, sy, sw - (2*c->bw), (sh / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), 0);
sy += HEIGHT(c) + ih;
}
}
}
/*
* Centred master layout + gaps
* https://dwm.suckless.org/patches/centeredmaster/
*/
void
centeredmaster(Monitor *m)
{
unsigned int i, n;
int oh, ov, ih, iv;
int mx = 0, my = 0, mh = 0, mw = 0;
int lx = 0, ly = 0, lw = 0, lh = 0;
int rx = 0, ry = 0, rw = 0, rh = 0;
float mfacts = 0, lfacts = 0, rfacts = 0;
int mtotal = 0, ltotal = 0, rtotal = 0;
int mrest = 0, lrest = 0, rrest = 0;
Client *c;
getgaps(m, &oh, &ov, &ih, &iv, &n);
if (n == 0)
return;
/* initialize areas */
mx = m->wx + ov;
my = m->wy + oh;
mh = m->wh - 2*oh - ih * ((!m->nmaster ? n : MIN(n, m->nmaster)) - 1);
mw = m->ww - 2*ov;
lh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - 1);
rh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - ((n - m->nmaster) % 2 ? 0 : 1));
if (m->nmaster && n > m->nmaster) {
/* go mfact box in the center if more than nmaster clients */
if (n - m->nmaster > 1) {
/* ||<-S->|<---M--->|<-S->|| */
mw = (m->ww - 2*ov - 2*iv) * m->mfact;
lw = (m->ww - mw - 2*ov - 2*iv) / 2;
rw = (m->ww - mw - 2*ov - 2*iv) - lw;
mx += lw + iv;
} else {
/* ||<---M--->|<-S->|| */
mw = (mw - iv) * m->mfact;
lw = 0;
rw = m->ww - mw - iv - 2*ov;
}
lx = m->wx + ov;
ly = m->wy + oh;
rx = mx + mw + iv;
ry = m->wy + oh;
}
/* calculate facts */
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) {
if (!m->nmaster || n < m->nmaster)
mfacts += 1;
else if ((n - m->nmaster) % 2)
lfacts += 1; // total factor of left hand stack area
else
rfacts += 1; // total factor of right hand stack area
}
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
if (!m->nmaster || n < m->nmaster)
mtotal += mh / mfacts;
else if ((n - m->nmaster) % 2)
ltotal += lh / lfacts;
else
rtotal += rh / rfacts;
mrest = mh - mtotal;
lrest = lh - ltotal;
rrest = rh - rtotal;
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
if (!m->nmaster || i < m->nmaster) {
/* nmaster clients are stacked vertically, in the center of the screen */
resize(c, mx, my, mw - (2*c->bw), (mh / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0);
my += HEIGHT(c) + ih;
} else {
/* stack clients are stacked vertically */
if ((i - m->nmaster) % 2 ) {
resize(c, lx, ly, lw - (2*c->bw), (lh / lfacts) + ((i - 2*m->nmaster) < 2*lrest ? 1 : 0) - (2*c->bw), 0);
ly += HEIGHT(c) + ih;
} else {
resize(c, rx, ry, rw - (2*c->bw), (rh / rfacts) + ((i - 2*m->nmaster) < 2*rrest ? 1 : 0) - (2*c->bw), 0);
ry += HEIGHT(c) + ih;
}
}
}
}
void
centeredfloatingmaster(Monitor *m)
{
unsigned int i, n;
float mfacts, sfacts;
float mivf = 1.0; // master inner vertical gap factor
int oh, ov, ih, iv, mrest, srest;
int mx = 0, my = 0, mh = 0, mw = 0;
int sx = 0, sy = 0, sh = 0, sw = 0;
Client *c;
getgaps(m, &oh, &ov, &ih, &iv, &n);
if (n == 0)
return;
sx = mx = m->wx + ov;
sy = my = m->wy + oh;
sh = mh = m->wh - 2*oh;
mw = m->ww - 2*ov - iv*(n - 1);
sw = m->ww - 2*ov - iv*(n - m->nmaster - 1);
if (m->nmaster && n > m->nmaster) {
mivf = 0.8;
/* go mfact box in the center if more than nmaster clients */
if (m->ww > m->wh) {
mw = m->ww * m->mfact - iv*mivf*(MIN(n, m->nmaster) - 1);
mh = m->wh * 0.9;
} else {
mw = m->ww * 0.9 - iv*mivf*(MIN(n, m->nmaster) - 1);
mh = m->wh * m->mfact;
}
mx = m->wx + (m->ww - mw) / 2;
my = m->wy + (m->wh - mh - 2*oh) / 2;
sx = m->wx + ov;
sy = m->wy + oh;
sh = m->wh - 2*oh;
}
getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest);
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
if (i < m->nmaster) {
/* nmaster clients are stacked horizontally, in the center of the screen */
resize(c, mx, my, (mw / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
mx += WIDTH(c) + iv*mivf;
} else {
/* stack clients are stacked horizontally */
resize(c, sx, sy, (sw / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0);
sx += WIDTH(c) + iv;
}
}
/* /*
* Deck layout + gaps * Deck layout + gaps
* https://dwm.suckless.org/patches/deck/ * https://dwm.suckless.org/patches/deck/
@ -426,7 +197,7 @@ centeredfloatingmaster(Monitor *m)
void void
deck(Monitor *m) deck(Monitor *m)
{ {
unsigned int i, n; unsigned int i, n, bw;
int oh, ov, ih, iv; int oh, ov, ih, iv;
int mx = 0, my = 0, mh = 0, mw = 0; int mx = 0, my = 0, mh = 0, mw = 0;
int sx = 0, sy = 0, sh = 0, sw = 0; int sx = 0, sy = 0, sh = 0, sw = 0;
@ -438,6 +209,11 @@ deck(Monitor *m)
if (n == 0) if (n == 0)
return; return;
if (n == 1)
bw = 0;
else
bw = borderpx;
sx = mx = m->wx + ov; sx = mx = m->wx + ov;
sy = my = m->wy + oh; sy = my = m->wy + oh;
sh = mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1); sh = mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1);
@ -457,313 +233,11 @@ deck(Monitor *m)
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
if (i < m->nmaster) { if (i < m->nmaster) {
resize(c, mx, my, mw - (2*c->bw), (mh / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0); resize(c, mx, my, mw - (2*bw), (mh / mfacts) + (i < mrest ? 1 : 0) - (2*bw), bw, 0);
my += HEIGHT(c) + ih; my += HEIGHT(c) + ih;
} else { } else {
resize(c, sx, sy, sw - (2*c->bw), sh - (2*c->bw), 0); resize(c, sx, sy, sw - (2*bw), sh - (2*bw), bw, 0);
}
}
/*
* Fibonacci layout + gaps
* https://dwm.suckless.org/patches/fibonacci/
*/
void
fibonacci(Monitor *m, int s)
{
unsigned int i, n;
int nx, ny, nw, nh;
int oh, ov, ih, iv;
int nv, hrest = 0, wrest = 0, r = 1;
Client *c;
getgaps(m, &oh, &ov, &ih, &iv, &n);
if (n == 0)
return;
nx = m->wx + ov;
ny = m->wy + oh;
nw = m->ww - 2*ov;
nh = m->wh - 2*oh;
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next)) {
if (r) {
if ((i % 2 && (nh - ih) / 2 <= (bh + 2*c->bw))
|| (!(i % 2) && (nw - iv) / 2 <= (bh + 2*c->bw))) {
r = 0;
}
if (r && i < n - 1) {
if (i % 2) {
nv = (nh - ih) / 2;
hrest = nh - 2*nv - ih;
nh = nv;
} else {
nv = (nw - iv) / 2;
wrest = nw - 2*nv - iv;
nw = nv;
}
if ((i % 4) == 2 && !s)
nx += nw + iv;
else if ((i % 4) == 3 && !s)
ny += nh + ih;
}
if ((i % 4) == 0) {
if (s) {
ny += nh + ih;
nh += hrest;
}
else {
nh -= hrest;
ny -= nh + ih;
}
}
else if ((i % 4) == 1) {
nx += nw + iv;
nw += wrest;
}
else if ((i % 4) == 2) {
ny += nh + ih;
nh += hrest;
if (i < n - 1)
nw += wrest;
}
else if ((i % 4) == 3) {
if (s) {
nx += nw + iv;
nw -= wrest;
} else {
nw -= wrest;
nx -= nw + iv;
nh += hrest;
}
}
if (i == 0) {
if (n != 1) {
nw = (m->ww - iv - 2*ov) - (m->ww - iv - 2*ov) * (1 - m->mfact);
wrest = 0;
}
ny = m->wy + oh;
}
else if (i == 1)
nw = m->ww - nw - iv - 2*ov;
i++;
}
resize(c, nx, ny, nw - (2*c->bw), nh - (2*c->bw), False);
}
}
void
dwindle(Monitor *m)
{
fibonacci(m, 1);
}
void
spiral(Monitor *m)
{
fibonacci(m, 0);
}
/*
* Gappless grid layout + gaps (ironically)
* https://dwm.suckless.org/patches/gaplessgrid/
*/
void
gaplessgrid(Monitor *m)
{
unsigned int i, n;
int x, y, cols, rows, ch, cw, cn, rn, rrest, crest; // counters
int oh, ov, ih, iv;
Client *c;
getgaps(m, &oh, &ov, &ih, &iv, &n);
if (n == 0)
return;
/* grid dimensions */
for (cols = 0; cols <= n/2; cols++)
if (cols*cols >= n)
break;
if (n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */
cols = 2;
rows = n/cols;
cn = rn = 0; // reset column no, row no, client count
ch = (m->wh - 2*oh - ih * (rows - 1)) / rows;
cw = (m->ww - 2*ov - iv * (cols - 1)) / cols;
rrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows;
crest = (m->ww - 2*ov - iv * (cols - 1)) - cw * cols;
x = m->wx + ov;
y = m->wy + oh;
for (i = 0, c = nexttiled(m->clients); c; i++, c = nexttiled(c->next)) {
if (i/rows + 1 > cols - n%cols) {
rows = n/cols + 1;
ch = (m->wh - 2*oh - ih * (rows - 1)) / rows;
rrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows;
}
resize(c,
x,
y + rn*(ch + ih) + MIN(rn, rrest),
cw + (cn < crest ? 1 : 0) - 2*c->bw,
ch + (rn < rrest ? 1 : 0) - 2*c->bw,
0);
rn++;
if (rn >= rows) {
rn = 0;
x += cw + ih + (cn < crest ? 1 : 0);
cn++;
} }
}
}
/*
* Gridmode layout + gaps
* https://dwm.suckless.org/patches/gridmode/
*/
void
grid(Monitor *m)
{
unsigned int i, n;
int cx, cy, cw, ch, cc, cr, chrest, cwrest, cols, rows;
int oh, ov, ih, iv;
Client *c;
getgaps(m, &oh, &ov, &ih, &iv, &n);
/* grid dimensions */
for (rows = 0; rows <= n/2; rows++)
if (rows*rows >= n)
break;
cols = (rows && (rows - 1) * rows >= n) ? rows - 1 : rows;
/* window geoms (cell height/width) */
ch = (m->wh - 2*oh - ih * (rows - 1)) / (rows ? rows : 1);
cw = (m->ww - 2*ov - iv * (cols - 1)) / (cols ? cols : 1);
chrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows;
cwrest = (m->ww - 2*ov - iv * (cols - 1)) - cw * cols;
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
cc = i / rows;
cr = i % rows;
cx = m->wx + ov + cc * (cw + iv) + MIN(cc, cwrest);
cy = m->wy + oh + cr * (ch + ih) + MIN(cr, chrest);
resize(c, cx, cy, cw + (cc < cwrest ? 1 : 0) - 2*c->bw, ch + (cr < chrest ? 1 : 0) - 2*c->bw, False);
}
}
/*
* Horizontal grid layout + gaps
* https://dwm.suckless.org/patches/horizgrid/
*/
void
horizgrid(Monitor *m) {
Client *c;
unsigned int n, i;
int oh, ov, ih, iv;
int mx = 0, my = 0, mh = 0, mw = 0;
int sx = 0, sy = 0, sh = 0, sw = 0;
int ntop, nbottom = 1;
float mfacts, sfacts;
int mrest, srest;
/* Count windows */
getgaps(m, &oh, &ov, &ih, &iv, &n);
if (n == 0)
return;
if (n <= 2)
ntop = n;
else {
ntop = n / 2;
nbottom = n - ntop;
}
sx = mx = m->wx + ov;
sy = my = m->wy + oh;
sh = mh = m->wh - 2*oh;
sw = mw = m->ww - 2*ov;
if (n > ntop) {
sh = (mh - ih) / 2;
mh = mh - ih - sh;
sy = my + mh + ih;
mw = m->ww - 2*ov - iv * (ntop - 1);
sw = m->ww - 2*ov - iv * (nbottom - 1);
}
mfacts = ntop;
sfacts = nbottom;
mrest = mw - (mw / ntop) * ntop;
srest = sw - (sw / nbottom) * nbottom;
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
if (i < ntop) {
resize(c, mx, my, (mw / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
mx += WIDTH(c) + iv;
} else {
resize(c, sx, sy, (sw / sfacts) + ((i - ntop) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0);
sx += WIDTH(c) + iv;
}
}
/*
* nrowgrid layout + gaps
* https://dwm.suckless.org/patches/nrowgrid/
*/
void
nrowgrid(Monitor *m)
{
unsigned int n;
int ri = 0, ci = 0; /* counters */
int oh, ov, ih, iv; /* vanitygap settings */
unsigned int cx, cy, cw, ch; /* client geometry */
unsigned int uw = 0, uh = 0, uc = 0; /* utilization trackers */
unsigned int cols, rows = m->nmaster + 1;
Client *c;
/* count clients */
getgaps(m, &oh, &ov, &ih, &iv, &n);
/* nothing to do here */
if (n == 0)
return;
/* force 2 clients to always split vertically */
if (FORCE_VSPLIT && n == 2)
rows = 1;
/* never allow empty rows */
if (n < rows)
rows = n;
/* define first row */
cols = n / rows;
uc = cols;
cy = m->wy + oh;
ch = (m->wh - 2*oh - ih*(rows - 1)) / rows;
uh = ch;
for (c = nexttiled(m->clients); c; c = nexttiled(c->next), ci++) {
if (ci == cols) {
uw = 0;
ci = 0;
ri++;
/* next row */
cols = (n - uc) / (rows - ri);
uc += cols;
cy = m->wy + oh + uh + ih;
uh += ch + ih;
}
cx = m->wx + ov + uw;
cw = (m->ww - 2*ov - uw) / (cols - ci);
uw += cw + iv;
resize(c, cx, cy, cw - (2*c->bw), ch - (2*c->bw), 0);
}
} }
/* /*
@ -772,7 +246,7 @@ nrowgrid(Monitor *m)
static void static void
tile(Monitor *m) tile(Monitor *m)
{ {
unsigned int i, n; unsigned int i, n, bw;
int oh, ov, ih, iv; int oh, ov, ih, iv;
int mx = 0, my = 0, mh = 0, mw = 0; int mx = 0, my = 0, mh = 0, mw = 0;
int sx = 0, sy = 0, sh = 0, sw = 0; int sx = 0, sy = 0, sh = 0, sw = 0;
@ -784,6 +258,11 @@ tile(Monitor *m)
if (n == 0) if (n == 0)
return; return;
if (n == 1)
bw = 0;
else
bw = borderpx;
sx = mx = m->wx + ov; sx = mx = m->wx + ov;
sy = my = m->wy + oh; sy = my = m->wy + oh;
mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1); mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1);
@ -800,10 +279,10 @@ tile(Monitor *m)
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
if (i < m->nmaster) { if (i < m->nmaster) {
resize(c, mx, my, mw - (2*c->bw), (mh / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0); resize(c, mx, my, mw - (2*bw), (mh / mfacts) + (i < mrest ? 1 : 0) - (2*bw), bw, 0);
my += HEIGHT(c) + ih; my += HEIGHT(c) + ih;
} else { } else {
resize(c, sx, sy, sw - (2*c->bw), (sh / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), 0); resize(c, sx, sy, sw - (2*bw), (sh / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*bw), bw, 0);
sy += HEIGHT(c) + ih; sy += HEIGHT(c) + ih;
} }
} }

Loading…
Cancel
Save