dwm-gestures-6.4.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-gestures-6.4.diff (3736B)
---
1 diff -up a/config.def.h b/config.def.h
2 --- a/config.def.h 2023-01-13 15:14:16.536118429 +0100
3 +++ b/config.def.h 2023-01-13 15:21:25.946360539 +0100
4 @@ -78,6 +78,7 @@ static const Key keys[] = {
5 { MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
6 { MODKEY, XK_space, setlayout, {0} },
7 { MODKEY|ShiftMask, XK_space, togglefloating, {0} },
8 + { MODKEY, XK_g, gesture, {0} },
9 { MODKEY, XK_0, view, {.ui = ~0 } },
10 { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
11 { MODKEY, XK_comma, focusmon, {.i = -1 } },
12 @@ -107,9 +108,21 @@ static const Button buttons[] = {
13 { ClkClientWin, MODKEY, Button1, movemouse, {0} },
14 { ClkClientWin, MODKEY, Button2, togglefloating, {0} },
15 { ClkClientWin, MODKEY, Button3, resizemouse, {0} },
16 + { ClkClientWin, MODKEY|ShiftMask,Button3, gesture, {0} },
17 { ClkTagBar, 0, Button1, view, {0} },
18 { ClkTagBar, 0, Button3, toggleview, {0} },
19 { ClkTagBar, MODKEY, Button1, tag, {0} },
20 { ClkTagBar, MODKEY, Button3, toggletag, {0} },
21 };
22
23 +/* gestures
24 + * u means up
25 + * d means down
26 + * l means left
27 + * r means right
28 + * ud means up and down
29 + */
30 +static Gesture gestures[] = {
31 + { "u", spawn, {.v = termcmd } },
32 + { "d", spawn, {.v = dmenucmd } },
33 +};
34 diff -up a/dwm.c b/dwm.c
35 --- a/dwm.c 2023-01-13 15:14:16.536118429 +0100
36 +++ b/dwm.c 2023-01-13 15:14:41.094075080 +0100
37 @@ -75,6 +75,12 @@ typedef union {
38 } Arg;
39
40 typedef struct {
41 + char *gname;
42 + void (*func)(const Arg *arg);
43 + const Arg arg;
44 +} Gesture;
45 +
46 +typedef struct {
47 unsigned int click;
48 unsigned int mask;
49 unsigned int button;
50 @@ -183,6 +189,7 @@ static void mappingnotify(XEvent *e);
51 static void maprequest(XEvent *e);
52 static void monocle(Monitor *m);
53 static void motionnotify(XEvent *e);
54 +static void gesture(const Arg *arg);
55 static void movemouse(const Arg *arg);
56 static Client *nexttiled(Client *c);
57 static void pop(Client *c);
58 @@ -1134,6 +1141,68 @@ motionnotify(XEvent *e)
59 }
60
61 void
62 +gesture(const Arg *arg) {
63 + int x, y, dx, dy, q;
64 + int valid=0, listpos=0, gestpos=0, count=0;
65 + char move, currGest[10];
66 + XEvent ev;
67 +
68 + if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
69 + None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess)
70 + return;
71 + if(!getrootptr(&x, &y))
72 + return;
73 + do {
74 + XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev);
75 + switch (ev.type) {
76 + case ConfigureRequest:
77 + case Expose:
78 + case MapRequest:
79 + handler[ev.type](&ev);
80 + break;
81 + case MotionNotify:
82 + if(count++ < 10)
83 + break;
84 + count = 0;
85 + dx = ev.xmotion.x - x;
86 + dy = ev.xmotion.y - y;
87 + x = ev.xmotion.x;
88 + y = ev.xmotion.y;
89 +
90 + if( abs(dx)/(abs(dy)+1) == 0 )
91 + move = dy<0?'u':'d';
92 + else
93 + move = dx<0?'l':'r';
94 +
95 + if(move!=currGest[gestpos-1])
96 + {
97 + if(gestpos>9)
98 + { ev.type++;
99 + break;
100 + }
101 +
102 + currGest[gestpos] = move;
103 + currGest[++gestpos] = '\0';
104 +
105 + valid = 0;
106 + for(q = 0; q<LENGTH(gestures); q++)
107 + { if(!strcmp(currGest, gestures[q].gname))
108 + { valid++;
109 + listpos = q;
110 + }
111 + }
112 + }
113 +
114 + }
115 + } while(ev.type != ButtonRelease);
116 +
117 + if(valid)
118 + gestures[listpos].func(&(gestures[listpos].arg));
119 +
120 + XUngrabPointer(dpy, CurrentTime);
121 +}
122 +
123 +void
124 movemouse(const Arg *arg)
125 {
126 int x, y, ocx, ocy, nx, ny;