commit 10dfc340a0faac5c4198e5ca4b0ba08c534ef635
parent 94b241e4e84ca01eb77c7c7c29c9300f5c337694
Author: Benjamin Chausse <benjamin@chausse.xyz>
Date:   Tue,  3 Nov 2020 21:45:24 -0500

Resize with closest corner to cursor

Diffstat:
Mconfig.def.h | 2++
Mdwm.c | 26+++++++++++++++++++++++---
2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/config.def.h b/config.def.h @@ -46,6 +46,8 @@ static const Rule rules[] = { { "youtube", NULL, NULL, 0, 1, 1, 1, 0, -1 }, { NULL, NULL, "Event Tester", 0, 0, 1, 0, 1, -1 }, /* xev */ { "R_x11", NULL, NULL, 0, 0, 1, 0, 1, -1 }, /* R popup */ + { "Matplotlib",NULL, NULL, 0, 1, 1, 0, 1, -1 }, /* Python popups */ + { "Dropbox-cli",NULL, NULL, 0, 0, 1, 0, 1, -1 }, { NULL, NULL, "Kite", 0, 0, 0, 0, 1, -1 }, { "Arandr", NULL, NULL, 0, 1, 1, 0, 0, -1 }, }; diff --git a/dwm.c b/dwm.c @@ -1667,9 +1667,14 @@ void resizemouse(const Arg *arg) { int ocx, ocy, nw, nh; + int ocx2, ocy2, nx, ny; Client *c; Monitor *m; XEvent ev; + int horizcorner, vertcorner; + int di; + unsigned int dui; + Window dummy; Time lasttime = 0; if (!(c = selmon->sel)) @@ -1679,10 +1684,18 @@ resizemouse(const Arg *arg) restack(selmon); ocx = c->x; ocy = c->y; + ocx2 = c->x + c->w; + ocy2 = c->y + c->h; 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 + c->bw - 1, c->h + c->bw - 1); + if (!XQueryPointer (dpy, c->win, &dummy, &dummy, &di, &di, &nx, &ny, &dui)) + return; + horizcorner = nx < c->w / 2; + vertcorner = ny < c->h / 2; + XWarpPointer (dpy, None, c->win, 0, 0, 0, 0, + horizcorner ? (-c->bw) : (c->w + c->bw -1), + vertcorner ? (-c->bw) : (c->h + c->bw -1)); do { XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); switch(ev.type) { @@ -1698,6 +1711,11 @@ resizemouse(const Arg *arg) nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); + nx = horizcorner ? ev.xmotion.x : c->x; + ny = vertcorner ? ev.xmotion.y : c->y; + nw = MAX(horizcorner ? (ocx2 - nx) : (ev.xmotion.x - ocx - 2 * c->bw + 1), 1); + nh = MAX(vertcorner ? (ocy2 - ny) : (ev.xmotion.y - ocy - 2 * c->bw + 1), 1); + if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh) { @@ -1706,11 +1724,13 @@ resizemouse(const Arg *arg) togglefloating(NULL); } if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, c->x, c->y, nw, nh, 1); + resize(c, nx, ny, nw, nh, 1); break; } } while (ev.type != ButtonRelease); - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); + XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, + horizcorner ? (-c->bw) : (c->w + c->bw - 1), + vertcorner ? (-c->bw) : (c->h + c->bw - 1)); XUngrabPointer(dpy, CurrentTime); while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) {