81 lines
2.5 KiB
Nix
81 lines
2.5 KiB
Nix
{ config, lib, pkgs, ... }:
|
||
let
|
||
# For GPD Win4’s AMD APU, we assume AMD Vulkan drivers:
|
||
amdPackages = [
|
||
pkgs.amdvlk
|
||
pkgs.driversi686Linux.amdvlk
|
||
];
|
||
in
|
||
{
|
||
options.services.steamDeckMode = {
|
||
enable = lib.mkOption {
|
||
type = lib.types.bool;
|
||
default = false;
|
||
description = "Launch Steam in a ‘Deck-like’ session upon login (auto-logins and starts Steam in gamepad UI mode).";
|
||
};
|
||
};
|
||
|
||
config = {
|
||
# Enable Steam and Gamescope
|
||
programs.gamescope = {
|
||
enable = true;
|
||
capSysNice = true;
|
||
};
|
||
programs.steam = {
|
||
enable = true;
|
||
# The ‘gamescopeSession’ creates a special session for Steam on Wayland
|
||
gamescopeSession.enable = true;
|
||
};
|
||
|
||
# Add some helpful gaming utilities
|
||
environment.systemPackages = with pkgs; [
|
||
mangohud
|
||
steam-tui
|
||
steamcmd
|
||
vulkan-tools
|
||
vulkan-headers
|
||
vulkan-loader
|
||
wlroots
|
||
libdecor
|
||
gamemode
|
||
];
|
||
|
||
# Enable 32-bit support for libraries (often required by Steam)
|
||
hardware.opengl.enable = true;
|
||
hardware.opengl.driSupport32Bit = true;
|
||
|
||
# Additional AMD drivers if needed
|
||
hardware.graphics.enable = true;
|
||
hardware.graphics.enable32Bit = true;
|
||
hardware.graphics.extraPackages = amdPackages;
|
||
|
||
# Example udev rules for Steam Deck controllers, optional
|
||
environment.etc."udev/rules.d/99-steamdeck-controller.rules".text = ''
|
||
# Valve Controller devices
|
||
SUBSYSTEM=="usb", ATTRS{idVendor}=="28de", MODE="0666"
|
||
KERNEL=="uinput", MODE="0660", GROUP="input", OPTIONS+="static_node=uinput"
|
||
'';
|
||
|
||
# Provide a “Steam Deck Mode” session in the display manager
|
||
services.xserver.displayManager.session = {
|
||
"steam-deck-mode" = {
|
||
name = "Steam Deck Mode";
|
||
start = ''
|
||
#!/usr/bin/env bash
|
||
# On X11, you could also remove or adjust the following env variable if you prefer Wayland
|
||
export XDG_SESSION_TYPE=x11
|
||
|
||
# Fullscreen + close gamescope on exit, then run Steam in gamepad UI
|
||
exec gamescope -f -e -- steam -gamepadui
|
||
'';
|
||
};
|
||
};
|
||
}
|
||
// lib.mkIf config.services.steamDeckMode.enable {
|
||
# Auto-login to the user of your choice and start in Steam Deck Mode
|
||
services.xserver.displayManager.autoLogin.enable = true;
|
||
services.xserver.displayManager.autoLogin.user = "dominik"; # or your preferred user
|
||
services.xserver.autoRestartXServer = true;
|
||
services.xserver.displayManager.defaultSession = "steam-deck-mode";
|
||
};
|