- WallpaperWindow für Sekundärmonitore (nur Hintergrundbild) - GreeterWindow bekommt bg_path als Parameter - resolve_wallpaper_path() aus config.py extrahiert (wiederverwendbar) - main.py: Monitor-Enumeration, Layer-Shell pro Monitor - Keyboard-Exclusive nur auf dem primären Monitor - CSS: ungültige max-width/max-height Properties entfernt
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 Fehlversuchen, WallpaperWindow für Sekundärmonitoremain.py— Entry Point, GTK App, Layer Shell Setup, Multi-Monitor-Orchestrierung
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.