From b39c4710d2f6e93b5e21d8a34700ef9a7d5aea65 Mon Sep 17 00:00:00 2001 From: jpirnay Date: Tue, 14 Apr 2026 10:00:46 +0200 Subject: [PATCH] Integrate upstream 1626 + 1658 --- lib/I18n/translations/english.yaml | 3 ++- src/CrossPointSettings.h | 2 +- src/SettingsList.h | 7 ++++--- src/activities/reader/EpubReaderActivity.cpp | 20 ++++++++++++++++++++ src/main.cpp | 9 +++++++++ 5 files changed, 36 insertions(+), 5 deletions(-) diff --git a/lib/I18n/translations/english.yaml b/lib/I18n/translations/english.yaml index f9ec3312..44ed6a6f 100644 --- a/lib/I18n/translations/english.yaml +++ b/lib/I18n/translations/english.yaml @@ -493,4 +493,5 @@ STR_MENU_READER_LAYOUT: "Layout Settings" STR_MENU_READER_TWEAKS: "Reader Tweaks" STR_MENU_READER_SPACING: "Spacing" STR_MENU_KOSYNC_SERVER: "Server Settings" -STR_MENU_KOSYNC_AUTH: "Login / Register" \ No newline at end of file +STR_MENU_KOSYNC_AUTH: "Login / Register" +STR_FORCE_REFRESH: "Refresh Screen" \ No newline at end of file diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index 3ba7248b..1ccd089b 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -128,7 +128,7 @@ class CrossPointSettings { }; // Short power button press actions - enum SHORT_PWRBTN { IGNORE = 0, SLEEP = 1, PAGE_TURN = 2, SHORT_PWRBTN_COUNT }; + enum SHORT_PWRBTN { IGNORE = 0, SLEEP = 1, PAGE_TURN = 2, FORCE_REFRESH = 3, FOOTNOTES = 4, SHORT_PWRBTN_COUNT }; // Hide battery percentage enum HIDE_BATTERY_PERCENTAGE { HIDE_NEVER = 0, HIDE_READER = 1, HIDE_ALWAYS = 2, HIDE_BATTERY_PERCENTAGE_COUNT }; diff --git a/src/SettingsList.h b/src/SettingsList.h index f10ac8af..8678321a 100644 --- a/src/SettingsList.h +++ b/src/SettingsList.h @@ -124,9 +124,10 @@ inline const std::vector list = { {StrId::STR_PREV_NEXT, StrId::STR_NEXT_PREV}, "sideButtonLayout", StrId::STR_CAT_CONTROLS), SettingInfo::Toggle(StrId::STR_LONG_PRESS_SKIP, &CrossPointSettings::longPressChapterSkip, "longPressChapterSkip", StrId::STR_CAT_CONTROLS), - SettingInfo::Enum(StrId::STR_SHORT_PWR_BTN, &CrossPointSettings::shortPwrBtn, - {StrId::STR_IGNORE, StrId::STR_SLEEP, StrId::STR_PAGE_TURN}, "shortPwrBtn", - StrId::STR_CAT_CONTROLS), + SettingInfo::Enum( + StrId::STR_SHORT_PWR_BTN, &CrossPointSettings::shortPwrBtn, + {StrId::STR_IGNORE, StrId::STR_SLEEP, StrId::STR_PAGE_TURN, StrId::STR_FORCE_REFRESH, StrId::STR_FOOTNOTES}, + "shortPwrBtn", StrId::STR_CAT_CONTROLS), // --- System --- SettingInfo::Toggle(StrId::STR_SHOW_HIDDEN_FILES, &CrossPointSettings::showHiddenFiles, "showHiddenFiles", diff --git a/src/activities/reader/EpubReaderActivity.cpp b/src/activities/reader/EpubReaderActivity.cpp index 3968753c..88c06619 100644 --- a/src/activities/reader/EpubReaderActivity.cpp +++ b/src/activities/reader/EpubReaderActivity.cpp @@ -245,6 +245,26 @@ void EpubReaderActivity::loop() { return; } + const bool screenshotChordReleased = gpio.wasReleased(HalGPIO::BTN_POWER) && gpio.wasReleased(HalGPIO::BTN_DOWN); + + // Handle short power button press for footnotes + if (SETTINGS.shortPwrBtn == CrossPointSettings::SHORT_PWRBTN::FOOTNOTES && + mappedInput.wasReleased(MappedInputManager::Button::Power) && !screenshotChordReleased) { + if (currentPageFootnotes.size() == 1) { + navigateToHref(currentPageFootnotes[0].href, true); + } else if (currentPageFootnotes.size() > 1) { + startActivityForResult(std::make_unique(renderer, mappedInput, currentPageFootnotes), + [this](const ActivityResult& result) { + if (!result.isCancelled) { + const auto& footnoteResult = std::get(result.data); + navigateToHref(footnoteResult.href, true); + } + requestUpdate(); + }); + } + return; + } + auto [prevTriggered, nextTriggered] = ReaderUtils::detectPageTurn(mappedInput); if (!prevTriggered && !nextTriggered) { return; diff --git a/src/main.cpp b/src/main.cpp index 561e2a73..4d875e94 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -350,6 +350,15 @@ void loop() { return; } } + + // Refresh screen when power button is short-pressed with FORCE_REFRESH setting. + if (SETTINGS.shortPwrBtn == CrossPointSettings::SHORT_PWRBTN::FORCE_REFRESH && + mappedInputManager.wasReleased(MappedInputManager::Button::Power)) { + LOG_DBG("MAIN", "Manual screen refresh triggered"); + RenderLock lock; + renderer.displayBuffer(HalDisplay::HALF_REFRESH); + } + if (!gpio.isPressed(HalGPIO::BTN_POWER)) { powerHoldStart = 0; }