moonset/CLAUDE.md
nevaforget 473bed479a docs: add CHANGELOG.md, DECISIONS.md, bump version to 0.1.1
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.
2026-03-28 10:17:22 +01:00

2.4 KiB

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

# 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