Browse Source

initial implementation for modifiers

https://github.com/zmkfirmware/zmk/issues/86
xmkb
Okke Formsma 4 years ago committed by Pete Johanson
parent
commit
4f258efbf1
  1. 30
      app/include/dt-bindings/zmk/keys.h
  2. 10
      app/include/zmk/events/keycode-state-changed.h
  3. 4
      app/include/zmk/hid.h
  4. 6
      app/src/behaviors/behavior_hold_tap.c
  5. 49
      app/src/hid.c
  6. 51
      app/src/hid_listener.c
  7. 1
      app/src/keymap.c
  8. 4
      app/tests/hold-tap/balanced/1-dn-up/keycode_events.snapshot
  9. 4
      app/tests/hold-tap/balanced/2-dn-timer-up/keycode_events.snapshot
  10. 8
      app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/keycode_events.snapshot
  11. 8
      app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/keycode_events.snapshot
  12. 8
      app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/keycode_events.snapshot
  13. 8
      app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot
  14. 8
      app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/keycode_events.snapshot
  15. 8
      app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot
  16. 8
      app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot
  17. 8
      app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/keycode_events.snapshot
  18. 8
      app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot
  19. 16
      app/tests/hold-tap/balanced/many-nested/keycode_events.snapshot
  20. 4
      app/tests/hold-tap/hold-preferred/1-dn-up/keycode_events.snapshot
  21. 4
      app/tests/hold-tap/hold-preferred/2-dn-timer-up/keycode_events.snapshot
  22. 8
      app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot
  23. 8
      app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot
  24. 8
      app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/keycode_events.snapshot
  25. 8
      app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot
  26. 8
      app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot
  27. 8
      app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot
  28. 8
      app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot
  29. 8
      app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot
  30. 8
      app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot
  31. 4
      app/tests/hold-tap/tap-preferred/1-dn-up/keycode_events.snapshot
  32. 4
      app/tests/hold-tap/tap-preferred/2-dn-timer-up/keycode_events.snapshot
  33. 8
      app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot
  34. 8
      app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot
  35. 8
      app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/keycode_events.snapshot
  36. 8
      app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot
  37. 8
      app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot
  38. 8
      app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot
  39. 8
      app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot
  40. 8
      app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot
  41. 8
      app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot
  42. 16
      app/tests/keypress/behavior_keymap.dtsi
  43. 4
      app/tests/keypress/cp-press-release/keycode_events.snapshot
  44. 2
      app/tests/keypress/cp-press-release/native_posix.keymap
  45. 4
      app/tests/keypress/kp-press-release/keycode_events.snapshot
  46. 5
      app/tests/keypress/kp-press-release/native_posix.keymap
  47. 4
      app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/events.patterns
  48. 17
      app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/keycode_events.snapshot
  49. 27
      app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix.keymap
  50. 4
      app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/events.patterns
  51. 9
      app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/keycode_events.snapshot
  52. 25
      app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix.keymap
  53. 4
      app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/events.patterns
  54. 18
      app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/keycode_events.snapshot
  55. 27
      app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix.keymap
  56. 4
      app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/events.patterns
  57. 18
      app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/keycode_events.snapshot
  58. 28
      app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix.keymap
  59. 4
      app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/events.patterns
  60. 8
      app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/keycode_events.snapshot
  61. 27
      app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix.keymap
  62. 9
      app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending
  63. 4
      app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/events.patterns
  64. 8
      app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/keycode_events.snapshot
  65. 27
      app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix.keymap
  66. 4
      app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/events.patterns
  67. 13
      app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot
  68. 27
      app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix.keymap
  69. 4
      app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/events.patterns
  70. 13
      app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/keycode_events.snapshot
  71. 27
      app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix.keymap
  72. 4
      app/tests/momentary-layer/early-key-release/keycode_events.snapshot
  73. 4
      app/tests/momentary-layer/normal/keycode_events.snapshot
  74. 8
      app/tests/toggle-layer/early-key-release/keycode_events.snapshot
  75. 4
      app/tests/toggle-layer/normal/keycode_events.snapshot
  76. 4
      app/tests/transparent/layered/keycode_events.snapshot
  77. 4
      docs/docs/feature/keymaps.md

30
app/include/dt-bindings/zmk/keys.h

@ -3,7 +3,6 @@
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#pragma once #pragma once
#define USAGE_KEYPAD 0x07 #define USAGE_KEYPAD 0x07
@ -144,11 +143,24 @@
#define M_VOLU 0xE9 #define M_VOLU 0xE9
#define M_VOLD 0xEA #define M_VOLD 0xEA
#define MOD_LCTL (1 << 0x00) #define MOD_LCTL 0x01
#define MOD_LSFT (1 << 0x01) #define MOD_LSFT 0x02
#define MOD_LALT (1 << 0x02) #define MOD_LALT 0x04
#define MOD_LGUI (1 << 0x03) #define MOD_LGUI 0x08
#define MOD_RCTL (1 << 0x04) #define MOD_RCTL 0x10
#define MOD_RSFT (1 << 0x05) #define MOD_RSFT 0x20
#define MOD_RALT (1 << 0x06) #define MOD_RALT 0x40
#define MOD_RGUI (1 << 0x07) #define MOD_RGUI 0x80
#define SELECT_MODS(keycode) (keycode >> 24)
#define STRIP_MODS(keycode) (keycode & ~(0xFF << 24))
#define APPLY_MODS(mods, keycode) (mods << 24 | keycode)
#define LC(keycode) APPLY_MODS(MOD_LCTL, keycode)
#define LS(keycode) APPLY_MODS(MOD_LSFT, keycode)
#define LA(keycode) APPLY_MODS(MOD_LALT, keycode)
#define LG(keycode) APPLY_MODS(MOD_LGUI, keycode)
#define RC(keycode) APPLY_MODS(MOD_RCTL, keycode)
#define RS(keycode) APPLY_MODS(MOD_RSFT, keycode)
#define RA(keycode) APPLY_MODS(MOD_RALT, keycode)
#define RG(keycode) APPLY_MODS(MOD_RGUI, keycode)

