The swipe-up-dismiss + relaunch bug (process survives, activity re-creates) crashed or left a sparse grid. Root cause chain, fully documented in docs/BUGS/recreation-stale-textures.md: - Each android_main (per activity instance) is a fresh Slint world with a fresh wgpu device (i-slint-core context is thread-local); the old world zombie-parks (Slint 1.18 android backend never delivers TerminateWindow/Destroy to it). - Worker-side GPU uploads + a process-global loader let textures cross world/device boundaries: a texture destroyed with its device left a stale handle in the registry (wgpu-core assert in transition_resources on the render thread) — either killing the process, or, with the interim catch_unwind band-aid, keeping a poisoned world alive and corrupting the VISIBLE world's imports (the sparse grid). A/B against pristine Slint confirmed the mechanism (pristine: 1 self-killing panic per recreation + full grid). Fix: - gputex rewrite: workers deliver plain RGBA8; the UI drain tick uploads to the device captured from the rendering notifier (Slint's borrowed-resource contract). Staleness impossible by construction. Keepalive thread removed. - Per-world lifecycle: CURRENT_WORLD gate silences zombie ticks; re-init invalidates the dying device + swaps the engine; render notifier handles RenderingTeardown/RenderingSetup (in-place cell clear — never set_vec mid-render, which desyncs the for-loop). - Vendor patch surface reduced to the single final-flush hunk (catch_unwind guard reverted to pristine). |
||
|---|---|---|
| docs/BUGS | ||
| scripts | ||
| src | ||
| vendor/i-slint-renderer-skia | ||
| .gitignore | ||
| build.rs | ||
| Cargo.lock | ||
| Cargo.toml | ||
| HANDOFF.md | ||
| LICENSE | ||
| README.md | ||
gallery
A high-performance image gallery for Android (primary), Linux and macOS — Rust + Slint 1.18.
Status: M1 (metadata scan + DB) done. See HANDOFF.md — the development hand-off with the full plan: architecture, thumbnail pipeline, milestones M1–M7, Slint gotchas, permission flow, and performance targets. Next: M2 (thumbnail engine).
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 Slint, used under the Slint royalty-free license for proprietary apps (see HANDOFF.md §10.4).