From d66cf1fc0d03e84c5b9e50e3617183e7d19aa150 Mon Sep 17 00:00:00 2001 From: philmoz Date: Tue, 14 Oct 2025 22:09:07 +1100 Subject: [PATCH] fix(color): popup warning may block UI and key input (#6648) --- radio/src/gui/colorlcd/libui/popups.cpp | 18 ++++-------------- radio/src/gui/colorlcd/libui/popups.h | 3 +-- radio/src/gui/common/stdlcd/popups.cpp | 10 +++++++--- radio/src/gui/common/stdlcd/popups_common.h | 6 +++--- radio/src/logs.cpp | 4 ++-- radio/src/telemetry/telemetry.cpp | 4 ++-- 6 files changed, 19 insertions(+), 26 deletions(-) diff --git a/radio/src/gui/colorlcd/libui/popups.cpp b/radio/src/gui/colorlcd/libui/popups.cpp index 60061bfc7..ae2e891c4 100644 --- a/radio/src/gui/colorlcd/libui/popups.cpp +++ b/radio/src/gui/colorlcd/libui/popups.cpp @@ -88,27 +88,17 @@ void show_ui_popup() } } -void POPUP_WARNING_ON_UI_TASK(const char* message, const char* info, - bool waitForClose) +bool POPUP_WARNING_ON_UI_TASK(const char* message, const char* info) { - // if already in a popup, and we don't want to wait, ignore call - if (!waitForClose && ui_popup_active) return; + // if already in a popup, ignore call + if (ui_popup_active) return false; - // Wait in case already in popup. - while (ui_popup_active) { - sleep_ms(20); - } ui_popup_title = "Warning"; ui_popup_msg = message; ui_popup_info = info; ui_popup_active = true; - // Wait until closed - if (waitForClose) { - while (ui_popup_active) { - sleep_ms(20); - } - } + return true; } // Bubble popup style diff --git a/radio/src/gui/colorlcd/libui/popups.h b/radio/src/gui/colorlcd/libui/popups.h index c7972bb72..ca8fb38df 100644 --- a/radio/src/gui/colorlcd/libui/popups.h +++ b/radio/src/gui/colorlcd/libui/popups.h @@ -40,8 +40,7 @@ typedef std::function void POPUP_INFORMATION(const char *message); void POPUP_WARNING(const char *message, const char *info = nullptr); -void POPUP_WARNING_ON_UI_TASK(const char *message, const char *info = nullptr, - bool waitForClose = true); +bool POPUP_WARNING_ON_UI_TASK(const char *message, const char *info = nullptr); void POPUP_BUBBLE(const char *message, uint32_t timeout, coord_t width = LCD_W - 100); void show_ui_popup(); diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp index ca87c928f..1a3f5d05e 100644 --- a/radio/src/gui/common/stdlcd/popups.cpp +++ b/radio/src/gui/common/stdlcd/popups.cpp @@ -267,10 +267,8 @@ void POPUP_INFORMATION(const char * s) popupFunc = runPopupWarning; } -void POPUP_WARNING(const char * message, const char * info, bool waitForClose) +void POPUP_WARNING(const char * message, const char * info) { - (void)waitForClose; - warningText = message; warningInfoText = info; warningInfoLength = info ? strlen(info) : 0; @@ -279,6 +277,12 @@ void POPUP_WARNING(const char * message, const char * info, bool waitForClose) popupFunc = runPopupWarning; } +bool POPUP_WARNING_ON_UI_TASK(const char * message, const char * info) +{ + POPUP_WARNING(message, info); + return true; +} + void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags) { warningInfoText = info; diff --git a/radio/src/gui/common/stdlcd/popups_common.h b/radio/src/gui/common/stdlcd/popups_common.h index eee08b03e..e503788b4 100644 --- a/radio/src/gui/common/stdlcd/popups_common.h +++ b/radio/src/gui/common/stdlcd/popups_common.h @@ -74,7 +74,7 @@ enum WarningType #if !defined(GUI) #define DISPLAY_WARNING(...) inline void POPUP_WAIT(const char * s) { } - inline void POPUP_WARNING(const char *, const char * = nullptr, bool waitForClose) { } + inline void POPUP_WARNING(const char *, const char * = nullptr) { } inline void POPUP_CONFIRMATION(const char * s, PopupMenuHandler handler) { } inline void POPUP_INPUT(const char * s, PopupFunc func) { } inline void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags) { } @@ -83,7 +83,7 @@ enum WarningType extern void CLEAR_POPUP(); extern void POPUP_WAIT(const char * s); extern void POPUP_INFORMATION(const char * s); - extern void POPUP_WARNING(const char * message, const char * info = nullptr, bool waitForClose = true); + extern void POPUP_WARNING(const char * message, const char * info = nullptr); extern void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags); extern void POPUP_CONFIRMATION(const char * s, PopupMenuHandler handler); extern void POPUP_INPUT(const char * s, PopupFunc func); @@ -100,4 +100,4 @@ extern void POPUP_MENU_START(PopupMenuHandler handler); extern void POPUP_MENU_START(PopupMenuHandler handler, int count, ...); // For compatability with color LCD code base, not (currently) required for B&W -#define POPUP_WARNING_ON_UI_TASK POPUP_WARNING +bool POPUP_WARNING_ON_UI_TASK(const char *, const char * = nullptr); diff --git a/radio/src/logs.cpp b/radio/src/logs.cpp index 068312740..7e7420b67 100644 --- a/radio/src/logs.cpp +++ b/radio/src/logs.cpp @@ -249,7 +249,7 @@ void logsWrite() if (result) { if (result != error_displayed) { error_displayed = result; - POPUP_WARNING_ON_UI_TASK(result, nullptr, false); + POPUP_WARNING_ON_UI_TASK(result, nullptr); } return; } @@ -354,7 +354,7 @@ void logsWrite() if (result<0 && !error_displayed) { error_displayed = STR_SDCARD_ERROR; - POPUP_WARNING_ON_UI_TASK(STR_SDCARD_ERROR, nullptr, false); + POPUP_WARNING_ON_UI_TASK(STR_SDCARD_ERROR, nullptr); logsClose(); } } diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 3c30afcef..c2320bbcb 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -335,8 +335,8 @@ void telemetryWakeup() #if defined(PXX1) || defined(PXX2) if (isBadAntennaDetected()) { AUDIO_RAS_RED(); - POPUP_WARNING_ON_UI_TASK(STR_WARNING, STR_ANTENNAPROBLEM); - SCHEDULE_NEXT_ALARMS_CHECK(10 /*seconds*/); + if (POPUP_WARNING_ON_UI_TASK(STR_WARNING, STR_ANTENNAPROBLEM)) + SCHEDULE_NEXT_ALARMS_CHECK(10 /*seconds*/); } #endif