From aab348a142122ba5d538f61101ade52e121ee92d Mon Sep 17 00:00:00 2001
From: Nick Conway <nick@conway.dev>
Date: Sun, 4 Jun 2023 02:23:15 -0400
Subject: [PATCH] Fix leader overlapping with timerless

---
 app/src/leader.c                              |  2 +-
 .../behavior_keymap_overlap_timerless.dtsi    | 37 +++++++++++++++++++
 .../overlapping-timerless/events.patterns     |  2 +
 .../keycode_events.snapshot                   |  4 ++
 .../native_posix_64.keymap                    | 10 +++++
 5 files changed, 54 insertions(+), 1 deletion(-)
 create mode 100644 app/tests/leader/behavior_keymap_overlap_timerless.dtsi
 create mode 100644 app/tests/leader/overlapping-timerless/events.patterns
 create mode 100644 app/tests/leader/overlapping-timerless/keycode_events.snapshot
 create mode 100644 app/tests/leader/overlapping-timerless/native_posix_64.keymap

diff --git a/app/src/leader.c b/app/src/leader.c
index 9f90ebf1..ed7e5493 100644
--- a/app/src/leader.c
+++ b/app/src/leader.c
@@ -324,7 +324,7 @@ static int position_state_changed_listener(const zmk_event_t *ev) {
                     zmk_leader_deactivate();
                 }
             }
-            if (!timerless) {
+            if (!timerless || num_comp_candidates < num_candidates) {
                 reset_timer(data->timestamp);
             }
         }
diff --git a/app/tests/leader/behavior_keymap_overlap_timerless.dtsi b/app/tests/leader/behavior_keymap_overlap_timerless.dtsi
new file mode 100644
index 00000000..c4c66fa5
--- /dev/null
+++ b/app/tests/leader/behavior_keymap_overlap_timerless.dtsi
@@ -0,0 +1,37 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan_mock.h>
+
+&leader {
+    timeout-ms = <200>;
+    timerless;
+};
+
+/ {
+    leader-sequences {
+        compatible = "zmk,leader-sequences";
+
+        leader_seq_one {
+            key-positions = <0>;
+            bindings = <&kp A>;
+        };
+
+        leader_seq_two {
+            key-positions = <0 0>;
+            bindings = <&kp B>;
+        };
+
+    };
+
+    keymap {
+        compatible = "zmk,keymap";
+        label ="Default keymap";
+
+        default_layer {
+            bindings = <
+                &kp N1 &kp N2
+                &kp N3 &leader
+            >;
+        };
+    };
+};
diff --git a/app/tests/leader/overlapping-timerless/events.patterns b/app/tests/leader/overlapping-timerless/events.patterns
new file mode 100644
index 00000000..e7381345
--- /dev/null
+++ b/app/tests/leader/overlapping-timerless/events.patterns
@@ -0,0 +1,2 @@
+s/.*hid_listener_keycode_//p
+s/.*zmk_leader.*:/leader:/p
diff --git a/app/tests/leader/overlapping-timerless/keycode_events.snapshot b/app/tests/leader/overlapping-timerless/keycode_events.snapshot
new file mode 100644
index 00000000..9ab32b1a
--- /dev/null
+++ b/app/tests/leader/overlapping-timerless/keycode_events.snapshot
@@ -0,0 +1,4 @@
+leader: leader key activated
+pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00
+leader: leader key deactivated
diff --git a/app/tests/leader/overlapping-timerless/native_posix_64.keymap b/app/tests/leader/overlapping-timerless/native_posix_64.keymap
new file mode 100644
index 00000000..ce1258f7
--- /dev/null
+++ b/app/tests/leader/overlapping-timerless/native_posix_64.keymap
@@ -0,0 +1,10 @@
+#include "../behavior_keymap_overlap_timerless.dtsi"
+
+&kscan {
+    events = <
+        ZMK_MOCK_PRESS(1,1,10)
+        ZMK_MOCK_RELEASE(1,1,10)
+        ZMK_MOCK_PRESS(0,0,10)
+        ZMK_MOCK_RELEASE(0,0,2000)
+    >;
+};