Der Desktop läuft mit CachyOS und Hyprland auf einer NVIDIA-Karte, drei Monitore. Windows-Spiele laufen über Lutris, nicht über Steam; Steam ist nur für native Linux-Spiele wie Dota 2 da.
Der Stack
- Lutris als Bibliothek, mit umu als Launcher und proton-cachyos als Proton-Build — das CachyOS-Paket, wird also mit dem System aktualisiert.
- ntsync ist ab Werk aktiv (CachyOS-Kernel), also kein Gebastel mit esync/fsync.
- VRR nur für Vollbildfenster.
- Die Bibliothek ist in zwei Lutris-Kategorien aufgeteilt, Flat und VR — die VR-Seite hat eine eigene Seite.
Ein Workspace pro Spiel
Jedes umu/Proton-Spiel bekommt die Fensterklasse steam_app_default, echte Steam-Spiele
steam_app_<id>. Eine Hyprland-Regel für beide macht jedes Spiel zum Vollbild; eine zweite nimmt
Launcher und Installer aus, damit die im Fenster bleiben.
Dazu gibt ein kleiner Lua-Handler in meiner Hyprland-Config jedem Spielstart einen eigenen, frischen Workspace auf dem mittleren Monitor. Wird das Spiel beendet, verschwindet der Workspace mit ihm. Zwei Spiele landen nie übereinander, und keine Regel pro Spiel ist nötig.
Der Haken sind native Linux-Spiele über Steam: Die behalten ihre eigene Fensterklasse (Dota 2 heißt
wirklich dota2). Aber Steam setzt SteamAppId in die Umgebung von allem, was es startet, also liest
der Handler auch /proc/<pid>/environ und erwischt die ebenfalls.
Installieren per Rechtsklick
Ein install-game-Skript erledigt alles in einem Rutsch: entpacken, Lutris-Eintrag anlegen, das Spiel
auf lutris.net für das Cover suchen, Launcher-Eintrag erstellen, in die Streaming-Liste aufnehmen. Es
steckt im Rechtsklickmenü des Dateimanagers auf Spielarchiven. uninstall-game auf einem Spielordner
entfernt alles wieder und meldet den freigegebenen Platz.
Was ich auf die harte Tour gelernt habe: Lutris schreibt seine Datenbank beim Beenden neu. Jedes Skript, das die Datenbank bearbeitet, muss Lutris vorher schließen, sonst stellt Lutris die alten Einträge still wieder her.
Die Battle.net-Ecke
WoW, Hearthstone und Battle.net teilen sich ein Prefix, und Battle.net ist der zickigste Teil des Setups:
- Tray-Icon. Wine-Apps nutzen alte XEmbed-Tray-Icons; meine Leiste spricht nur das neuere
StatusNotifier-Protokoll.
xembedsniproxyüberbrückt das. Es darf genau eine Instanz laufen. - Es beendet sich nie richtig. Schließt man Battle.net über das Tray, läuft der Update-Agent weiter und hält das Prefix am Leben — und das nächste Spiel, das in diese Session startet, bekommt eine Fake-GPU. Ein Post-Exit-Hook in Lutris fährt das Prefix jetzt sauber herunter.
- Es ist bei jedem Start einmal abgestürzt. Ein altes
--runonstartup-Argument aus dem Lutris-Installskript hat das nächste Argument verschluckt. Es zu löschen hat einen Absturzdialog behoben, den ich wochenlang weggeklickt hatte. - WoW-Region. Meine Spieldateien sind der EU-Build. “Spiel suchen” hat sie abgelehnt; “Installieren” mit dem vorhandenen Ordner als Ziel hat sie übernommen und nur die Differenz gepatcht.
- WoW-Beta. Manuell gestartet mit
PROTON_VERB=run— das Standard-Verb hängt, solange Battle.net das Prefix belegt. Außerdem hat sie beim Betreten der Welt die GPU aufgehängt, bis ich es mit dem niedrigsten Grafik-Preset versucht und danach hochgedreht habe. - Hearthstone verliert manchmal die Rechte an seinem eigenen Spielordner. Ein einzeiliges
chmodals Lutris-Pre-Launch-Befehl behebt das vor jedem Start.
Fixes pro Spiel, die man kennen sollte
- Binding of Isaac hat meinen Controller doppelt erkannt und die Sticks vertauscht. Das doppelte
DirectInput-Gerät in der Registry des Prefix zu deaktivieren hat es behoben.
dinput8komplett abzuschalten nicht — dann startet das Spiel gar nicht. - Dota 2 läuft nativ über Steam, mit Minify für Mods und Kosmetik.
Streaming ins Wohnzimmer
Auf dem Desktop läuft Sunshine (nur gestartet, wenn ich es brauche), im Wohnzimmer Moonlight.
- Beim Streamstart schaltet ein Skript die beiden äußeren Monitore ab und stellt den mittleren auf 60 Hz. Danach kommt das volle Layout zurück.
- Der Stream bleibt in nativer Auflösung, Sunshine skaliert ihn für den Fernseher herunter. Mein Hauptmonitor kann gar keine niedrigere Auflösung darstellen, und Spiele in nativer Auflösung sehen gestreamt und lokal gleich aus.
- Jedes Lutris-Spiel steht mit Cover in Sunshines App-Liste. Ein kleiner Wrapper hält Sunshine am laufenden Spiel fest, damit “App beenden” in Moonlight es auch wirklich schließt.
Die Wohnzimmer-Kiste
Ein eigener Mini-PC mit Bazzite im Gaming Mode, komplett per Controller bedient:
- Bootet direkt in eine Bibliothek mit genau drei Kacheln. Dafür brauchte es ein Decky-Plugin für die Tab-Reihenfolge und ein kleines Skript, das Steams Oberfläche nach dem Laden über den Debug-Port navigiert.
- YouTube ist die echte TV-App (youtube.com/tv) in einem Kiosk-Firefox mit Smart-TV-User-Agent und Werbeblocker, per eigenem Steam-Input-Layout auf den Controller gelegt.
- Der Xbox-Controller weckt sie aus dem Standby.
- Nachtmodus-Audio: eine PipeWire-Filterkette mit Kompressor, damit Explosionen nicht springen und Dialoge bei niedriger Lautstärke verständlich bleiben. Links und rechts sind vertauscht, weil die Soundbar hinter der Couch steht.