diff --git a/src/activities/reader/EpubReaderActivity.cpp b/src/activities/reader/EpubReaderActivity.cpp index 833600d1..5f59fb32 100644 --- a/src/activities/reader/EpubReaderActivity.cpp +++ b/src/activities/reader/EpubReaderActivity.cpp @@ -185,6 +185,7 @@ void EpubReaderActivity::loop() { // Long press BACK (1s+) goes to home screen if (mappedInput.isPressed(MappedInputManager::Button::Back) && mappedInput.getHeldTime() >= ReaderUtils::GO_HOME_MS) { + ReaderUtils::enforceExitFullRefresh(renderer); onGoHome(); return; } @@ -196,6 +197,7 @@ void EpubReaderActivity::loop() { restoreSavedPosition(); return; } + ReaderUtils::enforceExitFullRefresh(renderer); finish(); return; } diff --git a/src/activities/reader/ReaderUtils.h b/src/activities/reader/ReaderUtils.h index 8694be08..aa55bf7e 100644 --- a/src/activities/reader/ReaderUtils.h +++ b/src/activities/reader/ReaderUtils.h @@ -59,6 +59,12 @@ inline void displayWithRefreshCycle(const GfxRenderer& renderer, int& pagesUntil } } +inline void enforceExitFullRefresh(const GfxRenderer& renderer) { + // Reader exits can leave visible ghosting when the next screen is rendered with a fast LUT. + // Force one full waveform pass before leaving the reader stack. + renderer.displayBuffer(HalDisplay::FULL_REFRESH); +} + // Grayscale anti-aliasing pass. Renders content twice (LSB + MSB) to build // the grayscale buffer. Only the content callback is re-rendered — status bars // and other overlays should be drawn before calling this. diff --git a/src/activities/reader/TxtReaderActivity.cpp b/src/activities/reader/TxtReaderActivity.cpp index 261dfb2c..a62576ce 100644 --- a/src/activities/reader/TxtReaderActivity.cpp +++ b/src/activities/reader/TxtReaderActivity.cpp @@ -119,6 +119,7 @@ void TxtReaderActivity::onExit() { void TxtReaderActivity::loop() { // Long press BACK (1s+) goes to home screen if (mappedInput.isPressed(MappedInputManager::Button::Back) && mappedInput.getHeldTime() >= ReaderUtils::GO_HOME_MS) { + ReaderUtils::enforceExitFullRefresh(renderer); onGoHome(); return; } @@ -126,6 +127,7 @@ void TxtReaderActivity::loop() { // Short press BACK returns to the calling activity if (mappedInput.wasReleased(MappedInputManager::Button::Back) && mappedInput.getHeldTime() < ReaderUtils::GO_HOME_MS) { + ReaderUtils::enforceExitFullRefresh(renderer); finish(); return; } diff --git a/src/activities/reader/XtcReaderActivity.cpp b/src/activities/reader/XtcReaderActivity.cpp index e443f12f..d4f64a3a 100644 --- a/src/activities/reader/XtcReaderActivity.cpp +++ b/src/activities/reader/XtcReaderActivity.cpp @@ -15,6 +15,7 @@ #include "CrossPointSettings.h" #include "CrossPointState.h" #include "MappedInputManager.h" +#include "ReaderUtils.h" #include "RecentBooksStore.h" #include "XtcReaderChapterSelectionActivity.h" #include "components/UITheme.h" @@ -73,12 +74,14 @@ void XtcReaderActivity::loop() { // Long press BACK (1s+) goes to home screen if (mappedInput.isPressed(MappedInputManager::Button::Back) && mappedInput.getHeldTime() >= goHomeMs) { + ReaderUtils::enforceExitFullRefresh(renderer); onGoHome(); return; } // Short press BACK returns to the calling activity if (mappedInput.wasReleased(MappedInputManager::Button::Back) && mappedInput.getHeldTime() < goHomeMs) { + ReaderUtils::enforceExitFullRefresh(renderer); finish(); return; }