Go to file
Greg Pomerantz 9e52dc0355 gtauri: MediaStore fast path + js-ready handshake + virtualized grid
- MediaStore fast path: Kotlin's ContentObserver queries MediaStore
  for images added in the last 120s and writes path|added|size lines
  to .ms_recent, then wakes Rust via the proven zero-arg
  nativeFsChange() JNI. Rust upserts those rows and emits
  immediately — a camera photo appears in ~1s without waiting for
  the ~10s FUSE re-read of a 10,000-file directory. (Direct
  Kotlin->Rust JNI string passing and Rust->Java calls crash under
  the emulator's x86_64->arm64 native bridge; file handoff plus
  zero-arg JNI is the only reliable channel.)
- js-ready handshake: the first gallery-files emit fires ~30 ms
  after process start, before the WebView's JS exists (Tauri events
  are fire-and-forget, so it was lost). JS now signals
  'gtauri-js-ready'; Rust re-emits the current state.
- Virtualized grid: the document is ONE spacer (full scroll height)
  plus ONE band of recycled cells pinned by transform — ~80 DOM
  nodes total for a 10,000-photo library. Launch cost no longer
  scales with library size; the first screen renders as soon as
  the WebView boots and the first thumbs arrive.
- 'Missing photos' report resolved: the full walk of the 9,961-file
  Camera dir enumerates exactly 8,438 images with no guard firing;
  the difference is videos, which a photo gallery correctly
  excludes.
2026-11-02 00:02:48 -05:00
docs/BUGS 120Hz: jank_eval referee + slot-based wake guard + MISS ledger 2026-10-30 13:29:50 -04:00
harnesses gtauri: MediaStore fast path + js-ready handshake + virtualized grid 2026-11-02 00:02:48 -05:00
scripts Port the gallery from Slint to egui (egui 0.31 / egui_glow / winit 0.30 / glow 0.16) 2026-10-31 13:50:46 -04:00
shim/out Port the gallery from Slint to egui (egui 0.31 / egui_glow / winit 0.30 / glow 0.16) 2026-10-31 13:50:46 -04:00
src Port the gallery from Slint to egui (egui 0.31 / egui_glow / winit 0.30 / glow 0.16) 2026-10-31 13:50:46 -04:00
tools chore: gitignore target/, drop stray capture log 2026-11-01 20:24:17 -05:00
.gitignore chore: gitignore target/, drop stray capture log 2026-11-01 20:24:17 -05:00
Cargo.lock Port the gallery from Slint to egui (egui 0.31 / egui_glow / winit 0.30 / glow 0.16) 2026-10-31 13:50:46 -04:00
Cargo.toml Port the gallery from Slint to egui (egui 0.31 / egui_glow / winit 0.30 / glow 0.16) 2026-10-31 13:50:46 -04:00
HANDOFF.md docs: HANDOFF §8.12 (egui port + tttest harness), README reflects the egui stack 2026-10-31 13:54:56 -04:00
LICENSE Initial commit 2026-10-27 12:13:22 -04:00
README.md docs: HANDOFF §8.12 (egui port + tttest harness), README reflects the egui stack 2026-10-31 13:54:56 -04:00

gallery

A high-performance image gallery for Android (primary), Linux and macOS — Rust + egui 0.31 (egui_glow / winit 0.30 / glow 0.16). Ported from Slint 1.18 after the zero-jank campaign showed Slint-on-Mali janky at its base level while egui measured 3–7× cleaner (HANDOFF.md §8.11–8.12). The Slint tree is preserved in git history and docs/BUGS/.

Status: M0–M4 ported to egui, zero-jank tuning in progress. See HANDOFF.md — the development hand-off: architecture, thumbnail pipeline, milestones M1–M7, the Slint jank campaign, the egui port, and the sltest/egtest/tttest harnesses (A/B/C: Slint/egui/WebView).

Build

./scripts/build.sh debug     # debug x86_64 APK + install on emulator
./scripts/build.sh           # release x86_64 (emulator)
./scripts/build.sh aarch64   # release aarch64 (device)
cargo run                    # desktop (Linux needs libfontconfig1 + pkg-config)

Requires: Rust (rustup), cargo-apk2, Android SDK + NDK 27 (see HANDOFF.md §3 for exact paths/env).

License

GPL-3.0 (see LICENSE). Built on egui (MIT/Apache-2.0).