10
app/include/zmk/events/keycode-state-changed.h

@ -7,22 +7,24 @@
#pragma once #pragma once
#include <zephyr.h> #include <zephyr.h>
#include <dt-bindings/zmk/keys.h>
#include <zmk/event-manager.h> #include <zmk/event-manager.h>
struct keycode_state_changed { struct keycode_state_changed {
struct zmk_event_header header; struct zmk_event_header header;
u8_t usage_page; u8_t usage_page;
u32_t keycode; u32_t keycode;
u8_t implicit_modifiers;
bool state; bool state;
}; };
ZMK_EVENT_DECLARE(keycode_state_changed); ZMK_EVENT_DECLARE(keycode_state_changed);
inline struct keycode_state_changed *create_keycode_state_changed(u8_t usage_page, u32_t keycode, static inline struct keycode_state_changed *create_keycode_state_changed(u8_t usage_page, u32_t keycode, bool state) {
bool state) {
struct keycode_state_changed *ev = new_keycode_state_changed(); struct keycode_state_changed *ev = new_keycode_state_changed();
ev->usage_page = usage_page; ev->usage_page = usage_page;
ev->keycode = keycode; ev->keycode = STRIP_MODS(keycode);
ev->implicit_modifiers = SELECT_MODS(keycode);
ev->state = state; ev->state = state;
return ev; return ev;
} }

4
app/include/zmk/hid.h

@ -164,8 +164,8 @@ struct zmk_hid_consumer_report {
int zmk_hid_register_mod(zmk_mod modifier); int zmk_hid_register_mod(zmk_mod modifier);
int zmk_hid_unregister_mod(zmk_mod modifier); int zmk_hid_unregister_mod(zmk_mod modifier);
int zmk_hid_register_mods(zmk_mod_flags modifiers); int zmk_hid_implicit_modifiers_press(zmk_mod_flags implicit_modifiers);
int zmk_hid_unregister_mods(zmk_mod_flags modifiers); int zmk_hid_implicit_modifiers_release();
int zmk_hid_keypad_press(zmk_key key); int zmk_hid_keypad_press(zmk_key key);
int zmk_hid_keypad_release(zmk_key key); int zmk_hid_keypad_release(zmk_key key);
void zmk_hid_keypad_clear(); void zmk_hid_keypad_clear();

6
app/src/behaviors/behavior_hold_tap.c

@ -8,6 +8,7 @@
#include <device.h> #include <device.h>
#include <drivers/behavior.h> #include <drivers/behavior.h>
#include <dt-bindings/zmk/keys.h>
#include <logging/log.h> #include <logging/log.h>
#include <zmk/behavior.h> #include <zmk/behavior.h>
#include <zmk/matrix.h> #include <zmk/matrix.h>
@ -16,7 +17,6 @@
#include <zmk/events/position-state-changed.h> #include <zmk/events/position-state-changed.h>
#include <zmk/events/keycode-state-changed.h> #include <zmk/events/keycode-state-changed.h>
#include <zmk/events/modifiers-state-changed.h> #include <zmk/events/modifiers-state-changed.h>
#include <zmk/hid.h>
#include <zmk/behavior.h> #include <zmk/behavior.h>
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
@ -427,7 +427,7 @@ static int position_state_changed_listener(const struct zmk_event_header *eh) {
return ZMK_EV_EVENT_CAPTURED; return ZMK_EV_EVENT_CAPTURED;
} }
static bool is_mod(struct keycode_state_changed *ev) { static inline bool only_mods(struct keycode_state_changed *ev) {
return ev->usage_page == USAGE_KEYPAD && ev->keycode >= LCTL && ev->keycode <= RGUI; return ev->usage_page == USAGE_KEYPAD && ev->keycode >= LCTL && ev->keycode <= RGUI;
} }
@ -440,7 +440,7 @@ static int keycode_state_changed_listener(const struct zmk_event_header *eh) {
return 0; return 0;
} }
if (!is_mod(ev)) { if (!only_mods(ev)) {
// LOG_DBG("0x%02X bubble (not a mod)", ev->keycode); // LOG_DBG("0x%02X bubble (not a mod)", ev->keycode);
return 0; return 0;
} }

49
app/src/hid.c

