fix: MCP overlay persists, not auto-closed by idle tick in <1s

DisplayIdle::tick() runs every 50ms. After startMcpScreensaver()
sets displayDimmed=true, the next tick saw inactive_ms < 100ms
(user navigated Settings) and called stopScreensaver() ->
overlay deleted in <1s, text tool flash-then-back.

Root cause: idle wake logic (inactive<100ms) + charging guard +
duty-restore all operated on any overlay including MCP override.

Fix: detect MCP active via (drawArea != nullptr || overrideActive)
under state.mutex, guard all auto-stop paths with !isMcpActive.
MCP still closable via click handler on overlay (CLICKABLE flag).

Test: flash es3c28p 2be0c0 31% free to /dev/cu.usbmodem101
192.168.68.113 dashboard 200, dev 6666 ok, /api/mcp 25 tools.
Requires PYTHONPATH cleaned for idf.py build (Hermes venv hijacks
pydantic_core).
This commit is contained in:
Adolfo Reyna
2026-07-11 20:32:05 -04:00
parent 2dc216fb7b
commit 6235fa0541
@@ -161,11 +161,18 @@ void DisplayIdleService::tick() {
}
uint32_t inactive_ms = 0;
inactive_ms = lv_display_get_inactive_time(nullptr);
// Only update if not stopping (prevents lag on touch)
if (displayDimmed && screensaverOverlay && !stopScreensaverRequested.load(std::memory_order_acquire)) {
// Check if MCP override is active — it must not be auto-stopped by idle logic
bool isMcpActive = false;
{
auto& st = mcp::getState();
std::lock_guard<std::mutex> lk(st.mutex);
isMcpActive = (st.drawArea != nullptr) || st.overrideActive;
}
// Only update if not stopping (prevents lag on touch) — skip for MCP (no animation)
if (displayDimmed && screensaverOverlay && !stopScreensaverRequested.load(std::memory_order_acquire) && !isMcpActive) {
// Check if screensaver should auto-off after 5 minutes
if (!backlightOff) {
screensaverActiveCounter++;
@@ -199,7 +206,7 @@ void DisplayIdleService::tick() {
if (supportsBacklight) {
if (!cachedDisplaySettings.backlightTimeoutEnabled || cachedDisplaySettings.backlightTimeoutMs == 0) {
if (displayDimmed) {
if (displayDimmed && !isMcpActive) {
display->setBacklightDuty(cachedDisplaySettings.backlightDuty);
displayDimmed = false;
}
@@ -220,7 +227,7 @@ void DisplayIdleService::tick() {
}
displayDimmed = true;
}
} else if (displayDimmed) {
} else if (displayDimmed && !isMcpActive) {
if (inactive_ms < kWakeActivityThresholdMs) {
stopScreensaver();
} else if (charging_blocks) {