From 0b4198d0a6726d10b6f9e98d0a1b1e380642d9b2 Mon Sep 17 00:00:00 2001 From: okke Date: Tue, 26 Jul 2022 21:51:02 +0200 Subject: [PATCH] Behaviors: Update last_listener_index before running event handler An event can be captured and released in the same event handler, before the last_listener_index would have been updated. This causes some handlers to be triggered multiple times. The solution is to update the last_listener_index before calling the next event handler, so capturing and releasing within an event handler is harmless. Also see discussion at https://github.com/zmkfirmware/zmk/pull/1401 --- app/src/combo.c | 2 +- app/src/event_manager.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/combo.c b/app/src/combo.c index e24b510a..13ed1709 100644 --- a/app/src/combo.c +++ b/app/src/combo.c @@ -253,7 +253,7 @@ static int release_pressed_keys() { if (i == 0) { LOG_DBG("combo: releasing position event %d", as_zmk_position_state_changed(captured_event)->position); - ZMK_EVENT_RAISE_AFTER(captured_event, combo); + ZMK_EVENT_RELEASE(captured_event) } else { // reprocess events (see tests/combo/fully-overlapping-combos-3 for why this is needed) LOG_DBG("combo: reraising position event %d", diff --git a/app/src/event_manager.c b/app/src/event_manager.c index eef5d839..471432a8 100644 --- a/app/src/event_manager.c +++ b/app/src/event_manager.c @@ -25,6 +25,7 @@ int zmk_event_manager_handle_from(zmk_event_t *event, uint8_t start_index) { if (ev_sub->event_type != event->event) { continue; } + event->last_listener_index = i; ret = ev_sub->listener->callback(event); switch (ret) { case ZMK_EV_EVENT_BUBBLE: @@ -35,7 +36,6 @@ int zmk_event_manager_handle_from(zmk_event_t *event, uint8_t start_index) { goto release; case ZMK_EV_EVENT_CAPTURED: LOG_DBG("Listener captured the event"); - event->last_listener_index = i; // Listeners are expected to free events they capture return 0; default: