From ad6fa5a504829931cf84e79bc687c2004b8a0e97 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Sat, 8 Jan 2022 14:32:13 +1100 Subject: [PATCH] [client] app: move all alert management into overlay/alert.c --- client/src/app.c | 21 +------------- client/src/main.h | 5 ---- client/src/overlay/alert.c | 57 +++++++++++++++++++++++++++++++++++--- client/src/overlays.h | 2 ++ 4 files changed, 56 insertions(+), 29 deletions(-) diff --git a/client/src/app.c b/client/src/app.c index cd98084d..69753c64 100644 --- a/client/src/app.c +++ b/client/src/app.c @@ -39,8 +39,6 @@ #include #include -#define ALERT_TIMEOUT 2000000 - bool app_isRunning(void) { return @@ -552,15 +550,6 @@ void app_handleRenderEvent(const uint64_t timeUs) } } - if (g_state.alertShow) - if (g_state.alertTimeout < timeUs) - { - g_state.alertShow = false; - free(g_state.alertMessage); - g_state.alertMessage = NULL; - invalidate = true; - } - if (invalidate) app_invalidateWindow(false); } @@ -629,19 +618,11 @@ void app_alert(LG_MsgAlert type, const char * fmt, ...) if (!g_state.lgr || !g_params.showAlerts) return; - char * buffer; - va_list args; va_start(args, fmt); - valloc_sprintf(&buffer, fmt, args); + overlayAlert_show(type, fmt, args); va_end(args); - free(g_state.alertMessage); - g_state.alertMessage = buffer; - g_state.alertTimeout = microtime() + ALERT_TIMEOUT; - g_state.alertType = type; - g_state.alertShow = true; - g_state.renderImGuiTwice = true; app_invalidateWindow(false); } diff --git a/client/src/main.h b/client/src/main.h index 0e126ade..1aaa2215 100644 --- a/client/src/main.h +++ b/client/src/main.h @@ -63,11 +63,6 @@ struct AppState uint64_t lastImGuiFrame; bool renderImGuiTwice; - bool alertShow; - char * alertMessage; - LG_MsgAlert alertType; - uint64_t alertTimeout; - struct LG_DisplayServerOps * ds; bool dsInitialized; bool jitRender; diff --git a/client/src/overlay/alert.c b/client/src/overlay/alert.c index e46e2bb7..8d327dc2 100644 --- a/client/src/overlay/alert.c +++ b/client/src/overlay/alert.c @@ -22,8 +22,23 @@ #include "cimgui.h" #include "overlay_utils.h" +#include "common/stringutils.h" + #include "../main.h" +#define ALERT_TIMEOUT (2000 / (1000/25)) + +struct AlertState +{ + bool show; + char * message; + LG_MsgAlert type; + uint64_t timeout; + bool redraw; +}; + +struct AlertState l_alert = { 0 }; + static bool alert_init(void ** udata, const void * params) { return true; @@ -31,6 +46,8 @@ static bool alert_init(void ** udata, const void * params) static void alert_free(void * udata) { + free(l_alert.message); + l_alert.message = NULL; } static const uint32_t colours[] = @@ -44,14 +61,14 @@ static const uint32_t colours[] = static int alert_render(void * udata, bool interactive, struct Rect * windowRects, int maxRects) { - if (!g_state.alertShow) + if (!l_alert.show) return 0; ImVec2 * screen = overlayGetScreenSize(); igSetNextWindowBgAlpha(0.8f); igSetNextWindowPos((ImVec2) { screen->x / 2.0f, screen->y / 2.0f }, 0, (ImVec2) { 0.5f, 0.5f }); - igPushStyleColor_U32(ImGuiCol_WindowBg, colours[g_state.alertType]); + igPushStyleColor_U32(ImGuiCol_WindowBg, colours[l_alert.type]); igPushStyleVar_Vec2(ImGuiStyleVar_WindowPadding, (ImVec2) { 4.0f , 4.0f }); igPushStyleVar_Vec2(ImGuiStyleVar_WindowMinSize, (ImVec2) { 0.0f , 0.0f }); @@ -64,7 +81,7 @@ static int alert_render(void * udata, bool interactive, struct Rect * windowRect ); igPushFont(g_state.fontLarge); - igText("%s", g_state.alertMessage); + igText("%s", l_alert.message); igPopFont(); overlayGetImGuiRect(windowRects); @@ -76,10 +93,42 @@ static int alert_render(void * udata, bool interactive, struct Rect * windowRect return 1; } +static bool alert_tick(void * udata, unsigned long long tickCount) +{ + if (l_alert.show && l_alert.timeout-- == 0) + { + l_alert.show = false; + l_alert.redraw = true; + } + + if (!l_alert.redraw) + return false; + + l_alert.redraw = false; + return true; +} + struct LG_OverlayOps LGOverlayAlert = { .name = "alert", .init = alert_init, .free = alert_free, - .render = alert_render + .render = alert_render, + .tick = alert_tick, }; + +void overlayAlert_show(LG_MsgAlert type, const char * fmt, va_list args) +{ + if (!g_state.lgr || !g_params.showAlerts) + return; + + char * buffer; + valloc_sprintf(&buffer, fmt, args); + + free(l_alert.message); + l_alert.message = buffer; + l_alert.timeout = ALERT_TIMEOUT; + l_alert.type = type; + l_alert.show = true; + l_alert.redraw = true; +} diff --git a/client/src/overlays.h b/client/src/overlays.h index 74abb10d..9f6bcecb 100644 --- a/client/src/overlays.h +++ b/client/src/overlays.h @@ -38,6 +38,8 @@ extern struct LG_OverlayOps LGOverlayGraphs; extern struct LG_OverlayOps LGOverlayHelp; extern struct LG_OverlayOps LGOverlayConfig; +void overlayAlert_show(LG_MsgAlert type, const char * fmt, va_list args); + GraphHandle overlayGraph_register(const char * name, RingBuffer buffer, float min, float max); void overlayGraph_unregister();