From d09f7c7dcd794d91d1ca077661962a87ab3f4d80 Mon Sep 17 00:00:00 2001 From: Merlinov <64584348+Merlinov@users.noreply.github.com> Date: Wed, 8 Feb 2023 23:07:18 +0300 Subject: [PATCH] Update hid_listener.c --- app/src/hid_listener.c | 44 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/app/src/hid_listener.c b/app/src/hid_listener.c index af7c38d8..38633308 100644 --- a/app/src/hid_listener.c +++ b/app/src/hid_listener.c @@ -12,13 +12,30 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include +#include #include #include static int hid_listener_keycode_pressed(const struct zmk_keycode_state_changed *ev) { - int err; + int err, explicit_mods_changed, implicit_mods_changed; + 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); + err = zmk_hid_press(ZMK_HID_USAGE(ev->usage_page, ev->keycode)); + if (err < 0) { + LOG_DBG("Unable to press keycode"); + return err; + } + explicit_mods_changed = zmk_hid_register_mods(ev->explicit_modifiers); + implicit_mods_changed = zmk_hid_implicit_modifiers_press(ev->implicit_modifiers); + if (ev->usage_page != HID_USAGE_KEY && + (explicit_mods_changed > 0 || implicit_mods_changed > 0)) { + err = zmk_endpoints_send_report(HID_USAGE_KEY); + if (err < 0) { + LOG_ERR("Failed to send key report for changed mofifiers for consumer page event (%d)", + err); + int err, explicit_mods_changed, implicit_mods_changed; + switch (ev->usage_page) { case HID_USAGE_KEY: err = zmk_hid_keyboard_press(ev->keycode); @@ -44,6 +61,10 @@ static int hid_listener_keycode_released(const struct zmk_keycode_state_changed int err; 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); + err = zmk_hid_release(ZMK_HID_USAGE(ev->usage_page, ev->keycode)); + if (err < 0) { + LOG_DBG("Unable to release keycode"); + return err; switch (ev->usage_page) { case HID_USAGE_KEY: err = zmk_hid_keyboard_release(ev->keycode); @@ -59,7 +80,19 @@ static int hid_listener_keycode_released(const struct zmk_keycode_state_changed return err; } } + + explicit_mods_changed = zmk_hid_unregister_mods(ev->explicit_modifiers); zmk_hid_unregister_mods(ev->explicit_modifiers); + implicit_mods_changed = zmk_hid_implicit_modifiers_release(); + ; + if (ev->usage_page != HID_USAGE_KEY && + (explicit_mods_changed > 0 || implicit_mods_changed > 0)) { + err = zmk_endpoints_send_report(HID_USAGE_KEY); + if (err < 0) { + LOG_ERR("Failed to send key report for changed mofifiers for consumer page event (%d)", + err); + } + } // 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. @@ -75,12 +108,15 @@ int hid_listener(const zmk_event_t *eh) { if (kc_ev->state) { hid_listener_keycode_pressed(kc_ev); } else { - hid_listener_keycode_released(kc_ev); + hid_listener_keycode_released(ev); } return 0; } return 0; } - +const struct zmk_keycode_state_changed *ev = as_zmk_keycode_state_changed(eh); + if (ev) { + if (ev->state) { + hid_listener_keycode_pressed(ev); ZMK_LISTENER(hid_listener, hid_listener); -ZMK_SUBSCRIPTION(hid_listener, zmk_keycode_state_changed); \ No newline at end of file +ZMK_SUBSCRIPTION(hid_listener, zmk_keycode_state_changed);