commit 99b85c64f2e9589ad3b251cc3cca05fba33b3df6
Author: Hai Nguyen <[email protected]>
Date:   Wed Jan 19 04:45:29 2022 -0500

    update keychord to add new version of patch

diff --git a/dwm.suckless.org/patches/keychord/dwm-keychord-6.2.diff 
b/dwm.suckless.org/patches/keychord/dwm-keychord-6.2.diff
new file mode 100644
index 00000000..98ac4a8f
--- /dev/null
+++ b/dwm.suckless.org/patches/keychord/dwm-keychord-6.2.diff
@@ -0,0 +1,214 @@
+From af959703381f2c216624eff7795f59156b05c2a0 Mon Sep 17 00:00:00 2001
+From: Hai Nguyen <[email protected]>
+Date: Wed, 19 Jan 2022 04:38:20 -0500
+Subject: [PATCH] implement keychord using array and pointer instead of heap
+ allocation
+
+---
+ config.def.h | 63 +++++++++++++++++++++++----------------------
+ dwm.c        | 72 ++++++++++++++++++++++++++++++++++++++++------------
+ 2 files changed, 88 insertions(+), 47 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index a2ac963..7cc8ddd 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -46,11 +46,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(KEY,TAG)                                                      
                                        \
++      &((Keychord){1, {{MODKEY, KEY}},                                        
                        view,           {.ui = 1 << TAG} }), \
++              &((Keychord){1, {{MODKEY|ControlMask, KEY}},                    
                toggleview,     {.ui = 1 << TAG} }), \
++              &((Keychord){1, {{MODKEY|ShiftMask, KEY}},                      
                        tag,            {.ui = 1 << TAG} }), \
