Add CHANGELOG documenting all changes since 0.1.0 and the initial release. Add DECISIONS.md as an architectural decision log. Update CLAUDE.md to reflect current architecture. Bump to 0.1.1 for the security and correctness fixes in the previous commit.
59 lines
2.4 KiB
Markdown
59 lines
2.4 KiB
Markdown
# Moonset
|
|
|
|
**Name**: Hekate (Göttin der Wegkreuzungen — passend zum Power-Menu, das den Weg der Session bestimmt)
|
|
|
|
## Projekt
|
|
|
|
Moonset ist ein Wayland Session Power Menu, gebaut mit Rust + gtk4-rs + gtk4-layer-shell.
|
|
Teil des Moonarch-Ökosystems. Per Keybind aufrufbares Overlay mit 5 Aktionen:
|
|
Lock, Logout, Hibernate, Reboot, Shutdown.
|
|
|
|
## Tech-Stack
|
|
|
|
- Rust (Edition 2024), gtk4-rs 0.11, glib 0.22
|
|
- gtk4-layer-shell 0.8 für Wayland Layer Shell (OVERLAY Layer)
|
|
- `cargo test` für Unit-Tests
|
|
|
|
## Projektstruktur
|
|
|
|
- `src/` — Rust-Quellcode (main.rs, power.rs, i18n.rs, config.rs, users.rs, panel.rs)
|
|
- `resources/` — GResource-Assets (style.css, wallpaper.jpg komprimiert, default-avatar.svg)
|
|
- `config/` — Beispiel-Konfigurationsdateien
|
|
|
|
## Kommandos
|
|
|
|
```bash
|
|
# Tests ausführen
|
|
cargo test
|
|
|
|
# Release-Build
|
|
cargo build --release
|
|
|
|
# Power-Menu starten (in Niri-Session)
|
|
LD_PRELOAD=/usr/lib/libgtk4-layer-shell.so ./target/release/moonset
|
|
```
|
|
|
|
## Architektur
|
|
|
|
- `main.rs` — Entry Point, GTK App, Layer Shell Setup, Multi-Monitor, zentrale `GRESOURCE_PREFIX`-Konstante
|
|
- `power.rs` — 5 Power-Action-Wrapper mit absoluten Pfaden und 30s Timeout (lock, logout, hibernate, reboot, shutdown)
|
|
- `i18n.rs` — Locale-Erkennung und String-Tabellen (DE/EN)
|
|
- `config.rs` — TOML-Config + Wallpaper-Fallback
|
|
- `panel.rs` — GTK4 UI (Action-Buttons, Inline-Confirmation, WallpaperWindow)
|
|
- `users.rs` — User-Erkennung, Avatar-Loading (AccountsService, ~/.face, GResource-Fallback)
|
|
- `resources/style.css` — GTK-Theme-Colors für Konsistenz mit dem aktiven Desktop-Theme
|
|
|
|
## Design Decisions
|
|
|
|
Siehe `DECISIONS.md` für das vollständige Entscheidungsprotokoll.
|
|
|
|
Kurzfassung der wichtigsten Entscheidungen:
|
|
- **OVERLAY statt TOP Layer**: Waybar liegt auf TOP, moonset muss darüber
|
|
- **Niri-spezifischer Logout** (`niri msg action quit`): Moonarch setzt fest auf Niri
|
|
- **Einmal-Start per Keybind**: Kein Daemon, GTK `application_id` verhindert Doppelstart
|
|
- **System-Icons**: Adwaita/Catppuccin liefern alle benötigten symbolischen Icons
|
|
- **Lock ohne Confirmation**: Lock ist sofort reversibel, braucht kein Confirm
|
|
- **Absolute Pfade für Binaries**: `/usr/bin/systemctl` etc. statt relativer Pfade (Security)
|
|
- **GResource-Bundle**: CSS, Wallpaper (komprimiert) und Default-Avatar sind in die Binary kompiliert
|
|
- **Async Power Actions**: `glib::spawn_future_local` + `gio::spawn_blocking` mit 30s Timeout
|