From 53aadc4f931a27d7b1350ea99cdc79106e138ad3 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Fri, 22 May 2020 22:47:03 -0400 Subject: Initial exploration of mod tap action. --- src/handlers.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'src/handlers.c') diff --git a/src/handlers.c b/src/handlers.c index b73c92c..8c463a9 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -2,20 +2,71 @@ #include #include #include +#include +#include + +#ifdef CONFIG_ZMK_ACTION_MOD_TAP +u16_t action_effect_pending = 0; +#endif __attribute__((weak)) bool zmk_handle_key_user(struct zmk_key_event *key_event) { return true; }; +bool zmk_handle_action(zmk_action action, struct zmk_key_event *key_event) +{ + zmk_mod mods = ZK_MODS(key_event->key); + u8_t flattened_index = (key_event->row * ZMK_MATRIX_COLS) + key_event->column; + switch (action) + { +#ifdef CONFIG_ZMK_ACTION_MOD_TAP + case ZMK_ACTION_MOD_TAP: + if (key_event->pressed) + { + WRITE_BIT(action_effect_pending, flattened_index, true); + zmk_hid_register_mods(mods); + } + else + { + zmk_hid_unregister_mods(mods); + if (action_effect_pending & BIT(flattened_index)) + { + // Allow baseline keycode to flow to the endpoints! + return true; + } + else + { + // Since not sending a keycode, at least send the report w/ the mod removed + zmk_endpoints_send_report(); + } + } + break; +#endif + } + return false; +}; + void zmk_handle_key(struct zmk_key_event key_event) { + zmk_action action = ZK_ACTION(key_event.key); + if (!zmk_handle_key_user(&key_event)) { return; } + if (action && !zmk_handle_action(action, &key_event)) + { + return; + } + +#ifdef CONFIG_ZMK_ACTION_MOD_TAP + action_effect_pending = 0; +#endif + #ifdef CONFIG_ZMK_BLE + /* Used for intercepting key presses when doing passkey verification */ if (!zmk_ble_handle_key_user(&key_event)) { return; -- cgit v1.2.3 From 76a433fc392be31e56df256b630a21e61775d0af Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Sun, 24 May 2020 23:13:33 -0400 Subject: Clean up and implement MT release w/o mod press. --- src/handlers.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'src/handlers.c') diff --git a/src/handlers.c b/src/handlers.c index 8c463a9..ff969b1 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -32,8 +32,16 @@ bool zmk_handle_action(zmk_action action, struct zmk_key_event *key_event) zmk_hid_unregister_mods(mods); if (action_effect_pending & BIT(flattened_index)) { - // Allow baseline keycode to flow to the endpoints! - return true; + struct zmk_key_event non_mod_event = + { + .row = key_event->row, + .column = key_event->column, + .key = ZK_KEY(key_event->key), + .pressed = true}; + + zmk_handle_key(non_mod_event); + non_mod_event.pressed = false; + zmk_handle_key(non_mod_event); } else { -- cgit v1.2.3