From 1c792aab4753151248e1484f9f6a9ffc8044aa19 Mon Sep 17 00:00:00 2001 From: Randall Winkhart Date: Mon, 10 Aug 2026 20:33:12 -0400 Subject: [PATCH] Do not ignore wakeup events while in setter --- src/c/main.c | 142 +++++++++++++++++++++++++++------------------------ 1 file changed, 76 insertions(+), 66 deletions(-) diff --git a/src/c/main.c b/src/c/main.c index 939de22..20ab461 100644 --- a/src/c/main.c +++ b/src/c/main.c @@ -290,67 +290,6 @@ static void highlight_layer_update_proc(Layer *layer, GContext *ctx) { graphics_fill_rect(ctx, fill_area, 0, GCornerNone); } -static void setter_window_load() { - s_setter_highlight_color = GColorMediumAquamarine; - Layer *window_layer = window_get_root_layer(s_window); - - // top&bottom bars - add_bar_layers_to_window(window_layer, false); - - // clock icon - s_clock_bmp = gbitmap_create_with_resource(RESOURCE_ID_CLOCK35); - s_clock_bmp_layer = bitmap_layer_create(GRect(PBL_IF_ROUND_ELSE(0, 14), PBL_IF_ROUND_ELSE(6, 0), s_top_bar_grect.size.w, s_top_bar_grect.size.h)); - bitmap_layer_set_bitmap(s_clock_bmp_layer, s_clock_bmp); - bitmap_layer_set_alignment(s_clock_bmp_layer, PBL_IF_ROUND_ELSE(GAlignTop, GAlignLeft)); - bitmap_layer_set_compositing_mode(s_clock_bmp_layer, GCompOpSet); - layer_add_child(window_layer, bitmap_layer_get_layer(s_clock_bmp_layer)); - - // check icon - s_check_bmp = gbitmap_create_with_resource(RESOURCE_ID_CHECK); - s_check_bmp_layer = bitmap_layer_create(s_bottom_bar_grect); - bitmap_layer_set_bitmap(s_check_bmp_layer, s_check_bmp); - bitmap_layer_set_compositing_mode(s_check_bmp_layer, GCompOpSet); - layer_add_child(window_layer, bitmap_layer_get_layer(s_check_bmp_layer)); - - // countdown - s_counter_txt_layer = text_layer_create(GRect(PBL_IF_ROUND_ELSE(0, 39), (s_top_bar_grect.size.h / 2) + PBL_IF_ROUND_ELSE(10, -10), PBL_IF_ROUND_ELSE(s_top_bar_grect.size.w, s_top_bar_grect.size.w - 39), 32)); - text_layer_set_text_alignment(s_counter_txt_layer, GTextAlignmentCenter); - text_layer_set_text_color(s_counter_txt_layer, GColorWhite); - text_layer_set_background_color(s_counter_txt_layer, GColorClear); - text_layer_set_font(s_counter_txt_layer, s_font_lecoish_small); - layer_add_child(window_layer, text_layer_get_layer(s_counter_txt_layer)); - update_countdown_display(); - - // highlighter - s_setter_highlight_layer = layer_create(GRect(0, s_top_bar_grect.size.h, PBL_DISPLAY_WIDTH, PBL_DISPLAY_HEIGHT - (2 * s_top_bar_grect.size.h))); - layer_set_update_proc(s_setter_highlight_layer, highlight_layer_update_proc); - layer_add_child(window_layer, s_setter_highlight_layer); - - // setter - s_font_lecoish_big = fonts_load_custom_font(resource_get_handle(PBL_IF_ROUND_ELSE(RESOURCE_ID_FONT_LECOISH_MONO_BOLD_60, RESOURCE_ID_FONT_LECOISH_MONO_BOLD_40))); - s_setter_txt_layer = text_layer_create(GRect(0, (PBL_DISPLAY_HEIGHT / 2) - PBL_IF_ROUND_ELSE(30, 20), PBL_DISPLAY_WIDTH, PBL_IF_ROUND_ELSE(60, 40))); - text_layer_set_text_alignment(s_setter_txt_layer, GTextAlignmentCenter); - text_layer_set_background_color(s_setter_txt_layer, GColorClear); - text_layer_set_font(s_setter_txt_layer, s_font_lecoish_big); - layer_add_child(window_layer, text_layer_get_layer(s_setter_txt_layer)); - update_setter_display(); - - tick_timer_service_subscribe(SECOND_UNIT, setter_seconds_handler); -} - -static void setter_window_unload() { - text_layer_destroy(s_setter_txt_layer); - layer_destroy(s_setter_highlight_layer); - text_layer_destroy(s_counter_txt_layer); - bitmap_layer_destroy(s_check_bmp_layer); - bitmap_layer_destroy(s_clock_bmp_layer); - gbitmap_destroy(s_check_bmp); - gbitmap_destroy(s_clock_bmp); - layer_destroy(s_bottom_bar_layer); - layer_destroy(s_top_bar_layer); - fonts_unload_custom_font(s_font_lecoish_big); -} - static void alarm_seconds_handler(struct tm *tick_time, TimeUnits units_changed) { // re-schedule fallback alarm every 15 seconds if (tick_time->tm_sec % 15 == 0) { @@ -766,6 +705,81 @@ static void alarm_click_config_provider(void *ctx) { window_long_click_subscribe(BUTTON_ID_SELECT, 2500, alarm_select_hold_handler, NULL); } +static void push_alarm_window() { + window_set_window_handlers( + s_window, + (WindowHandlers){.load = alarm_window_load, .unload = alarm_window_unload}); + window_set_click_config_provider(s_window, alarm_click_config_provider); + window_stack_push(s_window, false); +} + +static void live_wakeup_handler_for_setter(WakeupId id, int32_t reason) { + window_stack_pop_all(false); + push_alarm_window(); +} + +static void setter_window_load() { + s_setter_highlight_color = GColorMediumAquamarine; + Layer *window_layer = window_get_root_layer(s_window); + + // top&bottom bars + add_bar_layers_to_window(window_layer, false); + + // clock icon + s_clock_bmp = gbitmap_create_with_resource(RESOURCE_ID_CLOCK35); + s_clock_bmp_layer = bitmap_layer_create(GRect(PBL_IF_ROUND_ELSE(0, 14), PBL_IF_ROUND_ELSE(6, 0), s_top_bar_grect.size.w, s_top_bar_grect.size.h)); + bitmap_layer_set_bitmap(s_clock_bmp_layer, s_clock_bmp); + bitmap_layer_set_alignment(s_clock_bmp_layer, PBL_IF_ROUND_ELSE(GAlignTop, GAlignLeft)); + bitmap_layer_set_compositing_mode(s_clock_bmp_layer, GCompOpSet); + layer_add_child(window_layer, bitmap_layer_get_layer(s_clock_bmp_layer)); + + // check icon + s_check_bmp = gbitmap_create_with_resource(RESOURCE_ID_CHECK); + s_check_bmp_layer = bitmap_layer_create(s_bottom_bar_grect); + bitmap_layer_set_bitmap(s_check_bmp_layer, s_check_bmp); + bitmap_layer_set_compositing_mode(s_check_bmp_layer, GCompOpSet); + layer_add_child(window_layer, bitmap_layer_get_layer(s_check_bmp_layer)); + + // countdown + s_counter_txt_layer = text_layer_create(GRect(PBL_IF_ROUND_ELSE(0, 39), (s_top_bar_grect.size.h / 2) + PBL_IF_ROUND_ELSE(10, -10), PBL_IF_ROUND_ELSE(s_top_bar_grect.size.w, s_top_bar_grect.size.w - 39), 32)); + text_layer_set_text_alignment(s_counter_txt_layer, GTextAlignmentCenter); + text_layer_set_text_color(s_counter_txt_layer, GColorWhite); + text_layer_set_background_color(s_counter_txt_layer, GColorClear); + text_layer_set_font(s_counter_txt_layer, s_font_lecoish_small); + layer_add_child(window_layer, text_layer_get_layer(s_counter_txt_layer)); + update_countdown_display(); + + // highlighter + s_setter_highlight_layer = layer_create(GRect(0, s_top_bar_grect.size.h, PBL_DISPLAY_WIDTH, PBL_DISPLAY_HEIGHT - (2 * s_top_bar_grect.size.h))); + layer_set_update_proc(s_setter_highlight_layer, highlight_layer_update_proc); + layer_add_child(window_layer, s_setter_highlight_layer); + + // setter + s_font_lecoish_big = fonts_load_custom_font(resource_get_handle(PBL_IF_ROUND_ELSE(RESOURCE_ID_FONT_LECOISH_MONO_BOLD_60, RESOURCE_ID_FONT_LECOISH_MONO_BOLD_40))); + s_setter_txt_layer = text_layer_create(GRect(0, (PBL_DISPLAY_HEIGHT / 2) - PBL_IF_ROUND_ELSE(30, 20), PBL_DISPLAY_WIDTH, PBL_IF_ROUND_ELSE(60, 40))); + text_layer_set_text_alignment(s_setter_txt_layer, GTextAlignmentCenter); + text_layer_set_background_color(s_setter_txt_layer, GColorClear); + text_layer_set_font(s_setter_txt_layer, s_font_lecoish_big); + layer_add_child(window_layer, text_layer_get_layer(s_setter_txt_layer)); + update_setter_display(); + + wakeup_service_subscribe(live_wakeup_handler_for_setter); + tick_timer_service_subscribe(SECOND_UNIT, setter_seconds_handler); +} + +static void setter_window_unload() { + text_layer_destroy(s_setter_txt_layer); + layer_destroy(s_setter_highlight_layer); + text_layer_destroy(s_counter_txt_layer); + bitmap_layer_destroy(s_check_bmp_layer); + bitmap_layer_destroy(s_clock_bmp_layer); + gbitmap_destroy(s_check_bmp); + gbitmap_destroy(s_clock_bmp); + layer_destroy(s_bottom_bar_layer); + layer_destroy(s_top_bar_layer); + fonts_unload_custom_font(s_font_lecoish_big); +} + static void init() { s_window = window_create(); s_font_lecoish_small = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_LECOISH_MONO_BOLD_20)); @@ -777,11 +791,7 @@ static void init() { switch (launch_reason()) { case APP_LAUNCH_PHONE: // DEBUG, REMOVE PRIOR TO RELEASE! case APP_LAUNCH_WAKEUP: - window_set_window_handlers( - s_window, - (WindowHandlers){.load = alarm_window_load, .unload = alarm_window_unload}); - window_set_click_config_provider(s_window, alarm_click_config_provider); - window_stack_push(s_window, false); + push_alarm_window(); break; default: window_set_window_handlers(