510d45a9b1
Update PKGBUILD version / update-pkgver (push) Successful in 4s
- Test AccountsService-icon symlink rejection (users.rs) - Tests for wallpaper symlink/extension/size rejection (config.rs) - Fix stale 'bundled package wallpaper' fallback docs (README, example config) — bundled tier removed 2026-03-28, actual chain is two-tier
193 lines
8.2 KiB
Markdown
193 lines
8.2 KiB
Markdown
# Changelog
|
||
|
||
All notable changes to this project will be documented in this file.
|
||
Format based on [Keep a Changelog](https://keepachangelog.com/).
|
||
|
||
## [0.9.1] - 2026-06-17
|
||
|
||
### Fixed
|
||
|
||
- Wallpaper fallback docs (README, example config) referenced a removed "bundled package wallpaper" tier; corrected to two-tier (config → moonarch default → CSS background)
|
||
|
||
### Added
|
||
|
||
- Tests for avatar/wallpaper rejection paths (AccountsService symlink, wallpaper symlink/extension/size)
|
||
|
||
## [0.9.0] - 2026-06-17
|
||
|
||
### Changed
|
||
|
||
- Logout is no longer Niri-locked — default terminates the logind session via `loginctl terminate-session $XDG_SESSION_ID` (compositor-agnostic)
|
||
|
||
### Added
|
||
|
||
- `logout_command` config key — override the logout command (e.g. `niri msg action quit`) for non-logind or compositor-specific setups
|
||
|
||
## [0.8.5] - 2026-04-24
|
||
|
||
### Changed
|
||
|
||
- Require `MOONSET_DEBUG=1` (not mere presence of the variable) to raise log verbosity, so path information is not written to the journal by accident
|
||
|
||
### Fixed
|
||
|
||
- Warn when the home directory cannot be resolved instead of silently searching for `.face` in the current working directory
|
||
|
||
### Removed
|
||
|
||
- Drop the unused `uid` field from `users::User` and its obsolete `u32::MAX` fallback sentinel
|
||
|
||
## [0.8.4] - 2026-04-24
|
||
|
||
### Security
|
||
|
||
- Restrict wallpaper paths to an image-extension allowlist (jpg, jpeg, png, webp), reject symlinks, and cap file size at 10 MB — narrows the gdk-pixbuf parser attack surface
|
||
|
||
### Fixed
|
||
|
||
- Free the `spawn_blocking` slot on every `wait()` exit path (RAII guard) so a failed `wait()` no longer pins a thread for the full 30 s timeout; distinguish the timeout's own SIGKILL from an external OOM-kill
|
||
- Honor POSIX locale precedence (`LC_ALL` → `LC_MESSAGES` → `LANG`) before `/etc/locale.conf`, so an English install with `LC_ALL=de_DE.UTF-8` shows the German UI
|
||
- Disable the action buttons while an action runs, so a double-click or key repeat cannot trigger the same power action twice
|
||
|
||
## [0.8.3] - 2026-04-24
|
||
|
||
### Fixed
|
||
|
||
- Discard child stdout in `run_command` to remove a latent pipe-deadlock risk when a command writes more than one OS pipe buffer (~64 KB); stderr is still captured for error reporting
|
||
|
||
## [0.8.2] - 2026-04-06
|
||
|
||
### Fixed
|
||
|
||
- Restore keyboard focus to the action buttons after cancelling a confirmation — under layer-shell exclusive keyboard mode the menu otherwise became keyboard-unreachable
|
||
|
||
## [0.8.1] - 2026-03-31
|
||
|
||
### Changed
|
||
|
||
- Optimize the release profile (LTO, single codegen unit, symbol stripping)
|
||
- Compress the bundled GResource assets (CSS, SVG)
|
||
- Inherit moonlock's stderr so its errors surface in the journal instead of being discarded
|
||
|
||
## [0.8.0] - 2026-03-30
|
||
|
||
### Changed
|
||
|
||
- Replace `canonicalize()` with `symlink_metadata` + `is_file` + `!is_symlink` for avatar lookup — prevents symlink traversal to arbitrary files
|
||
- Replace `canonicalize()` with same symlink-safe check in `resolve_background_path`
|
||
- Downscale wallpaper to `MAX_BLUR_DIMENSION` (1920px) before GPU blur — prevents excessive memory use on high-res images
|
||
- Validate `background_blur` per config source — invalid user value preserves system default instead of silently falling back to 0
|
||
|
||
### Fixed
|
||
|
||
- Fix blur padding offset from `(0,0)` to `(-pad,-pad)` to prevent edge darkening on blurred wallpaper
|
||
|
||
## [0.7.3] - 2026-03-29
|
||
|
||
### Fixed
|
||
|
||
- Fix shutdown and reboot — `loginctl` does not support `poweroff`/`reboot` verbs, switched to `systemctl poweroff` and `systemctl reboot`
|
||
|
||
## [0.7.2] - 2026-03-29
|
||
|
||
### Fixed
|
||
|
||
- Fix CSS priority so app styles override GTK4 user theme (Colloid-Catppuccin) — use `STYLE_PROVIDER_PRIORITY_USER` instead of `STYLE_PROVIDER_PRIORITY_APPLICATION`
|
||
- Replace `border-radius: 50%` with `9999px` — GTK4 CSS does not reliably support percentage-based border-radius
|
||
|
||
## [0.7.1] - 2026-03-28
|
||
|
||
### Fixed
|
||
|
||
- Fix edge darkening on blurred wallpaper — GskBlurNode sampled transparent pixels outside texture bounds, now renders with 3x-sigma padding and crops back
|
||
|
||
## [0.7.0] - 2026-03-28
|
||
|
||
### Added
|
||
|
||
- Blur validation: `background_blur` must be 0.0–200.0 (negative, NaN, infinite, and extreme values are rejected with a warning)
|
||
- `detect_locale_with()` testable DI function for locale detection (4 new tests)
|
||
- Path canonicalization for `~/.face` and AccountsService avatar paths (resolves symlinks, prevents passing arbitrary files to gdk-pixbuf)
|
||
|
||
### Changed
|
||
|
||
- Replace busy-loop polling (`try_wait` + `sleep(100ms)`) in `run_command` with blocking `child.wait()` + timeout thread — eliminates poll latency and thread waste
|
||
- Move config loading from `activate()` to `main()` — filesystem I/O no longer blocks the GTK main loop
|
||
- Click-to-dismiss now attached to overlay instead of background picture (works with or without wallpaper)
|
||
|
||
### Removed
|
||
|
||
- Embedded fallback wallpaper from GResource bundle — moonarch provides `/usr/share/moonarch/wallpaper.jpg` at install time, binary size dropped from ~3.2MB to ~1.3MB
|
||
- GResource fallback path in `resolve_background_path` — returns `Option<PathBuf>` now, `None` falls through to CSS background
|
||
|
||
## [0.6.0] - 2026-03-28
|
||
|
||
### Added
|
||
|
||
- Systemd journal logging (`journalctl -t moonset`) replacing env_logger stderr output
|
||
- `MOONSET_DEBUG` env var to enable debug-level journal output
|
||
- Debug logging across all modules (config resolution, wallpaper source, avatar loading, power actions, locale detection, blur cache)
|
||
- Shared blur cache for multi-monitor — GPU blur computed once, reused by all windows
|
||
|
||
### Changed
|
||
|
||
- Lock action spawns moonlock as detached process instead of blocking via run_command — moonset can quit immediately while moonlock runs independently
|
||
|
||
## [0.4.1] - 2026-03-28
|
||
|
||
### Added
|
||
|
||
- Fade-in/fade-out animation (250ms ease-in) for panel and wallpaper windows via CSS opacity transition
|
||
|
||
### Fixed
|
||
|
||
- Fix pixel format mismatch in blur path — `texture.download()` yields BGRA but was passed to `RgbaImage` without channel swap, now explicitly converts B↔R
|
||
- Logout action now calls `app.quit()` to dismiss the menu immediately (previously only Lock did)
|
||
- Log TOML parse errors to stderr instead of silently falling back to defaults
|
||
|
||
### Changed
|
||
|
||
- Replace magic string `"lock"` comparison with `quit_after` field on `ActionDef` for type-safe action dispatch
|
||
- Remove `compressed="true"` from JPEG wallpaper in GResource — JPEG is already compressed, zlib overhead hurts startup for negligible size savings
|
||
|
||
## [0.4.0] - 2026-03-28
|
||
|
||
### Added
|
||
|
||
- Optional background blur via `background_blur` config option (Gaussian blur, `image` crate)
|
||
- Disk cache for blurred wallpaper (`~/.cache/moonset/`) — avoids re-blurring on subsequent starts
|
||
|
||
## [0.1.1] - 2026-03-28
|
||
|
||
### Fixed
|
||
|
||
- Use absolute paths for all system binaries (`systemctl`, `loginctl`, `niri`, `moonlock`) to prevent PATH hijacking
|
||
- Implement `POWER_TIMEOUT` (30s) via `try_wait()` polling — previously declared but unused, leaving power actions able to block indefinitely
|
||
- Prevent panic in `load_background_texture` when GResource path contains non-UTF-8 bytes — now falls back to known wallpaper resource
|
||
- Fix fallback user UID from `0` (root) to `u32::MAX` as a safe sentinel value
|
||
- Fix CSS comment incorrectly describing circular buttons as "square card"
|
||
|
||
### Changed
|
||
|
||
- Compress wallpaper in GResource bundle (`compressed="true"`) to reduce binary size
|
||
- Merge double `idle_add_local_once` into single idle cycle for faster keyboard focus on launch
|
||
- Centralize `GRESOURCE_PREFIX` as `pub(crate) const` in `main.rs` (was duplicated in `config.rs`, `users.rs`, and literal strings in `panel.rs`)
|
||
- Translate README.md and config comments from German to English
|
||
- Remove stale `journal.md` (one-time development notes, not actively maintained)
|
||
|
||
## [0.1.0] - 2026-03-27
|
||
|
||
### Added
|
||
|
||
- Rust rewrite of the Python power menu (gtk4-rs + gtk4-layer-shell)
|
||
- 5 power actions: Lock, Logout, Hibernate, Reboot, Shutdown
|
||
- Inline confirmation for destructive actions (all except Lock)
|
||
- Multi-monitor wallpaper support via shared `gdk::Texture`
|
||
- DE/EN localization with automatic locale detection
|
||
- TOML configuration for custom wallpaper path
|
||
- GResource bundle for CSS, wallpaper, and default avatar
|
||
- Async power actions via `glib::spawn_future_local` + `gio::spawn_blocking`
|
||
- Async avatar loading (file-based avatars decoded off UI thread)
|
||
- Cached icon loading at startup
|
||
- 45 unit tests
|