2020-08-16 16:35:36 +00:00
|
|
|
From 6f0c657ee557bcb69fd92befad586476e6f2f375 Mon Sep 17 00:00:00 2001
|
2020-04-30 16:04:29 +00:00
|
|
|
From: bakkeby <bakkeby@gmail.com>
|
|
|
|
Date: Thu, 30 Apr 2020 17:31:36 +0200
|
2020-06-29 09:02:59 +00:00
|
|
|
Subject: [PATCH] dragmfact patch with smooth sliding and support for multiple
|
|
|
|
layouts
|
2020-04-30 16:04:29 +00:00
|
|
|
|
|
|
|
---
|
|
|
|
config.def.h | 1 +
|
2020-08-16 16:35:36 +00:00
|
|
|
dwm.c | 228 ++++++++++++++++++++++++++++++++++++++++++++++++++-
|
|
|
|
2 files changed, 228 insertions(+), 1 deletion(-)
|
2020-04-30 16:04:29 +00:00
|
|
|
|
|
|
|
diff --git a/config.def.h b/config.def.h
|
|
|
|
index 1c0b587..72f0467 100644
|
|
|
|
--- a/config.def.h
|
|
|
|
+++ b/config.def.h
|
|
|
|
@@ -107,6 +107,7 @@ static Button buttons[] = {
|
|
|
|
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
|
|
|
|
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
|
|
|
|
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },
|
|
|
|
+ { ClkClientWin, MODKEY|ShiftMask, Button1, dragmfact, {0} },
|
|
|
|
{ ClkTagBar, 0, Button1, view, {0} },
|
|
|
|
{ ClkTagBar, 0, Button3, toggleview, {0} },
|
|
|
|
{ ClkTagBar, MODKEY, Button1, tag, {0} },
|
|
|
|
diff --git a/dwm.c b/dwm.c
|
2020-08-16 16:35:36 +00:00
|
|
|
index 4465af1..689e338 100644
|
2020-04-30 16:04:29 +00:00
|
|
|
--- a/dwm.c
|
|
|
|
+++ b/dwm.c
|
2020-06-29 09:02:59 +00:00
|
|
|
@@ -58,7 +58,7 @@
|
|
|
|
#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
|
|
|
|
|
|
|
|
/* enums */
|
|
|
|
-enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
|
|
|
|
+enum { CurNormal, CurResize, CurMove, CurResizeHorzArrow, CurResizeVertArrow, CurLast }; /* cursor */
|
|
|
|
enum { SchemeNorm, SchemeSel }; /* color schemes */
|
|
|
|
enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
|
|
|
|
NetWMFullscreen, NetActiveWindow, NetWMWindowType,
|
2020-04-30 16:04:29 +00:00
|
|
|
@@ -161,6 +161,7 @@ static void destroynotify(XEvent *e);
|
|
|
|
static void detach(Client *c);
|
|
|
|
static void detachstack(Client *c);
|
|
|
|
static Monitor *dirtomon(int dir);
|
|
|
|
+static void dragmfact(const Arg *arg);
|
|
|
|
static void drawbar(Monitor *m);
|
|
|
|
static void drawbars(void);
|
|
|
|
static void enternotify(XEvent *e);
|
2020-08-16 16:35:36 +00:00
|
|
|
@@ -692,6 +693,229 @@ dirtomon(int dir)
|
2020-04-30 16:04:29 +00:00
|
|
|
return m;
|
|
|
|
}
|
|
|
|
|
|
|
|
+void
|
|
|
|
+dragmfact(const Arg *arg)
|
|
|
|
+{
|
|
|
|
+ unsigned int n;
|
|
|
|
+ int py, px; // pointer coordinates
|
|
|
|
+ int ax, ay, aw, ah; // area position, width and height
|
2020-06-29 09:02:59 +00:00
|
|
|
+ int center = 0, horizontal = 0, mirror = 0, fixed = 0; // layout configuration
|
2020-04-30 16:04:29 +00:00
|
|
|
+ double fact;
|
|
|
|
+ Monitor *m;
|
|
|
|
+ XEvent ev;
|
|
|
|
+ Time lasttime = 0;
|
|
|
|
+
|
|
|
|
+ m = selmon;
|
|
|
|
+
|
|
|
|
+ #if VANITYGAPS_PATCH
|
|
|
|
+ int oh, ov, ih, iv;
|
|
|
|
+ getgaps(m, &oh, &ov, &ih, &iv, &n);
|
|
|
|
+ #else
|
|
|
|
+ Client *c;
|
|
|
|
+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
|
|
|
|
+ #endif // VANITYGAPS_PATCH
|
|
|
|
+
|
|
|
|
+ ax = m->wx;
|
|
|
|
+ ay = m->wy;
|
|
|
|
+ ah = m->wh;
|
|
|
|
+ aw = m->ww;
|
|
|
|
+
|
2020-08-16 16:35:36 +00:00
|
|
|
+ if (!n)
|
|
|
|
+ return;
|
2020-04-30 16:04:29 +00:00
|
|
|
+ #if FLEXTILE_DELUXE_LAYOUT
|
2020-08-16 16:35:36 +00:00
|
|
|
+ else if (m->lt[m->sellt]->arrange == &flextile) {
|
2020-04-30 16:04:29 +00:00
|
|
|
+ int layout = m->ltaxis[LAYOUT];
|
|
|
|
+ if (layout < 0) {
|
|
|
|
+ mirror = 1;
|
|
|
|
+ layout *= -1;
|
|
|
|
+ }
|
2020-06-29 09:02:59 +00:00
|
|
|
+ if (layout > FLOATING_MASTER) {
|
2020-04-30 16:04:29 +00:00
|
|
|
+ layout -= FLOATING_MASTER;
|
2020-06-29 09:02:59 +00:00
|
|
|
+ fixed = 1;
|
|
|
|
+ }
|
2020-04-30 16:04:29 +00:00
|
|
|
+
|
|
|
|
+ if (layout == SPLIT_HORIZONTAL || layout == SPLIT_HORIZONTAL_DUAL_STACK)
|
|
|
|
+ horizontal = 1;
|
2020-06-29 09:02:59 +00:00
|
|
|
+ else if (layout == SPLIT_CENTERED_VERTICAL && (fixed || n - m->nmaster > 1))
|
2020-04-30 16:04:29 +00:00
|
|
|
+ center = 1;
|
|
|
|
+ else if (layout == FLOATING_MASTER) {
|
|
|
|
+ center = 1;
|
|
|
|
+ if (aw < ah)
|
|
|
|
+ horizontal = 1;
|
|
|
|
+ }
|
|
|
|
+ else if (layout == SPLIT_CENTERED_HORIZONTAL) {
|
2020-06-29 09:02:59 +00:00
|
|
|
+ if (fixed || n - m->nmaster > 1)
|
|
|
|
+ center = 1;
|
2020-04-30 16:04:29 +00:00
|
|
|
+ horizontal = 1;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ #endif // FLEXTILE_DELUXE_LAYOUT
|
|
|
|
+ #if CENTEREDMASTER_LAYOUT
|
2020-06-29 09:02:59 +00:00
|
|
|
+ else if (m->lt[m->sellt]->arrange == ¢eredmaster && (fixed || n - m->nmaster > 1))
|
2020-04-30 16:04:29 +00:00
|
|
|
+ center = 1;
|
|
|
|
+ #endif // CENTEREDMASTER_LAYOUT
|
|
|
|
+ #if CENTEREDFLOATINGMASTER_LAYOUT
|
|
|
|
+ else if (m->lt[m->sellt]->arrange == ¢eredfloatingmaster)
|
|
|
|
+ center = 1;
|
|
|
|
+ #endif // CENTEREDFLOATINGMASTER_LAYOUT
|
|
|
|
+ #if BSTACK_LAYOUT
|
|
|
|
+ else if (m->lt[m->sellt]->arrange == &bstack)
|
|
|
|
+ horizontal = 1;
|
|
|
|
+ #endif // BSTACK_LAYOUT
|
|
|
|
+ #if BSTACKHORIZ_LAYOUT
|
|
|
|
+ else if (m->lt[m->sellt]->arrange == &bstackhoriz)
|
|
|
|
+ horizontal = 1;
|
|
|
|
+ #endif // BSTACKHORIZ_LAYOUT
|
|
|
|
+
|
2020-06-29 09:02:59 +00:00
|
|
|
+ /* do not allow mfact to be modified under certain conditions */
|
|
|
|
+ if (!m->lt[m->sellt]->arrange // floating layout
|
2020-08-16 16:35:36 +00:00
|
|
|
+ || (!fixed && m->nmaster && n <= m->nmaster) // no master
|
2020-06-29 09:02:59 +00:00
|
|
|
+ #if MONOCLE_LAYOUT
|
|
|
|
+ || m->lt[m->sellt]->arrange == &monocle
|
|
|
|
+ #endif // MONOCLE_LAYOUT
|
|
|
|
+ #if GRIDMODE_LAYOUT
|
|
|
|
+ || m->lt[m->sellt]->arrange == &grid
|
|
|
|
+ #endif // GRIDMODE_LAYOUT
|
|
|
|
+ #if HORIZGRID_LAYOUT
|
|
|
|
+ || m->lt[m->sellt]->arrange == &horizgrid
|
|
|
|
+ #endif // HORIZGRID_LAYOUT
|
|
|
|
+ #if GAPPLESSGRID_LAYOUT
|
|
|
|
+ || m->lt[m->sellt]->arrange == &gaplessgrid
|
|
|
|
+ #endif // GAPPLESSGRID_LAYOUT
|
|
|
|
+ #if NROWGRID_LAYOUT
|
|
|
|
+ || m->lt[m->sellt]->arrange == &nrowgrid
|
|
|
|
+ #endif // NROWGRID_LAYOUT
|
|
|
|
+ #if FLEXTILE_DELUXE_LAYOUT
|
|
|
|
+ || (m->lt[m->sellt]->arrange == &flextile && m->ltaxis[LAYOUT] == NO_SPLIT)
|
|
|
|
+ #endif // FLEXTILE_DELUXE_LAYOUT
|
|
|
|
+ )
|
2020-04-30 16:04:29 +00:00
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ #if VANITYGAPS_PATCH
|
|
|
|
+ ay += oh;
|
|
|
|
+ ax += ov;
|
|
|
|
+ aw -= 2*ov;
|
|
|
|
+ ah -= 2*oh;
|
|
|
|
+ #endif // VANITYGAPS_PATCH
|
|
|
|
+
|
|
|
|
+ if (center) {
|
|
|
|
+ if (horizontal) {
|
|
|
|
+ px = ax + aw / 2;
|
|
|
|
+ #if VANITYGAPS_PATCH
|
|
|
|
+ py = ay + ah / 2 + (ah - 2*ih) * (m->mfact / 2.0) + ih / 2;
|
|
|
|
+ #else
|
|
|
|
+ py = ay + ah / 2 + ah * m->mfact / 2.0;
|
|
|
|
+ #endif // VANITYGAPS_PATCH
|
|
|
|
+ } else { // vertical split
|
|
|
|
+ #if VANITYGAPS_PATCH
|
|
|
|
+ px = ax + aw / 2 + (aw - 2*iv) * m->mfact / 2.0 + iv / 2;
|
|
|
|
+ #else
|
|
|
|
+ px = ax + aw / 2 + aw * m->mfact / 2.0;
|
|
|
|
+ #endif // VANITYGAPS_PATCH
|
|
|
|
+ py = ay + ah / 2;
|
|
|
|
+ }
|
|
|
|
+ } else if (horizontal) {
|
|
|
|
+ px = ax + aw / 2;
|
|
|
|
+ if (mirror)
|
|
|
|
+ #if VANITYGAPS_PATCH
|
|
|
|
+ py = ay + (ah - ih) * (1.0 - m->mfact) + ih / 2;
|
|
|
|
+ #else
|
|
|
|
+ py = ay + (ah * (1.0 - m->mfact));
|
|
|
|
+ #endif // VANITYGAPS_PATCH
|
|
|
|
+ else
|
|
|
|
+ #if VANITYGAPS_PATCH
|
|
|
|
+ py = ay + ((ah - ih) * m->mfact) + ih / 2;
|
|
|
|
+ #else
|
|
|
|
+ py = ay + (ah * m->mfact);
|
|
|
|
+ #endif // VANITYGAPS_PATCH
|
|
|
|
+ } else { // vertical split
|
|
|
|
+ if (mirror)
|
|
|
|
+ #if VANITYGAPS_PATCH
|
|
|
|
+ px = ax + (aw - iv) * (1.0 - m->mfact) + iv / 2;
|
|
|
|
+ #else
|
|
|
|
+ px = ax + (aw * m->mfact);
|
|
|
|
+ #endif // VANITYGAPS_PATCH
|
|
|
|
+ else
|
|
|
|
+ #if VANITYGAPS_PATCH
|
|
|
|
+ px = ax + ((aw - iv) * m->mfact) + iv / 2;
|
|
|
|
+ #else
|
|
|
|
+ px = ax + (aw * m->mfact);
|
|
|
|
+ #endif // VANITYGAPS_PATCH
|
|
|
|
+ py = ay + ah / 2;
|
|
|
|
+ }
|
|
|
|
+
|
2020-06-29 09:02:59 +00:00
|
|
|
+ if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
|
|
|
|
+ None, cursor[horizontal ? CurResizeVertArrow : CurResizeHorzArrow]->cursor, CurrentTime) != GrabSuccess)
|
|
|
|
+ return;
|
2020-04-30 16:04:29 +00:00
|
|
|
+ XWarpPointer(dpy, None, root, 0, 0, 0, 0, px, py);
|
|
|
|
+
|
|
|
|
+ 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 / 40))
|
|
|
|
+ continue;
|
|
|
|
+ if (lasttime != 0) {
|
|
|
|
+ px = ev.xmotion.x;
|
|
|
|
+ py = ev.xmotion.y;
|
|
|
|
+ }
|
|
|
|
+ lasttime = ev.xmotion.time;
|
|
|
|
+
|
|
|
|
+ #if VANITYGAPS_PATCH
|
|
|
|
+ if (center)
|
|
|
|
+ if (horizontal)
|
|
|
|
+ if (py - ay > ah / 2)
|
|
|
|
+ fact = (double) 1.0 - (ay + ah - py - ih / 2) * 2 / (double) (ah - 2*ih);
|
|
|
|
+ else
|
|
|
|
+ fact = (double) 1.0 - (py - ay - ih / 2) * 2 / (double) (ah - 2*ih);
|
|
|
|
+ else
|
|
|
|
+ if (px - ax > aw / 2)
|
|
|
|
+ fact = (double) 1.0 - (ax + aw - px - iv / 2) * 2 / (double) (aw - 2*iv);
|
|
|
|
+ else
|
|
|
|
+ fact = (double) 1.0 - (px - ax - iv / 2) * 2 / (double) (aw - 2*iv);
|
|
|
|
+ else
|
|
|
|
+ if (horizontal)
|
|
|
|
+ fact = (double) (py - ay - ih / 2) / (double) (ah - ih);
|
|
|
|
+ else
|
|
|
|
+ fact = (double) (px - ax - iv / 2) / (double) (aw - iv);
|
|
|
|
+ #else
|
|
|
|
+ if (center)
|
|
|
|
+ if (horizontal)
|
|
|
|
+ if (py - ay > ah / 2)
|
|
|
|
+ fact = (double) 1.0 - (ay + ah - py) * 2 / (double) ah;
|
|
|
|
+ else
|
|
|
|
+ fact = (double) 1.0 - (py - ay) * 2 / (double) ah;
|
|
|
|
+ else
|
|
|
|
+ if (px - ax > aw / 2)
|
|
|
|
+ fact = (double) 1.0 - (ax + aw - px) * 2 / (double) aw;
|
|
|
|
+ else
|
|
|
|
+ fact = (double) 1.0 - (px - ax) * 2 / (double) aw;
|
|
|
|
+ else
|
|
|
|
+ if (horizontal)
|
|
|
|
+ fact = (double) (py - ay) / (double) ah;
|
|
|
|
+ else
|
|
|
|
+ fact = (double) (px - ax) / (double) aw;
|
|
|
|
+ #endif // VANITYGAPS_PATCH
|
|
|
|
+
|
|
|
|
+ if (!center && mirror)
|
|
|
|
+ fact = 1.0 - fact;
|
|
|
|
+
|
|
|
|
+ setmfact(&((Arg) { .f = 1.0 + fact }));
|
|
|
|
+ px = ev.xmotion.x;
|
|
|
|
+ py = ev.xmotion.y;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ } while (ev.type != ButtonRelease);
|
|
|
|
+
|
|
|
|
+ XUngrabPointer(dpy, CurrentTime);
|
|
|
|
+ while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
void
|
|
|
|
drawbar(Monitor *m)
|
|
|
|
{
|
2020-08-16 16:35:36 +00:00
|
|
|
@@ -1566,6 +1790,8 @@ setup(void)
|
2020-06-25 09:51:50 +00:00
|
|
|
cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr);
|
|
|
|
cursor[CurResize] = drw_cur_create(drw, XC_sizing);
|
|
|
|
cursor[CurMove] = drw_cur_create(drw, XC_fleur);
|
|
|
|
+ cursor[CurResizeHorzArrow] = drw_cur_create(drw, XC_sb_h_double_arrow);
|
|
|
|
+ cursor[CurResizeVertArrow] = drw_cur_create(drw, XC_sb_v_double_arrow);
|
|
|
|
/* init appearance */
|
|
|
|
scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
|
|
|
|
for (i = 0; i < LENGTH(colors); i++)
|
|
|
|
--
|
|
|
|
2.17.1
|
|
|
|
|