diff --git a/README.md b/README.md index 2740605..2a45bc7 100644 --- a/README.md +++ b/README.md @@ -57,5 +57,6 @@ Most patches can be found on the suckless website: [https://dwm.suckless.org/pat * [actualfullscreen](https://dwm.suckless.org/patches/actualfullscreen/) - Actually toggle fullscreen for a window, instead of toggling the status bar and the monocle layout * [alwaysfullscreen](https://dwm.suckless.org/patches/alwaysfullscreen/) - Do not allow the focus to drift from the active fullscreen client when using focusstack() -* [anybar](https://github.com/mihirlad55/dwm-anybar) (Polybar Tray Fix Version) - enables dwm to manage external status bars such as lemonbar and polybar +* [anybar](https://github.com/mihirlad55/dwm-anybar) (Polybar Tray Fix Version) - Enables dwm to manage external status bars such as lemonbar and polybar +* [aspectresize](https://dwm.suckless.org/patches/aspectresize/) - Allows you to resize a window while maintaining aspect ratio * [fixborders](https://dwm.suckless.org/patches/alpha/) - Make borders opaque diff --git a/config.def.h b/config.def.h index becb98f..6433817 100644 --- a/config.def.h +++ b/config.def.h @@ -76,6 +76,8 @@ static Key keys[] = { { MODKEY, XK_l, setmfact, {.f = +0.05} }, { MODKEY, XK_Return, zoom, {0} }, { MODKEY, XK_Tab, view, {0} }, + { MODKEY|ShiftMask, XK_j, aspectresize, {.i = +24} }, + { MODKEY|ShiftMask, XK_k, aspectresize, {.i = -24} }, { MODKEY|ShiftMask, XK_c, killclient, {0} }, { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, diff --git a/dwm.1 b/dwm.1 index ef83aaa..eb64e03 100644 --- a/dwm.1 +++ b/dwm.1 @@ -125,6 +125,12 @@ Toggle fullscreen (actualfullscreen patch). .B Mod1\-Tab Toggles to the previously selected tags. .TP +.B Mod1\-Shift\-j +Increase window size while maintaining aspect ratio. +.TP +.B Mod1\-Shift\-k +Decrease window size while maintaining aspect ratio. +.TP .B Mod1\-Shift\-[1..n] Apply nth tag to focused window. .TP diff --git a/dwm.c b/dwm.c index 7d16eb9..79971f6 100644 --- a/dwm.c +++ b/dwm.c @@ -148,6 +148,7 @@ static void applyrules(Client *c); static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); static void arrange(Monitor *m); static void arrangemon(Monitor *m); +static void aspectresize(const Arg *arg); static void attach(Client *c); static void attachstack(Client *c); static void buttonpress(XEvent *e); @@ -410,6 +411,30 @@ arrangemon(Monitor *m) m->lt[m->sellt]->arrange(m); } +void +aspectresize(const Arg *arg) { + /* only floating windows can be moved */ + Client *c; + c = selmon->sel; + float ratio; + int w, h,nw, nh; + + if (!c || !arg) + return; + if (selmon->lt[selmon->sellt]->arrange && !c->isfloating) + return; + + ratio = (float)c->w / (float)c->h; + h = arg->i; + w = (int)(ratio * h); + + nw = c->w + w; + nh = c->h + h; + + XRaiseWindow(dpy, c->win); + resize(c, c->x, c->y, nw, nh, True); +} + void attach(Client *c) { diff --git a/patches/dwm-aspectresize-6.2.diff b/patches/dwm-aspectresize-6.2.diff new file mode 100644 index 0000000..1a2a673 --- /dev/null +++ b/patches/dwm-aspectresize-6.2.diff @@ -0,0 +1,56 @@ +diff --git a/config.def.h b/config.def.h +index 1c0b587..2fcc30d 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -72,6 +72,8 @@ static Key keys[] = { + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY, XK_Return, zoom, {0} }, + { MODKEY, XK_Tab, view, {0} }, ++ { MODKEY|ShiftMask, XK_j, aspectresize, {.i = +24} }, ++ { MODKEY|ShiftMask, XK_k, aspectresize, {.i = -24} }, + { MODKEY|ShiftMask, XK_c, killclient, {0} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, +diff --git a/dwm.c b/dwm.c +index 9fd0286..6a02119 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -146,6 +146,7 @@ static void applyrules(Client *c); + static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); + static void arrange(Monitor *m); + static void arrangemon(Monitor *m); ++static void aspectresize(const Arg *arg); + static void attach(Client *c); + static void attachstack(Client *c); + static void buttonpress(XEvent *e); +@@ -400,6 +401,30 @@ arrangemon(Monitor *m) + m->lt[m->sellt]->arrange(m); + } + ++void ++aspectresize(const Arg *arg) { ++ /* only floating windows can be moved */ ++ Client *c; ++ c = selmon->sel; ++ float ratio; ++ int w, h,nw, nh; ++ ++ if (!c || !arg) ++ return; ++ if (selmon->lt[selmon->sellt]->arrange && !c->isfloating) ++ return; ++ ++ ratio = (float)c->w / (float)c->h; ++ h = arg->i; ++ w = (int)(ratio * h); ++ ++ nw = c->w + w; ++ nh = c->h + h; ++ ++ XRaiseWindow(dpy, c->win); ++ resize(c, c->x, c->y, nw, nh, True); ++} ++ + void + attach(Client *c) + {