Adding dragmfact patch and README.md

pull/19/head
bakkeby 4 years ago
parent 2de961d6af
commit 76f8ae1549

@ -0,0 +1,7 @@
# Patches
This repository contains a selection of patches for suckless projects (only dwm for now).
Most of these are derived from the flexipatch projects, e.g. [dwm-flexipatch](https://github.com/bakkeby/dwm-flexipatch), and it should be noted that some of them have cross-patch compatibility built-in using the same preprocessor directives as used in the flexipatch builds.
One good example of this is the [dragmfact](https://github.com/bakkeby/patches/blob/master/dwm/dwm-dragmfact-6.2.diff) patch which can involve up to 11 additional patches. Due to the many possible patch combinations I have decided to leave these preprocessor directives in there as a form of guide for integrating this into your own build - the idea being that you manually delete the code that you don't need.
For cases where one patch changes another, e.g. adding additional fields on top of pertag, individual patches should exist as far as feasible.

@ -0,0 +1,264 @@
From 356ea057b0f62edd33d66775e817d02a0791eb04 Mon Sep 17 00:00:00 2001
From: bakkeby <bakkeby@gmail.com>
Date: Thu, 30 Apr 2020 17:31:36 +0200
Subject: [PATCH] dragmfact patch with smooth sliding and support for multiple
layouts
---
config.def.h | 1 +
dwm.c | 220 +++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 221 insertions(+)
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
index 4465af1..585896f 100644
--- a/dwm.c
+++ b/dwm.c
@@ -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);
@@ -692,6 +693,225 @@ dirtomon(int dir)
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
+ int center = 0, horizontal = 0, mirror = 0; // layout configuration
+ 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;
+
+ /* do not allow mfact to be modified under certain conditions */
+ if (!m->lt[m->sellt]->arrange // floating
+ || (m->nmaster && n <= m->nmaster) // no master
+ #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
+ )
+ return;
+
+ #if FLEXTILE_DELUXE_LAYOUT
+ if (m->lt[m->sellt]->arrange == &flextile) {
+ int layout = m->ltaxis[LAYOUT];
+ if (layout < 0) {
+ mirror = 1;
+ layout *= -1;
+ }
+ if (layout > FLOATING_MASTER)
+ layout -= FLOATING_MASTER;
+
+ if (layout == SPLIT_HORIZONTAL || layout == SPLIT_HORIZONTAL_DUAL_STACK)
+ horizontal = 1;
+ else if (layout == SPLIT_CENTERED_VERTICAL)
+ center = 1;
+ else if (layout == FLOATING_MASTER) {
+ center = 1;
+ if (aw < ah)
+ horizontal = 1;
+ }
+ else if (layout == SPLIT_CENTERED_HORIZONTAL) {
+ horizontal = 1;
+ center = 1;
+ }
+ }
+ #endif // FLEXTILE_DELUXE_LAYOUT
+ #if CENTEREDMASTER_LAYOUT
+ else if (m->lt[m->sellt]->arrange == &centeredmaster)
+ center = 1;
+ #endif // CENTEREDMASTER_LAYOUT
+ #if CENTEREDFLOATINGMASTER_LAYOUT
+ else if (m->lt[m->sellt]->arrange == &centeredfloatingmaster)
+ 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
+
+ if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
+ None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess)
+ 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;
+ }
+
+ 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)
{
--
2.17.1
Loading…
Cancel
Save