@ -8,29 +8,44 @@
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
#include <zmk/hid.h> #include <zmk/hid.h>
#include <dt-bindings/zmk/keys.h>
static struct zmk_hid_keypad_report kp_report = { static struct zmk_hid_keypad_report kp_report = {
.report_id = 1, .body = {.modifiers = 0, ._reserved = 0, .keys = {0}}}; .report_id = 1, .body = {.modifiers = 0, ._reserved = 0, .keys = {0}}};
static struct zmk_hid_consumer_report consumer_report = {.report_id = 2, .body = {.keys = {0}}}; static struct zmk_hid_consumer_report consumer_report = {.report_id = 2, .body = {.keys = {0}}};
#define _TOGGLE_MOD(mod, state) \ // Keep track of how often a modifier was pressed.
if (modifier > MOD_RGUI) { \ // Only release the modifier if the count is 0.
return -EINVAL; \ static int explicit_modifier_counts[8] = {0, 0, 0, 0, 0, 0, 0, 0};
} \ static zmk_mod_flags explicit_modifiers = 0;
WRITE_BIT(kp_report.body.modifiers, mod, state); \
return 0;
int zmk_hid_register_mod(zmk_mod modifier) { _TOGGLE_MOD(modifier, true); } #define SET_MODIFIERS(mods) \
int zmk_hid_unregister_mod(zmk_mod modifier) { _TOGGLE_MOD(modifier, false); } { \
kp_report.body.modifiers = mods; \
LOG_DBG("Modifiers set to 0x%02X", kp_report.body.modifiers); \
}
int zmk_hid_register_mods(zmk_mod_flags modifiers) { int zmk_hid_register_mod(zmk_mod modifier) {
kp_report.body.modifiers |= modifiers; explicit_modifier_counts[modifier]++;
LOG_DBG("Modifier %d count %d", modifier, explicit_modifier_counts[modifier]);
WRITE_BIT(explicit_modifiers, modifier, true);
SET_MODIFIERS(explicit_modifiers);
return 0; return 0;
} }
int zmk_hid_unregister_mods(zmk_mod_flags modifiers) { int zmk_hid_unregister_mod(zmk_mod modifier) {
kp_report.body.modifiers &= ~modifiers; if (explicit_modifier_counts[modifier] <= 0) {
LOG_ERR("Tried to unregister modifier %d too often", modifier);
return -EINVAL;
}
explicit_modifier_counts[modifier]--;
LOG_DBG("Modifier %d count: %d", modifier, explicit_modifier_counts[modifier]);
if (explicit_modifier_counts[modifier] == 0) {
LOG_DBG("Modifier %d released", modifier);
WRITE_BIT(explicit_modifiers, modifier, false);
}
SET_MODIFIERS(explicit_modifiers);
return 0; return 0;
} }
@ -52,6 +67,16 @@ int zmk_hid_unregister_mods(zmk_mod_flags modifiers) {
break; \ break; \
} }
int zmk_hid_implicit_modifiers_press(zmk_mod_flags implicit_modifiers) {
SET_MODIFIERS(explicit_modifiers | implicit_modifiers);
return 0;
}
int zmk_hid_implicit_modifiers_release() {
SET_MODIFIERS(explicit_modifiers);
return 0;
}
int zmk_hid_keypad_press(zmk_key code) { int zmk_hid_keypad_press(zmk_key code) {
if (code >= LCTL && code <= RGUI) { if (code >= LCTL && code <= RGUI) {
return zmk_hid_register_mod(code - LCTL); return zmk_hid_register_mod(code - LCTL);

51
app/src/hid_listener.c

@ -15,10 +15,11 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
#include <zmk/hid.h> #include <zmk/hid.h>
#include <zmk/endpoints.h> #include <zmk/endpoints.h>
static int hid_listener_keycode_pressed(u8_t usage_page, u32_t keycode) { static int hid_listener_keycode_pressed(u8_t usage_page, u32_t keycode,
zmk_mod_flags implicit_modifiers) {
int err; int err;
LOG_DBG("usage_page 0x%02X keycode 0x%02X", usage_page, keycode); LOG_DBG("usage_page 0x%02X keycode 0x%02X mods 0x%02X", usage_page, keycode,
implicit_modifiers);
switch (usage_page) { switch (usage_page) {
case USAGE_KEYPAD: case USAGE_KEYPAD:
err = zmk_hid_keypad_press(keycode); err = zmk_hid_keypad_press(keycode);
@ -35,14 +36,15 @@ static int hid_listener_keycode_pressed(u8_t usage_page, u32_t keycode) {
} }
break; break;
} }
zmk_hid_implicit_modifiers_press(implicit_modifiers);
return zmk_endpoints_send_report(usage_page); return zmk_endpoints_send_report(usage_page);
} }
static int hid_listener_keycode_released(u8_t usage_page, u32_t keycode) { static int hid_listener_keycode_released(u8_t usage_page, u32_t keycode,
zmk_mod_flags implicit_modifiers) {
int err; int err;
LOG_DBG("usage_page 0x%02X keycode 0x%02X", usage_page, keycode); LOG_DBG("usage_page 0x%02X keycode 0x%02X mods 0x%02X", usage_page, keycode,
implicit_modifiers);
switch (usage_page) { switch (usage_page) {
case USAGE_KEYPAD: case USAGE_KEYPAD:
err = zmk_hid_keypad_release(keycode); err = zmk_hid_keypad_release(keycode);
@ -57,44 +59,27 @@ static int hid_listener_keycode_released(u8_t usage_page, u32_t keycode) {
LOG_ERR("Unable to release keycode"); LOG_ERR("Unable to release keycode");
return err; return err;
} }
break;
} }
// There is a minor issue with this code.
// If LC(A) is pressed, then LS(B), then LC(A) is released, the shift for B will be released
// prematurely. This causes if LS(B) to repeat like Bbbbbbbb when pressed for a long time.
// Solving this would require keeping track of which key's implicit modifiers are currently
// active and only releasing modifiers at that time.
zmk_hid_implicit_modifiers_release();
return zmk_endpoints_send_report(usage_page); return zmk_endpoints_send_report(usage_page);
} }
static int hid_listener_modifiers_pressed(zmk_mod_flags modifiers) {
LOG_DBG("modifiers %d", modifiers);
zmk_hid_register_mods(modifiers);
return zmk_endpoints_send_report(USAGE_KEYPAD);
}
static int hid_listener_modifiers_released(zmk_mod_flags modifiers) {
LOG_DBG("modifiers %d", modifiers);
zmk_hid_unregister_mods(modifiers);
return zmk_endpoints_send_report(USAGE_KEYPAD);
}
int hid_listener(const struct zmk_event_header *eh) { int hid_listener(const struct zmk_event_header *eh) {
if (is_keycode_state_changed(eh)) { if (is_keycode_state_changed(eh)) {
const struct keycode_state_changed *ev = cast_keycode_state_changed(eh); const struct keycode_state_changed *ev = cast_keycode_state_changed(eh);
if (ev->state) { if (ev->state) {
hid_listener_keycode_pressed(ev->usage_page, ev->keycode); hid_listener_keycode_pressed(ev->usage_page, ev->keycode, ev->implicit_modifiers);
} else {
hid_listener_keycode_released(ev->usage_page, ev->keycode);
}
} else if (is_modifiers_state_changed(eh)) {
const struct modifiers_state_changed *ev = cast_modifiers_state_changed(eh);
if (ev->state) {
hid_listener_modifiers_pressed(ev->modifiers);
} else { } else {
hid_listener_modifiers_released(ev->modifiers); hid_listener_keycode_released(ev->usage_page, ev->keycode, ev->implicit_modifiers);
} }
} }
return 0; return 0;
} }
ZMK_LISTENER(hid_listener, hid_listener); ZMK_LISTENER(hid_listener, hid_listener);
ZMK_SUBSCRIPTION(hid_listener, keycode_state_changed); ZMK_SUBSCRIPTION(hid_listener, keycode_state_changed);
ZMK_SUBSCRIPTION(hid_listener, modifiers_state_changed);

1
app/src/keymap.c

@ -11,7 +11,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
#include <zmk/matrix.h> #include <zmk/matrix.h>
#include <zmk/sensors.h> #include <zmk/sensors.h>
#include <zmk/keymap.h> #include <zmk/keymap.h>
#include <dt-bindings/zmk/matrix-transform.h>
#include <drivers/behavior.h> #include <drivers/behavior.h>
#include <zmk/behavior.h> #include <zmk/behavior.h>

4
app/tests/hold-tap/balanced/1-dn-up/keycode_events.snapshot

@ -1,5 +1,5 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided tap (balanced event 0) ht_decide: 0 decided tap (balanced event 0)
kp_pressed: usage_page 0x07 keycode 0x09 kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

4
app/tests/hold-tap/balanced/2-dn-timer-up/keycode_events.snapshot

@ -1,5 +1,5 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (balanced event 3) ht_decide: 0 decided hold (balanced event 3)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/keycode_events.snapshot

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0xe4 kp_pressed: usage_page 0x07 keycode 0xe4 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided tap (balanced event 0) ht_decide: 0 decided tap (balanced event 0)
kp_pressed: usage_page 0x07 keycode 0x09 kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
kp_released: usage_page 0x07 keycode 0xe4 kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/keycode_events.snapshot

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0xe4 kp_pressed: usage_page 0x07 keycode 0xe4 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (balanced event 3) ht_decide: 0 decided hold (balanced event 3)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_released: usage_page 0x07 keycode 0xe4 kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/keycode_events.snapshot

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
ht_decide: 0 decided tap (balanced event 0) ht_decide: 0 decided tap (balanced event 0)
kp_pressed: usage_page 0x07 keycode 0x09 kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
ht_decide: 0 decided hold (balanced event 3) ht_decide: 0 decided hold (balanced event 3)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/keycode_events.snapshot

@ -1,10 +1,10 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (balanced event 3) ht_decide: 0 decided hold (balanced event 3)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_pressed: 1 new undecided hold_tap ht_binding_pressed: 1 new undecided hold_tap
ht_decide: 1 decided tap (balanced event 0) ht_decide: 1 decided tap (balanced event 0)
kp_pressed: usage_page 0x07 keycode 0x0d kp_pressed: usage_page 0x07 keycode 0x0d mods 0x00
kp_released: usage_page 0x07 keycode 0x0d kp_released: usage_page 0x07 keycode 0x0d mods 0x00
ht_binding_released: 1 cleaning up hold-tap ht_binding_released: 1 cleaning up hold-tap
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (balanced event 3) ht_decide: 0 decided hold (balanced event 3)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (balanced event 2) ht_decide: 0 decided hold (balanced event 2)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/keycode_events.snapshot

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (balanced event 2) ht_decide: 0 decided hold (balanced event 2)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided tap (balanced event 0) ht_decide: 0 decided tap (balanced event 0)
kp_pressed: usage_page 0x07 keycode 0x09 kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00

16
app/tests/hold-tap/balanced/many-nested/keycode_events.snapshot

@ -1,20 +1,20 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (balanced event 3) ht_decide: 0 decided hold (balanced event 3)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_pressed: 1 new undecided hold_tap ht_binding_pressed: 1 new undecided hold_tap
ht_decide: 1 decided hold (balanced event 3) ht_decide: 1 decided hold (balanced event 3)
kp_pressed: usage_page 0x07 keycode 0xe0 kp_pressed: usage_page 0x07 keycode 0xe0 mods 0x00
ht_binding_pressed: 2 new undecided hold_tap ht_binding_pressed: 2 new undecided hold_tap
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap
ht_decide: 2 decided hold (balanced event 3) ht_decide: 2 decided hold (balanced event 3)
kp_pressed: usage_page 0x07 keycode 0xe3 kp_pressed: usage_page 0x07 keycode 0xe3 mods 0x00
ht_binding_pressed: 3 new undecided hold_tap ht_binding_pressed: 3 new undecided hold_tap
ht_binding_released: 1 cleaning up hold-tap ht_binding_released: 1 cleaning up hold-tap
ht_decide: 3 decided hold (balanced event 3) ht_decide: 3 decided hold (balanced event 3)
kp_pressed: usage_page 0x07 keycode 0xe2 kp_pressed: usage_page 0x07 keycode 0xe2 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
kp_released: usage_page 0x07 keycode 0xe0 kp_released: usage_page 0x07 keycode 0xe0 mods 0x00
kp_released: usage_page 0x07 keycode 0xe3 kp_released: usage_page 0x07 keycode 0xe3 mods 0x00
ht_binding_released: 2 cleaning up hold-tap ht_binding_released: 2 cleaning up hold-tap
kp_released: usage_page 0x07 keycode 0xe2 kp_released: usage_page 0x07 keycode 0xe2 mods 0x00
ht_binding_released: 3 cleaning up hold-tap ht_binding_released: 3 cleaning up hold-tap

4
app/tests/hold-tap/hold-preferred/1-dn-up/keycode_events.snapshot

@ -1,5 +1,5 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided tap (hold-preferred event 0) ht_decide: 0 decided tap (hold-preferred event 0)
kp_pressed: usage_page 0x07 keycode 0x09 kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

4
app/tests/hold-tap/hold-preferred/2-dn-timer-up/keycode_events.snapshot

@ -1,5 +1,5 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (hold-preferred event 3) ht_decide: 0 decided hold (hold-preferred event 3)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0xe4 kp_pressed: usage_page 0x07 keycode 0xe4 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided tap (hold-preferred event 0) ht_decide: 0 decided tap (hold-preferred event 0)
kp_pressed: usage_page 0x07 keycode 0x09 kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
kp_released: usage_page 0x07 keycode 0xe4 kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0xe4 kp_pressed: usage_page 0x07 keycode 0xe4 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (hold-preferred event 3) ht_decide: 0 decided hold (hold-preferred event 3)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_released: usage_page 0x07 keycode 0xe4 kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/keycode_events.snapshot

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
ht_decide: 0 decided tap (hold-preferred event 0) ht_decide: 0 decided tap (hold-preferred event 0)
kp_pressed: usage_page 0x07 keycode 0x09 kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
ht_decide: 0 decided hold (hold-preferred event 3) ht_decide: 0 decided hold (hold-preferred event 3)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot

@ -1,10 +1,10 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (hold-preferred event 1) ht_decide: 0 decided hold (hold-preferred event 1)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_pressed: 1 new undecided hold_tap ht_binding_pressed: 1 new undecided hold_tap
ht_decide: 1 decided tap (hold-preferred event 0) ht_decide: 1 decided tap (hold-preferred event 0)
kp_pressed: usage_page 0x07 keycode 0x0d kp_pressed: usage_page 0x07 keycode 0x0d mods 0x00
kp_released: usage_page 0x07 keycode 0x0d kp_released: usage_page 0x07 keycode 0x0d mods 0x00
ht_binding_released: 1 cleaning up hold-tap ht_binding_released: 1 cleaning up hold-tap
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (hold-preferred event 1) ht_decide: 0 decided hold (hold-preferred event 1)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (hold-preferred event 1) ht_decide: 0 decided hold (hold-preferred event 1)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (hold-preferred event 1) ht_decide: 0 decided hold (hold-preferred event 1)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (hold-preferred event 1) ht_decide: 0 decided hold (hold-preferred event 1)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00

4
app/tests/hold-tap/tap-preferred/1-dn-up/keycode_events.snapshot

@ -1,5 +1,5 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided tap (tap-preferred event 0) ht_decide: 0 decided tap (tap-preferred event 0)
kp_pressed: usage_page 0x07 keycode 0x09 kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

4
app/tests/hold-tap/tap-preferred/2-dn-timer-up/keycode_events.snapshot

@ -1,5 +1,5 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (tap-preferred event 3) ht_decide: 0 decided hold (tap-preferred event 3)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0xe4 kp_pressed: usage_page 0x07 keycode 0xe4 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided tap (tap-preferred event 0) ht_decide: 0 decided tap (tap-preferred event 0)
kp_pressed: usage_page 0x07 keycode 0x09 kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
kp_released: usage_page 0x07 keycode 0xe4 kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0xe4 kp_pressed: usage_page 0x07 keycode 0xe4 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (tap-preferred event 3) ht_decide: 0 decided hold (tap-preferred event 3)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_released: usage_page 0x07 keycode 0xe4 kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/keycode_events.snapshot

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
ht_decide: 0 decided tap (tap-preferred event 0) ht_decide: 0 decided tap (tap-preferred event 0)
kp_pressed: usage_page 0x07 keycode 0x09 kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot

@ -1,7 +1,7 @@
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
ht_decide: 0 decided hold (tap-preferred event 3) ht_decide: 0 decided hold (tap-preferred event 3)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot

@ -1,10 +1,10 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (tap-preferred event 3) ht_decide: 0 decided hold (tap-preferred event 3)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_pressed: 1 new undecided hold_tap ht_binding_pressed: 1 new undecided hold_tap
ht_decide: 1 decided tap (tap-preferred event 0) ht_decide: 1 decided tap (tap-preferred event 0)
kp_pressed: usage_page 0x07 keycode 0x0d kp_pressed: usage_page 0x07 keycode 0x0d mods 0x00
kp_released: usage_page 0x07 keycode 0x0d kp_released: usage_page 0x07 keycode 0x0d mods 0x00
ht_binding_released: 1 cleaning up hold-tap ht_binding_released: 1 cleaning up hold-tap
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (tap-preferred event 3) ht_decide: 0 decided hold (tap-preferred event 3)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (tap-preferred event 3) ht_decide: 0 decided hold (tap-preferred event 3)
kp_pressed: usage_page 0x07 keycode 0xe1 kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0xe1 kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided tap (tap-preferred event 0) ht_decide: 0 decided tap (tap-preferred event 0)
kp_pressed: usage_page 0x07 keycode 0x09 kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap

8
app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot

@ -1,7 +1,7 @@
ht_binding_pressed: 0 new undecided hold_tap ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided tap (tap-preferred event 0) ht_decide: 0 decided tap (tap-preferred event 0)
kp_pressed: usage_page 0x07 keycode 0x09 kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
kp_pressed: usage_page 0x07 keycode 0x07 kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
kp_released: usage_page 0x07 keycode 0x09 kp_released: usage_page 0x07 keycode 0x09 mods 0x00
ht_binding_released: 0 cleaning up hold-tap ht_binding_released: 0 cleaning up hold-tap
kp_released: usage_page 0x07 keycode 0x07 kp_released: usage_page 0x07 keycode 0x07 mods 0x00

16
app/tests/keypress/behavior_keymap.dtsi

@ -9,20 +9,8 @@
default_layer { default_layer {
bindings = < bindings = <
&kp B &mo 1 &kp B &none
&kp D &kp G>; &cp M_NEXT &none>;
};
lower_layer {
bindings = <
&cp M_NEXT &trans
&kp L &kp J>;
};
raise_layer {
bindings = <
&kp W &kp U
&kp X &kp M>;
}; };
}; };
}; };

