Brings ~55 mod-exclusive files to the upstream-based mod/master-resync branch: Activities (migrated to new ActivityManager pattern): - Clock/Time: SetTimeActivity, SetTimezoneOffsetActivity, NtpSyncActivity - Dictionary: DictionaryDefinitionActivity, DictionarySuggestionsActivity, DictionaryWordSelectActivity, LookedUpWordsActivity - Bookmark: EpubReaderBookmarkSelectionActivity - Book management: BookManageMenuActivity, EndOfBookMenuActivity - OPDS: OpdsServerListActivity, OpdsSettingsActivity - Utility: DirectoryPickerActivity, NumericStepperActivity Utilities (unchanged): - BookManager, BookSettings, BookmarkStore, BootNtpSync - Dictionary, LookupHistory, TimeSync, OpdsServerStore Libraries: PlaceholderCover, TableData, ChapterXPathIndexer Scripts: inject_mod_version, generate_book_icon, preview_placeholder_cover Docs: KOReader sync XPath mapping Migration changes: - ActivityWithSubactivity -> Activity base class - Callback constructors -> finish()/setResult() pattern - enterNewActivity() -> startActivityForResult() - Activity::RenderLock&& -> RenderLock&& These files won't compile yet - they reference mod settings and I18n strings that will be added in subsequent phases. Made-with: Cursor
3.1 KiB
Fix Indexing Display Issues
Date: 2026-02-18
Branch: mod/merge-upstream-pr-979
Task
Fixed three issues with the indexing display implementation that was added as part of merging PR #979 (silent pre-indexing for next chapter):
-
Restore original popup for direct chapter jumps — The conditional logic that showed a full-screen "Indexing..." message when a status bar display mode was selected was removed. Direct chapter jumps now always show the original small popup overlay, regardless of the Indexing Display setting.
-
Clear status bar indicator after silent indexing — Added
preIndexedNextSpinetracking member to prevent thesilentIndexingActiveflag from being re-set on re-renders after indexing completes. ChangedsilentIndexNextChapterIfNeededto returnbooland addedrequestUpdate()call to trigger a clean re-render that clears the indicator. -
Handle single-page chapters — Updated the pre-indexing condition to trigger on the sole page of a 1-page chapter (not just the penultimate page of multi-page chapters).
Files Changed
src/activities/reader/EpubReaderActivity.h— AddedpreIndexedNextSpinemember, changedsilentIndexNextChapterIfNeededreturn type toboolsrc/activities/reader/EpubReaderActivity.cpp— All three fixes applied
Build
PlatformIO build succeeded (RAM: 31.1%, Flash: 99.6%).
Follow-up fix: False "Indexing" indicator + image flash on e-ink
Two related issues: (1) paging backwards to a penultimate page of an already-indexed chapter showed "Indexing" in the status bar, and (2) the requestUpdate() that cleared the indicator caused images to flash on e-ink.
Root cause: silentIndexingActive was set optimistically based on page position alone, before checking whether the next chapter's cache actually exists. The subsequent requestUpdate() to clear the indicator triggered a full re-render causing image artifacts.
Fix — replaced optimistic flag with a pre-check:
- Before rendering, probes the next chapter's section file via
Section::loadSectionFile. If cached, setspreIndexedNextSpineand leavessilentIndexingActive = false. Only setstruewhen indexing is genuinely needed. - Removed
requestUpdate()entirely — the indicator clears naturally on the next page turn. - Added early-out in
silentIndexNextChapterIfNeededforpreIndexedNextSpinematch to avoid redundant Section construction.
The pre-check cost (one loadSectionFile call) only happens once per chapter due to preIndexedNextSpine caching.
Silent indexing is only performed on text-only penultimate pages (!p->hasImages()). On image pages, silent indexing is skipped entirely — the normal popup handles indexing on the next chapter transition. This avoids conflicts with the grayscale rendering pipeline (displayWindow after displayGrayBuffer triggers grayscaleRevert, causing image inversion/ghosting).
For text-only pages: after renderContents returns, the indicator is cleared via displayWindow(FAST_REFRESH) on just the status bar strip. This is safe because text-only pages use simple BW rendering without the grayscale pipeline.
Build succeeded (RAM: 31.1%, Flash: 99.6%).