Sway op de Steam Deck

het root-bestands­systeem op de Steam Deck wordt bij elke systeem­update volledig over­schreven. hiermee maakt Valve het o.a. veel moeilijker om je systeem te breken. veranderingen in /home en /etc worden wel behouden. normale gebruikers worden geacht met Flatpak hun applicaties te installeren. voor de meeste applicaties werkt dit goed, maar als je je eigen compositor (bureaublad­omgeving) wilt installeren werkt dat minder fijn, omdat dan jij de gebruiker wordt beperkt door de sandbox van Flatpak.

we zouden de pakketten die we willen handmatig kunnen installeren met een andere prefix, zoals /home/deck/local. dan zou Sway bijvoorbeeld leven in /home/deck/local/bin/sway. hoewel dit zou werken, kost het erg veel tijd en moeite om al je applicaties handmatig met een aangepaste prefix te installeren. ook zou je met allerlei environment variables handmatig moeten aangeven waar programma’s bestanden kunnen vinden die normaliter in /usr zitten.

Nix

gelukkig heeft de pakket­beheerder Nix bij het oplossen van een ander probleem toevallig ook dit probleem voor ons opgelost. Nix installeert namelijk alle pakketten in /nix/store/..., en zorgt ervoor dat applicaties blijven werken d.m.v. een combinatie van patches, symlinks en environment variables.

de goed oplettenden zullen hebben opgemerkt dat /nix zich in het root-bestands­systeem bevind. gelukkig hebben de mensen van Determinate Systems uitgevonden hoe je Nix toch werkend kunt krijgen. dit doen ze door de inhoud van /nix in /home/nix op te slaan, en dan met een systemd-service /home/nix op /nix te mounten tijdens het opstarten.

dus, om ook Nix op je Steam Deck te krijgen, kun je dit script van Determinate Systems uitvoeren:

$ curl -L https://install.determinate.systems/nix | sh -s -- install steam-deck

meer info: Nix on the Steam Deck door Ana Hobden

standaard heeft Nix na het uitvoeren van deze installer geen channels om pakketten van te downloaden. als je gestoord genoeg bent om Sway op je Steam Deck te willen ga ik ervan uit dat stabiliteit niet je grootste prioriteit is. je kunt de channel nixpkgs-unstable zo toevoegen:

$ nix-channel --add https://nixos.org/channels/nixpkgs-unstable
$ nix-channel --update
unpacking channels...

en je hebt Nix! je kunt Nix op allerlei manieren gebruiken om een compleet reproduceerbaar systeem te krijgen, maar in dit artikel zullen we Nix gebruiken alsof het een normale pakket­beheerder is. mijn excuses naar alle Nix-fanaten.

nixGL

laten we kijken of het werkt! installeer mpv en probeer een video af te spelen:

$ nix-env -iA nixpkgs.mpv
[...]
$ mpv https://guacamolie.nl/vPjyzWaQjAYnTKp4vRtP.webm
 (+) Video --vid=1 (*) (vp9 1920x804 24.000fps)
[vo/gpu/drm] VT_GETMODE failed: Inappropriate ioctl for device
[vo/gpu/drm] Failed to set up VT switcher. Terminal switching will be unavailable.
MESA-LOADER: failed to open radeonsi: /run/opengl-driver/lib/dri/radeonsi_dri.so: cannot open shared object file: No such file or directory (search paths /run/opengl-driver/lib/dri, suffix _dri)
MESA-LOADER: failed to open zink: /run/opengl-driver/lib/dri/zink_dri.so: cannot open shared object file: No such file or directory (search paths /run/opengl-driver/lib/dri, suffix _dri)
MESA-LOADER: failed to open kms_swrast: /run/opengl-driver/lib/dri/kms_swrast_dri.so: cannot open shared object file: No such file or directory (search paths /run/opengl-driver/lib/dri, suffix _dri)
MESA-LOADER: failed to open swrast: /run/opengl-driver/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /run/opengl-driver/lib/dri, suffix _dri)
[vo/gpu] Failed to create GBM device.
[vo/gpu] Failed to setup GBM.
[vo/gpu] Failed to commit atomic request: No such file or directory
Segmentation fault (core dumped)

oei, dat ziet er niet goed uit. het probleem is dat Nix-pakketten die buiten NixOS worden geĂŻnstalleerd standaard niet goed met OpenGL kunnen omgaan. gelukkig heeft het project nixGL dit al voor ons opgelost. je kunt het zo installeren:

$ nix-channel --add https://github.com/guibou/nixGL/archive/main.tar.gz nixgl
$ nix-channel --update
unpacking channels...
$ nix-env -iA nixgl.auto.nixGLDefault
[...]

nu kunenn we met nixGL ons programma wel uitvoeren:

$ nixGL mpv https://guacamolie.nl/vPjyzWaQjAYnTKp4vRtP.webm
(+) Video --vid=1 (*) (vp9 1920x804 24.000fps)
VO: [gpu] 1920x804 yuv420p
V: 00:00:05 / 00:03:51 (2%) Cache: 225s/31MB

XDG_DATA_DIRS

omdat Nix-pakketten niet in /usr leven, moeten applicaties worden verteld waar ze bestanden kunnen vinden die normalieter in /usr leven. Nix past o.a. je PATH aan met /etc/profile.d/nix.sh, maar niet XDG_DATA_DIRS. hierin staat waar programma’s dingen zoals desktop files, iconen, lettertypes, documentatie, enz. kunnen vinden. we kunnen XDG_DATA_DIRS handmatig aanpassen door ons eigen script toe te voegen aan /etc/profile.d:

/etc/profile.d/nix-datadir.sh
XDG_DATA_DIRS="$HOME/.nix-profile/share:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
export XDG_DATA_DIRS

Sway

dan kunnen we nu eindelijk Sway installeren:

$ nix-env -iA nixpkgs.sway

de standaardconfiguratie van Sway gebruikt foot als terminal:

$ nix-env -iA nixpkgs.foot

je kunt nu al testen of het werkt:

$ nixGL sway

als het goed is zul je nu Sway in zijn eigen venster zien! we kunnen dan nu Sway als een niet-Steam-spel toevoegen aan Steam. om dit te doen kunnen we een shell­script schrijven die Sway laat werken binnen gaming-modus:

sway.sh
#!/bin/sh
# stop Steam from injecting the performance overlay, as this breaks Sway
unset LD_PRELOAD

# Steam resets the PATH, so source nix again to restore it
source /etc/profile.d/nix.sh

# since Sway is installed via Nix we need to run it with nixGL to get OpenGL working
exec nixGL sway

sla dit op in een locatie naar keuze, en maak hem uitvoerbaar:

$ chmod +x locatie/van/sway.sh

Niet-Steam-spel

we kunnen onze sway.sh nu als niet-Steam-spel toevoegen. open Steam, ga naar ‘Bibliotheek’, en druk linksonder op ‘Spel toevoegen’ en dan ‘Niet-Steam-spel toevoegen …’. Sway zou niet in de lijst staan dus druk op ‘Bladeren …’ en selecteer je sway.sh. open daarna de eigenschappen van het toegevoegde spel, en voer bij ‘Starten in’ /home/deck in.

je kunt nu weer terug naar gaming-modus gaan en Sway openen. als alles goed is gegaan, heb je nu Sway!

een screenshot van mijn persoonlijke Sway-setup

gepubliceerd op 24-09-2023.