diff --git a/config.def.h b/config.def.h index 0927c2d..f38210a 100644 --- a/config.def.h +++ b/config.def.h @@ -38,6 +38,8 @@ static const Rule rules[] = { /* layout(s) */ static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ +static const float vfactmaster = 0.5; /* vertical factor of first master tile */ +static const float vfactstack = 0.5; /* vertical factor of first stack tile */ static const int nmaster = 1; /* number of clients in master area */ static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ @@ -115,6 +117,12 @@ static Key keys[] = { TAGKEYS( XK_8, 7) TAGKEYS( XK_9, 8) { MODKEY|ShiftMask, XK_q, quit, {0} }, + { MODKEY, XK_e, setvfactmaster, {.f = +0.05} }, + { MODKEY|ShiftMask, XK_e, setvfactmaster, {.f = -0.05} }, + { MODKEY|ControlMask, XK_e, setvfactmaster, {.f = +1.0 } }, + { MODKEY, XK_r, setvfactstack, {.f = +0.05} }, + { MODKEY|ShiftMask, XK_r, setvfactstack, {.f = -0.05} }, + { MODKEY|ControlMask, XK_r, setvfactstack, {.f = +1.0 } }, }; /* button definitions */ diff --git a/dwm.c b/dwm.c index 36025bf..db9e7f6 100644 --- a/dwm.c +++ b/dwm.c @@ -114,6 +114,8 @@ typedef struct { struct Monitor { char ltsymbol[16]; float mfact; + float vfactmaster; + float vfactstack; int nmaster; int num; int by; /* bar geometry */ @@ -218,6 +220,9 @@ static void setlayout(const Arg *arg); static void setmfact(const Arg *arg); static void setup(void); static void seturgent(Client *c, int urg); +static void setvfact(float *factor, float f); +static void setvfactmaster(const Arg *arg); +static void setvfactstack(const Arg *arg); static void showhide(Client *c); static void sigchld(int unused); static void spawn(const Arg *arg); @@ -651,6 +656,8 @@ createmon(void) m = ecalloc(1, sizeof(Monitor)); m->tagset[0] = m->tagset[1] = 1; m->mfact = mfact; + m->vfactmaster = vfactmaster; + m->vfactstack = vfactstack; m->nmaster = nmaster; m->showbar = showbar; m->topbar = topbar; @@ -1735,6 +1742,27 @@ seturgent(Client *c, int urg) XFree(wmh); } +void +setvfact(float *factor, float f) { + if (!selmon->lt[selmon->sellt]->arrange) + return; + f += (*factor < 0.05 ? 0.5 : *factor); + *factor = f < 1.0 ? (f < 0.05 || f > 0.95 ? *factor : f) : 0.0; + arrange(selmon); +} + +void +setvfactmaster(const Arg *arg) +{ + setvfact(&selmon->vfactmaster, arg->f); +} + +void +setvfactstack(const Arg *arg) +{ + setvfact(&selmon->vfactstack, arg->f); +} + void showhide(Client *c) { @@ -1817,12 +1845,16 @@ tile(Monitor *m) if (i < m->nmaster) { r = MIN(n, m->nmaster) - i; h = (m->wh - my - m->gappoh*oe - m->gappih*ie * (r - 1)) / r; + if (i == 0 && MIN(n, m->nmaster) > 1 && m->vfactmaster > 0.01) + h *= r * m->vfactmaster; resize(c, m->wx + m->gappov*oe, m->wy + my, mw - (2*c->bw) - m->gappiv*ie, h - (2*c->bw), 0); if (my + HEIGHT(c) + m->gappih*ie < m->wh) my += HEIGHT(c) + m->gappih*ie; } else { r = n - i; h = (m->wh - ty - m->gappoh*oe - m->gappih*ie * (r - 1)) / r; + if (i == m->nmaster && n - i > 1 && m->vfactstack > 0.01) + h *= r * m->vfactstack; resize(c, m->wx + mw + m->gappov*oe, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gappov*oe, h - (2*c->bw), 0); if (ty + HEIGHT(c) + m->gappih*ie < m->wh) ty += HEIGHT(c) + m->gappih*ie;