summaryrefslogtreecommitdiff
path: root/app/src
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 /app/src
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.
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.