moonset/CLAUDE.md
nevaforget 71670eb263 feat: switch to systemd-journal-logger, add debug logging (v0.6.0)
Replace env_logger with systemd-journal-logger for consistent logging
across moonset/moonlock/moongreet. Add MOONSET_DEBUG env var and debug
statements across all modules. Also includes shared blur cache for
multi-monitor and detached moonlock spawn for lock action.
2026-03-28 22:58:25 +01:00

2.6 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, 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, Wallpaper (komprimiert) und Default-Avatar sind in die Binary kompiliert
  • 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