summaryrefslogtreecommitdiff
path: root/app/src
diff options
context:
space:
mode:
Diffstat (limited to 'app/src')
-rw-r--r--app/src/hid.c18
-rw-r--r--app/src/hid_listener.c14
2 files changed, 26 insertions, 6 deletions
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.