dwm-keychain-20200729-053e3a2.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       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