commit 8ba2c6de150cbb0d78377607506cdf88befcafda
Author: Aaron Züger <[email protected]>
Date:   Wed Jul 19 14:36:41 2023 +0200

    [dwm][patch] updating grabkeys function of the keychord patch to match the 
corresponding function in dwm-6.4.

diff --git a/dwm.suckless.org/patches/keychord/dwm-keychord-6.4.diff 
b/dwm.suckless.org/patches/keychord/dwm-keychord-6.4.diff
new file mode 100644
index 00000000..96d6145f
--- /dev/null
+++ b/dwm.suckless.org/patches/keychord/dwm-keychord-6.4.diff
@@ -0,0 +1,235 @@
+From cb7ea178ac8e60cf123b333af64df8228762f669 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Aaron=20Z=C3=BCger?= <[email protected]>
+Date: Wed, 19 Jul 2023 14:17:39 +0200
+Subject: [PATCH] Update dwm-keychord patch to comply with the changes in dwm
+ from version 6.2 to version 6.4. Namely changes in the grabkey function to
+ match the newer implementation of said function.
+
+---
+ config.def.h | 81 ++++++++++++++++++++++++++--------------------------
+ dwm.c        | 72 +++++++++++++++++++++++++++++++++++++---------
+ 2 files changed, 99 insertions(+), 54 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 9efa774..49f0558 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,41 +60,42 @@ 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 const 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} },
++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 } }),
++       &((Keychord){1, {{MODKEY|ShiftMask, XK_q}},                            
 quit,           {0} }),
++         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)
+ };
+ 
+ /* button definitions */
+diff --git a/dwm.c b/dwm.c
+index f1d86b2..e4885a4 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;
+@@ -267,6 +272,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,7 +960,8 @@ grabkeys(void)
+ {
+       updatenumlockmask();
+       {
+-              unsigned int i, j, k;
++              /* unsigned int i, j, k; */
++              unsigned int i, c, k;
+               unsigned int modifiers[] = { 0, LockMask, numlockmask, 
numlockmask|LockMask };
+               int start, end, skip;
+               KeySym *syms;
+@@ -964,15 +971,18 @@ grabkeys(void)
+               syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip);
+               if (!syms)
+                       return;
++
+               for (k = start; k <= end; k++)
+-                      for (i = 0; i < LENGTH(keys); i++)
++                      for (i = 0; i < LENGTH(keychords); i++)
+                               /* skip modifier codes, we do that ourselves */
+-                              if (keys[i].keysym == syms[(k - start) * skip])
+-                                      for (j = 0; j < LENGTH(modifiers); j++)
++                              if (keychords[i]->keys[currentkey].keysym == 
syms[(k - start) * skip])
++                                      for (c = 0; c < LENGTH(modifiers); c++)
+                                               XGrabKey(dpy, k,
+-                                                       keys[i].mod | 
modifiers[j],
++                                                       
keychords[i]->keys[currentkey].mod | modifiers[c],
+                                                        root, True,
+                                                        GrabModeAsync, 
GrabModeAsync);
++                if(currentkey > 0)
++                        XGrabKey(dpy, XKeysymToKeycode(dpy, XK_Escape), 
AnyModifier, root, True, GrabModeAsync, GrabModeAsync);
+               XFree(syms);
+       }
+ }
+@@ -999,17 +1009,51 @@ isuniquegeom(XineramaScreenInfo *unique, size_t n, 
XineramaScreenInfo *info)
+ void
+ keypress(XEvent *e)
+ {
+-      unsigned int i;
++      /* 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.41.0
+
diff --git a/dwm.suckless.org/patches/keychord/index.md 
b/dwm.suckless.org/patches/keychord/index.md
index 5af58e63..265d2764 100644
--- a/dwm.suckless.org/patches/keychord/index.md
+++ b/dwm.suckless.org/patches/keychord/index.md
@@ -8,12 +8,17 @@ A patch that change the Key struct to Keychord, letting user 
map a sequence of k
 *update 01/19/2022:
 change implementation to use array and pointer instead of dynamic heap 
allocation to minimize crash due heap allocation being too slow.
 
+*update 07/19/2023:
+changed grabkeys function to match the changes made in dwm-6.4.  
+
 
 Download
 --------
 * [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/2022) (latest version)
+* [dwm-keychord-6.2.diff](dwm-keychord-6.2.diff) (01/19/2022)
+* [dwm-keychord-6.4.diff](dwm-keychord-6.4.diff) (07/19/2023) (latest version)
 
 Authors
 -------
 * Hai Nguyen - <[email protected]>
+* Aaron Züger - <[email protected]>


Reply via email to