I think like it is good with dwm.c and config.def.h You can name it ‘ stackvfact’
I would recommend you try your patch with vanitygaps and with csfact and with stackmfact just to see you don’t have weird results. On Sat, Nov 28, 2020 at 11:26 AM Sebastiano Tronto < [email protected]> wrote: > Hello, > > I have made this patch for personal use. It introduces two new variables > for each monitor, vfactmaster and vfactstack, which determine which > proportion of the master (resp. stacking) area should be taken by the > first tile in that area. These variables can also be set to 0.0 to get > back the original behavior. > > My patch is similar to two other patches: > - stackmfact (https://dwm.suckless.org/patches/stackmfact/) > But my patch works also for the master area. > - cfacts (https://dwm.suckless.org/patches/cfacts/) > My patch is less flexible because one can only choose the size > factor for the first tile (not client) in an area. However the way > it works is closer to how the master area size factor (mfact) works. > Also, one advantage over cfacts is that one does not need to focus a > particular windows to change its size. > > I like to use this patch combined with a "zoomstack" function that I > wrote, which sends the selected window to the top of the stacking area > (and if the selected window is not in the stacking area, it swaps the > first two windows of the stacking area). > This function can be simply added to config.h. Should I send it as a > separate patch or should I just post it here? In case it is better to > send it as a separate patch, is it preferable to add this function to > dwm.c or to config.def.h? > > Best, > Sebastiano > > > From a138e7361ed1592e55a6b463ad559df054ce13e2 Mon Sep 17 00:00:00 2001 > From: Sebastiano Tronto <[email protected]> > Date: Sat, 28 Nov 2020 19:35:30 +0100 > Subject: [PATCH] Vertical size factor for first tile in master/stacking > area > > --- > config.def.h | 8 ++++++++ > dwm.c | 38 +++++++++++++++++++++++++++++++++++--- > 2 files changed, 43 insertions(+), 3 deletions(-) > > diff --git a/config.def.h b/config.def.h > index 1c0b587..ff87720 100644 > --- a/config.def.h > +++ b/config.def.h > @@ -33,6 +33,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 */ > > @@ -94,6 +96,12 @@ static Key keys[] = { > TAGKEYS( XK_8, 7) > TAGKEYS( XK_9, 8) > { MODKEY|ShiftMask, XK_q, quit, {0} }, > + { MODKEY, XK_y, setvfactmaster, {.f = +0.05} }, > + { MODKEY|ShiftMask, XK_y, setvfactmaster, {.f = -0.05} }, > + { MODKEY|ControlMask, XK_y, setvfactmaster, {.f = +1.0 } }, > + { MODKEY, XK_o, setvfactstack, {.f = +0.05} }, > + { MODKEY|ShiftMask, XK_o, setvfactstack, {.f = -0.05} }, > + { MODKEY|ControlMask, XK_o, setvfactstack, {.f = +1.0 } }, > }; > > /* button definitions */ > diff --git a/dwm.c b/dwm.c > index 664c527..fe71c14 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 */ > @@ -204,6 +206,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); > @@ -636,6 +641,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; > @@ -1611,6 +1618,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) > { > @@ -1687,13 +1715,17 @@ tile(Monitor *m) > 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); > + h = (i == 0 && MIN(n, m->nmaster) > 1 && > m->vfactmaster > 0.01) ? > + m->wh * m->vfactmaster : > + (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); > + h = (i == m->nmaster && n - i > 1 && m->vfactstack > > 0.01) ? > + m->wh * m->vfactstack : (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); > } > -- > 2.29.2 > > -- Regards Xavier
