dwm-keymodes-5.8.2.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-keymodes-5.8.2.diff (8503B) | |
--- | |
1 diff -up ../dwm-5.8.2-0/config.def.h ./config.def.h | |
2 --- ../dwm-5.8.2-0/config.def.h 2010-06-10 22:47:51.660949000 +02… | |
3 +++ ./config.def.h 2010-06-11 00:18:55.082073000 +0200 | |
4 @@ -16,6 +16,9 @@ static const Bool topbar = Tr | |
5 /* tagging */ | |
6 static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "… | |
7 | |
8 +/* include(s) defining functions */ | |
9 +#include "keymodes.pre.h" | |
10 + | |
11 static const Rule rules[] = { | |
12 /* class instance title tags mask isfloating … | |
13 { "Gimp", NULL, NULL, 0, True, … | |
14 @@ -47,9 +50,11 @@ static const Layout layouts[] = { | |
15 /* commands */ | |
16 static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", norm… | |
17 static const char *termcmd[] = { "uxterm", NULL }; | |
18 +static const char *helpcmd[] = { "uxterm", "-e", "man", "dwm", NULL }; | |
19 | |
20 static Key keys[] = { | |
21 /* modifier key function argu… | |
22 + { MODKEY, XK_Escape, setkeymode, {.ui… | |
23 { MODKEY, XK_p, spawn, {.v … | |
24 { MODKEY|ShiftMask, XK_Return, spawn, {.v … | |
25 { MODKEY, XK_b, togglebar, {0} … | |
26 @@ -83,6 +88,30 @@ static Key keys[] = { | |
27 { MODKEY|ShiftMask, XK_q, quit, {0} … | |
28 }; | |
29 | |
30 +static Key cmdkeys[] = { | |
31 + /* modifier keys functio… | |
32 + { 0, XK_Escape, clearcm… | |
33 + { ControlMask, XK_c, clearcm… | |
34 + { 0, XK_i, setkeym… | |
35 +}; | |
36 +static Command commands[] = { | |
37 + /* modifier (4 keys) keysyms (4 keys) … | |
38 + { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_h,… | |
39 + { {ControlMask, 0, 0, 0}, {XK_w, XK_o,… | |
40 + { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_o,… | |
41 + { {ControlMask, 0, 0, 0}, {XK_w, XK_v,… | |
42 + { {ControlMask, 0, 0, 0}, {XK_w, XK_le… | |
43 + { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_le… | |
44 + { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_0,… | |
45 + { {ShiftMask, 0, 0, 0}, {XK_period, XK_e,… | |
46 + { {ShiftMask, 0, 0, 0}, {XK_period, XK_o,… | |
47 + { {ShiftMask, 0, 0, 0}, {XK_period, XK_h,… | |
48 + { {ShiftMask, 0, 0, 0}, {XK_period, XK_q,… | |
49 + { {ShiftMask, 0, 0, 0}, {XK_period, XK_b,… | |
50 + { {ShiftMask, 0, 0, 0}, {XK_period, XK_b,… | |
51 + { {ShiftMask, 0, ShiftMask, 0}, {XK_period, XK_b,… | |
52 +}; | |
53 + | |
54 /* button definitions */ | |
55 /* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, … | |
56 static Button buttons[] = { | |
57 @@ -100,3 +129,5 @@ static Button buttons[] = { | |
58 { ClkTagBar, MODKEY, Button3, togglet… | |
59 }; | |
60 | |
61 +/* include(s) depending on the configuration variables */ | |
62 +#include "keymodes.post.h" | |
63 diff -up ../dwm-5.8.2-0/dwm.c ./dwm.c | |
64 --- ../dwm-5.8.2-0/dwm.c 2010-06-10 22:47:51.669677000 +0200 | |
65 +++ ./dwm.c 2010-06-11 00:18:55.106090000 +0200 | |
66 @@ -970,7 +970,7 @@ grabbuttons(Client *c, Bool focused) { | |
67 } | |
68 | |
69 void | |
70 -grabkeys(void) { | |
71 +grabdefkeys(void) { | |
72 updatenumlockmask(); | |
73 { | |
74 unsigned int i, j; | |
75 @@ -1052,7 +1052,7 @@ isuniquegeom(XineramaScreenInfo *unique, | |
76 #endif /* XINERAMA */ | |
77 | |
78 void | |
79 -keypress(XEvent *e) { | |
80 +defkeypress(XEvent *e) { | |
81 unsigned int i; | |
82 KeySym keysym; | |
83 XKeyEvent *ev; | |
84 diff -up ../dwm-5.8.2-0/keymodes.post.h ./keymodes.post.h | |
85 --- ../dwm-5.8.2-0/keymodes.post.h 2010-06-11 00:21:46.000000000 … | |
86 +++ ./keymodes.post.h 2010-06-11 00:18:55.119222000 +0200 | |
87 @@ -0,0 +1,124 @@ | |
88 +/* See LICENSE file for copyright and license details. */ | |
89 +/* © 2010 joten <[email protected]> */ | |
90 + | |
91 +/* function implementations */ | |
92 +void | |
93 +clearcmd(const Arg *arg) { | |
94 + unsigned int i; | |
95 + | |
96 + for(i = 0; i < LENGTH(cmdkeysym); i++) { | |
97 + cmdkeysym[i] = 0; | |
98 + cmdmod[i] = 0; | |
99 + } | |
100 +} | |
101 + | |
102 +void | |
103 +grabkeys(void) { | |
104 + if(keymode == INSERTMODE) { | |
105 + grabdefkeys(); | |
106 + } else if(keymode == COMMANDMODE) { | |
107 + XUngrabKey(dpy, AnyKey, AnyModifier, root); | |
108 + XGrabKey(dpy, AnyKey, AnyModifier, root, | |
109 + True, GrabModeAsync, GrabModeAsync); | |
110 + } | |
111 +} | |
112 + | |
113 +void | |
114 +keypress(XEvent *e) { | |
115 + unsigned int i, j; | |
116 + Arg a = {0}; | |
117 + Bool ismatch = False, maybematch = False; | |
118 + KeySym keysym; | |
119 + XKeyEvent *ev; | |
120 + | |
121 + if(keymode == INSERTMODE) | |
122 + defkeypress(e); | |
123 + else if(keymode == COMMANDMODE) { | |
124 + ev = &e->xkey; | |
125 + keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); | |
126 + if(keysym < XK_Shift_L || keysym > XK_Hyper_R) { | |
127 + for(i = 0; i < LENGTH(cmdkeys); i++) | |
128 + if(keysym == cmdkeys[i].keysym | |
129 + && CLEANMASK(cmdkeys[i].mod) == CLEANMA… | |
130 + && cmdkeys[i].func) { | |
131 + cmdkeys[i].func(&(cmdkeys[i].ar… | |
132 + ismatch = True; | |
133 + break; | |
134 + } | |
135 + if(!ismatch) { | |
136 + for(j = 0; j < LENGTH(cmdkeysym); j++) | |
137 + if(cmdkeysym[j] == 0) { | |
138 + cmdkeysym[j] = keysym; | |
139 + cmdmod[j] = ev->state; | |
140 + break; | |
141 + } | |
142 + for(i = 0; i < LENGTH(commands); i++) { | |
143 + for(j = 0; j < LENGTH(cmdkeysym… | |
144 + if(cmdkeysym[j] == comm… | |
145 + && CLEANMASK(cmdmod[j])… | |
146 + ismatch = True; | |
147 + else if(cmdkeysym[j] ==… | |
148 + && cmdmod[j] == 0) { | |
149 + ismatch = False; | |
150 + maybematch = Tr… | |
151 + break; | |
152 + } else { | |
153 + ismatch = False; | |
154 + break; | |
155 + } | |
156 + } | |
157 + if(ismatch) { | |
158 + if(commands[i].func) | |
159 + commands[i].fun… | |
160 + clearcmd(&a); | |
161 + break; | |
162 + } | |
163 + | |
164 + } | |
165 + if(!maybematch) | |
166 + clearcmd(&a); | |
167 + } | |
168 + } | |
169 + } | |
170 +} | |
171 + | |
172 +void | |
173 +onlyclient(const Arg *arg) { | |
174 + Client *c; | |
175 + XEvent ev; | |
176 + | |
177 + if(!selmon->sel) | |
178 + return; | |
179 + for(c = selmon->clients; c; c = c->next) | |
180 + if(c != selmon->sel && ISVISIBLE(c)) { | |
181 + if(isprotodel(c)) { | |
182 + ev.type = ClientMessage; | |
183 + ev.xclient.window = c->win; | |
184 + ev.xclient.message_type = wmatom[WMProt… | |
185 + ev.xclient.format = 32; | |
186 + ev.xclient.data.l[0] = wmatom[WMDelete]; | |
187 + ev.xclient.data.l[1] = CurrentTime; | |
188 + XSendEvent(dpy, c->win, False, NoEventM… | |
189 + } | |
190 + else { | |
191 + XGrabServer(dpy); | |
192 + XSetErrorHandler(xerrordummy); | |
193 + XSetCloseDownMode(dpy, DestroyAll); | |
194 + XKillClient(dpy, c->win); | |
195 + XSync(dpy, False); | |
196 + XSetErrorHandler(xerror); | |
197 + XUngrabServer(dpy); | |
198 + } | |
199 + } | |
200 +} | |
201 + | |
202 +void | |
203 +setkeymode(const Arg *arg) { | |
204 + Arg a = {0}; | |
205 + | |
206 + if(!arg) | |
207 + return; | |
208 + keymode = arg->ui; | |
209 + clearcmd(&a); | |
210 + grabkeys(); | |
211 +} | |
212 diff -up ../dwm-5.8.2-0/keymodes.pre.h ./keymodes.pre.h | |
213 --- ../dwm-5.8.2-0/keymodes.pre.h 2010-06-11 00:21:38.000000000 +… | |
214 +++ ./keymodes.pre.h 2010-06-11 00:18:55.121759000 +0200 | |
215 @@ -0,0 +1,24 @@ | |
216 +/* See LICENSE file for copyright and license details. */ | |
217 +/* © 2010 joten <[email protected]> */ | |
218 + | |
219 +#define COMMANDMODE 1 | |
220 +#define INSERTMODE 2 | |
221 + | |
222 +typedef struct { | |
223 + unsigned int mod[4]; | |
224 + KeySym keysym[4]; | |
225 + void (*func)(const Arg *); | |
226 + const Arg arg; | |
227 +} Command; | |
228 + | |
229 +/* function declarations */ | |
230 +static void clearcmd(const Arg *arg); | |
231 +static void defkeypress(XEvent *e); | |
232 +static void grabdefkeys(void); | |
233 +static void onlyclient(const Arg *arg); | |
234 +static void setkeymode(const Arg *arg); | |
235 + | |
236 +/* variables */ | |
237 +static unsigned int cmdmod[4]; | |
238 +static unsigned int keymode = COMMANDMODE; | |
239 +static KeySym cmdkeysym[4]; |