From beb7876ccfc92dcd615e707d2b2688448a7d7197 Mon Sep 17 00:00:00 2001 From: Jackson <54308792+jacksongoode@users.noreply.github.com> Date: Wed, 20 May 2026 05:13:27 +0900 Subject: [PATCH] feat: Make page turn naturally follow orientation (#2023) --- lib/I18n/translations/belarusian.yaml | 1 + lib/I18n/translations/catalan.yaml | 1 + lib/I18n/translations/czech.yaml | 1 + lib/I18n/translations/danish.yaml | 1 + lib/I18n/translations/dutch.yaml | 1 + lib/I18n/translations/english.yaml | 1 + lib/I18n/translations/finnish.yaml | 1 + lib/I18n/translations/french.yaml | 1 + lib/I18n/translations/german.yaml | 1 + lib/I18n/translations/hungarian.yaml | 1 + lib/I18n/translations/italian.yaml | 1 + lib/I18n/translations/kazakh.yaml | 1 + lib/I18n/translations/lithuanian.yaml | 1 + lib/I18n/translations/polish.yaml | 1 + lib/I18n/translations/portuguese.yaml | 1 + lib/I18n/translations/romanian.yaml | 1 + lib/I18n/translations/russian.yaml | 1 + lib/I18n/translations/slovenian.yaml | 1 + lib/I18n/translations/spanish.yaml | 1 + lib/I18n/translations/swedish.yaml | 1 + lib/I18n/translations/turkish.yaml | 1 + lib/I18n/translations/ukrainian.yaml | 1 + src/CrossPointSettings.cpp | 2 ++ src/CrossPointSettings.h | 1 + src/MappedInputManager.cpp | 13 ++++++++++--- src/SettingsList.h | 2 ++ src/activities/reader/ReaderUtils.h | 17 +++++++++++------ 27 files changed, 48 insertions(+), 9 deletions(-) diff --git a/lib/I18n/translations/belarusian.yaml b/lib/I18n/translations/belarusian.yaml index 8e2b2102..b5b29be7 100644 --- a/lib/I18n/translations/belarusian.yaml +++ b/lib/I18n/translations/belarusian.yaml @@ -69,6 +69,7 @@ STR_TEXT_AA: "Згладжванне тэксту" STR_SHORT_PWR_BTN: "Кароткае націсканне PWR" STR_ORIENTATION: "Арыентацыя чытання" STR_SIDE_BTN_LAYOUT: "Бакавыя кнопкі" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Арыентаваць пярэднія кнопкі" STR_LONG_PRESS_SKIP: "Доўгае націсканне - змена раздзела" STR_FONT_FAMILY: "Шрыфт чытання" STR_FONT_SIZE: "Памер шрыфту інтэрфейсу" diff --git a/lib/I18n/translations/catalan.yaml b/lib/I18n/translations/catalan.yaml index 30fa6503..7e3296bc 100644 --- a/lib/I18n/translations/catalan.yaml +++ b/lib/I18n/translations/catalan.yaml @@ -73,6 +73,7 @@ STR_IMAGES_SUPPRESS: "Suprimir" STR_SHORT_PWR_BTN: "Clic curt del botó d'engegada" STR_ORIENTATION: "Orientació de lectura" STR_SIDE_BTN_LAYOUT: "Disposició botons laterals" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientar botons frontals" STR_LONG_PRESS_BEHAVIOR: "Comportament de prémer llargament el botó" STR_LONG_PRESS_BEHAVIOR_OFF: "Desactivat" STR_LONG_PRESS_BEHAVIOR_SKIP: "Saltar capítols" diff --git a/lib/I18n/translations/czech.yaml b/lib/I18n/translations/czech.yaml index 775b9e47..c11b9e43 100644 --- a/lib/I18n/translations/czech.yaml +++ b/lib/I18n/translations/czech.yaml @@ -69,6 +69,7 @@ STR_TEXT_AA: "Vyhlazování textu" STR_SHORT_PWR_BTN: "Krátké stisknutí tlačítka napájení" STR_ORIENTATION: "Orientace čtení" STR_SIDE_BTN_LAYOUT: "Rozvržení bočních tlačítek (čtečka)" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientovat přední tlačítka" STR_LONG_PRESS_BEHAVIOR: "Chování při dlouhém stisknutí tlačítka" STR_LONG_PRESS_BEHAVIOR_OFF: "VYP" STR_LONG_PRESS_BEHAVIOR_SKIP: "Přeskočení kapitoly" diff --git a/lib/I18n/translations/danish.yaml b/lib/I18n/translations/danish.yaml index 4c7f3232..9a888af1 100644 --- a/lib/I18n/translations/danish.yaml +++ b/lib/I18n/translations/danish.yaml @@ -73,6 +73,7 @@ STR_IMAGES_SUPPRESS: "Skjul" STR_SHORT_PWR_BTN: "Kort tryk på tænd/sluk-knap" STR_ORIENTATION: "Læseretning" STR_SIDE_BTN_LAYOUT: "Knaplayout på siden (læser)" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientér forreste knapper" STR_LONG_PRESS_BEHAVIOR: "Comportamiento al mantener pulsado el botón" STR_LONG_PRESS_BEHAVIOR_OFF: "Desactivado" STR_LONG_PRESS_BEHAVIOR_SKIP: "Saltar capítulo" diff --git a/lib/I18n/translations/dutch.yaml b/lib/I18n/translations/dutch.yaml index fa10d57b..e8503553 100644 --- a/lib/I18n/translations/dutch.yaml +++ b/lib/I18n/translations/dutch.yaml @@ -73,6 +73,7 @@ STR_IMAGES_SUPPRESS: "Verbergen" STR_SHORT_PWR_BTN: "Korte klik aan/uit-knop" STR_ORIENTATION: "Leesstand" STR_SIDE_BTN_LAYOUT: "Indeling zijknoppen (lezer)" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Richt voorste knoppen" STR_LONG_PRESS_BEHAVIOR: "Long-press button behavior" STR_LONG_PRESS_BEHAVIOR_OFF: "OFF" STR_LONG_PRESS_BEHAVIOR_SKIP: "Chapter skip" diff --git a/lib/I18n/translations/english.yaml b/lib/I18n/translations/english.yaml index d5aa1bf6..8458ec63 100644 --- a/lib/I18n/translations/english.yaml +++ b/lib/I18n/translations/english.yaml @@ -73,6 +73,7 @@ STR_IMAGES_SUPPRESS: "Suppress" STR_SHORT_PWR_BTN: "Short Power Button Click" STR_ORIENTATION: "Reading Orientation" STR_SIDE_BTN_LAYOUT: "Side Button Layout (reader)" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orient front buttons" STR_LONG_PRESS_BEHAVIOR: "Long-press button behavior" STR_LONG_PRESS_BEHAVIOR_OFF: "OFF" STR_LONG_PRESS_BEHAVIOR_SKIP: "Chapter skip" diff --git a/lib/I18n/translations/finnish.yaml b/lib/I18n/translations/finnish.yaml index 2965a222..c6e7e240 100644 --- a/lib/I18n/translations/finnish.yaml +++ b/lib/I18n/translations/finnish.yaml @@ -69,6 +69,7 @@ STR_TEXT_AA: "Tekstin reunanpehmennys" STR_SHORT_PWR_BTN: "Lyhyt virtapainikkeen painallus" STR_ORIENTATION: "Lukusuunta" STR_SIDE_BTN_LAYOUT: "Sivupainikkeiden asettelu (lukija)" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Suuntaa etupainikkeet" STR_LONG_PRESS_BEHAVIOR: "Long-press button behavior" STR_LONG_PRESS_BEHAVIOR_OFF: "OFF" STR_LONG_PRESS_BEHAVIOR_SKIP: "Chapter skip" diff --git a/lib/I18n/translations/french.yaml b/lib/I18n/translations/french.yaml index 0720dd62..b7cd1323 100644 --- a/lib/I18n/translations/french.yaml +++ b/lib/I18n/translations/french.yaml @@ -73,6 +73,7 @@ STR_IMAGES_SUPPRESS: "Masquer" STR_SHORT_PWR_BTN: "Appui court alim." STR_ORIENTATION: "Orientation de lecture" STR_SIDE_BTN_LAYOUT: "Boutons latéraux" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orienter boutons avant" STR_LONG_PRESS_BEHAVIOR: "Comportement lors d'un appui long" STR_LONG_PRESS_BEHAVIOR_OFF: "Désactivé" STR_LONG_PRESS_BEHAVIOR_SKIP: "Saut de chapitre" diff --git a/lib/I18n/translations/german.yaml b/lib/I18n/translations/german.yaml index d29b82c8..62f4980e 100644 --- a/lib/I18n/translations/german.yaml +++ b/lib/I18n/translations/german.yaml @@ -69,6 +69,7 @@ STR_TEXT_AA: "Schriftglättung" STR_SHORT_PWR_BTN: "An-Taste kurz drücken" STR_ORIENTATION: "Leseausrichtung" STR_SIDE_BTN_LAYOUT: "Seitliche Tasten (Lesen)" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Vordere Tasten ausrichten" STR_LONG_PRESS_BEHAVIOR: "Verhalten bei langem Tastendruck" STR_LONG_PRESS_BEHAVIOR_OFF: "AUS" STR_LONG_PRESS_BEHAVIOR_SKIP: "Kapitel überspringen" diff --git a/lib/I18n/translations/hungarian.yaml b/lib/I18n/translations/hungarian.yaml index d6e00442..79fb9e7d 100644 --- a/lib/I18n/translations/hungarian.yaml +++ b/lib/I18n/translations/hungarian.yaml @@ -73,6 +73,7 @@ STR_IMAGES_SUPPRESS: "Elnyomás" STR_SHORT_PWR_BTN: "Rövid bekapcsológomb nyomás" STR_ORIENTATION: "Olvasási irány" STR_SIDE_BTN_LAYOUT: "Oldalsó gomb elrendezés (olvasó)" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Elülső gombok tájolása" STR_LONG_PRESS_SKIP: "Hosszú nyomás - fejezet ugrás" STR_FONT_FAMILY: "Olvasó betűkészlet" STR_FONT_SIZE: "Olvasó betűméret" diff --git a/lib/I18n/translations/italian.yaml b/lib/I18n/translations/italian.yaml index 0c264a3c..e0b7ba0a 100644 --- a/lib/I18n/translations/italian.yaml +++ b/lib/I18n/translations/italian.yaml @@ -73,6 +73,7 @@ STR_IMAGES_SUPPRESS: "Nascondi" STR_SHORT_PWR_BTN: "Pressione breve accensione" STR_ORIENTATION: "Orientamento lettura" STR_SIDE_BTN_LAYOUT: "Pulsanti laterali (lettore)" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orienta pulsanti frontali" STR_LONG_PRESS_BEHAVIOR: "Pressione lunga" STR_LONG_PRESS_BEHAVIOR_OFF: "OFF" STR_LONG_PRESS_BEHAVIOR_SKIP: "Salta capitolo" diff --git a/lib/I18n/translations/kazakh.yaml b/lib/I18n/translations/kazakh.yaml index 48ce163b..7f705971 100644 --- a/lib/I18n/translations/kazakh.yaml +++ b/lib/I18n/translations/kazakh.yaml @@ -68,6 +68,7 @@ STR_TEXT_AA: "Мәтін сырғытпасы" STR_SHORT_PWR_BTN: "Қуат түймесін қысқа басу" STR_ORIENTATION: "Оқу бағдары" STR_SIDE_BTN_LAYOUT: "Бүйірлік түймелер орналасуы (оқырман)" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Алдыңғы түймелерді бағдарлау" STR_LONG_PRESS_SKIP: "Ұзақ басу арқылы тарау өткізу" STR_FONT_FAMILY: "Оқырман қаріп тобы" STR_FONT_SIZE: "Интерфейс қаріп өлшемі" diff --git a/lib/I18n/translations/lithuanian.yaml b/lib/I18n/translations/lithuanian.yaml index 8fc16786..3dcc1965 100644 --- a/lib/I18n/translations/lithuanian.yaml +++ b/lib/I18n/translations/lithuanian.yaml @@ -73,6 +73,7 @@ STR_IMAGES_SUPPRESS: "Slėpti" STR_SHORT_PWR_BTN: "Trumpas įjungimo pasp." STR_ORIENTATION: "Orientacija" STR_SIDE_BTN_LAYOUT: "Šoniniai mygtukai" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientuoti priekinius mygtukus" STR_LONG_PRESS_SKIP: "Praleisti skyrių (ilgai)" STR_FONT_FAMILY: "Šriftas" STR_FONT_SIZE: "Šrifto dydis" diff --git a/lib/I18n/translations/polish.yaml b/lib/I18n/translations/polish.yaml index 638991af..e63cbf90 100644 --- a/lib/I18n/translations/polish.yaml +++ b/lib/I18n/translations/polish.yaml @@ -73,6 +73,7 @@ STR_IMAGES_SUPPRESS: "Pomijaj" STR_SHORT_PWR_BTN: "Krótkie naciśnięcie zasilania" STR_ORIENTATION: "Układ czytania" STR_SIDE_BTN_LAYOUT: "Układ przycisków bocznych" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientuj przednie przyciski" STR_LONG_PRESS_BEHAVIOR: "Funkcja długiego przyciśnięcia" STR_LONG_PRESS_BEHAVIOR_OFF: "Wył." STR_LONG_PRESS_BEHAVIOR_SKIP: "Przeskocz rozdział" diff --git a/lib/I18n/translations/portuguese.yaml b/lib/I18n/translations/portuguese.yaml index f51011dc..508a42a4 100644 --- a/lib/I18n/translations/portuguese.yaml +++ b/lib/I18n/translations/portuguese.yaml @@ -69,6 +69,7 @@ STR_TEXT_AA: "Suavização de texto" STR_SHORT_PWR_BTN: "Clique curto botão ligar" STR_ORIENTATION: "Orientação de leitura" STR_SIDE_BTN_LAYOUT: "Disposição botões laterais" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientar botões frontais" STR_LONG_PRESS_BEHAVIOR: "Comportamento do botão de premir e segurar" STR_LONG_PRESS_BEHAVIOR_OFF: "Desligado" STR_LONG_PRESS_BEHAVIOR_SKIP: "Saltar capítulo" diff --git a/lib/I18n/translations/romanian.yaml b/lib/I18n/translations/romanian.yaml index 5e65da18..1fe47e51 100644 --- a/lib/I18n/translations/romanian.yaml +++ b/lib/I18n/translations/romanian.yaml @@ -73,6 +73,7 @@ STR_IMAGES_SUPPRESS: "Suprimare" STR_SHORT_PWR_BTN: "Apăsare scurtă întrerupător" STR_ORIENTATION: "Orientare lectură" STR_SIDE_BTN_LAYOUT: "Aspect butoane laterale (lectură)" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientare butoane frontale" STR_LONG_PRESS_BEHAVIOR: "Comportament buton apăsat lung" STR_LONG_PRESS_BEHAVIOR_OFF: "Dezactivat" STR_LONG_PRESS_BEHAVIOR_SKIP: "Sărire capitol" diff --git a/lib/I18n/translations/russian.yaml b/lib/I18n/translations/russian.yaml index 81c1ec01..02c94c86 100644 --- a/lib/I18n/translations/russian.yaml +++ b/lib/I18n/translations/russian.yaml @@ -73,6 +73,7 @@ STR_IMAGES_SUPPRESS: "Скрыть" STR_SHORT_PWR_BTN: "Короткое нажатие PWR" STR_ORIENTATION: "Ориентация чтения" STR_SIDE_BTN_LAYOUT: "Боковые кнопки" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Ориентировать передние кнопки" STR_LONG_PRESS_BEHAVIOR: "Долгое нажатие" STR_LONG_PRESS_BEHAVIOR_OFF: "Ничего" STR_LONG_PRESS_BEHAVIOR_SKIP: "Пропуск главы" diff --git a/lib/I18n/translations/slovenian.yaml b/lib/I18n/translations/slovenian.yaml index 70ebfad1..69b7d6be 100644 --- a/lib/I18n/translations/slovenian.yaml +++ b/lib/I18n/translations/slovenian.yaml @@ -73,6 +73,7 @@ STR_IMAGES_SUPPRESS: "Zatdi" STR_SHORT_PWR_BTN: "Kratek pritisk na gumb za vklop" STR_ORIENTATION: "Orientacija branja" STR_SIDE_BTN_LAYOUT: "Razpored stranskih gumbov" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Usmeri sprednje gumbe" STR_LONG_PRESS_SKIP: "Dolgi pritisk za preskok poglavja" STR_FONT_FAMILY: "Pisava bralnika" STR_FONT_SIZE: "Velikost pisave" diff --git a/lib/I18n/translations/spanish.yaml b/lib/I18n/translations/spanish.yaml index fbdf3fb3..919d9439 100644 --- a/lib/I18n/translations/spanish.yaml +++ b/lib/I18n/translations/spanish.yaml @@ -73,6 +73,7 @@ STR_IMAGES_SUPPRESS: "Ocultar" STR_SHORT_PWR_BTN: "Toque corto del encendido" STR_ORIENTATION: "Orientación" STR_SIDE_BTN_LAYOUT: "Función botones laterales (lector)" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientar botones frontales" STR_LONG_PRESS_BEHAVIOR: "Al mantener pulsado un botón" STR_LONG_PRESS_BEHAVIOR_OFF: "No hacer nada" STR_LONG_PRESS_BEHAVIOR_SKIP: "Saltar capítulo" diff --git a/lib/I18n/translations/swedish.yaml b/lib/I18n/translations/swedish.yaml index e5f1a0bf..66e62db3 100644 --- a/lib/I18n/translations/swedish.yaml +++ b/lib/I18n/translations/swedish.yaml @@ -73,6 +73,7 @@ STR_IMAGES_SUPPRESS: "Dölj" STR_SHORT_PWR_BTN: "Kort strömknappsklick" STR_ORIENTATION: "Läsrikting" STR_SIDE_BTN_LAYOUT: "Sidoknappslayout (Läsare)" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Rikta främre knappar" STR_LONG_PRESS_BEHAVIOR: "Beteende vid lång knapptryckning" STR_LONG_PRESS_BEHAVIOR_OFF: "AV" STR_LONG_PRESS_BEHAVIOR_SKIP: "Hoppa över kapitel" diff --git a/lib/I18n/translations/turkish.yaml b/lib/I18n/translations/turkish.yaml index 5777eaad..a8f15a7c 100644 --- a/lib/I18n/translations/turkish.yaml +++ b/lib/I18n/translations/turkish.yaml @@ -68,6 +68,7 @@ STR_TEXT_AA: "Metin Yumuşatma (AA)" STR_SHORT_PWR_BTN: "Kısa Güç Tuşu Tıklaması" STR_ORIENTATION: "Okuma Yönü" STR_SIDE_BTN_LAYOUT: "Yan Tuş Dizilimi (okuyucu)" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Ön düğmeleri yönlendir" STR_LONG_PRESS_BEHAVIOR: "Long-press button behavior" STR_LONG_PRESS_BEHAVIOR_OFF: "OFF" STR_LONG_PRESS_BEHAVIOR_SKIP: "Chapter skip" diff --git a/lib/I18n/translations/ukrainian.yaml b/lib/I18n/translations/ukrainian.yaml index c43f2615..1cfa2c28 100644 --- a/lib/I18n/translations/ukrainian.yaml +++ b/lib/I18n/translations/ukrainian.yaml @@ -73,6 +73,7 @@ STR_IMAGES_SUPPRESS: "Приховати" STR_SHORT_PWR_BTN: "Короткий натиск кн. живл." STR_ORIENTATION: "Орієнтація читання" STR_SIDE_BTN_LAYOUT: "Схема бічних кнопок" +STR_FRONT_BTN_FOLLOW_ORIENTATION: "Орієнтувати передні кнопки" STR_LONG_PRESS_BEHAVIOR: "Поведінка при довгому настику" STR_LONG_PRESS_BEHAVIOR_OFF: "Немає" STR_LONG_PRESS_BEHAVIOR_SKIP: "Наступ. розділ (утримув.)" diff --git a/src/CrossPointSettings.cpp b/src/CrossPointSettings.cpp index 527392f3..7dd9051d 100644 --- a/src/CrossPointSettings.cpp +++ b/src/CrossPointSettings.cpp @@ -240,6 +240,8 @@ bool CrossPointSettings::loadFromBinaryFile() { if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, embeddedStyle); if (++settingsRead >= fileSettingsCount) break; + serialization::readPod(inputFile, frontButtonFollowOrientation); + if (++settingsRead >= fileSettingsCount) break; } while (false); if (frontButtonMappingRead) { diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index 3e857fac..c8774b1f 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -192,6 +192,7 @@ class CrossPointSettings { // Button layouts (front layout retained for migration only) uint8_t frontButtonLayout = BACK_CONFIRM_LEFT_RIGHT; uint8_t sideButtonLayout = PREV_NEXT; + uint8_t frontButtonFollowOrientation = 0; // Front button remap (logical -> hardware) // Used by MappedInputManager to translate logical buttons into physical front buttons. uint8_t frontButtonBack = FRONT_HW_BACK; diff --git a/src/MappedInputManager.cpp b/src/MappedInputManager.cpp index 467c0f75..8d8833fc 100644 --- a/src/MappedInputManager.cpp +++ b/src/MappedInputManager.cpp @@ -68,6 +68,13 @@ unsigned long MappedInputManager::getHeldTime() const { return gpio.getHeldTime( MappedInputManager::Labels MappedInputManager::mapLabels(const char* back, const char* confirm, const char* previous, const char* next) const { + // Swap previous/next labels to match the page turn direction swap in INVERTED and LANDSCAPE_CCW. + const bool swapLabels = + SETTINGS.frontButtonFollowOrientation && (SETTINGS.orientation == CrossPointSettings::INVERTED || + SETTINGS.orientation == CrossPointSettings::LANDSCAPE_CCW); + const char* leftLabel = swapLabels ? next : previous; + const char* rightLabel = swapLabels ? previous : next; + // Build the label order based on the configured hardware mapping. auto labelForHardware = [&](uint8_t hw) -> const char* { // Compare against configured logical roles and return the matching label. @@ -78,10 +85,10 @@ MappedInputManager::Labels MappedInputManager::mapLabels(const char* back, const return confirm; } if (hw == SETTINGS.frontButtonLeft) { - return previous; + return leftLabel; } if (hw == SETTINGS.frontButtonRight) { - return next; + return rightLabel; } return ""; }; @@ -106,4 +113,4 @@ int MappedInputManager::getPressedFrontButton() const { return HalGPIO::BTN_RIGHT; } return -1; -} \ No newline at end of file +} diff --git a/src/SettingsList.h b/src/SettingsList.h index e625f17f..c17b47da 100644 --- a/src/SettingsList.h +++ b/src/SettingsList.h @@ -163,6 +163,8 @@ inline std::vector getSettingsList(const SdCardFontRegistry* regist // --- Controls --- SettingInfo::Enum(StrId::STR_SIDE_BTN_LAYOUT, &CrossPointSettings::sideButtonLayout, {StrId::STR_PREV_NEXT, StrId::STR_NEXT_PREV}, "sideButtonLayout", StrId::STR_CAT_CONTROLS), + SettingInfo::Toggle(StrId::STR_FRONT_BTN_FOLLOW_ORIENTATION, &CrossPointSettings::frontButtonFollowOrientation, + "frontButtonFollowOrientation", StrId::STR_CAT_CONTROLS), SettingInfo::Enum(StrId::STR_LONG_PRESS_BEHAVIOR, &CrossPointSettings::longPressButtonBehavior, {StrId::STR_LONG_PRESS_BEHAVIOR_OFF, StrId::STR_LONG_PRESS_BEHAVIOR_SKIP, StrId::STR_LONG_PRESS_BEHAVIOR_ORIENTATION}, diff --git a/src/activities/reader/ReaderUtils.h b/src/activities/reader/ReaderUtils.h index 1de6174b..f2845328 100644 --- a/src/activities/reader/ReaderUtils.h +++ b/src/activities/reader/ReaderUtils.h @@ -41,16 +41,21 @@ inline PageTurnResult detectPageTurn(const MappedInputManager& input) { const bool usePress = SETTINGS.longPressButtonBehavior == SETTINGS.OFF; const bool tiltNext = SETTINGS.tiltPageTurn && halTiltSensor.wasTiltedForward(); const bool tiltPrev = SETTINGS.tiltPageTurn && halTiltSensor.wasTiltedBack(); - const bool prev = tiltPrev || (usePress ? (input.wasPressed(MappedInputManager::Button::PageBack) || - input.wasPressed(MappedInputManager::Button::Left)) - : (input.wasReleased(MappedInputManager::Button::PageBack) || - input.wasReleased(MappedInputManager::Button::Left))); + const bool swapFront = + SETTINGS.frontButtonFollowOrientation && (SETTINGS.orientation == CrossPointSettings::INVERTED || + SETTINGS.orientation == CrossPointSettings::LANDSCAPE_CCW); + const auto prevButton = swapFront ? MappedInputManager::Button::Right : MappedInputManager::Button::Left; + const auto nextButton = swapFront ? MappedInputManager::Button::Left : MappedInputManager::Button::Right; + const bool prev = + tiltPrev || + (usePress ? (input.wasPressed(MappedInputManager::Button::PageBack) || input.wasPressed(prevButton)) + : (input.wasReleased(MappedInputManager::Button::PageBack) || input.wasReleased(prevButton))); const bool powerTurn = SETTINGS.shortPwrBtn == CrossPointSettings::SHORT_PWRBTN::PAGE_TURN && input.wasReleased(MappedInputManager::Button::Power); const bool next = tiltNext || (usePress ? (input.wasPressed(MappedInputManager::Button::PageForward) || powerTurn || - input.wasPressed(MappedInputManager::Button::Right)) + input.wasPressed(nextButton)) : (input.wasReleased(MappedInputManager::Button::PageForward) || powerTurn || - input.wasReleased(MappedInputManager::Button::Right))); + input.wasReleased(nextButton))); return {prev, next, tiltPrev || tiltNext}; }