- _on_realize implementiert (war nur connected, nicht definiert) - do_unrealize für as_file() Context-Manager-Cleanup - threading.Lock für _greetd_sock Race Condition - TOML-Parsing-Fehler abfangen statt Crash - last-user Datei: Längen- und Zeichenvalidierung - detect_locale: non-alpha LANG-Werte abweisen - exec_cmd Plausibility-Check mit shutil.which - Exception-Details ins Log statt in die UI - subprocess.run Timeout für Power-Actions - Sequence[Path] statt tuple[Path, ...] in get_sessions - Mock-Server _recvall für fragmentierte Reads - [behavior]-Config-Sektion entfernt (unimplementiert) - Design Decisions in CLAUDE.md dokumentiert
2.2 KiB
2.2 KiB
Moongreet
Name: Selene (Mondgöttin — passend zu Moon-greet)
Projekt
Moongreet ist ein greetd-Greeter für Wayland, gebaut mit Python + GTK4 + gtk4-layer-shell. Teil des Moonarch-Ökosystems.
Tech-Stack
- Python 3.11+, PyGObject (GTK 4.0)
- gtk4-layer-shell für Wayland Layer Shell
- greetd IPC über Unix Domain Socket (length-prefixed JSON)
- pytest für Tests
Projektstruktur
src/moongreet/— Quellcodesrc/moongreet/data/— Package-Assets (Default-Avatar, Icons) — werden mit dem Wheel ausgelieferttests/— pytest Testsdata/— User-Assets (wallpaper.jpg) — nicht Teil des Packagesconfig/— Beispiel-Konfigurationsdateien für/etc/moongreet/und/etc/greetd/
Kommandos
# Tests ausführen
uv run pytest tests/ -v
# Typ-Checks
uv run pyright src/
# Greeter starten (nur zum Testen, braucht normalerweise greetd)
uv run moongreet
Architektur
ipc.py— greetd Socket-Kommunikation (length-prefixed JSON)users.py— Benutzer aus /etc/passwd, Avatare, GTK-Themessessions.py— Wayland/X11 Sessions aus .desktop Filespower.py— Reboot/Shutdown via loginctli18n.py— Locale-Erkennung (LANG / /etc/locale.conf) und String-Tabellen (DE/EN)greeter.py— GTK4 UI (Overlay-Layout), Faillock-Warnung nach 2 Fehlversuchenmain.py— Entry Point, GTK App, Layer Shell Setup
Design Decisions
- Synchrones I/O im GTK-Konstruktor:
load_config,load_strings,get_usersundget_sessionslaufen synchron inGreeterWindow.__init__. Async Loading mit Placeholder-UI wäre möglich, erhöht aber die Komplexität erheblich. Der Greeter startet 1x pro Boot auf lokaler Hardware — die Daten sind klein (passwd, locale.conf, wenige .desktop-Files), die Latenz im Normalfall vernachlässigbar. - Synchrones Avatar-Decoding:
GdkPixbuf.Pixbuf.new_from_file_at_scaleläuft synchron auf dem Main Thread. Bei großen Bildern als.face-Datei kann die UI kurz stocken. Der Avatar-Cache (_avatar_cache) federt das nach dem ersten Laden ab. Async Decoding per Worker-Thread +GLib.idle_addwäre die Alternative, rechtfertigt aber den Aufwand nicht für einen Single-User-Greeter.