fix(x3): white pre-flash on sleep entry to clear reader page ghosting

On X3 panels, perform a full-sync white flash before rendering the sleep
screen. The previous approach (requestResync condition passes after the
sleep image) reduced ghosting but the first frame still showed residual
content from the reader page. The pre-flash drives the panel to a clean
white state first, so the sleep screen renders ghost-free.

Skipped for OVERLAY mode (frame buffer must stay intact) and BLANK mode
(which renders white anyway).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
jpirnay
2026-05-14 18:07:28 +02:00
co-authored by Claude Sonnet 4.6
parent 509adada2c
commit bc62d882e4
+14 -4
View File
@@ -4,6 +4,7 @@
#include <Epub/converters/PngToFramebufferConverter.h>
#include <FsHelpers.h>
#include <GfxRenderer.h>
#include <HalGPIO.h>
#include <HalStorage.h>
#include <I18n.h>
#include <PNGdec.h>
@@ -357,10 +358,19 @@ void SleepActivity::onEnter() {
if (SETTINGS.sleepScreen != CrossPointSettings::SLEEP_SCREEN_MODE::OVERLAY) {
GUI.drawPopup(renderer, tr(STR_ENTERING_SLEEP));
}
// X3 panels need extra settle passes to fully clear ghosting from the previous reader page
// before showing the static sleep image. No-op on other panels. Placed after the popup so
// its own displayBuffer doesn't consume the request.
display.requestResync(2);
// X3 panels: flash white before rendering the sleep image so any ghosting from the reader
// page is fully cleared. The full sync triggered by requestResync drives the panel to a
// clean white state; the sleep screen is then drawn on top without residual ghost content.
// Skipped for OVERLAY (frame buffer must stay intact) and BLANK (already renders white).
const bool needsX3PreFlash =
gpio.deviceIsX3() &&
SETTINGS.sleepScreen != CrossPointSettings::SLEEP_SCREEN_MODE::OVERLAY &&
SETTINGS.sleepScreen != CrossPointSettings::SLEEP_SCREEN_MODE::BLANK;
if (needsX3PreFlash) {
renderer.clearScreen();
display.requestResync(1);
renderer.displayBuffer(HalDisplay::HALF_REFRESH);
}
switch (SETTINGS.sleepScreen) {
case (CrossPointSettings::SLEEP_SCREEN_MODE::BLANK):