commit 9f5f4f33eb85a7b3eab7374899ecabe5c9714890 Author: bakkeby Date: Mon Apr 6 12:55:10 2020 +0200 Adding dragcfacts patch diff --git a/dwm/dwm-cfacts-6.2.diff b/dwm/dwm-cfacts-6.2.diff new file mode 100644 index 0000000..1c8630a --- /dev/null +++ b/dwm/dwm-cfacts-6.2.diff @@ -0,0 +1,117 @@ +From 521c7445948f467ad4d3021b31433d1a711c7226 Mon Sep 17 00:00:00 2001 +From: bakkeby +Date: Mon, 6 Apr 2020 12:04:55 +0200 +Subject: [PATCH] Adding cfacts patch which provides the ability to assign + different weights to clients in their respective stack in tiled layout. + +Refer to https://dwm.suckless.org/patches/cfacts/ +--- + config.def.h | 3 +++ + dwm.c | 35 ++++++++++++++++++++++++++++++++--- + 2 files changed, 35 insertions(+), 3 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..83910c1 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -70,6 +70,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} }, +diff --git a/dwm.c b/dwm.c +index 4465af1..5592c57 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -87,6 +87,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; +@@ -200,6 +201,7 @@ static void setclientstate(Client *c, long state); + static void setfocus(Client *c); + static void setfullscreen(Client *c, int fullscreen); + static void setlayout(const Arg *arg); ++static void setcfact(const Arg *arg); + static void setmfact(const Arg *arg); + static void setup(void); + static void seturgent(Client *c, int urg); +@@ -1029,6 +1031,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))) { +@@ -1511,6 +1514,24 @@ setlayout(const Arg *arg) + drawbar(selmon); + } + ++void ++setcfact(const Arg *arg) { ++ float f; ++ Client *c; ++ ++ 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); ++} ++ + /* arg > 1.0 will set mfact absolutely */ + void + setmfact(const Arg *arg) +@@ -1674,9 +1695,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; + +@@ -1686,13 +1713,15 @@ 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); + resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); + my += HEIGHT(c); ++ mfacts -= c->cfact; + } else { +- h = (m->wh - ty) / (n - i); ++ h = (m->wh - ty) * (c->cfact / sfacts); + resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); + ty += HEIGHT(c); ++ sfacts -= c->cfact; + } + } + +-- +2.17.1 + diff --git a/dwm/dwm-cfacts-dragcfact-6.2.diff b/dwm/dwm-cfacts-dragcfact-6.2.diff new file mode 100644 index 0000000..36ae208 --- /dev/null +++ b/dwm/dwm-cfacts-dragcfact-6.2.diff @@ -0,0 +1,239 @@ +From 7a9b2a8f26b6692082e6392b2781e1cdc1223bde Mon Sep 17 00:00:00 2001 +From: bakkeby +Date: Mon, 6 Apr 2020 12:04:55 +0200 +Subject: [PATCH 1/2] [PATCH] Adding cfacts patch which provides the ability to + assign different weights to clients in their respective stack in tiled + layout. + +Refer to https://dwm.suckless.org/patches/cfacts/ +--- + config.def.h | 3 +++ + dwm.c | 35 ++++++++++++++++++++++++++++++++--- + 2 files changed, 35 insertions(+), 3 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..83910c1 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -70,6 +70,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} }, +diff --git a/dwm.c b/dwm.c +index 4465af1..5592c57 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -87,6 +87,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; +@@ -200,6 +201,7 @@ static void setclientstate(Client *c, long state); + static void setfocus(Client *c); + static void setfullscreen(Client *c, int fullscreen); + static void setlayout(const Arg *arg); ++static void setcfact(const Arg *arg); + static void setmfact(const Arg *arg); + static void setup(void); + static void seturgent(Client *c, int urg); +@@ -1029,6 +1031,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))) { +@@ -1511,6 +1514,24 @@ setlayout(const Arg *arg) + drawbar(selmon); + } + ++void ++setcfact(const Arg *arg) { ++ float f; ++ Client *c; ++ ++ 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); ++} ++ + /* arg > 1.0 will set mfact absolutely */ + void + setmfact(const Arg *arg) +@@ -1674,9 +1695,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; + +@@ -1686,13 +1713,15 @@ 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); + resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); + my += HEIGHT(c); ++ mfacts -= c->cfact; + } else { +- h = (m->wh - ty) / (n - i); ++ h = (m->wh - ty) * (c->cfact / sfacts); + resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); + ty += HEIGHT(c); ++ sfacts -= c->cfact; + } + } + +-- +2.17.1 + + +From e8b4b2736a8d01cbe3f84723e6f1dd7d325d4502 Mon Sep 17 00:00:00 2001 +From: bakkeby +Date: Mon, 6 Apr 2020 12:16:26 +0200 +Subject: [PATCH 2/2] The dragcfact patch allow you resize clients' size (i.e. + modify cfact) by holding modkey + shift + right-click and dragging the mouse. + +--- + config.def.h | 1 + + dwm.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 77 insertions(+) + +diff --git a/config.def.h b/config.def.h +index 83910c1..dd482f8 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -110,6 +110,7 @@ static Button buttons[] = { + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, + { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, + { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, ++ { ClkClientWin, MODKEY|ShiftMask, Button3, dragcfact, {0} }, + { ClkTagBar, 0, Button1, view, {0} }, + { ClkTagBar, 0, Button3, toggleview, {0} }, + { ClkTagBar, MODKEY, Button1, tag, {0} }, +diff --git a/dwm.c b/dwm.c +index 5592c57..d5e3169 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -162,6 +162,7 @@ static void destroynotify(XEvent *e); + static void detach(Client *c); + static void detachstack(Client *c); + static Monitor *dirtomon(int dir); ++static void dragcfact(const Arg *arg); + static void drawbar(Monitor *m); + static void drawbars(void); + static void enternotify(XEvent *e); +@@ -694,6 +695,81 @@ dirtomon(int dir) + return m; + } + ++void ++dragcfact(const Arg *arg) ++{ ++ int prev_x, prev_y, dist_x, dist_y; ++ float fact; ++ Client *c; ++ XEvent ev; ++ Time lasttime = 0; ++ ++ if (!(c = selmon->sel)) ++ return; ++ if (c->isfloating) { ++ resizemouse(arg); ++ return; ++ } ++ #if !FAKEFULLSCREEN_PATCH ++ #if FAKEFULLSCREEN_CLIENT_PATCH ++ if (c->isfullscreen && !c->fakefullscreen) /* no support resizing fullscreen windows by mouse */ ++ return; ++ #else ++ if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ ++ return; ++ #endif // FAKEFULLSCREEN_CLIENT_PATCH ++ #endif // !FAKEFULLSCREEN_PATCH ++ restack(selmon); ++ ++ if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, ++ None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) ++ return; ++ XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w/2, c->h/2); ++ ++ prev_x = prev_y = -999999; ++ ++ do { ++ XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); ++ switch(ev.type) { ++ case ConfigureRequest: ++ case Expose: ++ case MapRequest: ++ handler[ev.type](&ev); ++ break; ++ case MotionNotify: ++ if ((ev.xmotion.time - lasttime) <= (1000 / 60)) ++ continue; ++ lasttime = ev.xmotion.time; ++ if (prev_x == -999999) { ++ prev_x = ev.xmotion.x_root; ++ prev_y = ev.xmotion.y_root; ++ } ++ ++ dist_x = ev.xmotion.x - prev_x; ++ dist_y = ev.xmotion.y - prev_y; ++ ++ if (abs(dist_x) > abs(dist_y)) { ++ fact = (float) 4.0 * dist_x / c->mon->ww; ++ } else { ++ fact = (float) -4.0 * dist_y / c->mon->wh; ++ } ++ ++ if (fact) ++ setcfact(&((Arg) { .f = fact })); ++ ++ prev_x = ev.xmotion.x; ++ prev_y = ev.xmotion.y; ++ break; ++ } ++ } while (ev.type != ButtonRelease); ++ ++ ++ XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w/2, c->h/2); ++ ++ XUngrabPointer(dpy, CurrentTime); ++ while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); ++} ++ + void + drawbar(Monitor *m) + { +-- +2.17.1 +