summaryrefslogtreecommitdiff
path: root/app/src/hid_listener.c
diff options
context:
space:
mode:
authorOkke Formsma <okke@formsma.nl>2020-09-02 22:30:09 +0200
committerPete Johanson <peter@peterjohanson.com>2020-11-03 00:19:37 -0500
commit4f258efbf1602e212a808cc10915050a1b46e140 (patch)
treeed7601514e31895139ab91314610b2d570b1d326 /app/src/hid_listener.c
parenta9e729b427800fab230fc1fcdacd3cbdb6bedc19 (diff)
initial implementation for modifiers
https://github.com/zmkfirmware/zmk/issues/86
Diffstat (limited to 'app/src/hid_listener.c')
-rw-r--r--app/src/hid_listener.c51
1 files changed, 18 insertions, 33 deletions
diff --git a/app/src/hid_listener.c b/app/src/hid_listener.c
index 4467e6d..32e9d97 100644
--- a/app/src/hid_listener.c
+++ b/app/src/hid_listener.c
@@ -15,10 +15,11 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
#include <zmk/hid.h>
#include <zmk/endpoints.h>
-static int hid_listener_keycode_pressed(u8_t usage_page, u32_t keycode) {
+static int hid_listener_keycode_pressed(u8_t usage_page, u32_t keycode,
+ zmk_mod_flags implicit_modifiers) {
int err;
- LOG_DBG("usage_page 0x%02X keycode 0x%02X", usage_page, keycode);
-
+ LOG_DBG("usage_page 0x%02X keycode 0x%02X mods 0x%02X", usage_page, keycode,
+ implicit_modifiers);
switch (usage_page) {
case USAGE_KEYPAD:
err = zmk_hid_keypad_press(keycode);
@@ -35,14 +36,15 @@ static int hid_listener_keycode_pressed(u8_t usage_page, u32_t keycode) {
}
break;
}
-
+ zmk_hid_implicit_modifiers_press(implicit_modifiers);
return zmk_endpoints_send_report(usage_page);
}
-static int hid_listener_keycode_released(u8_t usage_page, u32_t keycode) {
+static int hid_listener_keycode_released(u8_t usage_page, u32_t keycode,
+ zmk_mod_flags implicit_modifiers) {
int err;
- LOG_DBG("usage_page 0x%02X keycode 0x%02X", usage_page, keycode);
-
+ LOG_DBG("usage_page 0x%02X keycode 0x%02X mods 0x%02X", usage_page, keycode,
+ implicit_modifiers);
switch (usage_page) {
case USAGE_KEYPAD:
err = zmk_hid_keypad_release(keycode);
@@ -57,44 +59,27 @@ static int hid_listener_keycode_released(u8_t usage_page, u32_t keycode) {
LOG_ERR("Unable to release keycode");
return err;
}
- break;
}
+ // There is a minor issue with this code.
+ // If LC(A) is pressed, then LS(B), then LC(A) is released, the shift for B will be released
+ // prematurely. This causes if LS(B) to repeat like Bbbbbbbb when pressed for a long time.
+ // Solving this would require keeping track of which key's implicit modifiers are currently
+ // active and only releasing modifiers at that time.
+ zmk_hid_implicit_modifiers_release();
return zmk_endpoints_send_report(usage_page);
}
-static int hid_listener_modifiers_pressed(zmk_mod_flags modifiers) {
- LOG_DBG("modifiers %d", modifiers);
-
- zmk_hid_register_mods(modifiers);
- return zmk_endpoints_send_report(USAGE_KEYPAD);
-}
-
-static int hid_listener_modifiers_released(zmk_mod_flags modifiers) {
- LOG_DBG("modifiers %d", modifiers);
-
- zmk_hid_unregister_mods(modifiers);
- return zmk_endpoints_send_report(USAGE_KEYPAD);
-}
-
int hid_listener(const struct zmk_event_header *eh) {
if (is_keycode_state_changed(eh)) {
const struct keycode_state_changed *ev = cast_keycode_state_changed(eh);
if (ev->state) {
- hid_listener_keycode_pressed(ev->usage_page, ev->keycode);
- } else {
- hid_listener_keycode_released(ev->usage_page, ev->keycode);
- }
- } else if (is_modifiers_state_changed(eh)) {
- const struct modifiers_state_changed *ev = cast_modifiers_state_changed(eh);
- if (ev->state) {
- hid_listener_modifiers_pressed(ev->modifiers);
+ hid_listener_keycode_pressed(ev->usage_page, ev->keycode, ev->implicit_modifiers);
} else {
- hid_listener_modifiers_released(ev->modifiers);
+ hid_listener_keycode_released(ev->usage_page, ev->keycode, ev->implicit_modifiers);
}
}
return 0;
}
ZMK_LISTENER(hid_listener, hid_listener);
-ZMK_SUBSCRIPTION(hid_listener, keycode_state_changed);
-ZMK_SUBSCRIPTION(hid_listener, modifiers_state_changed); \ No newline at end of file
+ZMK_SUBSCRIPTION(hid_listener, keycode_state_changed); \ No newline at end of file