From 391f57bdd20f6e89f2e5fae14e052ef5595f1896 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Wed, 1 Jan 2025 01:54:59 -0600 Subject: [PATCH] misc: Headless: Inherit main input config --- src/Ryujinx/Headless/HeadlessRyujinx.cs | 32 +++++++++++++++------ src/Ryujinx/Headless/Options.cs | 37 +++++++++++++++++++++++-- 2 files changed, 57 insertions(+), 12 deletions(-) diff --git a/src/Ryujinx/Headless/HeadlessRyujinx.cs b/src/Ryujinx/Headless/HeadlessRyujinx.cs index 3cb0afca3..c99e5409c 100644 --- a/src/Ryujinx/Headless/HeadlessRyujinx.cs +++ b/src/Ryujinx/Headless/HeadlessRyujinx.cs @@ -162,6 +162,11 @@ namespace Ryujinx.Headless } ReloadConfig(); + + if (option.InheritConfig) + { + option.InheritMainConfigInput(originalArgs, ConfigurationState.Instance); + } _virtualFileSystem = VirtualFileSystem.CreateInstance(); _libHacHorizonManager = new LibHacHorizonManager(); @@ -224,15 +229,7 @@ namespace Ryujinx.Headless _enableKeyboard = option.EnableKeyboard; _enableMouse = option.EnableMouse; - static void LoadPlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index) - { - InputConfig inputConfig = HandlePlayerConfiguration(inputProfileName, inputId, index); - if (inputConfig != null) - { - _inputConfiguration.Add(inputConfig); - } - } LoadPlayerConfiguration(option.InputProfile1Name, option.InputId1, PlayerIndex.Player1); LoadPlayerConfiguration(option.InputProfile2Name, option.InputId2, PlayerIndex.Player2); @@ -244,7 +241,6 @@ namespace Ryujinx.Headless LoadPlayerConfiguration(option.InputProfile8Name, option.InputId8, PlayerIndex.Player8); LoadPlayerConfiguration(option.InputProfileHandheldName, option.InputIdHandheld, PlayerIndex.Handheld); - if (_inputConfiguration.Count == 0) { return; @@ -306,6 +302,24 @@ namespace Ryujinx.Headless } _inputManager.Dispose(); + + return; + + void LoadPlayerConfiguration(string inputProfileName, string inputId, PlayerIndex index) + { + if (index == PlayerIndex.Handheld && _inputConfiguration.Count > 0) + { + Logger.Info?.Print(LogClass.Configuration, "Skipping handheld configuration as there are already other players configured."); + return; + } + + InputConfig inputConfig = option.InheritedInputConfigs[index] ?? HandlePlayerConfiguration(inputProfileName, inputId, index); + + if (inputConfig != null) + { + _inputConfiguration.Add(inputConfig); + } + } } private static void SetupProgressHandler() diff --git a/src/Ryujinx/Headless/Options.cs b/src/Ryujinx/Headless/Options.cs index c0def95c1..11deea3a5 100644 --- a/src/Ryujinx/Headless/Options.cs +++ b/src/Ryujinx/Headless/Options.cs @@ -154,10 +154,39 @@ namespace Ryujinx.Headless return; bool NeedsOverride(string argKey) => originalArgs.None(arg => arg.TrimStart('-').EqualsIgnoreCase(OptionName(argKey))); - - string OptionName(string propertyName) => - typeof(Options)!.GetProperty(propertyName)!.GetCustomAttribute()!.LongName; } + + public void InheritMainConfigInput(string[] originalArgs, ConfigurationState configurationState) + { + Dictionary indicesToProperties = new() + { + { PlayerIndex.Handheld, (nameof(InputIdHandheld), nameof(InputProfileHandheldName)) }, + { PlayerIndex.Player1, (nameof(InputId1), nameof(InputProfile1Name)) }, + { PlayerIndex.Player2, (nameof(InputId2), nameof(InputProfile2Name)) }, + { PlayerIndex.Player3, (nameof(InputId3), nameof(InputProfile3Name)) }, + { PlayerIndex.Player4, (nameof(InputId4), nameof(InputProfile4Name)) }, + { PlayerIndex.Player5, (nameof(InputId5), nameof(InputProfile5Name)) }, + { PlayerIndex.Player6, (nameof(InputId6), nameof(InputProfile6Name)) }, + { PlayerIndex.Player7, (nameof(InputId7), nameof(InputProfile7Name)) }, + { PlayerIndex.Player8, (nameof(InputId8), nameof(InputProfile8Name)) } + }; + + foreach ((PlayerIndex playerIndex, (string id, string profile)) in indicesToProperties) + { + if (NeedsOverride(id) && NeedsOverride(profile)) + { + configurationState.Hid.InputConfig.Value.FindFirst(x => x.PlayerIndex == playerIndex) + .IfPresent(ic => InheritedInputConfigs[playerIndex] = ic); + } + } + + return; + + bool NeedsOverride(string argKey) => originalArgs.None(arg => arg.TrimStart('-').EqualsIgnoreCase(OptionName(argKey))); + } + + private static string OptionName(string propertyName) => + typeof(Options)!.GetProperty(propertyName)!.GetCustomAttribute()!.LongName; // General @@ -391,5 +420,7 @@ namespace Ryujinx.Headless [Value(0, MetaName = "input", HelpText = "Input to load.", Required = true)] public string InputPath { get; set; } + + public SafeDictionary InheritedInputConfigs = new(); } }