dwm-tapresize-20200819-f04cac6.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-tapresize-20200819-f04cac6.diff (4885B)
---
1 From d781863fb98f066d1ad98b573796d0880b48af8f Mon Sep 17 00:00:00 2001
2 From: verschmelzen <ivan.komarov@protonmail.com>
3 Date: Wed, 19 Aug 2020 00:05:34 +0300
4 Subject: [PATCH] Resize windows with touchpad two-finger scroll
5
6 This patch allows to resize windows using mouse scroll events. Since
7 there is no right-click-tap-to-drag I found this patch to be the only
8 way to be able to both move and resize windows with touchpad.
9 ---
10 config.def.h | 16 ++++++++++++++++
11 dwm.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
12 2 files changed, 62 insertions(+)
13
14 diff --git a/config.def.h b/config.def.h
15 index 1c0b587..d7d208f 100644
16 --- a/config.def.h
17 +++ b/config.def.h
18 @@ -36,6 +36,9 @@ static const float mfact = 0.55; /* factor of master area size [0.05..0.95]
19 static const int nmaster = 1; /* number of clients in master area */
20 static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
21
22 +/* mouse scroll resize */
23 +static const int scrollsensetivity = 30; /* 1 means resize window by 1 pixel for each scroll event */
24 +
25 static const Layout layouts[] = {
26 /* symbol arrange function */
27 { "[]=", tile }, /* first entry is default */
28 @@ -96,6 +99,15 @@ static Key keys[] = {
29 { MODKEY|ShiftMask, XK_q, quit, {0} },
30 };
31
32 +/* resizemousescroll direction argument list */
33 +static const int scrollargs[][2] = {
34 + /* width change height change */
35 + { +scrollsensetivity, 0 },
36 + { -scrollsensetivity, 0 },
37 + { 0, +scrollsensetivity },
38 + { 0, -scrollsensetivity },
39 +};
40 +
41 /* button definitions */
42 /* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
43 static Button buttons[] = {
44 @@ -107,6 +119,10 @@ static Button buttons[] = {
45 { ClkClientWin, MODKEY, Button1, movemouse, {0} },
46 { ClkClientWin, MODKEY, Button2, togglefloating, {0} },
47 { ClkClientWin, MODKEY, Button3, resizemouse, {0} },
48 + { ClkClientWin, MODKEY, Button4, resizemousescroll, {.v = &scrollargs[0]} },
49 + { ClkClientWin, MODKEY, Button5, resizemousescroll, {.v = &scrollargs[1]} },
50 + { ClkClientWin, MODKEY, Button6, resizemousescroll, {.v = &scrollargs[2]} },
51 + { ClkClientWin, MODKEY, Button7, resizemousescroll, {.v = &scrollargs[3]} },
52 { ClkTagBar, 0, Button1, view, {0} },
53 { ClkTagBar, 0, Button3, toggleview, {0} },
54 { ClkTagBar, MODKEY, Button1, tag, {0} },
55 diff --git a/dwm.c b/dwm.c
56 index 9fd0286..30f14db 100644
57 --- a/dwm.c
58 +++ b/dwm.c
59 @@ -57,6 +57,12 @@
60 #define TAGMASK ((1 << LENGTH(tags)) - 1)
61 #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
62
63 +/* Undefined in X11/X.h buttons that are actualy exist and correspond to
64 + * horizontal scroll
65 + */
66 +#define Button6 6
67 +#define Button7 7
68 +
69 /* enums */
70 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
71 enum { SchemeNorm, SchemeSel }; /* color schemes */
72 @@ -192,6 +198,7 @@ static Monitor *recttomon(int x, int y, int w, int h);
73 static void resize(Client *c, int x, int y, int w, int h, int interact);
74 static void resizeclient(Client *c, int x, int y, int w, int h);
75 static void resizemouse(const Arg *arg);
76 +static void resizemousescroll(const Arg *arg);
77 static void restack(Monitor *m);
78 static void run(void);
79 static void scan(void);
80 @@ -1345,6 +1352,45 @@ resizemouse(const Arg *arg)
81 }
82 }
83
84 +void
85 +resizemousescroll(const Arg *arg)
86 +{
87 + int nw, nh;
88 + Client *c;
89 + Monitor *m;
90 + XEvent ev;
91 + int dw = *((int*)arg->v + 1);
92 + int dh = *(int*)arg->v;
93 +
94 + if (!(c = selmon->sel))
95 + return;
96 + if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */
97 + return;
98 + restack(selmon);
99 + if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
100 + None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess)
101 + return;
102 + nw = MAX(c->w + dw, 1);
103 + nh = MAX(c->h + dh, 1);
104 + if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww
105 + && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh)
106 + {
107 + if (!c->isfloating && selmon->lt[selmon->sellt]->arrange
108 + && (abs(nw - c->w) > snap || abs(nh - c->h) > snap))
109 + togglefloating(NULL);
110 + }
111 + if (!selmon->lt[selmon->sellt]->arrange || c->isfloating)
112 + resize(c, c->x, c->y, nw, nh, 1);
113 + XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1);
114 + XUngrabPointer(dpy, CurrentTime);
115 + while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
116 + if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) {
117 + sendmon(c, m);
118 + selmon = m;
119 + focus(NULL);
120 + }
121 +}
122 +
123 void
124 restack(Monitor *m)
125 {
126 --
127 2.28.0
128