dwm-gestures-6.4.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
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 … | |
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… | |
10 { MODKEY|ShiftMask, XK_0, tag, {.ui… | |
11 { MODKEY, XK_comma, focusmon, {.i … | |
12 @@ -107,9 +108,21 @@ static const Button buttons[] = { | |
13 { ClkClientWin, MODKEY, Button1, movemou… | |
14 { ClkClientWin, MODKEY, Button2, togglef… | |
15 { ClkClientWin, MODKEY, Button3, resizem… | |
16 + { ClkClientWin, MODKEY|ShiftMask,Button3, ges… | |
17 { ClkTagBar, 0, Button1, view, … | |
18 { ClkTagBar, 0, Button3, togglev… | |
19 { ClkTagBar, MODKEY, Button1, tag, … | |
20 { ClkTagBar, MODKEY, Button3, togglet… | |
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, Gr… | |
69 + None, cursor[CurMove]->cursor, CurrentTime) != GrabSucc… | |
70 + return; | |
71 + if(!getrootptr(&x, &y)) | |
72 + return; | |
73 + do { | |
74 + XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedi… | |
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); … | |
107 + { if(!strcmp(currGest, g… | |
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; |