summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOkke Formsma <okke@formsma.nl>2021-01-22 17:00:19 +0100
committerPete Johanson <peter@peterjohanson.com>2021-01-24 23:30:41 -0500
commit7b7701ae90469b920cd78e2ab7aca0c470140b7a (patch)
treeb4fade597239b5f0df24197faea3413e305a636f
parent0c30b49063c79be2416453f4544795922efad74f (diff)
feature(modifiers): add explicit modifiers
this makes LS(LEFT_CONTROL) work as if shift and control were both pressed explicitly. Previously, the left shift would have been released as soon as another key was pressed. The implicit behavior is useful in case of LS(NUMBER_1) when rolling over to other keys. Also see #361.
-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