4
app/tests/keypress/cp-press-release/keycode_events.snapshot

@ -1,2 +1,2 @@
pressed: usage_page 0x0c keycode 0xb5 pressed: usage_page 0x0c keycode 0xb5 mods 0x00
released: usage_page 0x0c keycode 0xb5 pressed: usage_page 0x0c keycode 0xb5 mods 0x00

2
app/tests/keypress/cp-press-release/native_posix.keymap

@ -1,5 +1,5 @@
#include "../behavior_keymap.dtsi" #include "../behavior_keymap.dtsi"
&kscan { &kscan {
events = <ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10)>; events = <ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(1,0,10)>;
}; };

4
app/tests/keypress/kp-press-release/keycode_events.snapshot

@ -1,2 +1,2 @@
pressed: usage_page 0x0c keycode 0xb5 pressed: usage_page 0x07 keycode 0x05 mods 0x00
released: usage_page 0x0c keycode 0xb5 released: usage_page 0x07 keycode 0x05 mods 0x00

5
app/tests/keypress/kp-press-release/native_posix.keymap

@ -1,8 +1,5 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
#include "../behavior_keymap.dtsi" #include "../behavior_keymap.dtsi"
&kscan { &kscan {
events = <ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10)>; events = <ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10)>;
}; };

4
app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/events.patterns

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

