Simon Bruder
05da953e22
This was broken when no files matched the glob /dev/hidraw* (it was passed literall to bubblewrap, which failed due to it not existing).
110 lines
4 KiB
Nix
110 lines
4 KiB
Nix
{ lib, nixosConfig, pkgs, ... }:
|
||
let
|
||
cfg = nixosConfig.sbruder.games;
|
||
inherit (nixosConfig.sbruder) unfree;
|
||
|
||
steam-sandbox = pkgs.writeShellScriptBin "steam-sandbox" /* bash */ ''
|
||
set -euo pipefail
|
||
shopt -s nullglob # make for loop work for glob if files do not exist
|
||
base_dir="''${XDG_DATA_HOME:-$HOME/.local/share}/steam-sandbox"
|
||
mkdir -p "$base_dir"/{.local/share,.steam,.config,.factorio,data}
|
||
bubblewrap_args=(
|
||
# sandboxing
|
||
--unshare-all
|
||
--share-net
|
||
--die-with-parent
|
||
--new-session
|
||
|
||
# basic filesystem
|
||
--tmpfs /tmp
|
||
--proc /proc
|
||
--dev /dev
|
||
--dir "$HOME"
|
||
--dir "$XDG_RUNTIME_DIR"
|
||
--ro-bind /nix/store /nix/store
|
||
# path
|
||
--ro-bind /run/current-system/sw /run/current-system/sw
|
||
--ro-bind /etc/profiles/per-user/$USER/bin /etc/profiles/per-user/$USER/bin
|
||
# system-wide configuration
|
||
--ro-bind /etc/fonts /etc/fonts
|
||
--ro-bind /etc/localtime /etc/localtime
|
||
--ro-bind /etc/machine-id /etc/machine-id
|
||
--ro-bind /etc/os-release /etc/os-release
|
||
--ro-bind /etc/passwd /etc/passwd
|
||
--ro-bind /etc/resolv.conf /etc/resolv.conf
|
||
--ro-bind /etc/ssl/certs /etc/ssl/certs
|
||
--ro-bind /etc/static /etc/static
|
||
|
||
# gui
|
||
--ro-bind /tmp/.X11-unix /tmp/.X11-unix
|
||
--ro-bind "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY"
|
||
--dev-bind /dev/dri /dev/dri
|
||
--ro-bind /run/opengl-driver /run/opengl-driver
|
||
--ro-bind-try /run/opengl-driver-32 /run/opengl-driver-32
|
||
|
||
# audio
|
||
--ro-bind "$XDG_RUNTIME_DIR/pulse" "$XDG_RUNTIME_DIR/pulse"
|
||
--setenv PULSE_SERVER "$XDG_RUNTIME_DIR/pulse/native"
|
||
--ro-bind "''${XDG_CONFIG_HOME:-$HOME/.config}/pulse/cookie" "''${XDG_CONFIG_HOME:-$HOME/.config}/pulse/cookie"
|
||
--setenv PULSE_COOKIE "''${XDG_CONFIG_HOME:-$HOME/.config}/pulse/cookie/pulse/cookie"
|
||
--ro-bind-try /etc/asound.conf /etc/asound.conf
|
||
--ro-bind-try /etc/alsa/conf.d /etc/alsa/conf.d
|
||
--ro-bind-try "$XDG_RUNTIME_DIR/pipewire-0" "$XDG_RUNTIME_DIR/pipewire-0"
|
||
|
||
# dbus
|
||
--ro-bind /run/dbus/system_bus_socket /run/dbus/system_bus_socket
|
||
--ro-bind "$XDG_RUNTIME_DIR/bus" "$XDG_RUNTIME_DIR/bus"
|
||
|
||
# shared data
|
||
--bind "$base_dir/.local/share" "$HOME/.local/share"
|
||
--bind "$base_dir/.steam" "$HOME/.steam"
|
||
--bind "$base_dir/.config" "$HOME/.config"
|
||
--bind "$base_dir/.factorio" "$HOME/.factorio"
|
||
--bind "$base_dir/data" "$HOME/data"
|
||
--ro-bind-try "$HOME/.config/MangoHud" "$HOME/.config/MangoHud"
|
||
|
||
# input
|
||
--dev-bind /dev/input /dev/input
|
||
--dev-bind-try /dev/uinput /dev/uinput
|
||
--ro-bind /sys /sys # required for discovery
|
||
)
|
||
|
||
for hidraw in /dev/hidraw*; do
|
||
bubblewrap_args+=(--dev-bind $hidraw $hidraw)
|
||
done
|
||
|
||
|
||
unset SDL_VIDEODRIVER QT_QPA_PLATFORM # games generally don’t support wayland
|
||
export PATH="${pkgs.unstable.mangohud}/bin:$PATH"
|
||
|
||
${pkgs.bubblewrap}/bin/bwrap \
|
||
"''${bubblewrap_args[@]}" \
|
||
''${SANDBOX_COMMAND:-${pkgs.unstable.steam}/bin/steam} \
|
||
"$@"
|
||
'';
|
||
|
||
steam-sandbox-with-icons = pkgs.runCommand "steam-sandbox-with-icons" { } ''
|
||
mkdir -p $out/{bin,share}
|
||
ln -s ${pkgs.steamPackages.steam}/share/icons $out/share
|
||
ln -s ${pkgs.steamPackages.steam}/share/pixmaps $out/share
|
||
ln -s ${steam-sandbox}/bin/steam-sandbox $out/bin/steam-sandbox
|
||
'';
|
||
in
|
||
lib.mkIf cfg.enable {
|
||
home.packages = with pkgs; [ ]
|
||
++ lib.optionals (cfg.performanceIndex >= 2) [
|
||
mgba
|
||
] ++ lib.optionals (cfg.performanceIndex >= 4) [
|
||
desmume
|
||
unstable.dolphin-emu-beta
|
||
] ++ lib.optional (unfree.allowAssets && cfg.performanceIndex >= 8) (unstable.yuzu-mainline.overrideAttrs (o: o // {
|
||
cmakeFlags = o.cmakeFlags ++ [
|
||
"-DYUZU_ENABLE_COMPATIBILITY_REPORTING=ON"
|
||
];
|
||
}))
|
||
++ lib.optionals unfree.allowSoftware [
|
||
unstable.osu-lazer-sandbox
|
||
steam-sandbox-with-icons
|
||
];
|
||
}
|