summaryrefslogtreecommitdiffhomepage
path: root/patch/dragcfact.c
diff options
context:
space:
mode:
authorbakkeby <[email protected]>2020-03-25 15:15:47 +0100
committerbakkeby <[email protected]>2020-03-25 15:15:47 +0100
commit32d3d2b7c37184595f1347f5d03fc7c0fce94b92 (patch)
tree1e1d835e90e01e80750c075a5080dc8b5ccac0dd /patch/dragcfact.c
parentd17a306a94127b8ac971c03aa41bf709dd50d428 (diff)
downloaddwm-flexipatch-32d3d2b7c37184595f1347f5d03fc7c0fce94b92.tar.gz
dwm-flexipatch-32d3d2b7c37184595f1347f5d03fc7c0fce94b92.zip
Adding dragcfact patch, ref. #19
Diffstat (limited to 'patch/dragcfact.c')
-rw-r--r--patch/dragcfact.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/patch/dragcfact.c b/patch/dragcfact.c
new file mode 100644
index 0000000..205b12a
--- /dev/null
+++ b/patch/dragcfact.c
@@ -0,0 +1,71 @@
+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) /* no support rezising floating windows */
+ 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;
+ }
+
+ 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));
+} \ No newline at end of file