From 2339fd48a0f7a29e63c801b2ad6c6ba54b68e9ca Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Tue, 14 Apr 2026 14:33:58 +0300 Subject: fix: debug menu items had NULL callbacks after window appear MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit debug_refresh_menu() set all SimpleMenuItem.callback fields to NULL. debug_window_load() then set them to debug_menu_select_callback in a separate loop — but that loop ran *before* the debug_refresh_menu() call that immediately cleared them again. debug_window_appear also calls debug_refresh_menu(), so every re-focus wiped the callbacks. Fix: move the callback assignment into debug_refresh_menu() itself (adding a forward declaration so the function is in scope), and remove the now-redundant loop from debug_window_load(). Co-Authored-By: Claude Sonnet 4.6 --- src/c/fastforge.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/c/fastforge.c b/src/c/fastforge.c index 71c5852..f128592 100644 --- a/src/c/fastforge.c +++ b/src/c/fastforge.c @@ -358,39 +358,43 @@ static void settings_toggle_developer_mode(void) { #endif #ifdef DEBUG +static void debug_menu_select_callback(int index, void *context); + static void debug_refresh_menu(void) { snprintf(s_debug_menu_clock_text, sizeof(s_debug_menu_clock_text), "Debug %+ldh %s", (long)(s_fake_time_offset_seconds / 3600), s_fake_time_enabled ? "fake" : "real"); + /* Callbacks must be set here (not in load) because debug_refresh_menu is + * also called from debug_window_appear, which would otherwise clobber them. */ s_debug_menu_items[0] = (SimpleMenuItem) { .title = "+1 Hour", .subtitle = "Advance debug clock", - .callback = NULL + .callback = debug_menu_select_callback }; s_debug_menu_items[1] = (SimpleMenuItem) { .title = "+6 Hours", .subtitle = "Jump to next stage", - .callback = NULL + .callback = debug_menu_select_callback }; s_debug_menu_items[2] = (SimpleMenuItem) { .title = "+24 Hours", .subtitle = "Cross whole-day boundary", - .callback = NULL + .callback = debug_menu_select_callback }; s_debug_menu_items[3] = (SimpleMenuItem) { .title = "Use Real Clock", .subtitle = "Clear fake-time offset", - .callback = NULL + .callback = debug_menu_select_callback }; s_debug_menu_items[4] = (SimpleMenuItem) { .title = "Force Goal Alarm", .subtitle = "Trigger goal-hit flow now", - .callback = NULL + .callback = debug_menu_select_callback }; s_debug_menu_items[5] = (SimpleMenuItem) { .title = "Show Raw State", .subtitle = "Open debug snapshot", - .callback = NULL + .callback = debug_menu_select_callback }; s_debug_menu_sections[0] = (SimpleMenuSection) { .title = s_debug_menu_clock_text, @@ -469,9 +473,6 @@ static void debug_menu_select_callback(int index, void *context) { static void debug_window_load(Window *window) { Layer *window_layer = window_get_root_layer(window); GRect bounds = layer_get_bounds(window_layer); - for (size_t i = 0; i < ARRAY_LENGTH(s_debug_menu_items); i++) { - s_debug_menu_items[i].callback = debug_menu_select_callback; - } debug_refresh_menu(); s_debug_menu_layer = simple_menu_layer_create(bounds, window, s_debug_menu_sections, 1, NULL); layer_add_child(window_layer, simple_menu_layer_get_layer(s_debug_menu_layer)); -- cgit v1.2.3