From 17883dc0a18ab6796e6053bb4df9d4a94fc7304b Mon Sep 17 00:00:00 2001 From: Andrew Rae Date: Thu, 24 Mar 2022 11:26:16 -0400 Subject: [PATCH] Properly integrating global quick tap as an option --- .../behaviors/zmk,behavior-hold-tap.yaml | 2 ++ app/src/behaviors/behavior_hold_tap.c | 30 ++++++++++++------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml index 09691159..e4cfaeab 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml @@ -20,6 +20,8 @@ properties: default: -1 quick_tap_ms: # deprecated type: int + global-quick-tap: + type: boolean flavor: type: string required: false diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index b92a2c34..06c85ed4 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -57,6 +57,7 @@ struct behavior_hold_tap_config { char *hold_behavior_dev; char *tap_behavior_dev; int quick_tap_ms; + bool global_quick_tap; enum flavor flavor; bool retro_tap; int32_t hold_trigger_key_positions_len; @@ -88,22 +89,30 @@ struct active_hold_tap active_hold_taps[ZMK_BHV_HOLD_TAP_MAX_HELD] = {}; // We capture most position_state_changed events and some modifiers_state_changed events. const zmk_event_t *captured_events[ZMK_BHV_HOLD_TAP_MAX_CAPTURED_EVENTS] = {}; -// Keep track of which key was tapped most recently for 'quick_tap_ms' -struct last_tapped { +// Keep track of which hold tap key was tapped most recently for the standard +// 'quick_tap_ms' implementation +struct last_hold_tapped { int32_t position; int64_t timestamp; }; -struct last_tapped last_tapped; +struct last_hold_tapped last_hold_tapped; -static void store_last_tapped(int32_t position, int64_t timestamp) { - last_tapped.position = position; - last_tapped.timestamp = timestamp; +static void store_last_hold_tapped(struct active_hold_tap *hold_tap) { + last_hold_tapped.position = hold_tap->position; + last_hold_tapped.timestamp = hold_tap->timestamp + hold_tap->config->quick_tap_ms; } +// For global quick tap we just keep track of when the last key was pressed last +int64_t last_key_tapped_timestamp; + static bool is_quick_tap(struct active_hold_tap *hold_tap) { - return //last_tapped.position == hold_tap->position && - last_tapped.timestamp + hold_tap->config->quick_tap_ms > hold_tap->timestamp; + if (hold_tap->config->global_quick_tap) { + return (last_key_tapped_timestamp + hold_tap->config->quick_tap_ms) > hold_tap->timestamp; + } else { + return last_hold_tapped.position == hold_tap->position && + last_hold_tapped.timestamp > hold_tap->timestamp; + } } static int capture_event(const zmk_event_t *event) { @@ -362,7 +371,7 @@ static int press_binding(struct active_hold_tap *hold_tap) { } else { binding.behavior_dev = hold_tap->config->tap_behavior_dev; binding.param1 = hold_tap->param_tap; - /* store_last_tapped(hold_tap); */ + store_last_hold_tapped(hold_tap); } return behavior_keymap_binding_pressed(&binding, event); } @@ -620,7 +629,7 @@ static int keycode_state_changed_listener(const zmk_event_t *eh) { struct zmk_keycode_state_changed *ev = as_zmk_keycode_state_changed(eh); if (ev->state && !is_mod(ev->usage_page, ev->keycode)) { - store_last_tapped(0, ev->timestamp); + last_key_tapped_timestamp = ev->timestamp; } if (undecided_hold_tap == NULL) { @@ -687,6 +696,7 @@ static struct behavior_hold_tap_data behavior_hold_tap_data; .hold_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 0)), \ .tap_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 1)), \ .quick_tap_ms = DT_INST_PROP(n, quick_tap_ms), \ + .global_quick_tap = DT_INST_PROP(n, global_quick_tap), \ .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ .retro_tap = DT_INST_PROP(n, retro_tap), \ .hold_trigger_key_positions = DT_INST_PROP(n, hold_trigger_key_positions), \