17
app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/keycode_events.snapshot

@ -0,0 +1,17 @@
pressed: usage_page 0x07 keycode 0xe0 mods 0x00
reg: Modifier 0 count 1
reg: Modifiers set to 0x01
mods: Modifiers set to 0x01
pressed: usage_page 0x07 keycode 0xe0 mods 0x00
reg: Modifier 0 count 2
reg: Modifiers set to 0x01
mods: Modifiers set to 0x01
released: usage_page 0x07 keycode 0xe0 mods 0x00
unreg: Modifier 0 count: 1
unreg: Modifiers set to 0x01
mods: Modifiers set to 0x01
released: usage_page 0x07 keycode 0xe0 mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x00
mods: Modifiers set to 0x00

27
app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix.keymap

@ -0,0 +1,27 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(0,0,10)
ZMK_MOCK_PRESS(0,1,10)
ZMK_MOCK_RELEASE(0,0,10)
ZMK_MOCK_RELEASE(0,1,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LCTL &kp LCTL
&kp LSFT &none
>;
};
};
};

4
app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/events.patterns

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

9
app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/keycode_events.snapshot

@ -0,0 +1,9 @@
pressed: usage_page 0x07 keycode 0xe0 mods 0x00
reg: Modifier 0 count 1
reg: Modifiers set to 0x01
mods: Modifiers set to 0x01
released: usage_page 0x07 keycode 0xe0 mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x00
mods: Modifiers set to 0x00

