Add aditional RenderLocks

This commit is contained in:
jpirnay
2026-04-08 14:17:43 +02:00
parent 0abe6c6e58
commit 07906853d6
8 changed files with 66 additions and 19 deletions
@@ -8,6 +8,7 @@
void BootActivity::onEnter() { void BootActivity::onEnter() {
Activity::onEnter(); Activity::onEnter();
RenderLock lock(*this);
const auto pageWidth = renderer.getScreenWidth(); const auto pageWidth = renderer.getScreenWidth();
const auto pageHeight = renderer.getScreenHeight(); const auto pageHeight = renderer.getScreenHeight();
+4 -1
View File
@@ -98,7 +98,10 @@ void BookInfoActivity::loadData() {
void BookInfoActivity::onEnter() { void BookInfoActivity::onEnter() {
Activity::onEnter(); Activity::onEnter();
renderLoading(); {
RenderLock lock(*this);
renderLoading();
}
loadData(); loadData();
requestUpdate(true); requestUpdate(true);
} }
+8 -2
View File
@@ -58,7 +58,10 @@ void EpubReaderActivity::onEnter() {
// Configure screen orientation based on settings // Configure screen orientation based on settings
// NOTE: This affects layout math and must be applied before any render calls. // NOTE: This affects layout math and must be applied before any render calls.
ReaderUtils::applyOrientation(renderer, SETTINGS.orientation); {
RenderLock lock(*this);
ReaderUtils::applyOrientation(renderer, SETTINGS.orientation);
}
epub->setupCacheDir(); epub->setupCacheDir();
@@ -107,7 +110,10 @@ void EpubReaderActivity::onExit() {
Activity::onExit(); Activity::onExit();
// Reset orientation back to portrait for the rest of the UI // Reset orientation back to portrait for the rest of the UI
renderer.setOrientation(GfxRenderer::Orientation::Portrait); {
RenderLock lock(*this);
renderer.setOrientation(GfxRenderer::Orientation::Portrait);
}
APP_STATE.readerActivityLoadCount = 0; APP_STATE.readerActivityLoadCount = 0;
APP_STATE.saveToFile(); APP_STATE.saveToFile();
+6 -3
View File
@@ -125,9 +125,12 @@ void ReaderActivity::onEnter() {
if (isImageFile(initialBookPath)) { if (isImageFile(initialBookPath)) {
onGoToBmpViewer(initialBookPath); onGoToBmpViewer(initialBookPath);
} else if (isXtcFile(initialBookPath)) { } else if (isXtcFile(initialBookPath)) {
renderer.clearScreen(); {
renderer.drawCenteredText(UI_12_FONT_ID, 300, tr(STR_LOADING), true, EpdFontFamily::BOLD); RenderLock lock(*this);
renderer.displayBuffer(); renderer.clearScreen();
renderer.drawCenteredText(UI_12_FONT_ID, 300, tr(STR_LOADING), true, EpdFontFamily::BOLD);
renderer.displayBuffer();
}
auto xtc = loadXtc(initialBookPath); auto xtc = loadXtc(initialBookPath);
if (!xtc) { if (!xtc) {
+8 -2
View File
@@ -92,7 +92,10 @@ void TxtReaderActivity::onEnter() {
return; return;
} }
ReaderUtils::applyOrientation(renderer, SETTINGS.orientation); {
RenderLock lock(*this);
ReaderUtils::applyOrientation(renderer, SETTINGS.orientation);
}
txt->setupCacheDir(); txt->setupCacheDir();
@@ -111,7 +114,10 @@ void TxtReaderActivity::onExit() {
Activity::onExit(); Activity::onExit();
// Reset orientation back to portrait for the rest of the UI // Reset orientation back to portrait for the rest of the UI
renderer.setOrientation(GfxRenderer::Orientation::Portrait); {
RenderLock lock(*this);
renderer.setOrientation(GfxRenderer::Orientation::Portrait);
}
pageOffsets.clear(); pageOffsets.clear();
currentPageLines.clear(); currentPageLines.clear();
+18 -6
View File
@@ -127,6 +127,7 @@ void BmpViewerActivity::onExit() {
} }
bool BmpViewerActivity::renderBmpImage(const bool showControls) { bool BmpViewerActivity::renderBmpImage(const bool showControls) {
RenderLock lock(*this);
FsFile file; FsFile file;
const auto pageWidth = renderer.getScreenWidth(); const auto pageWidth = renderer.getScreenWidth();
const auto pageHeight = renderer.getScreenHeight(); const auto pageHeight = renderer.getScreenHeight();
@@ -192,6 +193,7 @@ bool BmpViewerActivity::renderBmpImage(const bool showControls) {
} }
bool BmpViewerActivity::renderDecodedImage(const bool showControls) { bool BmpViewerActivity::renderDecodedImage(const bool showControls) {
RenderLock lock(*this);
const auto pageWidth = renderer.getScreenWidth(); const auto pageWidth = renderer.getScreenWidth();
const auto pageHeight = renderer.getScreenHeight(); const auto pageHeight = renderer.getScreenHeight();
Rect popupRect = GUI.drawPopup(renderer, tr(STR_LOADING_POPUP)); Rect popupRect = GUI.drawPopup(renderer, tr(STR_LOADING_POPUP));
@@ -291,8 +293,11 @@ void BmpViewerActivity::toggleDisplayMode() {
grayscaleDisplay = !grayscaleDisplay; grayscaleDisplay = !grayscaleDisplay;
// Switching between 1-bit BW and 4-level grayscale requires a full refresh to clear // Switching between 1-bit BW and 4-level grayscale requires a full refresh to clear
// ghosting from the previous mode — a half refresh leaves visible residue. // ghosting from the previous mode — a half refresh leaves visible residue.
renderer.clearScreen(); {
renderer.displayBuffer(HalDisplay::FULL_REFRESH); RenderLock lock(*this);
renderer.clearScreen();
renderer.displayBuffer(HalDisplay::FULL_REFRESH);
}
if (!renderCurrentImage()) { if (!renderCurrentImage()) {
renderError(tr(STR_COULD_NOT_RENDER_IMAGE)); renderError(tr(STR_COULD_NOT_RENDER_IMAGE));
} }
@@ -335,6 +340,7 @@ void BmpViewerActivity::saveDitherSettingsIfNeeded() {
#endif #endif
void BmpViewerActivity::renderError(const char* message) { void BmpViewerActivity::renderError(const char* message) {
RenderLock lock(*this);
const auto pageHeight = renderer.getScreenHeight(); const auto pageHeight = renderer.getScreenHeight();
renderer.clearScreen(); renderer.clearScreen();
renderer.drawCenteredText(UI_10_FONT_ID, pageHeight / 2, message); renderer.drawCenteredText(UI_10_FONT_ID, pageHeight / 2, message);
@@ -365,8 +371,11 @@ void BmpViewerActivity::setAsSleepScreen() {
if (!success) { if (!success) {
LOG_ERR("BMP", "Failed to set %s as sleep screen", filePath.c_str()); LOG_ERR("BMP", "Failed to set %s as sleep screen", filePath.c_str());
GUI.drawPopup(renderer, tr(STR_FAILED_TO_SET_SLEEP_SCREEN)); {
renderer.displayBuffer(HalDisplay::HALF_REFRESH); RenderLock lock(*this);
GUI.drawPopup(renderer, tr(STR_FAILED_TO_SET_SLEEP_SCREEN));
renderer.displayBuffer(HalDisplay::HALF_REFRESH);
}
return; return;
} }
@@ -374,8 +383,11 @@ void BmpViewerActivity::setAsSleepScreen() {
SETTINGS.saveToFile(); SETTINGS.saveToFile();
LOG_INF("BMP", "Set %s as sleep screen", filePath.c_str()); LOG_INF("BMP", "Set %s as sleep screen", filePath.c_str());
GUI.drawPopup(renderer, tr(STR_SLEEP_SCREEN_SET)); {
renderer.displayBuffer(HalDisplay::HALF_REFRESH); RenderLock lock(*this);
GUI.drawPopup(renderer, tr(STR_SLEEP_SCREEN_SET));
renderer.displayBuffer(HalDisplay::HALF_REFRESH);
}
} }
void BmpViewerActivity::loop() { void BmpViewerActivity::loop() {
@@ -6,6 +6,7 @@
void FullScreenMessageActivity::onEnter() { void FullScreenMessageActivity::onEnter() {
Activity::onEnter(); Activity::onEnter();
RenderLock lock(*this);
const auto height = renderer.getLineHeight(UI_10_FONT_ID); const auto height = renderer.getLineHeight(UI_10_FONT_ID);
const auto top = (renderer.getScreenHeight() - height) / 2; const auto top = (renderer.getScreenHeight() - height) / 2;
+20 -5
View File
@@ -202,7 +202,10 @@ void WeatherActivity::onEnter() {
Activity::onEnter(); Activity::onEnter();
// Force landscape orientation for weather display // Force landscape orientation for weather display
renderer.setOrientation(GfxRenderer::Orientation::LandscapeClockwise); {
RenderLock lock(*this);
renderer.setOrientation(GfxRenderer::Orientation::LandscapeClockwise);
}
state = State::LOADING_CACHE; state = State::LOADING_CACHE;
errorMessage.clear(); errorMessage.clear();
@@ -217,7 +220,10 @@ void WeatherActivity::onExit() {
Activity::onExit(); Activity::onExit();
// Weather screen is always landscape; restore app UI to portrait on exit. // Weather screen is always landscape; restore app UI to portrait on exit.
renderer.setOrientation(GfxRenderer::Orientation::Portrait); {
RenderLock lock(*this);
renderer.setOrientation(GfxRenderer::Orientation::Portrait);
}
WiFi.mode(WIFI_OFF); WiFi.mode(WIFI_OFF);
} }
@@ -283,7 +289,10 @@ void WeatherActivity::launchWifiSelection() {
void WeatherActivity::onWifiSelectionComplete(bool connected) { void WeatherActivity::onWifiSelectionComplete(bool connected) {
// Re-apply landscape after returning from WiFi selection (which uses portrait) // Re-apply landscape after returning from WiFi selection (which uses portrait)
renderer.setOrientation(GfxRenderer::Orientation::LandscapeClockwise); {
RenderLock lock(*this);
renderer.setOrientation(GfxRenderer::Orientation::LandscapeClockwise);
}
LOG_DBG("WEA", "onWifiSelectionComplete connected=%d wifiStatus=%d", connected ? 1 : 0, (int)WiFi.status()); LOG_DBG("WEA", "onWifiSelectionComplete connected=%d wifiStatus=%d", connected ? 1 : 0, (int)WiFi.status());
if (connected) { if (connected) {
@@ -325,10 +334,16 @@ void WeatherActivity::fetchWeather() {
} }
void WeatherActivity::openSettingsActivity() { void WeatherActivity::openSettingsActivity() {
renderer.setOrientation(GfxRenderer::Orientation::Portrait); {
RenderLock lock(*this);
renderer.setOrientation(GfxRenderer::Orientation::Portrait);
}
startActivityForResult(std::make_unique<WeatherSettingsActivity>(renderer, mappedInput), startActivityForResult(std::make_unique<WeatherSettingsActivity>(renderer, mappedInput),
[this](const ActivityResult&) { [this](const ActivityResult&) {
renderer.setOrientation(GfxRenderer::Orientation::LandscapeClockwise); {
RenderLock lock(*this);
renderer.setOrientation(GfxRenderer::Orientation::LandscapeClockwise);
}
forceRefresh = true; forceRefresh = true;
loadAndDisplay(); loadAndDisplay();
}); });