diff --git a/modules/programs/lutris.nix b/modules/programs/lutris.nix index 1855b7cee..336143058 100644 --- a/modules/programs/lutris.nix +++ b/modules/programs/lutris.nix @@ -12,17 +12,22 @@ let types optional optionalAttrs + optionalString nameValuePair mapAttrs' + filter filterAttrs + filterAttrsRecursive attrNames concatStringsSep toLower + recursiveUpdate listToAttrs getExe ; cfg = config.programs.lutris; settingsFormat = pkgs.formats.yaml { }; + formatWineName = (package: toLower package.name); in { options.programs.lutris = { @@ -46,6 +51,16 @@ in ''; type = types.listOf types.package; }; + defaultWinePackage = mkOption { + default = null; + example = "pkgs.proton-ge-bin"; + description = '' + The wine/proton package to set as the default for lutris. + It must still be set under proton/winePackages. + ''; + type = types.nullOr types.package; + }; + protonPackages = mkOption { default = [ ]; example = "[ pkgs.proton-ge-bin ]"; @@ -87,6 +102,7 @@ in description = '' The package to use for this runner, nix will try to find the executable for this package. A more specific path can be set by using settings.runner.runner_executable instead. + Uncompatible with certain runners, such as wine. ''; type = types.nullOr types.package; }; @@ -111,6 +127,7 @@ in default = ""; description = '' Specific option to point to a runner executable directly, don't set runner.package if you set this. + Uncompatible with certain runners such as wine. ''; }; }; @@ -148,13 +165,23 @@ in ) cfg.runners ); in - mkIf (redundantRunners != [ ]) [ - '' + filter (e: e != "") [ + (optionalString (redundantRunners != [ ]) '' Under programs.lutris.runners, the following lutris runners had both a .package and .settings.runner.runner_executable options set: - ${concatStringsSep ", " redundantRunners} Note that runner_executable overrides package, setting both is pointless. - '' + '') + (optionalString ((cfg.runners.wine.package or null) != null) '' + Setting programs.lutris.runners.wine.package does nothing. + Use the respective options, proton/winePackages and defaultWinePackage. + '') + (optionalString ((cfg ? runners.wine.settings.runner.version) && (cfg.defaultWinePackage != null)) + '' + Found conflicting options under programs.lutris, both runners.wine.settings.version and defaultWinePackage + were set. + '' + ) ]; home.packages = let @@ -170,27 +197,34 @@ in let buildRunnerConfig = ( runner_name: runner_config: - { + # Remove the unset values so they don't end up on the final config. + filterAttrsRecursive (name: value: value != { } && value != null && value != "") { "${runner_name}" = - (optionalAttrs (runner_config.settings.runner != { }) runner_config.settings.runner) - // (optionalAttrs - (runner_config.package != null && runner_config.settings.runner.runner_executable == "") - { - runner_executable = getExe runner_config.package; - } - ); - } - // optionalAttrs (runner_config.settings.system != { }) { - system = runner_config.settings.system; + runner_config.settings.runner + # If set translate .package to runner_executable + // (optionalAttrs (runner_config.package != null) { + runner_executable = getExe runner_config.package; + }); + inherit (runner_config.settings) system; } ); + # Extra default config for wine if defaultWinePackage was set + wine_extra = optionalAttrs (cfg.defaultWinePackage != null) { + wine = { + package = null; + settings = { + runner.version = formatWineName cfg.defaultWinePackage; + system = { }; + }; + }; + }; in mapAttrs' ( runner_name: runner_config: nameValuePair "lutris/runners/${runner_name}.yml" { source = settingsFormat.generate "${runner_name}.yml" (buildRunnerConfig runner_name runner_config); } - ) cfg.runners; + ) (recursiveUpdate wine_extra cfg.runners); xdg.dataFile = let @@ -199,7 +233,7 @@ in map ( # lutris seems to not detect wine/proton if the name has some caps package: - (nameValuePair "lutris/runners/${type}/${toLower package.name}" { + (nameValuePair "lutris/runners/${type}/${formatWineName package}" { source = package; }) ) packages; diff --git a/tests/modules/programs/lutris/runners-configuration.nix b/tests/modules/programs/lutris/runners-configuration.nix index c5ca4e94d..e6b042251 100644 --- a/tests/modules/programs/lutris/runners-configuration.nix +++ b/tests/modules/programs/lutris/runners-configuration.nix @@ -2,7 +2,12 @@ { programs.lutris = { enable = true; + defaultWinePackage = pkgs.proton-ge-bin; runners = { + wine.settings = { + runner.system_winetricks = true; + system.disable_runtime = true; + }; cemu.package = pkgs.cemu; pcsx2.settings = { system.disable_screen_saver = true; @@ -38,6 +43,13 @@ system: disable_screen_saver: true ''; + expectedWine = builtins.toFile "wine.yml" '' + system: + disable_runtime: true + wine: + system_winetricks: true + version: ${lib.toLower pkgs.proton-ge-bin.name} + ''; in '' assertFileExists ${runnersDir}/cemu.yml @@ -46,5 +58,7 @@ assertFileContent ${runnersDir}/pcsx2.yml ${expectedPcsx2} assertFileExists ${runnersDir}/rpcs3.yml assertFileContent ${runnersDir}/rpcs3.yml ${expectedRpcs3} + assertFileExists ${runnersDir}/wine.yml + assertFileContent ${runnersDir}/wine.yml ${expectedWine} ''; }