25
app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix.keymap

@ -0,0 +1,25 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(0,0,10)
ZMK_MOCK_RELEASE(0,0,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LCTL &kp LCTL
&kp LSFT &none
>;
};
};
};

4
app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/events.patterns

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

18
app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/keycode_events.snapshot

@ -0,0 +1,18 @@
pressed: usage_page 0x07 keycode 0xe0 mods 0x00
reg: Modifier 0 count 1
reg: Modifiers set to 0x01
mods: Modifiers set to 0x01
pressed: usage_page 0x07 keycode 0xe1 mods 0x00
reg: Modifier 1 count 1
reg: Modifiers set to 0x03
mods: Modifiers set to 0x03
released: usage_page 0x07 keycode 0xe0 mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x02
mods: Modifiers set to 0x02
released: usage_page 0x07 keycode 0xe1 mods 0x00
unreg: Modifier 1 count: 0
unreg: Modifier 1 released
unreg: Modifiers set to 0x00
mods: Modifiers set to 0x00

27
app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix.keymap

@ -0,0 +1,27 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(0,0,10)
ZMK_MOCK_PRESS(1,0,10)
ZMK_MOCK_RELEASE(0,0,10)
ZMK_MOCK_RELEASE(1,0,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LCTL &kp LCTL
&kp LSFT &none
>;
};
};
};

