From c937bb3177b1e3d0411a245bf9ae3480c1a1093f Mon Sep 17 00:00:00 2001 From: Adolfo Reyna Date: Tue, 21 Jul 2026 12:01:27 -0400 Subject: [PATCH] fix(mcp): implement startMcpScreensaver - missing method caused linker error - Was declared in DisplayIdleService.h but not defined in clean refactored branch - Implementation taken from original 8970143f: locks LVGL, checks overlay, ensures backlight, creates McpScreensaver - Fixes build of feature/local-all-rebased on es3c28p --- .../service/displayidle/DisplayIdle.cpp | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/Tactility/Source/service/displayidle/DisplayIdle.cpp b/Tactility/Source/service/displayidle/DisplayIdle.cpp index 6967288f..52a94e6c 100644 --- a/Tactility/Source/service/displayidle/DisplayIdle.cpp +++ b/Tactility/Source/service/displayidle/DisplayIdle.cpp @@ -9,11 +9,11 @@ #include "StackChanScreensaver.h" #include "McpScreensaver.h" -#include #include #include #include #include +#include #include #include #include @@ -284,6 +284,61 @@ bool DisplayIdleService::isScreensaverActive() const { return screensaverOverlay != nullptr; } +void DisplayIdleService::startMcpScreensaver() { + if (!lvgl::lock(200)) { + LOG_W(TAG, "startMcpScreensaver: failed to acquire LVGL lock"); + return; + } + + if (screensaverOverlay != nullptr) { + // Screensaver already active — if drawArea is registered we're done, + // otherwise stop the current one so we can replace it with McpScreensaver. + const auto& mcpState = mcp::getState(); + if (mcpState.drawArea != nullptr) { + lvgl::unlock(); + return; // McpScreensaver already running + } + // Wrong screensaver type active — tear it down first + if (screensaver) { + screensaver->stop(); + screensaver.reset(); + } + lv_obj_delete(screensaverOverlay); + screensaverOverlay = nullptr; + } + + screensaverActiveCounter = 0; + backlightOff = false; + + // Ensure backlight is active if the display supports it + auto display = getDisplay(); + if (display != nullptr && display->supportsBacklightDuty()) { + uint8_t duty = cachedDisplaySettings.backlightDuty; + if (duty == 0) duty = 255; // ensure visible if settings not loaded / default + display->setBacklightDuty(duty); + } + + lv_coord_t screenW = lv_display_get_horizontal_resolution(nullptr); + lv_coord_t screenH = lv_display_get_vertical_resolution(nullptr); + + lv_obj_t* top = lv_layer_top(); + screensaverOverlay = lv_obj_create(top); + lv_obj_remove_style_all(screensaverOverlay); + lv_obj_set_size(screensaverOverlay, LV_PCT(100), LV_PCT(100)); + lv_obj_set_pos(screensaverOverlay, 0, 0); + lv_obj_set_style_bg_color(screensaverOverlay, lv_color_black(), 0); + lv_obj_set_style_bg_opa(screensaverOverlay, LV_OPA_COVER, 0); + lv_obj_add_flag(screensaverOverlay, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_event_cb(screensaverOverlay, stopScreensaverCb, LV_EVENT_CLICKED, this); + + screensaver = std::make_unique(); + screensaver->start(screensaverOverlay, screenW, screenH); + + lvgl::unlock(); + displayDimmed = true; + LOG_I(TAG, "MCP screensaver activated"); +} + void DisplayIdleService::reloadSettings() { // Set flag for thread-safe reload - actual reload happens in tick() settingsReloadRequested.store(true, std::memory_order_release);