diff options
| author | Warrick Lo <warrick.s.z.lo@gmail.com> | 2021-11-24 22:51:06 -0800 |
|---|---|---|
| committer | Warrick Lo <warrick.s.z.lo@gmail.com> | 2021-11-24 22:51:06 -0800 |
| commit | e9f63fd848ab2b4c610ff20f7cc4287f51a085eb (patch) | |
| tree | 3585d5209771bacdb99aaa839d55a098232e1aa5 | |
| parent | Change behaviour of moveresize(), moveresizeedge() (diff) | |
Add cfacts fuctionality
Added the ability to increase/decrease a window's weight (screen space).
| -rw-r--r-- | config.def.h | 3 | ||||
| -rw-r--r-- | dwm.c | 40 |
2 files changed, 38 insertions, 5 deletions
diff --git a/config.def.h b/config.def.h index cbf49de..7ddd415 100644 --- a/config.def.h +++ b/config.def.h @@ -84,6 +84,9 @@ static Key keys[] = { { MODKEY, XK_d, incnmaster, {.i = -1 } }, { MODKEY, XK_h, setmfact, {.f = -0.05} }, { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY|ShiftMask, XK_h, setcfact, {.f = -0.25} }, + { MODKEY|ShiftMask, XK_l, setcfact, {.f = +0.25} }, + { MODKEY|ShiftMask, XK_o, setcfact, {.f = 0.00} }, { MODKEY, XK_Return, zoom, {0} }, { MODKEY, XK_Tab, view, {0} }, { MODKEY|ShiftMask, XK_c, killclient, {0} }, @@ -107,6 +107,7 @@ typedef struct Client Client; struct Client { char name[256]; float mina, maxa; + float cfact; int x, y, w, h; int oldx, oldy, oldw, oldh; int basew, baseh, incw, inch, maxw, maxh, minw, minh; @@ -229,6 +230,7 @@ static void run(void); static void scan(void); static int sendevent(Client *c, Atom proto); static void sendmon(Client *c, Monitor *m); +static void setcfact(const Arg *arg); static void setclientstate(Client *c, long state); static void setcurrentdesktop(void); static void setdesktopnames(void); @@ -1184,6 +1186,7 @@ manage(Window w, XWindowAttributes *wa) c->w = c->oldw = wa->width; c->h = c->oldh = wa->height; c->oldbw = wa->border_width; + c->cfact = 1.0; updatetitle(c); if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { @@ -1741,6 +1744,23 @@ sendmon(Client *c, Monitor *m) } void +setcfact(const Arg *arg) +{ + float f; + Client *c = selmon->sel; + + if(!arg || !c || !selmon->lt[selmon->sellt]->arrange) + return; + f = arg->f + c->cfact; + if(arg->f == 0.0) + f = 1.0; + else if(f < 0.25 || f > 4.0) + return; + c->cfact = f; + arrange(selmon); +} + +void setclientstate(Client *c, long state) { long data[] = { state, None }; @@ -2141,9 +2161,15 @@ void tile(Monitor *m) { unsigned int i, n, h, mw, my, ty; + float mfacts = 0, sfacts = 0; Client *c; - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) { + if (n < m->nmaster) + mfacts += c->cfact; + else + sfacts += c->cfact; + } if (n == 0) return; if (m->pertag->drawwithgaps[m->pertag->curtag]) { /* draw with fullgaps logic */ @@ -2153,15 +2179,17 @@ tile(Monitor *m) 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]; + h = (m->wh - my) * (c->cfact / mfacts) - 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]; + mfacts -= c->cfact; } else { - h = (m->wh - ty) / (n - i) - m->pertag->gappx[m->pertag->curtag]; + h = (m->wh - ty) * (c->cfact / sfacts) - 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]; + sfacts -= c->cfact; } } else { /* draw with singularborders logic */ if (n > m->nmaster) @@ -2170,16 +2198,18 @@ 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 = (m->wh - my) * (c->cfact / mfacts); 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; + mfacts -= c->cfact; } else { - h = (m->wh - ty) / (n - i); + h = (m->wh - ty) * (c->cfact / sfacts); resize(c, m->wx + mw - c->bw, m->wy + ty, m->ww - mw, h - c->bw, False); ty += HEIGHT(c) - c->bw; + sfacts -= c->cfact; } } } |