summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJackson Moore <jacksonmoore@tuta.io>2026-09-04 12:45:41 +0200
committerJackson Moore <jacksonmoore@tuta.io>2026-09-04 12:45:41 +0200
commiteee2fe5b78d903045d92efb33354107d600f8107 (patch)
treec16493773c0ec56abe8a9f61c43ec93e26267740
parent800ec4fae75b9bfb69b132ddffc28d88c8690a3b (diff)
Clear feedback from current timer
-rw-r--r--lua/clever_f/feedback_service.lua18
-rw-r--r--tests/run.lua35
2 files changed, 48 insertions, 5 deletions
diff --git a/lua/clever_f/feedback_service.lua b/lua/clever_f/feedback_service.lua
index edaa39d..ac5f54b 100644
--- a/lua/clever_f/feedback_service.lua
+++ b/lua/clever_f/feedback_service.lua
@@ -712,23 +712,33 @@ function FeedbackService:cancel_highlight_timer()
return identity
end
-function FeedbackService:handle_highlight_timer(callback_identity)
+function FeedbackService:handle_highlight_timer(callback_identity, window)
if callback_identity == nil then
fail("highlight timer callback identity must be present", 2)
end
- return callback_identity == service_records[self].state.highlight_timer
+ local record = service_records[self]
+ if callback_identity ~= record.state.highlight_timer then
+ return false
+ end
+ local _, current = record.transitions:ClearHighlightTimer(callback_identity)
+ if not current then
+ return false
+ end
+ self:remove_character_overlays(window or record.host:read_window())
+ return true
end
-function FeedbackService:start_highlight_timer()
+function FeedbackService:start_highlight_timer(window)
local record = service_records[self]
local delay = self:highlight_timer_delay()
if delay == nil then
return nil
end
+ window = window or record.host:read_window()
self:cancel_highlight_timer()
local identity
identity = record.host:start_timer(delay, function(callback_identity)
- self:handle_highlight_timer(callback_identity or identity)
+ self:handle_highlight_timer(callback_identity or identity, window)
end)
record.transitions:SetHighlightTimer(identity)
return identity
diff --git a/tests/run.lua b/tests/run.lua
index c3e7009..cdda346 100644
--- a/tests/run.lua
+++ b/tests/run.lua
@@ -6663,7 +6663,40 @@ test("Timer callbacks compare their identity with current state", function()
falsy(feedback:handle_highlight_timer(stale))
same(current, state.highlight_timer)
truthy(feedback:handle_highlight_timer(current))
- same(current, state.highlight_timer)
+ same(nil, state.highlight_timer)
+end)
+
+test("Current timer callback clears timer and character overlays", function()
+ local state, transitions = fresh_sequence_state()
+ local host = MemoryHost.new({
+ buffer_lines = { "aba" },
+ configuration = {
+ mark_char = true,
+ highlight_timeout_ms = 30,
+ },
+ })
+ local feedback = feedback_service.new({
+ host = host,
+ transitions = transitions,
+ })
+ local shared_target = target_plan.build(target("a"), matching_policy())
+ local movement = motion_plan.build(shared_target, "f")
+ local persistent = feedback:request_persistent({
+ context = "n",
+ anchor = domain.Position.new(1, 1),
+ target_plan = shared_target,
+ motion_plan = movement,
+ window = "window-1",
+ })
+ local timer = feedback:start_highlight_timer("window-1")
+
+ truthy(host:fire_timer(timer))
+
+ same(nil, state.highlight_timer)
+ same(0, #state.target_overlays)
+ same(nil, host:highlights()[persistent.identity])
+ same(1, #state.finalizers)
+ falsy(host:timers()[timer].active)
end)
for _, item in ipairs(tests) do