commit bd10ce10818f6d1d2888d07be124017e4d4d0506
Author: braunbearded <[email protected]>
Date:   Wed Jul 29 20:16:58 2020 +0200

    add keychain wiki entry

diff --git 
a/dwm.suckless.org/patches/keychain/dwm-keychain-20200719-e9f3eec.diff 
b/dwm.suckless.org/patches/keychain/dwm-keychain-20200719-e9f3eec.diff
new file mode 100644
index 00000000..140f26f6
--- /dev/null
+++ b/dwm.suckless.org/patches/keychain/dwm-keychain-20200719-e9f3eec.diff
@@ -0,0 +1,224 @@
+From e6c2d5fdc6010a22d6cd74485cb0b3e74467d0da Mon Sep 17 00:00:00 2001
+From: braunbearded <[email protected]>
+Date: Wed, 29 Jul 2020 18:37:47 +0200
+Subject: [PATCH 1/3] chain key bindings
+
+---
+ dwm.c | 34 +++++++++++++++++++++++++++++-----
+ 1 file changed, 29 insertions(+), 5 deletions(-)
+
+diff --git a/dwm.c b/dwm.c
+index 9fd0286..7298c5e 100644
+--- a/dwm.c
++++ b/dwm.c
+@@ -101,6 +101,7 @@ struct Client {
+ 
+ typedef struct {
+       unsigned int mod;
++    KeySym chain;
+       KeySym keysym;
+       void (*func)(const Arg *);
+       const Arg arg;
+@@ -268,6 +269,7 @@ static Display *dpy;
+ static Drw *drw;
+ static Monitor *mons, *selmon;
+ static Window root, wmcheckwin;
++static KeySym keychain = -1;
+ 
+ /* configuration, allows nested code to access above variables */
+ #include "config.h"
+@@ -954,13 +956,18 @@ grabkeys(void)
+               unsigned int i, j;
+               unsigned int modifiers[] = { 0, LockMask, numlockmask, 
numlockmask|LockMask };
+               KeyCode code;
++              KeyCode chain;
+ 
+               XUngrabKey(dpy, AnyKey, AnyModifier, root);
+               for (i = 0; i < LENGTH(keys); i++)
+-                      if ((code = XKeysymToKeycode(dpy, keys[i].keysym)))
++                      if ((code = XKeysymToKeycode(dpy, keys[i].keysym))) {
++                              if (keys[i].chain != -1 &&
++                                      ((chain = XKeysymToKeycode(dpy, 
keys[i].chain))))
++                                              code = chain;
+                               for (j = 0; j < LENGTH(modifiers); j++)
+                                       XGrabKey(dpy, code, keys[i].mod | 
modifiers[j], root,
+                                               True, GrabModeAsync, 
GrabModeAsync);
++                      }
+       }
+ }
+ 
+@@ -989,14 +996,31 @@ keypress(XEvent *e)
+       unsigned int i;
+       KeySym keysym;
+       XKeyEvent *ev;
++      int current = 0;
+ 
+       ev = &e->xkey;
+       keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
+-      for (i = 0; i < LENGTH(keys); i++)
+-              if (keysym == keys[i].keysym
+-              && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)
+-              && keys[i].func)
++      for (i = 0; i < LENGTH(keys); i++) {
++              if (keysym == keys[i].keysym && keys[i].chain == -1
++                              && CLEANMASK(keys[i].mod) == 
CLEANMASK(ev->state)
++                              && keys[i].func)
++                      keys[i].func(&(keys[i].arg));
++              else if (keysym == keys[i].chain && keychain == -1
++                              && CLEANMASK(keys[i].mod) == 
CLEANMASK(ev->state)
++                              && keys[i].func) {
++                      current = 1;
++                      keychain = keysym;
++                      XGrabKey(dpy, AnyKey, AnyModifier, root, True, 
GrabModeAsync,
++                                      GrabModeAsync);
++              } else if (!current && keysym == keys[i].keysym
++                              && keys[i].chain == keychain
++                              && keys[i].func)
+                       keys[i].func(&(keys[i].arg));
++      }
++      if (!current) {
++              keychain = -1;
++              grabkeys();
++      }
+ }
+ 
+ void
+-- 
+2.28.0
+
+
+From ad3d15cf7df3286d35728afef823c3163898e2db Mon Sep 17 00:00:00 2001
+From: braunbearded <[email protected]>
+Date: Wed, 29 Jul 2020 18:38:15 +0200
+Subject: [PATCH 2/3] update default bindings
+
+---
+ config.def.h | 80 +++++++++++++++++++++++++++-------------------------
+ 1 file changed, 41 insertions(+), 39 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 1c0b587..c7cab16 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -45,11 +45,11 @@ static const Layout layouts[] = {
+ 
+ /* key definitions */
+ #define MODKEY Mod1Mask
+-#define TAGKEYS(KEY,TAG) \
+-      { MODKEY,                       KEY,      view,           {.ui = 1 << 
TAG} }, \
+-      { MODKEY|ControlMask,           KEY,      toggleview,     {.ui = 1 << 
TAG} }, \
+-      { MODKEY|ShiftMask,             KEY,      tag,            {.ui = 1 << 
TAG} }, \
+-      { MODKEY|ControlMask|ShiftMask, KEY,      toggletag,      {.ui = 1 << 
TAG} },
++#define TAGKEYS(CHAIN,KEY,TAG) \
++      { MODKEY,                       CHAIN,    KEY,      view,           
{.ui = 1 << TAG} }, \
++      { MODKEY|ControlMask,           CHAIN,    KEY,      toggleview,     
{.ui = 1 << TAG} }, \
++      { MODKEY|ShiftMask,             CHAIN,    KEY,      tag,            
{.ui = 1 << TAG} }, \
++      { MODKEY|ControlMask|ShiftMask, CHAIN,    KEY,      toggletag,      
{.ui = 1 << TAG} },
+ 
+ /* helper for spawning shell commands in the pre dwm-5.0 fashion */
+ #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
+@@ -60,40 +60,42 @@ static const char *dmenucmd[] = { "dmenu_run", "-m", 
dmenumon, "-fn", dmenufont,
+ static const char *termcmd[]  = { "st", NULL };
+ 
+ static Key keys[] = {
+-      /* modifier                     key        function        argument */
+-      { MODKEY,                       XK_p,      spawn,          {.v = 
dmenucmd } },
+-      { MODKEY|ShiftMask,             XK_Return, spawn,          {.v = 
termcmd } },
+-      { MODKEY,                       XK_b,      togglebar,      {0} },
+-      { MODKEY,                       XK_j,      focusstack,     {.i = +1 } },
+-      { MODKEY,                       XK_k,      focusstack,     {.i = -1 } },
+-      { MODKEY,                       XK_i,      incnmaster,     {.i = +1 } },
+-      { MODKEY,                       XK_d,      incnmaster,     {.i = -1 } },
+-      { MODKEY,                       XK_h,      setmfact,       {.f = -0.05} 
},
+-      { MODKEY,                       XK_l,      setmfact,       {.f = +0.05} 
},
+-      { MODKEY,                       XK_Return, zoom,           {0} },
+-      { MODKEY,                       XK_Tab,    view,           {0} },
+-      { MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
+-      { MODKEY,                       XK_t,      setlayout,      {.v = 
&layouts[0]} },
+-      { MODKEY,                       XK_f,      setlayout,      {.v = 
&layouts[1]} },
+-      { MODKEY,                       XK_m,      setlayout,      {.v = 
&layouts[2]} },
+-      { MODKEY,                       XK_space,  setlayout,      {0} },
+-      { MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
+-      { MODKEY,                       XK_0,      view,           {.ui = ~0 } 
},
+-      { MODKEY|ShiftMask,             XK_0,      tag,            {.ui = ~0 } 
},
+-      { MODKEY,                       XK_comma,  focusmon,       {.i = -1 } },
+-      { MODKEY,                       XK_period, focusmon,       {.i = +1 } },
+-      { MODKEY|ShiftMask,             XK_comma,  tagmon,         {.i = -1 } },
+-      { MODKEY|ShiftMask,             XK_period, tagmon,         {.i = +1 } },
+-      TAGKEYS(                        XK_1,                      0)
+-      TAGKEYS(                        XK_2,                      1)
+-      TAGKEYS(                        XK_3,                      2)
+-      TAGKEYS(                        XK_4,                      3)
+-      TAGKEYS(                        XK_5,                      4)
+-      TAGKEYS(                        XK_6,                      5)
+-      TAGKEYS(                        XK_7,                      6)
+-      TAGKEYS(                        XK_8,                      7)
+-      TAGKEYS(                        XK_9,                      8)
+-      { MODKEY|ShiftMask,             XK_q,      quit,           {0} },
++      /* modifier                     chain key   key        function        
argument */
++      { MODKEY,                       -1,         XK_p,      spawn,          
{.v = dmenucmd } },
++      { MODKEY|ShiftMask,             -1,         XK_Return, spawn,          
{.v = termcmd } },
++      { MODKEY,                       -1,         XK_b,      togglebar,      
{0} },
++      { MODKEY,                       -1,         XK_j,      focusstack,     
{.i = +1 } },
++      { MODKEY,                       -1,         XK_k,      focusstack,     
{.i = -1 } },
++      { MODKEY,                       -1,         XK_i,      incnmaster,     
{.i = +1 } },
++      { MODKEY,                       -1,         XK_d,      incnmaster,     
{.i = -1 } },
++      { MODKEY,                       -1,         XK_h,      setmfact,       
{.f = -0.05} },
++      { MODKEY,                       -1,         XK_l,      setmfact,       
{.f = +0.05} },
++      { MODKEY,                       -1,         XK_Return, zoom,           
{0} },
++      { MODKEY,                       -1,         XK_Tab,    view,           
{0} },
++      { MODKEY|ShiftMask,             -1,         XK_c,      killclient,     
{0} },
++      { MODKEY,                       -1,         XK_t,      setlayout,      
{.v = &layouts[0]} },
++      { MODKEY,                       -1,         XK_f,      setlayout,      
{.v = &layouts[1]} },
++      { MODKEY,                       -1,         XK_m,      setlayout,      
{.v = &layouts[2]} },
++      { MODKEY,                       -1,         XK_space,  setlayout,      
{0} },
++      { MODKEY|ShiftMask,             -1,         XK_space,  togglefloating, 
{0} },
++      { MODKEY,                       -1,         XK_0,      view,           
{.ui = ~0 } },
++      { MODKEY|ShiftMask,             -1,         XK_0,      tag,            
{.ui = ~0 } },
++      { MODKEY,                       -1,         XK_comma,  focusmon,       
{.i = -1 } },
++      { MODKEY,                       -1,         XK_period, focusmon,       
{.i = +1 } },
++      { MODKEY|ShiftMask,             -1,         XK_comma,  tagmon,         
{.i = -1 } },
++      { MODKEY|ShiftMask,             -1,         XK_period, tagmon,         
{.i = +1 } },
++      TAGKEYS(                        -1,         XK_1,                      
0)
++      TAGKEYS(                        -1,         XK_2,                      
1)
++      TAGKEYS(                        -1,         XK_3,                      
2)
++      TAGKEYS(                        -1,         XK_4,                      
3)
++      TAGKEYS(                        -1,         XK_5,                      
4)
++      TAGKEYS(                        -1,         XK_6,                      
5)
++      TAGKEYS(                        -1,         XK_7,                      
6)
++      TAGKEYS(                        -1,         XK_8,                      
7)
++      TAGKEYS(                        -1,         XK_9,                      
8)
++      { MODKEY|ShiftMask,             -1,         XK_q,      quit,           
{0} },
++      { MODKEY,                       XK_a,       XK_d,      spawn,          
{.v = dmenucmd } },
++      { MODKEY,                       XK_a,       XK_t,      spawn,          
{.v = termcmd } },
+ };
+ 
+ /* button definitions */
+-- 
+2.28.0
+
+
+From e9f3eec82010fd6083dc57f058902a1aab2d14ea Mon Sep 17 00:00:00 2001
+From: braunbearded <[email protected]>
+Date: Wed, 29 Jul 2020 19:07:07 +0200
+Subject: [PATCH 3/3] fix bug for mod key ignore
+
+---
+ dwm.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/dwm.c b/dwm.c
+index 7298c5e..aee56d4 100644
+--- a/dwm.c
++++ b/dwm.c
+@@ -1013,6 +1013,7 @@ keypress(XEvent *e)
+                       XGrabKey(dpy, AnyKey, AnyModifier, root, True, 
GrabModeAsync,
+                                       GrabModeAsync);
+               } else if (!current && keysym == keys[i].keysym
++                              && keychain != -1
+                               && keys[i].chain == keychain
+                               && keys[i].func)
+                       keys[i].func(&(keys[i].arg));
+-- 
+2.28.0
+
diff --git a/dwm.suckless.org/patches/keychain/index.md 
b/dwm.suckless.org/patches/keychain/index.md
new file mode 100644
index 00000000..34fa69f8
--- /dev/null
+++ b/dwm.suckless.org/patches/keychain/index.md
@@ -0,0 +1,19 @@
+keychain
+====
+
+Description
+-----------
+This patch modifies the key handing so that you can chain multiple bindings
+together like in sxhkd. After pressing Mod + ChainKey the next key press
+will be matched against any KEY in the keys array which is part of the Mod +
+ChainKey group and execute its function. If there isn't any match the key press
+will be consumed without any effect. This allows you group certain bindings
+together which all starts with the specified Mod + ChainKey prefix.
+
+Download
+--------
+* [dwm-keychain-20200719-e9f3eec.diff](dwm-keychain-20200719-e9f3eec.diff)
+
+Author
+------
+* [Stefan Matz (braunbearded)](mailto:[email protected])


Reply via email to