-
Notifications
You must be signed in to change notification settings - Fork 31
/
Copy pathdwm-cfacts-dragcfact-6.2.diff
152 lines (145 loc) · 3.99 KB
/
dwm-cfacts-dragcfact-6.2.diff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
From 307943dac6555b7251697e7b0f0eb2af2e14d2c7 Mon Sep 17 00:00:00 2001
From: Bakkeby <bakkeby@gmail.com>
Date: Wed, 26 Jun 2024 09:40:24 +0200
Subject: [PATCH 2/2] The dragcfact patch allow you resize clients' size (i.e.
modify cfact) by holding modkey + shift + right-click and dragging the mouse.
---
config.def.h | 1 +
dwm.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++----
2 files changed, 89 insertions(+), 6 deletions(-)
diff --git a/config.def.h b/config.def.h
index 83910c1..dd482f8 100644
--- a/config.def.h
+++ b/config.def.h
@@ -110,6 +110,7 @@ static Button buttons[] = {
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },
+ { ClkClientWin, MODKEY|ShiftMask, Button3, dragcfact, {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 5592c57..2d591e3 100644
--- a/dwm.c
+++ b/dwm.c
@@ -162,6 +162,7 @@ static void destroynotify(XEvent *e);
static void detach(Client *c);
static void detachstack(Client *c);
static Monitor *dirtomon(int dir);
+static void dragcfact(const Arg *arg);
static void drawbar(Monitor *m);
static void drawbars(void);
static void enternotify(XEvent *e);
@@ -694,6 +695,81 @@ dirtomon(int dir)
return m;
}
+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) {
+ resizemouse(arg);
+ 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;
+ }
+
+ if (fact)
+ 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));
+}
+
void
drawbar(Monitor *m)
{
@@ -1515,19 +1591,25 @@ setlayout(const Arg *arg)
}
void
-setcfact(const Arg *arg) {
+setcfact(const Arg *arg)
+{
float f;
Client *c;
c = selmon->sel;
- if(!arg || !c || !selmon->lt[selmon->sellt]->arrange)
+ if (!arg || !c || !selmon->lt[selmon->sellt]->arrange)
return;
- f = arg->f + c->cfact;
- if(arg->f == 0.0)
+ if (!arg->f)
f = 1.0;
- else if(f < 0.25 || f > 4.0)
- return;
+ else if (arg->f > 4.0) // set fact absolutely
+ f = arg->f - 4.0;
+ else
+ f = arg->f + c->cfact;
+ if (f < 0.25)
+ f = 0.25;
+ else if (f > 4.0)
+ f = 4.0;
c->cfact = f;
arrange(selmon);
}
--
2.45.2