dwm-keymodes-5.8.2.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) 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 +0200
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", "9" };
7
8 +/* include(s) defining functions */
9 +#include "keymodes.pre.h"
10 +
11 static const Rule rules[] = {
12 /* class instance title tags mask isfloating monitor */
13 { "Gimp", NULL, NULL, 0, True, -1 },
14 @@ -47,9 +50,11 @@ static const Layout layouts[] = {
15 /* commands */
16 static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
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 argument */
22 + { MODKEY, XK_Escape, setkeymode, {.ui = COMMANDMODE} },
23 { MODKEY, XK_p, spawn, {.v = dmenucmd } },
24 { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
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 function argument */
32 + { 0, XK_Escape, clearcmd, {0} },
33 + { ControlMask, XK_c, clearcmd, {0} },
34 + { 0, XK_i, setkeymode, {.ui = INSERTMODE} },
35 +};
36 +static Command commands[] = {
37 + /* modifier (4 keys) keysyms (4 keys) function argument */
38 + { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_h, 0, 0}, setlayout, {.v = &layouts[0]} },
39 + { {ControlMask, 0, 0, 0}, {XK_w, XK_o, 0, 0}, setlayout, {.v = &layouts[2]} },
40 + { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_o, 0, 0}, onlyclient, {0} },
41 + { {ControlMask, 0, 0, 0}, {XK_w, XK_v, 0, 0}, setlayout, {.v = &layouts[0]} },
42 + { {ControlMask, 0, 0, 0}, {XK_w, XK_less, 0, 0}, setmfact, {.f = -0.05} },
43 + { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_less, 0, 0}, setmfact, {.f = +0.05} },
44 + { {ControlMask, ShiftMask, 0, 0}, {XK_w, XK_0, 0, 0}, setmfact, {.f = +1.50} },
45 + { {ShiftMask, 0, 0, 0}, {XK_period, XK_e, 0, 0}, spawn, {.v = dmenucmd} },
46 + { {ShiftMask, 0, 0, 0}, {XK_period, XK_o, 0, 0}, spawn, {.v = dmenucmd} },
47 + { {ShiftMask, 0, 0, 0}, {XK_period, XK_h, XK_Return, 0}, spawn, {.v = helpcmd} },
48 + { {ShiftMask, 0, 0, 0}, {XK_period, XK_q, XK_Return, 0}, quit, {0} },
49 + { {ShiftMask, 0, 0, 0}, {XK_period, XK_b, XK_d, XK_Return}, killclient, {0} },
50 + { {ShiftMask, 0, 0, 0}, {XK_period, XK_b, XK_n, XK_Return}, focusstack, {.i = +1} },
51 + { {ShiftMask, 0, ShiftMask, 0}, {XK_period, XK_b, XK_n, XK_Return}, focusstack, {.i = -1} },
52 +};
53 +
54 /* button definitions */
55 /* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
56 static Button buttons[] = {
57 @@ -100,3 +129,5 @@ static Button buttons[] = {
58 { ClkTagBar, MODKEY, Button3, toggletag, {0} },
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 +0200
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 <joten@freenet.de> */
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) == CLEANMASK(ev->state)
130 + && cmdkeys[i].func) {
131 + cmdkeys[i].func(&(cmdkeys[i].arg));
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); j++) {
144 + if(cmdkeysym[j] == commands[i].keysym[j]
145 + && CLEANMASK(cmdmod[j]) == CLEANMASK(commands[i].mod[j]))
146 + ismatch = True;
147 + else if(cmdkeysym[j] == 0
148 + && cmdmod[j] == 0) {
149 + ismatch = False;
150 + maybematch = True;
151 + break;
152 + } else {
153 + ismatch = False;
154 + break;
155 + }
156 + }
157 + if(ismatch) {
158 + if(commands[i].func)
159 + commands[i].func(&(commands[i].arg));
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[WMProtocols];
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, NoEventMask, &ev);
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 +0200
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 <joten@freenet.de> */
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];