++              &((Keychord){1, {{MODKEY|ControlMask|ShiftMask, 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,31 +60,32 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, 
manipulated in spawn()
+ static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", 
dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", 
col_gray4, NULL };
+ 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 } },
++static Keychord *keychords[] = {
++      /* Keys        function        argument */
++      &((Keychord){1, {{MODKEY, XK_p}},                                       
                spawn,          {.v = dmenucmd } }),
++      &((Keychord){1, {{MODKEY|ShiftMask, XK_Return}},                        
spawn,          {.v = termcmd } }),
++      &((Keychord){2, {{MODKEY, XK_e}, {MODKEY, XK_e}},                       
spawn,          {.v = termcmd } }),
++      &((Keychord){1, {{MODKEY, XK_b}},                                       
                togglebar,      {0} }),
++      &((Keychord){1, {{MODKEY, XK_j}},                                       
                focusstack,     {.i = +1 } }),
++      &((Keychord){1, {{MODKEY, XK_k}},                                       
                focusstack,     {.i = -1 } }),
++      &((Keychord){1, {{MODKEY, XK_i}},                                       
                incnmaster,     {.i = +1 } }),
++      &((Keychord){1, {{MODKEY, XK_d}},                                       
                incnmaster,     {.i = -1 } }),
++      &((Keychord){1, {{MODKEY, XK_h}},                                       
                setmfact,       {.f = -0.05} }),
++      &((Keychord){1, {{MODKEY, XK_l}},                                       
                setmfact,       {.f = +0.05} }),
++      &((Keychord){1, {{MODKEY, XK_Return}},                                  
        zoom,           {0} }),
++      &((Keychord){1, {{MODKEY, XK_Tab}},                                     
                view,           {0} }),
++      &((Keychord){1, {{MODKEY|ShiftMask, XK_c}},                             
        killclient,     {0} }),
++      &((Keychord){1, {{MODKEY, XK_t}},                                       
                setlayout,      {.v = &layouts[0]} }),
++      &((Keychord){1, {{MODKEY, XK_f}},                                       
                setlayout,      {.v = &layouts[1]} }),
++      &((Keychord){1, {{MODKEY, XK_m}},                                       
                setlayout,      {.v = &layouts[2]} }),
++      &((Keychord){1, {{MODKEY, XK_space}},                                   
        setlayout,      {0} }),
++      &((Keychord){1, {{MODKEY|ShiftMask, XK_space}},                         
togglefloating, {0} }),
++      &((Keychord){1, {{MODKEY, XK_0}},                                       
                view,           {.ui = ~0 } }),
++      &((Keychord){1, {{MODKEY|ShiftMask, XK_0}},                             
        tag,            {.ui = ~0 } }),
++      &((Keychord){1, {{MODKEY, XK_comma}},                                   
        focusmon,       {.i = -1 } }),
++      &((Keychord){1, {{MODKEY, XK_period}},                                  
        focusmon,       {.i = +1 } }),
++      &((Keychord){1, {{MODKEY|ShiftMask, XK_comma}},                         
tagmon,         {.i = -1 } }),
++      &((Keychord){1, {{MODKEY|ShiftMask, XK_period}},                        
tagmon,         {.i = +1 } }),
+       TAGKEYS(                        XK_1,                      0)
+       TAGKEYS(                        XK_2,                      1)
+       TAGKEYS(                        XK_3,                      2)
+@@ -94,7 +95,7 @@ static Key keys[] = {
+       TAGKEYS(                        XK_7,                      6)
+       TAGKEYS(                        XK_8,                      7)
+       TAGKEYS(                        XK_9,                      8)
+-      { MODKEY|ShiftMask,             XK_q,      quit,           {0} },
++      &((Keychord){1, {{MODKEY|ShiftMask, XK_q}},                             
        quit,           {0} }),
+ };
+ 
+ /* button definitions */
+diff --git a/dwm.c b/dwm.c
+index a96f33c..f9777bd 100644
+--- a/dwm.c
++++ b/dwm.c
+@@ -102,9 +102,14 @@ struct Client {
+ typedef struct {
+       unsigned int mod;
+       KeySym keysym;
++} Key;
++
++typedef struct {
++      unsigned int n;
++      const Key keys[5];
+       void (*func)(const Arg *);
+       const Arg arg;
+-} Key;
++} Keychord;
+ 
+ typedef struct {
+       const char *symbol;
+@@ -268,6 +273,7 @@ static Display *dpy;
+ static Drw *drw;
+ static Monitor *mons, *selmon;
+ static Window root, wmcheckwin;
++unsigned int currentkey = 0;
+ 
+ /* configuration, allows nested code to access above variables */
+ #include "config.h"
+@@ -954,16 +960,17 @@ grabkeys(void)
+ {
+       updatenumlockmask();
+       {
+-              unsigned int i, j;
++              unsigned int i, k;
+               unsigned int modifiers[] = { 0, LockMask, numlockmask, 
numlockmask|LockMask };
+               KeyCode code;
+-
+               XUngrabKey(dpy, AnyKey, AnyModifier, root);
+-              for (i = 0; i < LENGTH(keys); i++)
+-                      if ((code = XKeysymToKeycode(dpy, keys[i].keysym)))
+-                              for (j = 0; j < LENGTH(modifiers); j++)
+-                                      XGrabKey(dpy, code, keys[i].mod | 
modifiers[j], root,
+-                                              True, GrabModeAsync, 
GrabModeAsync);
++              for (i = 0; i < LENGTH(keychords); i++)
++                      if ((code = XKeysymToKeycode(dpy, 
keychords[i]->keys[currentkey].keysym)))
++                              for (k = 0; k < LENGTH(modifiers); k++)
++                                      XGrabKey(dpy, code, 
keychords[i]->keys[currentkey].mod | modifiers[k], root,
++                                                       True, GrabModeAsync, 
GrabModeAsync);
++              if(currentkey > 0)
++                      XGrabKey(dpy, XKeysymToKeycode(dpy, XK_Escape), 
AnyModifier, root, True, GrabModeAsync, GrabModeAsync);
+       }
+ }
+ 
+@@ -989,17 +996,50 @@ isuniquegeom(XineramaScreenInfo *unique, size_t n, 
XineramaScreenInfo *info)
+ void
+ keypress(XEvent *e)
+ {
+-      unsigned int i;
++      XEvent event = *e;
++      unsigned int ran = 0;
+       KeySym keysym;
+       XKeyEvent *ev;
+ 
+-      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)
+-                      keys[i].func(&(keys[i].arg));
++      Keychord *arr1[sizeof(keychords) / sizeof(Keychord*)];
++      Keychord *arr2[sizeof(keychords) / sizeof(Keychord*)];
++      memcpy(arr1, keychords, sizeof(keychords));
++      Keychord **rpointer = arr1;
++      Keychord **wpointer = arr2;
++
++      size_t r = sizeof(keychords)/ sizeof(Keychord*);
++
++      while(1){
++              ev = &event.xkey;
++              keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
++              size_t w = 0;
++              for (int i = 0; i < r; i++){
++                      if(keysym == (*(rpointer + i))->keys[currentkey].keysym
++                         && CLEANMASK((*(rpointer + 
i))->keys[currentkey].mod) == CLEANMASK(ev->state)
++                         && (*(rpointer + i))->func){
++                              if((*(rpointer + i))->n == currentkey +1){
++                                      (*(rpointer + i))->func(&((*(rpointer + 
i))->arg));
++                                      ran = 1;
++                              }else{
++                                      *(wpointer + w) = *(rpointer + i);
++                                      w++;
++                              }
++                      }
++              }
++              currentkey++;
++              if(w == 0 || ran == 1)
++                      break;
++              grabkeys();
++              while (running && !XNextEvent(dpy, &event) && !ran)
++                      if(event.type == KeyPress)
++                              break;
++              r = w;
++              Keychord **holder = rpointer;
++              rpointer = wpointer;
++              wpointer = holder;
++      }
++      currentkey = 0;
++      grabkeys();
+ }
+ 
+ void
+-- 
+2.34.1
+
diff --git a/dwm.suckless.org/patches/keychord/index.md 
b/dwm.suckless.org/patches/keychord/index.md
index cb52e4f6..30d16792 100644
--- a/dwm.suckless.org/patches/keychord/index.md
+++ b/dwm.suckless.org/patches/keychord/index.md
@@ -5,10 +5,14 @@ Description
 -----------
 A patch that change the Key struct to Keychord, letting user map a sequence of 
key instead of one singular keystroke.
 
+*update 01/19/2021:
+change implementation to use array and pointer instead of dynamic heap 
allocation to minimize crash due heap allocation being too slow.
+
 
 Download
 --------
-* [dwm-keychord-20211210-a786211.diff](dwm-keychord-20211210-a786211.diff)
+* [dwm-keychord-20211210-a786211.diff](dwm-keychord-20211210-a786211.diff) 
(10/12/2021)
+* [dwm-keychord-6.2.diff](dwm-keychord-6.2.diff) (01/19/2021)
 
 Authors
 -------


Reply via email to