Security: prevent double unlock() when PAM and fingerprint succeed simultaneously (ext-session-lock protocol error). Fix PAM callback returning PAM_AUTH_ERR instead of PAM_BUF_ERR on calloc OOM. Performance: replace CPU-side Gaussian blur (image crate) with GPU blur via GskBlurNode + GskRenderer::render_texture(). Eliminates 500ms-2s main-thread blocking on cold cache for 4K wallpapers. Remove image and dirs dependencies (~15 transitive crates). Make fingerprint stop() fire-and-forget async to avoid 6s UI block after successful auth.
2.0 KiB
2.0 KiB
Decisions
Architectural and design decisions for Moonlock, in reverse chronological order.
2026-03-28 – GPU blur via GskBlurNode replaces CPU blur
- Who: Nyx, Dom
- Why: CPU-side Gaussian blur (
imagecrate) blocked the GTK main thread for 500ms–2s on 4K wallpapers at cold cache. Disk cache mitigated repeat starts but added ~100 lines of complexity. - Tradeoffs: GPU blur quality is slightly different (box-blur approximation vs true Gaussian), acceptable for wallpaper. Removes
imageanddirsdependencies entirely. No disk cache needed. - How:
Snapshot::push_blur()+GskRenderer::render_texture()onconnect_realize. Blur happens once on the GPU when the widget gets its renderer, producing a concretegdk::Texture. Zero startup latency.
2026-03-28 – Optional background blur via image crate (superseded)
- Who: Nyx, Dom
- Why: Consistent with moonset/moongreet — blurred wallpaper as lockscreen background is a common UX pattern
- Tradeoffs: Adds
imagecrate dependency (~15 transitive crates); CPU-side Gaussian blur at load time adds startup latency proportional to image size and sigma. Acceptable because blur runs once and the texture is shared across monitors. - How:
load_background_texture(bg_path, blur_radius)loads texture, optionally appliesimageops::blur(), returnsgdk::Texture. Config optionbackground_blur: Option<f32>in TOML.
2026-03-28 – Shared wallpaper texture pattern (aligned with moonset/moongreet)
- Who: Nyx, Dom
- Why: Previously loaded wallpaper per-window via
Picture::for_filename(). Multi-monitor setups decoded the JPEG redundantly. Blur feature requires texture pixel access anyway. - Tradeoffs: Slightly more code in main.rs (texture loaded before window creation), but avoids redundant decoding and enables the blur feature.
- How:
load_background_texture()in lockscreen.rs decodes once,create_background_picture()wraps sharedgdk::Textureingtk::Picture. Same pattern as moonset/moongreet.