dwm-keychain-20200729-053e3a2.diff (11441B)
1 From e6c2d5fdc6010a22d6cd74485cb0b3e74467d0da Mon Sep 17 00:00:00 2001 2 From: braunbearded <braunbearded1@gmail.com> 3 Date: Wed, 29 Jul 2020 18:37:47 +0200 4 Subject: [PATCH 1/4] chain key bindings 5 6 --- 7 dwm.c | 34 +++++++++++++++++++++++++++++----- 8 1 file changed, 29 insertions(+), 5 deletions(-) 9 10 diff --git a/dwm.c b/dwm.c 11 index 9fd0286..7298c5e 100644 12 --- a/dwm.c 13 +++ b/dwm.c 14 @@ -101,6 +101,7 @@ struct Client { 15 16 typedef struct { 17 unsigned int mod; 18 + KeySym chain; 19 KeySym keysym; 20 void (*func)(const Arg *); 21 const Arg arg; 22 @@ -268,6 +269,7 @@ static Display *dpy; 23 static Drw *drw; 24 static Monitor *mons, *selmon; 25 static Window root, wmcheckwin; 26 +static KeySym keychain = -1; 27 28 /* configuration, allows nested code to access above variables */ 29 #include "config.h" 30 @@ -954,13 +956,18 @@ grabkeys(void) 31 unsigned int i, j; 32 unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; 33 KeyCode code; 34 + KeyCode chain; 35 36 XUngrabKey(dpy, AnyKey, AnyModifier, root); 37 for (i = 0; i < LENGTH(keys); i++) 38 - if ((code = XKeysymToKeycode(dpy, keys[i].keysym))) 39 + if ((code = XKeysymToKeycode(dpy, keys[i].keysym))) { 40 + if (keys[i].chain != -1 && 41 + ((chain = XKeysymToKeycode(dpy, keys[i].chain)))) 42 + code = chain; 43 for (j = 0; j < LENGTH(modifiers); j++) 44 XGrabKey(dpy, code, keys[i].mod | modifiers[j], root, 45 True, GrabModeAsync, GrabModeAsync); 46 + } 47 } 48 } 49 50 @@ -989,14 +996,31 @@ keypress(XEvent *e) 51 unsigned int i; 52 KeySym keysym; 53 XKeyEvent *ev; 54 + int current = 0; 55 56 ev = &e->xkey; 57 keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); 58 - for (i = 0; i < LENGTH(keys); i++) 59 - if (keysym == keys[i].keysym 60 - && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) 61 - && keys[i].func) 62 + for (i = 0; i < LENGTH(keys); i++) { 63 + if (keysym == keys[i].keysym && keys[i].chain == -1 64 + && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) 65 + && keys[i].func) 66 + keys[i].func(&(keys[i].arg)); 67 + else if (keysym == keys[i].chain && keychain == -1 68 + && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) 69 + && keys[i].func) { 70 + current = 1; 71 + keychain = keysym; 72 + XGrabKey(dpy, AnyKey, AnyModifier, root, True, GrabModeAsync, 73 + GrabModeAsync); 74 + } else if (!current && keysym == keys[i].keysym 75 + && keys[i].chain == keychain 76 + && keys[i].func) 77 keys[i].func(&(keys[i].arg)); 78 + } 79 + if (!current) { 80 + keychain = -1; 81 + grabkeys(); 82 + } 83 } 84 85 void 86 -- 87 2.28.0 88 89 90 From ad3d15cf7df3286d35728afef823c3163898e2db Mon Sep 17 00:00:00 2001 91 From: braunbearded <braunbearded1@gmail.com> 92 Date: Wed, 29 Jul 2020 18:38:15 +0200 93 Subject: [PATCH 2/4] update default bindings 94 95 --- 96 config.def.h | 80 +++++++++++++++++++++++++++------------------------- 97 1 file changed, 41 insertions(+), 39 deletions(-) 98 99 diff --git a/config.def.h b/config.def.h 100 index 1c0b587..c7cab16 100644 101 --- a/config.def.h 102 +++ b/config.def.h 103 @@ -45,11 +45,11 @@ static const Layout layouts[] = { 104 105 /* key definitions */ 106 #define MODKEY Mod1Mask 107 -#define TAGKEYS(KEY,TAG) \ 108 - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ 109 - { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ 110 - { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ 111 - { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, 112 +#define TAGKEYS(CHAIN,KEY,TAG) \ 113 + { MODKEY, CHAIN, KEY, view, {.ui = 1 << TAG} }, \ 114 + { MODKEY|ControlMask, CHAIN, KEY, toggleview, {.ui = 1 << TAG} }, \ 115 + { MODKEY|ShiftMask, CHAIN, KEY, tag, {.ui = 1 << TAG} }, \ 116 + { MODKEY|ControlMask|ShiftMask, CHAIN, KEY, toggletag, {.ui = 1 << TAG} }, 117 118 /* helper for spawning shell commands in the pre dwm-5.0 fashion */ 119 #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } 120 @@ -60,40 +60,42 @@ static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, 121 static const char *termcmd[] = { "st", NULL }; 122 123 static Key keys[] = { 124 - /* modifier key function argument */ 125 - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, 126 - { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, 127 - { MODKEY, XK_b, togglebar, {0} }, 128 - { MODKEY, XK_j, focusstack, {.i = +1 } }, 129 - { MODKEY, XK_k, focusstack, {.i = -1 } }, 130 - { MODKEY, XK_i, incnmaster, {.i = +1 } }, 131 - { MODKEY, XK_d, incnmaster, {.i = -1 } }, 132 - { MODKEY, XK_h, setmfact, {.f = -0.05} }, 133 - { MODKEY, XK_l, setmfact, {.f = +0.05} }, 134 - { MODKEY, XK_Return, zoom, {0} }, 135 - { MODKEY, XK_Tab, view, {0} }, 136 - { MODKEY|ShiftMask, XK_c, killclient, {0} }, 137 - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, 138 - { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, 139 - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, 140 - { MODKEY, XK_space, setlayout, {0} }, 141 - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, 142 - { MODKEY, XK_0, view, {.ui = ~0 } }, 143 - { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, 144 - { MODKEY, XK_comma, focusmon, {.i = -1 } }, 145 - { MODKEY, XK_period, focusmon, {.i = +1 } }, 146 - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, 147 - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, 148 - TAGKEYS( XK_1, 0) 149 - TAGKEYS( XK_2, 1) 150 - TAGKEYS( XK_3, 2) 151 - TAGKEYS( XK_4, 3) 152 - TAGKEYS( XK_5, 4) 153 - TAGKEYS( XK_6, 5) 154 - TAGKEYS( XK_7, 6) 155 - TAGKEYS( XK_8, 7) 156 - TAGKEYS( XK_9, 8) 157 - { MODKEY|ShiftMask, XK_q, quit, {0} }, 158 + /* modifier chain key key function argument */ 159 + { MODKEY, -1, XK_p, spawn, {.v = dmenucmd } }, 160 + { MODKEY|ShiftMask, -1, XK_Return, spawn, {.v = termcmd } }, 161 + { MODKEY, -1, XK_b, togglebar, {0} }, 162 + { MODKEY, -1, XK_j, focusstack, {.i = +1 } }, 163 + { MODKEY, -1, XK_k, focusstack, {.i = -1 } }, 164 + { MODKEY, -1, XK_i, incnmaster, {.i = +1 } }, 165 + { MODKEY, -1, XK_d, incnmaster, {.i = -1 } }, 166 + { MODKEY, -1, XK_h, setmfact, {.f = -0.05} }, 167 + { MODKEY, -1, XK_l, setmfact, {.f = +0.05} }, 168 + { MODKEY, -1, XK_Return, zoom, {0} }, 169 + { MODKEY, -1, XK_Tab, view, {0} }, 170 + { MODKEY|ShiftMask, -1, XK_c, killclient, {0} }, 171 + { MODKEY, -1, XK_t, setlayout, {.v = &layouts[0]} }, 172 + { MODKEY, -1, XK_f, setlayout, {.v = &layouts[1]} }, 173 + { MODKEY, -1, XK_m, setlayout, {.v = &layouts[2]} }, 174 + { MODKEY, -1, XK_space, setlayout, {0} }, 175 + { MODKEY|ShiftMask, -1, XK_space, togglefloating, {0} }, 176 + { MODKEY, -1, XK_0, view, {.ui = ~0 } }, 177 + { MODKEY|ShiftMask, -1, XK_0, tag, {.ui = ~0 } }, 178 + { MODKEY, -1, XK_comma, focusmon, {.i = -1 } }, 179 + { MODKEY, -1, XK_period, focusmon, {.i = +1 } }, 180 + { MODKEY|ShiftMask, -1, XK_comma, tagmon, {.i = -1 } }, 181 + { MODKEY|ShiftMask, -1, XK_period, tagmon, {.i = +1 } }, 182 + TAGKEYS( -1, XK_1, 0) 183 + TAGKEYS( -1, XK_2, 1) 184 + TAGKEYS( -1, XK_3, 2) 185 + TAGKEYS( -1, XK_4, 3) 186 + TAGKEYS( -1, XK_5, 4) 187 + TAGKEYS( -1, XK_6, 5) 188 + TAGKEYS( -1, XK_7, 6) 189 + TAGKEYS( -1, XK_8, 7) 190 + TAGKEYS( -1, XK_9, 8) 191 + { MODKEY|ShiftMask, -1, XK_q, quit, {0} }, 192 + { MODKEY, XK_a, XK_d, spawn, {.v = dmenucmd } }, 193 + { MODKEY, XK_a, XK_t, spawn, {.v = termcmd } }, 194 }; 195 196 /* button definitions */ 197 -- 198 2.28.0 199 200 201 From e9f3eec82010fd6083dc57f058902a1aab2d14ea Mon Sep 17 00:00:00 2001 202 From: braunbearded <braunbearded1@gmail.com> 203 Date: Wed, 29 Jul 2020 19:07:07 +0200 204 Subject: [PATCH 3/4] fix bug for mod key ignore 205 206 --- 207 dwm.c | 1 + 208 1 file changed, 1 insertion(+) 209 210 diff --git a/dwm.c b/dwm.c 211 index 7298c5e..aee56d4 100644 212 --- a/dwm.c 213 +++ b/dwm.c 214 @@ -1013,6 +1013,7 @@ keypress(XEvent *e) 215 XGrabKey(dpy, AnyKey, AnyModifier, root, True, GrabModeAsync, 216 GrabModeAsync); 217 } else if (!current && keysym == keys[i].keysym 218 + && keychain != -1 219 && keys[i].chain == keychain 220 && keys[i].func) 221 keys[i].func(&(keys[i].arg)); 222 -- 223 2.28.0 224 225 226 From 053e3a2b2ff87805a15f3fe2f82a7d8bf0ab9b7a Mon Sep 17 00:00:00 2001 227 From: braunbearded <braunbearded1@gmail.com> 228 Date: Wed, 29 Jul 2020 21:25:23 +0200 229 Subject: [PATCH 4/4] listen for all keys inkl modifier after prefix 230 231 --- 232 dwm.c | 8 +++++--- 233 1 file changed, 5 insertions(+), 3 deletions(-) 234 235 diff --git a/dwm.c b/dwm.c 236 index aee56d4..dea8f6a 100644 237 --- a/dwm.c 238 +++ b/dwm.c 239 @@ -993,10 +993,11 @@ isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) 240 void 241 keypress(XEvent *e) 242 { 243 - unsigned int i; 244 + unsigned int i, j; 245 KeySym keysym; 246 XKeyEvent *ev; 247 int current = 0; 248 + unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; 249 250 ev = &e->xkey; 251 keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); 252 @@ -1010,8 +1011,9 @@ keypress(XEvent *e) 253 && keys[i].func) { 254 current = 1; 255 keychain = keysym; 256 - XGrabKey(dpy, AnyKey, AnyModifier, root, True, GrabModeAsync, 257 - GrabModeAsync); 258 + for (j = 0; j < LENGTH(modifiers); j++) 259 + XGrabKey(dpy, AnyKey, 0 | modifiers[j], root, 260 + True, GrabModeAsync, GrabModeAsync); 261 } else if (!current && keysym == keys[i].keysym 262 && keychain != -1 263 && keys[i].chain == keychain 264 -- 265 2.28.0 266