Procházet zdrojové kódy

misc: Headless: Inherit main input config

Evan Husted před 1 rokem
rodič
revize
391f57bdd2

+ 23 - 9
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()

+ 33 - 2
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)));
+        }
+
+        public void InheritMainConfigInput(string[] originalArgs, ConfigurationState configurationState)
+        {
+            Dictionary<PlayerIndex, (string InputId, string InputProfileName)> 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);
+                }
+            }
 
-            string OptionName(string propertyName) =>
-                typeof(Options)!.GetProperty(propertyName)!.GetCustomAttribute<OptionAttribute>()!.LongName;
+            return;
+            
+            bool NeedsOverride(string argKey) => originalArgs.None(arg => arg.TrimStart('-').EqualsIgnoreCase(OptionName(argKey)));
         }
+
+        private static string OptionName(string propertyName) =>
+            typeof(Options)!.GetProperty(propertyName)!.GetCustomAttribute<OptionAttribute>()!.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<PlayerIndex, InputConfig> InheritedInputConfigs = new();
     }
 }