Remove the Hekate persona block from CLAUDE.md and rewrite prior DECISIONS entries from Hekate and leftover Ragnar to ClaudeCode for consistency with the rest of the ecosystem.
58 lines
2.4 KiB
Markdown
58 lines
2.4 KiB
Markdown
# Moonset
|
|
|
|
## 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, 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, systemd-Journal-Logging, Debug-Level per `MOONSET_DEBUG` Env-Var, 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 und Default-Avatar sind in die Binary kompiliert (Wallpaper kommt vom Dateisystem)
|
|
- **Async Power Actions**: `glib::spawn_future_local` + `gio::spawn_blocking` mit 30s Timeout
|
|
- **Journal-Logging**: `systemd-journal-logger` statt File-Logging — `journalctl -t moonset`, Debug-Level per `MOONSET_DEBUG` Env-Var
|