index.md (1604B)
1 keysequence 2 =========== 3 4 Description 5 ----------- 6 7 This patch allows for defining sequential keybindings, for example `MOD+A W`. 8 This is done not through the `XGrabKey()` which is used for root bindings, 9 but by the `XGrabKeyboard()` so any key presses that are not defined will 10 stop the matching without passing them to programs. This behaviour is 11 less confusing. 12 13 It defines new bindable function `keypress_other()` that as argument takes 14 a pointer to array of bindings. 15 16 static Key keyseq_a[] = { 17 { 0, XK_t, setlayout, {.v = &layouts[0]}}, 18 { ShiftMask, XK_t, setlayout, {.v = &layouts[1]}}, 19 { MODKEY, XK_y, setlayout, {.v = &layouts[2]}}, 20 {0} 21 } 22 23 static Key keys[] = { 24 { MODKEY, XK_a, keypress_other, {.v = keyseq_a}}, 25 {0} 26 } 27 28 This assigns `MOD+a t`, `MOD+a T`, `MOD+a MOD+y` to changing layout, you can 29 nest bindings endlessly. 30 31 Notice that now keybinding arrays are ended by `{0}` empty element, 32 this is necessary because `Arg` structure can take only pointer 33 sized elements, there's no place to specify size so it has to be 34 calculated while running. 35 36 While typing sequence all events are ignored other than key presses 37 and mouse, moving mouse exits sequence. 38 39 Save your hands! Don't make long sequences, stick to simple, easy to 40 access binding and use plain letters, realistically speaking you'll 41 use it for dmenu scripts, layout bindings, and other rarely used 42 commands. 43 44 Download 45 -------- 46 * [keysequence-20250606-0d6af14.diff](keysequence-20250606-0d6af14.diff) 47 48 Author 49 ------ 50 * TUVIMEN <hexderm@gmail.com>