4
app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/events.patterns

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

18
app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/keycode_events.snapshot

@ -0,0 +1,18 @@
pressed: usage_page 0x07 keycode 0xe0 mods 0x00
reg: Modifier 0 count 1
reg: Modifiers set to 0x01
mods: Modifiers set to 0x01
pressed: usage_page 0x07 keycode 0xe1 mods 0x00
reg: Modifier 1 count 1
reg: Modifiers set to 0x03
mods: Modifiers set to 0x03
released: usage_page 0x07 keycode 0xe1 mods 0x00
unreg: Modifier 1 count: 0
unreg: Modifier 1 released
unreg: Modifiers set to 0x01
mods: Modifiers set to 0x01
released: usage_page 0x07 keycode 0xe0 mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x00
mods: Modifiers set to 0x00

28
app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix.keymap

@ -0,0 +1,28 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(0,0,10)
ZMK_MOCK_PRESS(1,0,10)
ZMK_MOCK_RELEASE(1,0,10)
ZMK_MOCK_RELEASE(0,0,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LCTL &kp LCTL
&kp LSFT &none
>;
};
};
};

4
app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/events.patterns

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

8
app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/keycode_events.snapshot

@ -0,0 +1,8 @@
pressed: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x02
pressed: usage_page 0x07 keycode 0x04 mods 0x01
mods: Modifiers set to 0x01
released: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x01
released: usage_page 0x07 keycode 0x04 mods 0x01
mods: Modifiers set to 0x00

27
app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix.keymap

@ -0,0 +1,27 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(0,1,10)
ZMK_MOCK_PRESS(0,0,10)
ZMK_MOCK_RELEASE(0,1,10)
ZMK_MOCK_RELEASE(0,0,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LC(A) &kp LS(B)
&kp LCTL &none
>;
};
};
};

9
app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending

@ -0,0 +1,9 @@
This test fails because the hid_listener_keycode_released function
releases implicit modifiers always, even if they were not set by the
key that's going up. Also see the comment in that function:
If LC(A) is pressed, then LS(B), then LC(A) is released, the shift for B will be released
prematurely. This causes if LS(B) to repeat like Bbbbbbbb when pressed for a long time.
Solving this would require keeping track of which key's implicit modifiers are currently
active and only releasing modifiers at that time.

4
app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/events.patterns

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

8
app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/keycode_events.snapshot

@ -0,0 +1,8 @@
pressed: usage_page 0x07 keycode 0x04 mods 0x01
mods: Modifiers set to 0x01
pressed: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x02
released: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x00
released: usage_page 0x07 keycode 0x04 mods 0x01
mods: Modifiers set to 0x00

27
app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix.keymap

@ -0,0 +1,27 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(0,0,10)
ZMK_MOCK_PRESS(0,1,10)
ZMK_MOCK_RELEASE(0,1,10)
ZMK_MOCK_RELEASE(0,0,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LC(A) &kp LS(B)
&none &none
>;
};
};
};

4
app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/events.patterns

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

13
app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot

@ -0,0 +1,13 @@
pressed: usage_page 0x07 keycode 0xe0 mods 0x00
reg: Modifier 0 count 1
reg: Modifiers set to 0x01
mods: Modifiers set to 0x01
pressed: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x03
released: usage_page 0x07 keycode 0xe0 mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x00
mods: Modifiers set to 0x00
released: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x00

27
app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix.keymap

@ -0,0 +1,27 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(1,0,10)
ZMK_MOCK_PRESS(0,1,10)
ZMK_MOCK_RELEASE(1,0,10)
ZMK_MOCK_RELEASE(0,1,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LC(A) &kp LS(B)
&kp LCTL &none
>;
};
};
};

4
app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/events.patterns

@ -0,0 +1,4 @@
s/.*hid_listener_keycode_//p
s/.*hid_register_mod/reg/p
s/.*hid_unregister_mod/unreg/p
s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p

