Files
crosspoint-reader-mod/chat-summaries/2026-02-18_fix-indexing-display-summary.md
cottongin dfbc931c14 mod: Phase 1 - bring forward mod-exclusive files with ActivityManager migration
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
2026-03-07 15:10:00 -05:00

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):

  1. 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.

  2. Clear status bar indicator after silent indexing — Added preIndexedNextSpine tracking member to prevent the silentIndexingActive flag from being re-set on re-renders after indexing completes. Changed silentIndexNextChapterIfNeeded to return bool and added requestUpdate() call to trigger a clean re-render that clears the indicator.

  3. 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 — Added preIndexedNextSpine member, changed silentIndexNextChapterIfNeeded return type to bool
  • src/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, sets preIndexedNextSpine and leaves silentIndexingActive = false. Only sets true when indexing is genuinely needed.
  • Removed requestUpdate() entirely — the indicator clears naturally on the next page turn.
  • Added early-out in silentIndexNextChapterIfNeeded for preIndexedNextSpine match 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%).