summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/include/zmk/events/keycode_state_changed.h15
-rw-r--r--app/include/zmk/hid.h2
-rw-r--r--app/src/hid.c18
-rw-r--r--app/src/hid_listener.c14
-rw-r--r--app/tests/combo/combos-and-holdtaps-0/keycode_events.snapshot8
-rw-r--r--app/tests/combo/combos-and-holdtaps-1/keycode_events.snapshot8
-rw-r--r--app/tests/combo/combos-and-holdtaps-2/keycode_events.snapshot4
-rw-r--r--app/tests/combo/multiple-timeouts/keycode_events.snapshot8
-rw-r--r--app/tests/combo/overlapping-combos-0/keycode_events.snapshot40
-rw-r--r--app/tests/combo/overlapping-combos-1/keycode_events.snapshot16
-rw-r--r--app/tests/combo/overlapping-combos-2/keycode_events.snapshot8
-rw-r--r--app/tests/combo/overlapping-combos-3/keycode_events.snapshot8
-rw-r--r--app/tests/combo/partially-overlapping-combos/keycode_events.snapshot32
-rw-r--r--app/tests/combo/press-release/keycode_events.snapshot16
-rw-r--r--app/tests/combo/press-timeout/keycode_events.snapshot8
-rw-r--r--app/tests/combo/press1-press2-release1-release2/keycode_events.snapshot8
-rw-r--r--app/tests/combo/press1-press2-release2-release1/keycode_events.snapshot8
-rw-r--r--app/tests/combo/press1-release1-press2-release2/keycode_events.snapshot8
-rw-r--r--app/tests/combo/slowrelease-disabled/keycode_events.snapshot8
-rw-r--r--app/tests/combo/slowrelease-enabled/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/balanced/1-dn-up/keycode_events.snapshot4
-rw-r--r--app/tests/hold-tap/balanced/2-dn-timer-up/keycode_events.snapshot4
-rw-r--r--app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/balanced/many-nested/keycode_events.snapshot16
-rw-r--r--app/tests/hold-tap/hold-preferred/1-dn-up/keycode_events.snapshot4
-rw-r--r--app/tests/hold-tap/hold-preferred/2-dn-timer-up/keycode_events.snapshot4
-rw-r--r--app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/tap-preferred/1-dn-up/keycode_events.snapshot4
-rw-r--r--app/tests/hold-tap/tap-preferred/2-dn-timer-up/keycode_events.snapshot4
-rw-r--r--app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot8
-rw-r--r--app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot8
-rw-r--r--app/tests/keypress/kp-press-release/keycode_events.snapshot4
-rw-r--r--app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/events.patterns4
-rw-r--r--app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/keycode_events.snapshot28
-rw-r--r--app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix.keymap28
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/keycode_events.snapshot8
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/keycode_events.snapshot4
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/keycode_events.snapshot8
-rw-r--r--app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/keycode_events.snapshot8
-rw-r--r--app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/keycode_events.snapshot8
-rw-r--r--app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/keycode_events.snapshot8
-rw-r--r--app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot8
-rw-r--r--app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/keycode_events.snapshot8
-rw-r--r--app/tests/momentary-layer/1-normal/keycode_events.snapshot4
-rw-r--r--app/tests/momentary-layer/2-early-key-release/keycode_events.snapshot4
-rw-r--r--app/tests/momentary-layer/4-nested/keycode_events.snapshot4
-rw-r--r--app/tests/momentary-layer/5-nested-early-key-release/keycode_events.snapshot4
-rw-r--r--app/tests/sticky-keys/1-os-dn-up/keycode_events.snapshot8
-rw-r--r--app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/keycode_events.snapshot16
-rw-r--r--app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/keycode_events.snapshot8
-rw-r--r--app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/keycode_events.snapshot8
-rw-r--r--app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/keycode_events.snapshot8
-rw-r--r--app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/keycode_events.snapshot8
-rw-r--r--app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/keycode_events.snapshot12
-rw-r--r--app/tests/sticky-keys/8-lsk-osk-combination/keycode_events.snapshot16
-rw-r--r--app/tests/sticky-keys/9-sk-dn-up-dn-up/keycode_events.snapshot8
-rw-r--r--app/tests/to-layer/normal/keycode_events.snapshot12
-rw-r--r--app/tests/toggle-layer/early-key-release/keycode_events.snapshot8
-rw-r--r--app/tests/toggle-layer/normal/keycode_events.snapshot4
-rw-r--r--app/tests/transparent/layered/keycode_events.snapshot4
83 files changed, 425 insertions, 336 deletions
diff --git a/app/include/zmk/events/keycode_state_changed.h b/app/include/zmk/events/keycode_state_changed.h
index 031169d..466bbd7 100644
--- a/app/include/zmk/events/keycode_state_changed.h
+++ b/app/include/zmk/events/keycode_state_changed.h
@@ -7,8 +7,6 @@
#pragma once
#include <zephyr.h>
-#include <dt-bindings/zmk/modifiers.h>
-#include <dt-bindings/zmk/hid_usage_pages.h>
#include <zmk/event_manager.h>
#include <zmk/keys.h>
@@ -16,6 +14,7 @@ struct zmk_keycode_state_changed {
uint16_t usage_page;
uint32_t keycode;
uint8_t implicit_modifiers;
+ uint8_t explicit_modifiers;
bool state;
int64_t timestamp;
};
@@ -26,16 +25,24 @@ static inline struct zmk_keycode_state_changed_event *
zmk_keycode_state_changed_from_encoded(uint32_t encoded, bool pressed, int64_t timestamp) {
uint16_t page = HID_USAGE_PAGE(encoded) & 0xFF;
uint16_t id = HID_USAGE_ID(encoded);
- zmk_mod_flags_t implicit_mods = SELECT_MODS(encoded);
+ uint8_t implicit_modifiers = 0x00;
+ uint8_t explicit_modifiers = 0x00;
if (!page) {
page = HID_USAGE_KEY;
}
+ if (is_mod(page, id)) {
+ explicit_modifiers = SELECT_MODS(encoded);
+ } else {
+ implicit_modifiers = SELECT_MODS(encoded);
+ }
+
return new_zmk_keycode_state_changed(
(struct zmk_keycode_state_changed){.usage_page = page,
.keycode = id,
- .implicit_modifiers = implicit_mods,
+ .implicit_modifiers = implicit_modifiers,
+ .explicit_modifiers = explicit_modifiers,
.state = pressed,
.timestamp = timestamp});
}
diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h
index aca3cc4..5aa004c 100644
--- a/app/include/zmk/hid.h
+++ b/app/include/zmk/hid.h
@@ -169,6 +169,8 @@ struct zmk_hid_consumer_report {
zmk_mod_flags_t zmk_hid_get_explicit_mods();
int zmk_hid_register_mod(zmk_mod_t modifier);
int zmk_hid_unregister_mod(zmk_mod_t modifier);
+int zmk_hid_register_mods(zmk_mod_flags_t explicit_modifiers);
+int zmk_hid_unregister_mods(zmk_mod_flags_t explicit_modifiers);
int zmk_hid_implicit_modifiers_press(zmk_mod_flags_t implicit_modifiers);
int zmk_hid_implicit_modifiers_release();
int zmk_hid_keyboard_press(zmk_key_t key);
diff --git a/app/src/hid.c b/app/src/hid.c
index 65eabd9..7ab080e 100644
--- a/app/src/hid.c
+++ b/app/src/hid.c
@@ -51,6 +51,24 @@ int zmk_hid_unregister_mod(zmk_mod_t modifier) {
return 0;
}
+int zmk_hid_register_mods(zmk_mod_flags_t modifiers) {
+ for (zmk_mod_t i = 0; i < 8; i++) {
+ if (modifiers & (1 << i)) {
+ zmk_hid_register_mod(i);
+ }
+ }
+ return 0;
+}
+
+int zmk_hid_unregister_mods(zmk_mod_flags_t modifiers) {
+ for (zmk_mod_t i = 0; i < 8; i++) {
+ if (modifiers & (1 << i)) {
+ zmk_hid_unregister_mod(i);
+ }
+ }
+ return 0;
+}
+
#define TOGGLE_KEYBOARD(match, val) \
for (int idx = 0; idx < ZMK_HID_KEYBOARD_NKRO_SIZE; idx++) { \
if (keyboard_report.body.keys[idx] != match) { \
diff --git a/app/src/hid_listener.c b/app/src/hid_listener.c
index 127eb52..d582c16 100644
--- a/app/src/hid_listener.c
+++ b/app/src/hid_listener.c
@@ -16,10 +16,10 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
#include <dt-bindings/zmk/hid_usage_pages.h>
#include <zmk/endpoints.h>
-static int hid_listener_keycode_pressed(const struct keycode_state_changed *ev) {
+static int hid_listener_keycode_pressed(const struct zmk_keycode_state_changed *ev) {
int err;
- LOG_DBG("usage_page 0x%02X keycode 0x%02X mods 0x%02X", ev->usage_page, ev->keycode,
- ev->implicit_modifiers);
+ LOG_DBG("usage_page 0x%02X keycode 0x%02X implicit_mods 0x%02X explicit_mods 0x%02X",
+ ev->usage_page, ev->keycode, ev->implicit_modifiers, ev->explicit_modifiers);
switch (ev->usage_page) {
case HID_USAGE_KEY:
err = zmk_hid_keyboard_press(ev->keycode);
@@ -36,14 +36,15 @@ static int hid_listener_keycode_pressed(const struct keycode_state_changed *ev)
}
break;
}
+ zmk_hid_register_mods(ev->explicit_modifiers);
zmk_hid_implicit_modifiers_press(ev->implicit_modifiers);
return zmk_endpoints_send_report(ev->usage_page);
}
-static int hid_listener_keycode_released(const struct keycode_state_changed *ev) {
+static int hid_listener_keycode_released(const struct zmk_keycode_state_changed *ev) {
int err;
- LOG_DBG("usage_page 0x%02X keycode 0x%02X mods 0x%02X", ev->usage_page, ev->keycode,
- ev->implicit_modifiers);
+ LOG_DBG("usage_page 0x%02X keycode 0x%02X implicit_mods 0x%02X explicit_mods 0x%02X",
+ ev->usage_page, ev->keycode, ev->implicit_modifiers, ev->explicit_modifiers);
switch (ev->usage_page) {
case HID_USAGE_KEY:
err = zmk_hid_keyboard_release(ev->keycode);
@@ -59,6 +60,7 @@ static int hid_listener_keycode_released(const struct keycode_state_changed *ev)
return err;
}
}
+ zmk_hid_unregister_mods(ev->explicit_modifiers);
// 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.
diff --git a/app/tests/combo/combos-and-holdtaps-0/keycode_events.snapshot b/app/tests/combo/combos-and-holdtaps-0/keycode_events.snapshot
index ad86b26..e1c02da 100644
--- a/app/tests/combo/combos-and-holdtaps-0/keycode_events.snapshot
+++ b/app/tests/combo/combos-and-holdtaps-0/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0xe0 mods 0x00
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0xe0 mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
+pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/combos-and-holdtaps-1/keycode_events.snapshot b/app/tests/combo/combos-and-holdtaps-1/keycode_events.snapshot
index dc4dbb4..ff06037 100644
--- a/app/tests/combo/combos-and-holdtaps-1/keycode_events.snapshot
+++ b/app/tests/combo/combos-and-holdtaps-1/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-pressed: usage_page 0x07 keycode 0x06 mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0x06 mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/combos-and-holdtaps-2/keycode_events.snapshot b/app/tests/combo/combos-and-holdtaps-2/keycode_events.snapshot
index a650880..325549f 100644
--- a/app/tests/combo/combos-and-holdtaps-2/keycode_events.snapshot
+++ b/app/tests/combo/combos-and-holdtaps-2/keycode_events.snapshot
@@ -1,2 +1,2 @@
-pressed: usage_page 0x07 keycode 0xe0 mods 0x00
-pressed: usage_page 0x07 keycode 0xe4 mods 0x00
+pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/multiple-timeouts/keycode_events.snapshot b/app/tests/combo/multiple-timeouts/keycode_events.snapshot
index c5bdd6e..bb47d85 100644
--- a/app/tests/combo/multiple-timeouts/keycode_events.snapshot
+++ b/app/tests/combo/multiple-timeouts/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0x04 mods 0x00
-pressed: usage_page 0x07 keycode 0x05 mods 0x00
-released: usage_page 0x07 keycode 0x04 mods 0x00
-released: usage_page 0x07 keycode 0x05 mods 0x00
+pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/overlapping-combos-0/keycode_events.snapshot b/app/tests/combo/overlapping-combos-0/keycode_events.snapshot
index ec63b77..cc5b30f 100644
--- a/app/tests/combo/overlapping-combos-0/keycode_events.snapshot
+++ b/app/tests/combo/overlapping-combos-0/keycode_events.snapshot
@@ -1,20 +1,20 @@
-pressed: usage_page 0x07 keycode 0x1b mods 0x00
-released: usage_page 0x07 keycode 0x1b mods 0x00
-pressed: usage_page 0x07 keycode 0x1b mods 0x00
-released: usage_page 0x07 keycode 0x1b mods 0x00
-pressed: usage_page 0x07 keycode 0x1b mods 0x00
-released: usage_page 0x07 keycode 0x1b mods 0x00
-pressed: usage_page 0x07 keycode 0x1b mods 0x00
-released: usage_page 0x07 keycode 0x1b mods 0x00
-pressed: usage_page 0x07 keycode 0x1b mods 0x00
-released: usage_page 0x07 keycode 0x1b mods 0x00
-pressed: usage_page 0x07 keycode 0x1b mods 0x00
-released: usage_page 0x07 keycode 0x1b mods 0x00
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
+pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/overlapping-combos-1/keycode_events.snapshot b/app/tests/combo/overlapping-combos-1/keycode_events.snapshot
index daf7247..a80db25 100644
--- a/app/tests/combo/overlapping-combos-1/keycode_events.snapshot
+++ b/app/tests/combo/overlapping-combos-1/keycode_events.snapshot
@@ -1,8 +1,8 @@
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/overlapping-combos-2/keycode_events.snapshot b/app/tests/combo/overlapping-combos-2/keycode_events.snapshot
index dc4dbb4..ff06037 100644
--- a/app/tests/combo/overlapping-combos-2/keycode_events.snapshot
+++ b/app/tests/combo/overlapping-combos-2/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-pressed: usage_page 0x07 keycode 0x06 mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0x06 mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/overlapping-combos-3/keycode_events.snapshot b/app/tests/combo/overlapping-combos-3/keycode_events.snapshot
index e0cb655..3df81e5 100644
--- a/app/tests/combo/overlapping-combos-3/keycode_events.snapshot
+++ b/app/tests/combo/overlapping-combos-3/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0x04 mods 0x00
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0x04 mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
+pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/partially-overlapping-combos/keycode_events.snapshot b/app/tests/combo/partially-overlapping-combos/keycode_events.snapshot
index adaa64b..e6c8814 100644
--- a/app/tests/combo/partially-overlapping-combos/keycode_events.snapshot
+++ b/app/tests/combo/partially-overlapping-combos/keycode_events.snapshot
@@ -1,16 +1,16 @@
-pressed: usage_page 0x07 keycode 0x1b mods 0x00
-released: usage_page 0x07 keycode 0x1b mods 0x00
-pressed: usage_page 0x07 keycode 0x1b mods 0x00
-released: usage_page 0x07 keycode 0x1b mods 0x00
-pressed: usage_page 0x07 keycode 0x1b mods 0x00
-released: usage_page 0x07 keycode 0x1b mods 0x00
-pressed: usage_page 0x07 keycode 0x1b mods 0x00
-released: usage_page 0x07 keycode 0x1b mods 0x00
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
+pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/press-release/keycode_events.snapshot b/app/tests/combo/press-release/keycode_events.snapshot
index 01718e7..d0767ca 100644
--- a/app/tests/combo/press-release/keycode_events.snapshot
+++ b/app/tests/combo/press-release/keycode_events.snapshot
@@ -1,8 +1,8 @@
-pressed: usage_page 0x07 keycode 0x06 mods 0x00
-released: usage_page 0x07 keycode 0x06 mods 0x00
-pressed: usage_page 0x07 keycode 0x06 mods 0x00
-released: usage_page 0x07 keycode 0x06 mods 0x00
-pressed: usage_page 0x07 keycode 0x06 mods 0x00
-released: usage_page 0x07 keycode 0x06 mods 0x00
-pressed: usage_page 0x07 keycode 0x06 mods 0x00
-released: usage_page 0x07 keycode 0x06 mods 0x00
+pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/press-timeout/keycode_events.snapshot b/app/tests/combo/press-timeout/keycode_events.snapshot
index c5bdd6e..bb47d85 100644
--- a/app/tests/combo/press-timeout/keycode_events.snapshot
+++ b/app/tests/combo/press-timeout/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0x04 mods 0x00
-pressed: usage_page 0x07 keycode 0x05 mods 0x00
-released: usage_page 0x07 keycode 0x04 mods 0x00
-released: usage_page 0x07 keycode 0x05 mods 0x00
+pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/press1-press2-release1-release2/keycode_events.snapshot b/app/tests/combo/press1-press2-release1-release2/keycode_events.snapshot
index cfa02de..0539a7c 100644
--- a/app/tests/combo/press1-press2-release1-release2/keycode_events.snapshot
+++ b/app/tests/combo/press1-press2-release1-release2/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0x06 mods 0x00
-pressed: usage_page 0x07 keycode 0x07 mods 0x00
-released: usage_page 0x07 keycode 0x06 mods 0x00
-released: usage_page 0x07 keycode 0x07 mods 0x00
+pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/press1-press2-release2-release1/keycode_events.snapshot b/app/tests/combo/press1-press2-release2-release1/keycode_events.snapshot
index b55f09b..c473ece 100644
--- a/app/tests/combo/press1-press2-release2-release1/keycode_events.snapshot
+++ b/app/tests/combo/press1-press2-release2-release1/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0x06 mods 0x00
-pressed: usage_page 0x07 keycode 0x07 mods 0x00
-released: usage_page 0x07 keycode 0x07 mods 0x00
-released: usage_page 0x07 keycode 0x06 mods 0x00
+pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/press1-release1-press2-release2/keycode_events.snapshot b/app/tests/combo/press1-release1-press2-release2/keycode_events.snapshot
index c41dee8..3c8dc13 100644
--- a/app/tests/combo/press1-release1-press2-release2/keycode_events.snapshot
+++ b/app/tests/combo/press1-release1-press2-release2/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0x06 mods 0x00
-released: usage_page 0x07 keycode 0x06 mods 0x00
-pressed: usage_page 0x07 keycode 0x07 mods 0x00
-released: usage_page 0x07 keycode 0x07 mods 0x00
+pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/slowrelease-disabled/keycode_events.snapshot b/app/tests/combo/slowrelease-disabled/keycode_events.snapshot
index c41dee8..3c8dc13 100644
--- a/app/tests/combo/slowrelease-disabled/keycode_events.snapshot
+++ b/app/tests/combo/slowrelease-disabled/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0x06 mods 0x00
-released: usage_page 0x07 keycode 0x06 mods 0x00
-pressed: usage_page 0x07 keycode 0x07 mods 0x00
-released: usage_page 0x07 keycode 0x07 mods 0x00
+pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/combo/slowrelease-enabled/keycode_events.snapshot b/app/tests/combo/slowrelease-enabled/keycode_events.snapshot
index cfa02de..0539a7c 100644
--- a/app/tests/combo/slowrelease-enabled/keycode_events.snapshot
+++ b/app/tests/combo/slowrelease-enabled/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0x06 mods 0x00
-pressed: usage_page 0x07 keycode 0x07 mods 0x00
-released: usage_page 0x07 keycode 0x06 mods 0x00
-released: usage_page 0x07 keycode 0x07 mods 0x00
+pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/hold-tap/balanced/1-dn-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/1-dn-up/keycode_events.snapshot
index c088e5e..4134442 100644
--- a/app/tests/hold-tap/balanced/1-dn-up/keycode_events.snapshot
+++ b/app/tests/hold-tap/balanced/1-dn-up/keycode_events.snapshot
@@ -1,5 +1,5 @@
ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided tap (balanced event 0)
-kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
-kp_released: usage_page 0x07 keycode 0x09 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/2-dn-timer-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/2-dn-timer-up/keycode_events.snapshot
index a8b5d1f..f83b408 100644
--- a/app/tests/hold-tap/balanced/2-dn-timer-up/keycode_events.snapshot
+++ b/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_decide: 0 decided hold (balanced event 3)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/keycode_events.snapshot
index ca458c7..ca744aa 100644
--- a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/keycode_events.snapshot
+++ b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/keycode_events.snapshot
@@ -1,7 +1,7 @@
-kp_pressed: usage_page 0x07 keycode 0xe4 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided tap (balanced event 0)
-kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
-kp_released: usage_page 0x07 keycode 0x09 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/keycode_events.snapshot
index ef4dfa5..c2bddc2 100644
--- a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/keycode_events.snapshot
+++ b/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 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (balanced event 3)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/keycode_events.snapshot
index 70a3353..6bef346 100644
--- a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/keycode_events.snapshot
+++ b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/keycode_events.snapshot
@@ -1,7 +1,7 @@
-kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 0 new undecided hold_tap
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
ht_decide: 0 decided tap (balanced event 0)
-kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
-kp_released: usage_page 0x07 keycode 0x09 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot
index 121f007..5354ff7 100644
--- a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot
+++ b/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 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 0 new undecided hold_tap
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
ht_decide: 0 decided hold (balanced event 3)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/keycode_events.snapshot
index ae9dcc9..1038065 100644
--- a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/keycode_events.snapshot
+++ b/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_decide: 0 decided hold (balanced event 3)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 1 new undecided hold_tap
ht_decide: 1 decided tap (balanced event 0)
-kp_pressed: usage_page 0x07 keycode 0x0d mods 0x00
-kp_released: usage_page 0x07 keycode 0x0d mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 1 cleaning up hold-tap
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot
index c1e03ad..9d5a9e8 100644
--- a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot
+++ b/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_decide: 0 decided hold (balanced event 3)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot
index 95330e6..190d95e 100644
--- a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot
+++ b/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_decide: 0 decided hold (balanced event 2)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/keycode_events.snapshot
index 95330e6..190d95e 100644
--- a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/keycode_events.snapshot
+++ b/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_decide: 0 decided hold (balanced event 2)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot b/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot
index 63219ee..31089ab 100644
--- a/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot
+++ b/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_decide: 0 decided tap (balanced event 0)
-kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
-kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0x09 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/hold-tap/balanced/many-nested/keycode_events.snapshot b/app/tests/hold-tap/balanced/many-nested/keycode_events.snapshot
index dda02dd..4bd40a9 100644
--- a/app/tests/hold-tap/balanced/many-nested/keycode_events.snapshot
+++ b/app/tests/hold-tap/balanced/many-nested/keycode_events.snapshot
@@ -1,20 +1,20 @@
ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (balanced event 3)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 1 new undecided hold_tap
ht_decide: 1 decided hold (balanced event 3)
-kp_pressed: usage_page 0x07 keycode 0xe0 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 2 new undecided hold_tap
ht_binding_released: 0 cleaning up hold-tap
ht_decide: 2 decided hold (balanced event 3)
-kp_pressed: usage_page 0x07 keycode 0xe3 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe3 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 3 new undecided hold_tap
ht_binding_released: 1 cleaning up hold-tap
ht_decide: 3 decided hold (balanced event 3)
-kp_pressed: usage_page 0x07 keycode 0xe2 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe0 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe3 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe2 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe3 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 2 cleaning up hold-tap
-kp_released: usage_page 0x07 keycode 0xe2 mods 0x00
+kp_released: usage_page 0x07 keycode 0xe2 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 3 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/1-dn-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/1-dn-up/keycode_events.snapshot
index 2eb6475..12c1a54 100644
--- a/app/tests/hold-tap/hold-preferred/1-dn-up/keycode_events.snapshot
+++ b/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_decide: 0 decided tap (hold-preferred event 0)
-kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
-kp_released: usage_page 0x07 keycode 0x09 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/keycode_events.snapshot
index 86517aa..291d17b 100644
--- a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/keycode_events.snapshot
+++ b/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_decide: 0 decided hold (hold-preferred event 3)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot
index b7434c6..2f8b72e 100644
--- a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot
+++ b/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 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided tap (hold-preferred event 0)
-kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
-kp_released: usage_page 0x07 keycode 0x09 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot
index ffb6aad..7330862 100644
--- a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot
+++ b/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 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (hold-preferred event 3)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/keycode_events.snapshot
index 1254fed..4596425 100644
--- a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/keycode_events.snapshot
+++ b/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 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 0 new undecided hold_tap
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
ht_decide: 0 decided tap (hold-preferred event 0)
-kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
-kp_released: usage_page 0x07 keycode 0x09 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot
index ba7b48b..5d6d637 100644
--- a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot
+++ b/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 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 0 new undecided hold_tap
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
ht_decide: 0 decided hold (hold-preferred event 3)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot
index c8acfc1..92886a8 100644
--- a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot
+++ b/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_decide: 0 decided hold (hold-preferred event 1)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 1 new undecided hold_tap
ht_decide: 1 decided tap (hold-preferred event 0)
-kp_pressed: usage_page 0x07 keycode 0x0d mods 0x00
-kp_released: usage_page 0x07 keycode 0x0d mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 1 cleaning up hold-tap
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot
index 97cd07b..e2feeef 100644
--- a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot
+++ b/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_decide: 0 decided hold (hold-preferred event 1)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot
index 97cd07b..e2feeef 100644
--- a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot
+++ b/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_decide: 0 decided hold (hold-preferred event 1)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot
index 97cd07b..e2feeef 100644
--- a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot
+++ b/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_decide: 0 decided hold (hold-preferred event 1)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot
index 2a21d92..da5b826 100644
--- a/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot
+++ b/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_decide: 0 decided hold (hold-preferred event 1)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/hold-tap/tap-preferred/1-dn-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/1-dn-up/keycode_events.snapshot
index 57e4fcd..93b5ce2 100644
--- a/app/tests/hold-tap/tap-preferred/1-dn-up/keycode_events.snapshot
+++ b/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_decide: 0 decided tap (tap-preferred event 0)
-kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
-kp_released: usage_page 0x07 keycode 0x09 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/keycode_events.snapshot
index 71ba8da..3dccfd3 100644
--- a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/keycode_events.snapshot
+++ b/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_decide: 0 decided hold (tap-preferred event 3)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot
index 0bc731f..09d2f10 100644
--- a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot
+++ b/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 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided tap (tap-preferred event 0)
-kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
-kp_released: usage_page 0x07 keycode 0x09 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot
index 6a3398f..c89aecf 100644
--- a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot
+++ b/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 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 0 new undecided hold_tap
ht_decide: 0 decided hold (tap-preferred event 3)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe4 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/keycode_events.snapshot
index e518582..4211e85 100644
--- a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/keycode_events.snapshot
+++ b/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 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 0 new undecided hold_tap
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
ht_decide: 0 decided tap (tap-preferred event 0)
-kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
-kp_released: usage_page 0x07 keycode 0x09 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot
index b3b0673..c149544 100644
--- a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot
+++ b/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 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 0 new undecided hold_tap
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
ht_decide: 0 decided hold (tap-preferred event 3)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot
index 7f45421..cf7db30 100644
--- a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot
+++ b/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_decide: 0 decided hold (tap-preferred event 3)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_pressed: 1 new undecided hold_tap
ht_decide: 1 decided tap (tap-preferred event 0)
-kp_pressed: usage_page 0x07 keycode 0x0d mods 0x00
-kp_released: usage_page 0x07 keycode 0x0d mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 1 cleaning up hold-tap
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot
index ade0d3e..95573b9 100644
--- a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot
+++ b/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_decide: 0 decided hold (tap-preferred event 3)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot
index ade0d3e..95573b9 100644
--- a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot
+++ b/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_decide: 0 decided hold (tap-preferred event 3)
-kp_pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0xe1 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot
index 418312c..38cce94 100644
--- a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot
+++ b/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_decide: 0 decided tap (tap-preferred event 0)
-kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
-kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0x09 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
diff --git a/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot
index c0b4c0b..8749a46 100644
--- a/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot
+++ b/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_decide: 0 decided tap (tap-preferred event 0)
-kp_pressed: usage_page 0x07 keycode 0x09 mods 0x00
-kp_pressed: usage_page 0x07 keycode 0x07 mods 0x00
-kp_released: usage_page 0x07 keycode 0x09 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00
ht_binding_released: 0 cleaning up hold-tap
-kp_released: usage_page 0x07 keycode 0x07 mods 0x00
+kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/keypress/kp-press-release/keycode_events.snapshot b/app/tests/keypress/kp-press-release/keycode_events.snapshot
index 80cac20..259501b 100644
--- a/app/tests/keypress/kp-press-release/keycode_events.snapshot
+++ b/app/tests/keypress/kp-press-release/keycode_events.snapshot
@@ -1,2 +1,2 @@
-pressed: usage_page 0x07 keycode 0x05 mods 0x00
-released: usage_page 0x07 keycode 0x05 mods 0x00
+pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/events.patterns b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/events.patterns
new file mode 100644
index 0000000..cbf21af
--- /dev/null
+++ b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-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 \ No newline at end of file
diff --git a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/keycode_events.snapshot b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/keycode_events.snapshot
new file mode 100644
index 0000000..e146b9c
--- /dev/null
+++ b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/keycode_events.snapshot
@@ -0,0 +1,28 @@
+pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x0e
+reg: Modifier 0 count 1
+reg: Modifiers set to 0x01
+reg: Modifier 1 count 1
+reg: Modifiers set to 0x03
+reg: Modifier 2 count 1
+reg: Modifiers set to 0x07
+reg: Modifier 3 count 1
+reg: Modifiers set to 0x0f
+mods: Modifiers set to 0x0f
+pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+mods: Modifiers set to 0x0f
+released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+mods: Modifiers set to 0x0f
+released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x0e
+unreg: Modifier 0 count: 0
+unreg: Modifier 0 released
+unreg: Modifiers set to 0x0e
+unreg: Modifier 1 count: 0
+unreg: Modifier 1 released
+unreg: Modifiers set to 0x0c
+unreg: Modifier 2 count: 0
+unreg: Modifier 2 released
+unreg: Modifiers set to 0x08
+unreg: Modifier 3 count: 0
+unreg: Modifier 3 released
+unreg: Modifiers set to 0x00
+mods: Modifiers set to 0x00
diff --git a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix.keymap b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix.keymap
new file mode 100644
index 0000000..b814242
--- /dev/null
+++ b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-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 LS(LA(LG(LEFT_CONTROL))) &kp LEFT_CONTROL
+ &kp A &none
+ >;
+ };
+ };
+};
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/keycode_events.snapshot b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/keycode_events.snapshot
index 6218e65..25b7944 100644
--- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/keycode_events.snapshot
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/keycode_events.snapshot
@@ -1,16 +1,16 @@
-pressed: usage_page 0x07 keycode 0xe0 mods 0x00
+pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_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
+pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_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
+released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_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
+released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x00
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/keycode_events.snapshot b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/keycode_events.snapshot
index 4232428..545af6e 100644
--- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/keycode_events.snapshot
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/keycode_events.snapshot
@@ -1,8 +1,8 @@
-pressed: usage_page 0x07 keycode 0xe0 mods 0x00
+pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_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
+released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x00
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/keycode_events.snapshot b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/keycode_events.snapshot
index 60d829a..b744542 100644
--- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/keycode_events.snapshot
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/keycode_events.snapshot
@@ -1,17 +1,17 @@
-pressed: usage_page 0x07 keycode 0xe0 mods 0x00
+pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_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
+pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_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
+released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_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
+released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
unreg: Modifier 1 count: 0
unreg: Modifier 1 released
unreg: Modifiers set to 0x00
diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/keycode_events.snapshot b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/keycode_events.snapshot
index b4755e5..74916a8 100644
--- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/keycode_events.snapshot
+++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/keycode_events.snapshot
@@ -1,17 +1,17 @@
-pressed: usage_page 0x07 keycode 0xe0 mods 0x00
+pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_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
+pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_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
+released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_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
+released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x00
diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/keycode_events.snapshot b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/keycode_events.snapshot
index 61dd271..6dad3de 100644
--- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/keycode_events.snapshot
+++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/keycode_events.snapshot
@@ -1,8 +1,8 @@
-pressed: usage_page 0x07 keycode 0x05 mods 0x02
+pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x02 explicit_mods 0x00
mods: Modifiers set to 0x02
-pressed: usage_page 0x07 keycode 0x04 mods 0x01
+pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x01 explicit_mods 0x00
mods: Modifiers set to 0x01
-released: usage_page 0x07 keycode 0x05 mods 0x02
+released: usage_page 0x07 keycode 0x05 implicit_mods 0x02 explicit_mods 0x00
mods: Modifiers set to 0x01
-released: usage_page 0x07 keycode 0x04 mods 0x01
+released: usage_page 0x07 keycode 0x04 implicit_mods 0x01 explicit_mods 0x00
mods: Modifiers set to 0x00
diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/keycode_events.snapshot b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/keycode_events.snapshot
index e8a231f..723b03e 100644
--- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/keycode_events.snapshot
+++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/keycode_events.snapshot
@@ -1,8 +1,8 @@
-pressed: usage_page 0x07 keycode 0x04 mods 0x01
+pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x01 explicit_mods 0x00
mods: Modifiers set to 0x01
-pressed: usage_page 0x07 keycode 0x05 mods 0x02
+pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x02 explicit_mods 0x00
mods: Modifiers set to 0x02
-released: usage_page 0x07 keycode 0x05 mods 0x02
+released: usage_page 0x07 keycode 0x05 implicit_mods 0x02 explicit_mods 0x00
mods: Modifiers set to 0x00
-released: usage_page 0x07 keycode 0x04 mods 0x01
+released: usage_page 0x07 keycode 0x04 implicit_mods 0x01 explicit_mods 0x00
mods: Modifiers set to 0x00
diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot
index 40c5841..aece8be 100644
--- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot
+++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot
@@ -1,13 +1,13 @@
-pressed: usage_page 0x07 keycode 0xe0 mods 0x00
+pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_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
+pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x02 explicit_mods 0x00
mods: Modifiers set to 0x03
-released: usage_page 0x07 keycode 0xe0 mods 0x00
+released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_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
+released: usage_page 0x07 keycode 0x05 implicit_mods 0x02 explicit_mods 0x00
mods: Modifiers set to 0x00
diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/keycode_events.snapshot b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/keycode_events.snapshot
index 5df571b..c24494f 100644
--- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/keycode_events.snapshot
+++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/keycode_events.snapshot
@@ -1,12 +1,12 @@
-pressed: usage_page 0x07 keycode 0xe0 mods 0x00
+pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_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
+pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x02 explicit_mods 0x00
mods: Modifiers set to 0x03
-released: usage_page 0x07 keycode 0x05 mods 0x02
+released: usage_page 0x07 keycode 0x05 implicit_mods 0x02 explicit_mods 0x00
mods: Modifiers set to 0x01
-released: usage_page 0x07 keycode 0xe0 mods 0x00
+released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00
unreg: Modifier 0 count: 0
unreg: Modifier 0 released
unreg: Modifiers set to 0x00
diff --git a/app/tests/momentary-layer/1-normal/keycode_events.snapshot b/app/tests/momentary-layer/1-normal/keycode_events.snapshot
index 608ce09..0a00aa2 100644
--- a/app/tests/momentary-layer/1-normal/keycode_events.snapshot
+++ b/app/tests/momentary-layer/1-normal/keycode_events.snapshot
@@ -1,4 +1,4 @@
mo_pressed: position 1 layer 1
-kp_pressed: usage_page 0x07 keycode 0x06 mods 0x00
-kp_released: usage_page 0x07 keycode 0x06 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00
mo_released: position 1 layer 1
diff --git a/app/tests/momentary-layer/2-early-key-release/keycode_events.snapshot b/app/tests/momentary-layer/2-early-key-release/keycode_events.snapshot
index 82ebc67..e24f11f 100644
--- a/app/tests/momentary-layer/2-early-key-release/keycode_events.snapshot
+++ b/app/tests/momentary-layer/2-early-key-release/keycode_events.snapshot
@@ -1,4 +1,4 @@
-kp_pressed: usage_page 0x07 keycode 0x05 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
mo_pressed: position 1 layer 1
-kp_released: usage_page 0x07 keycode 0x05 mods 0x00
+kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
mo_released: position 1 layer 1
diff --git a/app/tests/momentary-layer/4-nested/keycode_events.snapshot b/app/tests/momentary-layer/4-nested/keycode_events.snapshot
index f03e4d5..29b2e3f 100644
--- a/app/tests/momentary-layer/4-nested/keycode_events.snapshot
+++ b/app/tests/momentary-layer/4-nested/keycode_events.snapshot
@@ -1,6 +1,6 @@
mo_pressed: position 1 layer 1
mo_pressed: position 0 layer 2
-kp_pressed: usage_page 0x07 keycode 0x05 mods 0x00
-kp_released: usage_page 0x07 keycode 0x05 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
mo_released: position 0 layer 2
mo_released: position 1 layer 1
diff --git a/app/tests/momentary-layer/5-nested-early-key-release/keycode_events.snapshot b/app/tests/momentary-layer/5-nested-early-key-release/keycode_events.snapshot
index 15be601..d14d788 100644
--- a/app/tests/momentary-layer/5-nested-early-key-release/keycode_events.snapshot
+++ b/app/tests/momentary-layer/5-nested-early-key-release/keycode_events.snapshot
@@ -1,6 +1,6 @@
mo_pressed: position 1 layer 1
mo_pressed: position 0 layer 2
-kp_pressed: usage_page 0x07 keycode 0x05 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
mo_released: position 1 layer 1
mo_released: position 0 layer 2
-kp_released: usage_page 0x07 keycode 0x05 mods 0x00
+kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/sticky-keys/1-os-dn-up/keycode_events.snapshot b/app/tests/sticky-keys/1-os-dn-up/keycode_events.snapshot
index 5280f5c..d260989 100644
--- a/app/tests/sticky-keys/1-os-dn-up/keycode_events.snapshot
+++ b/app/tests/sticky-keys/1-os-dn-up/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0x08 mods 0x00
-released: usage_page 0x07 keycode 0x08 mods 0x00
-pressed: usage_page 0x07 keycode 0x04 mods 0x00
-released: usage_page 0x07 keycode 0x04 mods 0x00
+pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/keycode_events.snapshot b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/keycode_events.snapshot
index dba30cc..addbca8 100644
--- a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/keycode_events.snapshot
+++ b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/keycode_events.snapshot
@@ -1,8 +1,8 @@
-pressed: usage_page 0x07 keycode 0x08 mods 0x00
-pressed: usage_page 0x07 keycode 0x04 mods 0x00
-released: usage_page 0x07 keycode 0x08 mods 0x00
-released: usage_page 0x07 keycode 0x04 mods 0x00
-pressed: usage_page 0x07 keycode 0x08 mods 0x00
-pressed: usage_page 0x07 keycode 0x04 mods 0x00
-released: usage_page 0x07 keycode 0x08 mods 0x00
-released: usage_page 0x07 keycode 0x04 mods 0x00
+pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/keycode_events.snapshot b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/keycode_events.snapshot
index ee8aee0..1b091a6 100644
--- a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/keycode_events.snapshot
+++ b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0x08 mods 0x00
-pressed: usage_page 0x07 keycode 0x04 mods 0x00
-released: usage_page 0x07 keycode 0x04 mods 0x00
-released: usage_page 0x07 keycode 0x08 mods 0x00
+pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/keycode_events.snapshot b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/keycode_events.snapshot
index 758ed61..6e004ec 100644
--- a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/keycode_events.snapshot
+++ b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0x08 mods 0x00
-pressed: usage_page 0x07 keycode 0x04 mods 0x00
-released: usage_page 0x07 keycode 0x08 mods 0x00
-released: usage_page 0x07 keycode 0x04 mods 0x00
+pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/keycode_events.snapshot b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/keycode_events.snapshot
index 758ed61..6e004ec 100644
--- a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/keycode_events.snapshot
+++ b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0x08 mods 0x00
-pressed: usage_page 0x07 keycode 0x04 mods 0x00
-released: usage_page 0x07 keycode 0x08 mods 0x00
-released: usage_page 0x07 keycode 0x04 mods 0x00
+pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/keycode_events.snapshot b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/keycode_events.snapshot
index 99bac8d..03495b4 100644
--- a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/keycode_events.snapshot
+++ b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0x04 mods 0x00
-pressed: usage_page 0x07 keycode 0x08 mods 0x00
-released: usage_page 0x07 keycode 0x04 mods 0x00
-released: usage_page 0x07 keycode 0x08 mods 0x00
+pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/keycode_events.snapshot b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/keycode_events.snapshot
index a9de7e1..3c757bb 100644
--- a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/keycode_events.snapshot
+++ b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/keycode_events.snapshot
@@ -1,6 +1,6 @@
-pressed: usage_page 0x07 keycode 0x08 mods 0x00
-pressed: usage_page 0x07 keycode 0x04 mods 0x00
-pressed: usage_page 0x07 keycode 0x05 mods 0x00
-released: usage_page 0x07 keycode 0x08 mods 0x00
-released: usage_page 0x07 keycode 0x04 mods 0x00
-released: usage_page 0x07 keycode 0x05 mods 0x00
+pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/sticky-keys/8-lsk-osk-combination/keycode_events.snapshot b/app/tests/sticky-keys/8-lsk-osk-combination/keycode_events.snapshot
index 51660c3..8eb8a35 100644
--- a/app/tests/sticky-keys/8-lsk-osk-combination/keycode_events.snapshot
+++ b/app/tests/sticky-keys/8-lsk-osk-combination/keycode_events.snapshot
@@ -1,8 +1,8 @@
-pressed: usage_page 0x07 keycode 0xe0 mods 0x00
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0xe0 mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
-pressed: usage_page 0x07 keycode 0xe0 mods 0x00
-pressed: usage_page 0x07 keycode 0x1c mods 0x00
-released: usage_page 0x07 keycode 0xe0 mods 0x00
-released: usage_page 0x07 keycode 0x1c mods 0x00
+pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/sticky-keys/9-sk-dn-up-dn-up/keycode_events.snapshot b/app/tests/sticky-keys/9-sk-dn-up-dn-up/keycode_events.snapshot
index bfe7f61..d5bd587 100644
--- a/app/tests/sticky-keys/9-sk-dn-up-dn-up/keycode_events.snapshot
+++ b/app/tests/sticky-keys/9-sk-dn-up-dn-up/keycode_events.snapshot
@@ -1,4 +1,4 @@
-pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-released: usage_page 0x07 keycode 0xe1 mods 0x00
-pressed: usage_page 0x07 keycode 0xe1 mods 0x00
-released: usage_page 0x07 keycode 0xe1 mods 0x00
+pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/to-layer/normal/keycode_events.snapshot b/app/tests/to-layer/normal/keycode_events.snapshot
index 930a977..5ac5eb6 100644
--- a/app/tests/to-layer/normal/keycode_events.snapshot
+++ b/app/tests/to-layer/normal/keycode_events.snapshot
@@ -1,16 +1,16 @@
-kp_pressed: usage_page 0x07 keycode 0x16 mods 0x00
-kp_released: usage_page 0x07 keycode 0x16 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00
to_pressed: position 1 layer 1
layer_changed: layer 1 state 1
to_released: position 1 layer 1
-kp_pressed: usage_page 0x07 keycode 0x0e mods 0x00
-kp_released: usage_page 0x07 keycode 0x0e mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x0e implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x0e implicit_mods 0x00 explicit_mods 0x00
to_pressed: position 0 layer 0
layer_changed: layer 1 state 0
layer_changed: layer 0 state 1
to_released: position 0 layer 0
-kp_pressed: usage_page 0x07 keycode 0x16 mods 0x00
-kp_released: usage_page 0x07 keycode 0x16 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00
to_pressed: position 0 layer 0
to_released: position 0 layer 0
to_pressed: position 1 layer 1
diff --git a/app/tests/toggle-layer/early-key-release/keycode_events.snapshot b/app/tests/toggle-layer/early-key-release/keycode_events.snapshot
index 6b4d50b..e0aa502 100644
--- a/app/tests/toggle-layer/early-key-release/keycode_events.snapshot
+++ b/app/tests/toggle-layer/early-key-release/keycode_events.snapshot
@@ -1,6 +1,6 @@
-kp_pressed: usage_page 0x07 keycode 0x05 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
tog_pressed: position 1 layer 1
-kp_released: usage_page 0x07 keycode 0x05 mods 0x00
+kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00
tog_released: position 1 layer 1
-kp_pressed: usage_page 0x0c keycode 0xb5 mods 0x00
-kp_released: usage_page 0x0c keycode 0xb5 mods 0x00
+kp_pressed: usage_page 0x0c keycode 0xb5 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x0c keycode 0xb5 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/toggle-layer/normal/keycode_events.snapshot b/app/tests/toggle-layer/normal/keycode_events.snapshot
index d03295e..8b5b0cc 100644
--- a/app/tests/toggle-layer/normal/keycode_events.snapshot
+++ b/app/tests/toggle-layer/normal/keycode_events.snapshot
@@ -1,4 +1,4 @@
tog_pressed: position 1 layer 1
tog_released: position 1 layer 1
-kp_pressed: usage_page 0x0c keycode 0xb5 mods 0x00
-kp_released: usage_page 0x0c keycode 0xb5 mods 0x00
+kp_pressed: usage_page 0x0c keycode 0xb5 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x0c keycode 0xb5 implicit_mods 0x00 explicit_mods 0x00
diff --git a/app/tests/transparent/layered/keycode_events.snapshot b/app/tests/transparent/layered/keycode_events.snapshot
index 5e707b8..570e7d1 100644
--- a/app/tests/transparent/layered/keycode_events.snapshot
+++ b/app/tests/transparent/layered/keycode_events.snapshot
@@ -1,2 +1,2 @@
-kp_pressed: usage_page 0x07 keycode 0x04 mods 0x00
-kp_released: usage_page 0x07 keycode 0x04 mods 0x00
+kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00