13
app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/keycode_events.snapshot

@ -0,0 +1,13 @@
pressed: usage_page 0x07 keycode 0xe0 mods 0x00
reg: Modifier 0 count 1
reg: Modifiers set to 0x01
mods: Modifiers set to 0x01
pressed: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x03
released: usage_page 0x07 keycode 0x05 mods 0x02
mods: Modifiers set to 0x01
released: usage_page 0x07 keycode 0xe0 mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x00
mods: Modifiers set to 0x00

27
app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix.keymap

@ -0,0 +1,27 @@
#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
#include <dt-bindings/zmk/kscan-mock.h>
&kscan {
events = <
ZMK_MOCK_PRESS(1,0,10)
ZMK_MOCK_PRESS(0,1,10)
ZMK_MOCK_RELEASE(0,1,10)
ZMK_MOCK_RELEASE(1,0,10)
>;
};
/ {
keymap {
compatible = "zmk,keymap";
label ="Default keymap";
default_layer {
bindings = <
&kp LC(A) &kp LS(B)
&kp LCTL &none
>;
};
};
};

4
app/tests/momentary-layer/early-key-release/keycode_events.snapshot

@ -1,4 +1,4 @@
kp_pressed: usage_page 0x07 keycode 0x05 kp_pressed: usage_page 0x07 keycode 0x05 mods 0x00
mo_pressed: position 1 layer 1 mo_pressed: position 1 layer 1
kp_released: usage_page 0x07 keycode 0x05 kp_released: usage_page 0x07 keycode 0x05 mods 0x00
mo_released: position 1 layer 1 mo_released: position 1 layer 1

4
app/tests/momentary-layer/normal/keycode_events.snapshot

@ -1,4 +1,4 @@
mo_pressed: position 1 layer 1 mo_pressed: position 1 layer 1
kp_pressed: usage_page 0x0c keycode 0xb5 kp_pressed: usage_page 0x0c keycode 0xb5 mods 0x00
kp_released: usage_page 0x0c keycode 0xb5 kp_released: usage_page 0x0c keycode 0xb5 mods 0x00
mo_released: position 1 layer 1 mo_released: position 1 layer 1

8
app/tests/toggle-layer/early-key-release/keycode_events.snapshot

@ -1,6 +1,6 @@
kp_pressed: usage_page 0x07 keycode 0x05 kp_pressed: usage_page 0x07 keycode 0x05 mods 0x00
tog_pressed: position 1 layer 1 tog_pressed: position 1 layer 1
kp_released: usage_page 0x07 keycode 0x05 kp_released: usage_page 0x07 keycode 0x05 mods 0x00
tog_released: position 1 layer 1 tog_released: position 1 layer 1
kp_pressed: usage_page 0x0c keycode 0xb5 kp_pressed: usage_page 0x0c keycode 0xb5 mods 0x00
kp_released: usage_page 0x0c keycode 0xb5 kp_released: usage_page 0x0c keycode 0xb5 mods 0x00

4
app/tests/toggle-layer/normal/keycode_events.snapshot

@ -1,4 +1,4 @@
tog_pressed: position 1 layer 1 tog_pressed: position 1 layer 1
tog_released: position 1 layer 1 tog_released: position 1 layer 1
kp_pressed: usage_page 0x0c keycode 0xb5 kp_pressed: usage_page 0x0c keycode 0xb5 mods 0x00
kp_released: usage_page 0x0c keycode 0xb5 kp_released: usage_page 0x0c keycode 0xb5 mods 0x00

4
app/tests/transparent/layered/keycode_events.snapshot

@ -1,2 +1,2 @@
kp_pressed: usage_page 0x07 keycode 0x04 kp_pressed: usage_page 0x07 keycode 0x04 mods 0x00
kp_released: usage_page 0x07 keycode 0x04 kp_released: usage_page 0x07 keycode 0x04 mods 0x00

4
docs/docs/feature/keymaps.md

@ -68,7 +68,7 @@ In this case, the `A` is actually a define for the raw HID keycode, to make keym
For example of a binding that uses two parameters, you can see how "mod-tap" (`mt`) is bound: For example of a binding that uses two parameters, you can see how "mod-tap" (`mt`) is bound:
``` ```
&mt MOD_LSFT D &mt LSFT D
``` ```
Here, the first parameter is the set of modifiers that should be used for the "hold" behavior, and the second Here, the first parameter is the set of modifiers that should be used for the "hold" behavior, and the second
@ -92,7 +92,7 @@ The top two lines of most keymaps should include:
The first defines the nodes for all the available behaviors in ZMK, which will be referenced in the behavior bindings. This is how bindings like `&kp` can reference the key press behavior defined with an anchor name of `kp`. The first defines the nodes for all the available behaviors in ZMK, which will be referenced in the behavior bindings. This is how bindings like `&kp` can reference the key press behavior defined with an anchor name of `kp`.
The second include brings in the defines for all the keycodes (e.g. `A`, `NUM_1`, `M_PLAY`) and the modifiers (e.g. `MOD_LSFT`) used for various behavior bindings. The second include brings in the defines for all the keycodes (e.g. `A`, `NUM_1`, `M_PLAY`) and the modifiers (e.g. `LSFT`) used for various behavior bindings.
### Root devicetree Node ### Root devicetree Node

Loading…
Cancel
Save