dwm-grab-all-keycodes-6.2.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-grab-all-keycodes-6.2.diff (1859B)
       ---
            1 From f64e5ddc9bc47dd3bca79a1eac214525ba005caf Mon Sep 17 00:00:00 2001
            2 From: Alexander Courtis <acourtis@atlassian.com>
            3 Date: Sat, 15 Feb 2020 14:23:26 +1100
            4 Subject: [PATCH] Grab all keycodes that map to keys.keysym
            5 
            6 There may be multiple keycodes that map to a keys.keysym. One such scenario is using xkb to remap a key: `caps:escape`
            7 
            8 When grabbing keys, we now scan all X keycode mappings and look for match.
            9 
           10 Changing keymaps via xkb or other means will not cause the keys to be "re-grabbed". This existing behaviour is desirable.
           11 
           12 ---
           13  dwm.c | 26 ++++++++++++++++++++------
           14  1 file changed, 20 insertions(+), 6 deletions(-)
           15 
           16 diff --git a/dwm.c b/dwm.c
           17 index cc4fce7..04f6220 100644
           18 --- a/dwm.c
           19 +++ b/dwm.c
           20 @@ -1104,14 +1104,28 @@ grabkeys(void)
           21          {
           22                  unsigned int i, j;
           23                  unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
           24 -                KeyCode code;
           25 +                int kc, kcmin, kcmax, kcper;
           26 +                KeySym keysym, *keysyms;
           27  
           28                  XUngrabKey(dpy, AnyKey, AnyModifier, root);
           29 -                for (i = 0; i < LENGTH(keys); i++)
           30 -                        if ((code = XKeysymToKeycode(dpy, keys[i].keysym)))
           31 -                                for (j = 0; j < LENGTH(modifiers); j++)
           32 -                                        XGrabKey(dpy, code, keys[i].mod | modifiers[j], root,
           33 -                                                True, GrabModeAsync, GrabModeAsync);
           34 +
           35 +                /* retrieve all the keycode -> keysym mappings */
           36 +                XDisplayKeycodes(dpy, &kcmin, &kcmax);
           37 +                keysyms = XGetKeyboardMapping(dpy, kcmin, kcmax - kcmin + 1, &kcper);
           38 +
           39 +                /* only look at the first keysym for each keycode as we handle shifted states */
           40 +                for (kc = kcmin; kc <= kcmax; kc++) {
           41 +                        keysym = keysyms[(kc - kcmin) * kcper];
           42 +                        for (i = 0; i < LENGTH(keys); i++) {
           43 +                                if (keys[i].keysym == keysym) {
           44 +                                        for (j = 0; j < LENGTH(modifiers); j++) {
           45 +                                                XGrabKey(dpy, kc, keys[i].mod | modifiers[j], root, True, GrabModeAsync, GrabModeAsync);
           46 +                                        }
           47 +                                }
           48 +                        }
           49 +                }
           50 +
           51 +                XFree(keysyms);
           52          }
           53  }
           54  
           55 -- 
           56 2.25.0
           57