diff --git a/src/Ryujinx.Common/ReleaseInformation.cs b/src/Ryujinx.Common/ReleaseInformation.cs
index cbf93013f5..c009651163 100644
--- a/src/Ryujinx.Common/ReleaseInformation.cs
+++ b/src/Ryujinx.Common/ReleaseInformation.cs
@@ -13,12 +13,14 @@ public static class ReleaseInformation
public const string BuildGitHash = "%%RYUJINX_BUILD_GIT_HASH%%";
private const string ReleaseChannelName = "%%RYUJINX_TARGET_RELEASE_CHANNEL_NAME%%";
private const string ConfigFileName = "%%RYUJINX_CONFIG_FILE_NAME%%";
+ private const string ConfigFileNameOverride = "%%RYUJINX_CONFIG_FILE_NAME_OVERRIDE%%";
public const string ReleaseChannelOwner = "%%RYUJINX_TARGET_RELEASE_CHANNEL_OWNER%%";
public const string ReleaseChannelSourceRepo = "%%RYUJINX_TARGET_RELEASE_CHANNEL_SOURCE_REPO%%";
public const string ReleaseChannelRepo = "%%RYUJINX_TARGET_RELEASE_CHANNEL_REPO%%";
public static string ConfigName => !ConfigFileName.StartsWith("%%") ? ConfigFileName : "Config.json";
+ public static string CustomConfigNameOverride => !ConfigFileNameOverride.StartsWith("%%") ? ConfigFileNameOverride : "CustomConfigOverride.json";
public static bool IsValid =>
!BuildGitHash.StartsWith("%%") &&
@@ -26,7 +28,8 @@ public static class ReleaseInformation
!ReleaseChannelOwner.StartsWith("%%") &&
!ReleaseChannelSourceRepo.StartsWith("%%") &&
!ReleaseChannelRepo.StartsWith("%%") &&
- !ConfigFileName.StartsWith("%%");
+ !ConfigFileName.StartsWith("%%") &&
+ !ConfigFileNameOverride.StartsWith("%%");
public static bool IsCanaryBuild => IsValid && ReleaseChannelName.Equals(CanaryChannel);
diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs
index 831e4294cd..6c953703f6 100644
--- a/src/Ryujinx/Program.cs
+++ b/src/Ryujinx/Program.cs
@@ -160,6 +160,28 @@ public static void ReloadConfig()
string localConfigurationPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ReleaseInformation.ConfigName);
string appDataConfigurationPath = Path.Combine(AppDataManager.BaseDirPath, ReleaseInformation.ConfigName);
+ string overrideLocalConfigurationPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ReleaseInformation.CustomConfigNameOverride);
+ string overrideAppDataConfigurationPath = Path.Combine(AppDataManager.BaseDirPath, ReleaseInformation.CustomConfigNameOverride);
+
+ // Copies and reloads the configuration file if the game was loaded with arguments
+ // based on global configuration
+ if (CommandLineState.CountArguments > 0)
+ {
+ if (File.Exists(localConfigurationPath))
+ {
+ File.Copy(localConfigurationPath, overrideLocalConfigurationPath, overwrite: true);
+ }
+
+ localConfigurationPath = overrideLocalConfigurationPath;
+
+ if (File.Exists(appDataConfigurationPath))
+ {
+ File.Copy(appDataConfigurationPath, overrideAppDataConfigurationPath, overwrite: true);
+ }
+
+ appDataConfigurationPath = overrideAppDataConfigurationPath;
+ }
+
// Now load the configuration as the other subsystems are now registered
if (File.Exists(localConfigurationPath))
{
@@ -232,8 +254,35 @@ public static void ReloadConfig()
_ => ConfigurationState.Instance.HideCursor,
};
+ // Check if memoryManagerMode was overridden.
+ if (CommandLineState.OverrideMemoryManagerMode is not null)
+ if (Enum.TryParse(CommandLineState.OverrideMemoryManagerMode, true, out MemoryManagerMode result))
+ {
+ ConfigurationState.Instance.System.MemoryManagerMode.Value = result;
+ }
+
+ // Check if PPTC was overridden.
+ if (CommandLineState.OverridePPTC is not null)
+ if (Enum.TryParse(CommandLineState.OverridePPTC, true, out bool result))
+ {
+ ConfigurationState.Instance.System.EnablePtc.Value = result;
+ }
+
+ // Check if region was overridden.
+ if (CommandLineState.OverrideSystemRegion is not null)
+ if (Enum.TryParse(CommandLineState.OverrideSystemRegion, true, out Ryujinx.HLE.HOS.SystemState.RegionCode result))
+ {
+ ConfigurationState.Instance.System.Region.Value = (Utilities.Configuration.System.Region)result;
+ }
+
+ //Check if language was overridden.
+ if (CommandLineState.OverrideSystemLanguage is not null)
+ if (Enum.TryParse(CommandLineState.OverrideSystemLanguage, true, out Ryujinx.HLE.HOS.SystemState.SystemLanguage result))
+ {
+ ConfigurationState.Instance.System.Language.Value = (Utilities.Configuration.System.Language)result;
+ }
- // Check if hardware-acceleration was overridden.
+ // Check if hardware-acceleration was overridden. MemoryManagerMode ( outdated! )
if (CommandLineState.OverrideHardwareAcceleration != null)
UseHardwareAcceleration = CommandLineState.OverrideHardwareAcceleration.Value;
}
diff --git a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs
index e55e744551..b4a944752a 100644
--- a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs
+++ b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs
@@ -376,15 +376,11 @@ public async void ExtractApplicationLogo_Click(object sender, RoutedEventArgs ar
png.SaveTo(fileStream);
}
- public void CreateApplicationShortcut_Click(object sender, RoutedEventArgs args)
+ public async void CreateApplicationShortcut_Click(object sender, RoutedEventArgs args)
{
if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
- ShortcutHelper.CreateAppShortcut(
- viewModel.SelectedApplication.Path,
- viewModel.SelectedApplication.Name,
- viewModel.SelectedApplication.IdString,
- viewModel.SelectedApplication.Icon
- );
+ await new ArgumentsConfigWindows(viewModel).ShowDialog((Window)viewModel.TopLevel);
+
}
public async void OpenApplicationCompatibility_Click(object sender, RoutedEventArgs args)
diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs
index d54313e768..1c9d69405f 100644
--- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs
@@ -1,8 +1,10 @@
using Avalonia.Collections;
using Avalonia.Controls;
+using Avalonia.Media.Imaging;
using Avalonia.Threading;
using CommunityToolkit.Mvvm.ComponentModel;
using Gommon;
+using LibHac.Tools.Fs;
using LibHac.Tools.FsSystem;
using Ryujinx.Audio.Backends.OpenAL;
using Ryujinx.Audio.Backends.SDL2;
@@ -26,6 +28,7 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
+using System.IO;
using System.Linq;
using System.Net.NetworkInformation;
using System.Runtime.InteropServices;
@@ -63,12 +66,56 @@ public partial class SettingsViewModel : BaseModel
public event Action CloseWindow;
public event Action SaveSettingsEvent;
+ public event Action CompareSettingsEvent;
private int _networkInterfaceIndex;
private int _multiplayerModeIndex;
private string _ldnPassphrase;
[ObservableProperty] private string _ldnServer;
public SettingsHacksViewModel DirtyHacks { get; }
+ public string GamePath { get; }
+ public string GameName { get; }
+
+ private Bitmap _gameIcon;
+
+ private string _gameTitle;
+ private string _gameId;
+ public Bitmap GameIcon
+ {
+ get => _gameIcon;
+ set
+ {
+ if (_gameIcon != value)
+ {
+ _gameIcon = value;
+ }
+ }
+ }
+
+ public string GameTitle
+ {
+ get => _gameTitle;
+ set
+ {
+ if (_gameTitle != value)
+ {
+ _gameTitle = value;
+ }
+ }
+ }
+
+ public string GameId
+ {
+ get => _gameId;
+ set
+ {
+ if (_gameId != value)
+ {
+ _gameId = value;
+ }
+ }
+ }
+
public int ResolutionScale
{
@@ -344,6 +391,30 @@ public SettingsViewModel(VirtualFileSystem virtualFileSystem, ContentManager con
}
}
+ public SettingsViewModel(VirtualFileSystem virtualFileSystem, ContentManager contentManager, string gamePath, string gameName, string gameId, byte[] gameIconData) : this()
+ {
+ _virtualFileSystem = virtualFileSystem;
+ _contentManager = contentManager;
+
+ if (gameIconData != null && gameIconData.Length > 0)
+ {
+ using (var ms = new MemoryStream(gameIconData))
+ {
+ GameIcon = new Bitmap(ms);
+ }
+ }
+
+ GameTitle = gameName;
+ GameId = gameId;
+
+ if (Program.PreviewerDetached)
+ {
+ Task.Run(LoadTimeZones);
+
+ DirtyHacks = new SettingsHacksViewModel(this);
+ }
+ }
+
public SettingsViewModel()
{
GameDirectories = [];
@@ -716,6 +787,11 @@ public void ApplyButton()
SaveSettings();
}
+ public void CreateShortcut()
+ {
+ CompareSettingsEvent?.Invoke(); //raises an event to create a shortcut with arguments
+ }
+
public void OkButton()
{
SaveSettings();
diff --git a/src/Ryujinx/UI/Views/Settings/SettingsApplyOverride.axaml b/src/Ryujinx/UI/Views/Settings/SettingsApplyOverride.axaml
new file mode 100644
index 0000000000..e508000751
--- /dev/null
+++ b/src/Ryujinx/UI/Views/Settings/SettingsApplyOverride.axaml
@@ -0,0 +1,237 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Ryujinx/UI/Views/Settings/SettingsApplyOverride.axaml.cs b/src/Ryujinx/UI/Views/Settings/SettingsApplyOverride.axaml.cs
new file mode 100644
index 0000000000..d852fdc16d
--- /dev/null
+++ b/src/Ryujinx/UI/Views/Settings/SettingsApplyOverride.axaml.cs
@@ -0,0 +1,12 @@
+using Avalonia.Controls;
+
+namespace Ryujinx.Ava.UI.Views.Settings
+{
+ public partial class SettingsApplyOverride : UserControl
+ {
+ public SettingsApplyOverride()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/src/Ryujinx/UI/Windows/ArgumentsConfigWindows.axaml b/src/Ryujinx/UI/Windows/ArgumentsConfigWindows.axaml
new file mode 100644
index 0000000000..b0953f77c2
--- /dev/null
+++ b/src/Ryujinx/UI/Windows/ArgumentsConfigWindows.axaml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Ryujinx/UI/Windows/ArgumentsConfigWindows.axaml.cs b/src/Ryujinx/UI/Windows/ArgumentsConfigWindows.axaml.cs
new file mode 100644
index 0000000000..4f12b77991
--- /dev/null
+++ b/src/Ryujinx/UI/Windows/ArgumentsConfigWindows.axaml.cs
@@ -0,0 +1,162 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Controls.Shapes;
+using Avalonia.Input;
+using Avalonia.Media.Imaging;
+using FluentAvalonia.Core;
+using FluentAvalonia.UI.Controls;
+using Projektanker.Icons.Avalonia;
+using Ryujinx.Ava.Common.Locale;
+using Ryujinx.Ava.UI.Models;
+using Ryujinx.Ava.UI.ViewModels;
+using Ryujinx.Ava.UI.ViewModels.Input;
+using Ryujinx.Ava.Utilities;
+using Ryujinx.Ava.Utilities.Configuration;
+using Ryujinx.Common.Configuration;
+using Ryujinx.HLE.FileSystem;
+using Ryujinx.HLE.HOS.SystemState;
+using Ryujinx.Input;
+using System;
+using System.IO;
+using System.Linq;
+using Key = Avalonia.Input.Key;
+
+
+namespace Ryujinx.Ava.UI.Windows
+{
+ public partial class ArgumentsConfigWindows : StyleableAppWindow
+ {
+ internal readonly SettingsViewModel ViewModel;
+ public string GamePath { get; }
+ public string GameName { get; }
+ public string GameId { get; }
+ public byte[] GameIconData { get; }
+
+ public static int OverrideBackendThreading { get; private set; }
+ public static int OverrideGraphicsBackend { get; private set; }
+ public static int OverrideSystemLanguage { get; private set; }
+ public static int OverrideSystemRegion { get; private set; }
+ public static bool OverridePPTC { get; private set; }
+ public static int OverrideMemoryManagerMode { get; private set; }
+
+
+ public ArgumentsConfigWindows(MainWindowViewModel viewModel)
+ {
+ Title = RyujinxApp.FormatTitle(LocaleKeys.Settings);
+
+ DataContext = ViewModel = new SettingsViewModel(
+ viewModel.VirtualFileSystem,
+ viewModel.ContentManager,
+ viewModel.SelectedApplication.Path,
+ viewModel.SelectedApplication.Name,
+ viewModel.SelectedApplication.IdString,
+ viewModel.SelectedApplication.Icon);
+
+ GamePath = viewModel.SelectedApplication.Path;
+ GameName = viewModel.SelectedApplication.Name;
+ GameId = viewModel.SelectedApplication.IdString;
+ GameIconData = viewModel.SelectedApplication.Icon;
+
+ OverrideBackendThreading = ViewModel.GraphicsBackendMultithreadingIndex;
+ OverrideGraphicsBackend = ViewModel.GraphicsBackendIndex;
+ OverrideSystemLanguage = ViewModel.Language;
+ OverrideSystemRegion = ViewModel.Region;
+ OverridePPTC = ViewModel.EnablePptc;
+ OverrideMemoryManagerMode = ViewModel.MemoryMode;
+
+ ViewModel.CloseWindow += Close;
+ ViewModel.CompareSettingsEvent += CompareConfiguration;
+
+ InitializeComponent();
+ Load();
+
+#if DEBUG
+ this.AttachDevTools(new KeyGesture(Key.F12, KeyModifiers.Alt));
+#endif
+ }
+
+ public void CompareConfiguration()
+ {
+ ShortcutHelper.CreateAppShortcut(
+ GamePath,
+ GameName,
+ GameId,
+ GameIconData,
+ GetArguments()
+ );
+ }
+
+ private string GetArguments()
+ {
+
+ string line = "";
+
+ if (OverrideBackendThreading != ViewModel.GraphicsBackendMultithreadingIndex)
+ {
+ string _result = Enum.GetName(typeof(BackendThreading), ViewModel.GraphicsBackendMultithreadingIndex);
+ line += " --backend-threading " + _result;
+ }
+
+ if (OverrideGraphicsBackend != ViewModel.GraphicsBackendIndex)
+ {
+ string _result = Enum.GetName(typeof(GraphicsBackend), ViewModel.GraphicsBackendIndex);
+ line += " -g " + _result;
+ }
+
+ if (OverridePPTC != ViewModel.EnablePptc)
+ {
+ string _result = ViewModel.EnablePptc.ToString();
+ line += " --pptc " + _result;
+ }
+
+ if (OverrideMemoryManagerMode != ViewModel.MemoryMode)
+ {
+ string _result = Enum.GetName(typeof(MemoryManagerMode), ViewModel.MemoryMode);
+ line += " -m " + _result;
+ }
+
+ if (OverrideSystemRegion != ViewModel.Region)
+ {
+ string _result = Enum.GetName(typeof(RegionCode), ViewModel.Region);
+ line += " --system-region " + _result;
+ }
+
+ if (OverrideSystemLanguage != ViewModel.Language)
+ {
+ string _result = Enum.GetName(typeof(SystemLanguage), ViewModel.Language);
+ line += " --system-language " + _result;
+ }
+
+ return line;
+ }
+
+ private void Load()
+ {
+ Pages.Children.Clear();
+ NavPanel.SelectionChanged += NavPanelOnSelectionChanged;
+ NavPanel.SelectedItem = NavPanel.MenuItems.ElementAt(0);
+
+ }
+
+ private void NavPanelOnSelectionChanged(object sender, NavigationViewSelectionChangedEventArgs e)
+ {
+
+ if (e.SelectedItem is NavigationViewItem navItem && navItem.Tag is not null)
+ {
+ switch (navItem.Tag.ToString())
+ {
+ case nameof(AllSettings):
+ NavPanel.Content = AllSettings;
+ break;
+ default:
+ throw new NotImplementedException();
+ }
+ }
+ }
+
+ protected override void OnClosing(WindowClosingEventArgs e)
+ {
+ base.OnClosing(e);
+ }
+ }
+}
diff --git a/src/Ryujinx/Utilities/CommandLineState.cs b/src/Ryujinx/Utilities/CommandLineState.cs
index 3eafb8d010..b5b44d8897 100644
--- a/src/Ryujinx/Utilities/CommandLineState.cs
+++ b/src/Ryujinx/Utilities/CommandLineState.cs
@@ -6,11 +6,15 @@ namespace Ryujinx.Ava.Utilities
public static class CommandLineState
{
public static string[] Arguments { get; private set; }
-
+ public static int CountArguments { get; private set; }
public static bool? OverrideDockedMode { get; private set; }
public static bool? OverrideHardwareAcceleration { get; private set; }
public static string OverrideGraphicsBackend { get; private set; }
public static string OverrideBackendThreading { get; private set; }
+ public static string OverridePPTC { get; private set; }
+ public static string OverrideMemoryManagerMode { get; private set; }
+ public static string OverrideSystemRegion { get; private set; }
+ public static string OverrideSystemLanguage { get; private set; }
public static string OverrideHideCursor { get; private set; }
public static string BaseDirPathArg { get; private set; }
public static string Profile { get; private set; }
@@ -28,6 +32,11 @@ public static void ParseArguments(string[] args)
{
string arg = args[i];
+ if (arg.Contains("-") || arg.Contains("--"))
+ {
+ CountArguments++;
+ }
+
switch (arg)
{
case "-r":
@@ -85,6 +94,47 @@ public static void ParseArguments(string[] args)
OverrideBackendThreading = args[++i];
break;
+ case "--pptc":
+ if (i + 1 >= args.Length)
+ {
+ Logger.Error?.Print(LogClass.Application, $"Invalid option '{arg}'");
+
+ continue;
+ }
+
+ OverridePPTC = args[++i];
+ break;
+ case "-m":
+ case "--memory-manager-mode":
+ if (i + 1 >= args.Length)
+ {
+ Logger.Error?.Print(LogClass.Application, $"Invalid option '{arg}'");
+
+ continue;
+ }
+
+ OverrideMemoryManagerMode = args[++i];
+ break;
+ case "--system-region":
+ if (i + 1 >= args.Length)
+ {
+ Logger.Error?.Print(LogClass.Application, $"Invalid option '{arg}'");
+
+ continue;
+ }
+
+ OverrideSystemRegion = args[++i];
+ break;
+ case "--system-language":
+ if (i + 1 >= args.Length)
+ {
+ Logger.Error?.Print(LogClass.Application, $"Invalid option '{arg}'");
+
+ continue;
+ }
+
+ OverrideSystemLanguage = args[++i];
+ break;
case "-i":
case "--application-id":
LaunchApplicationId = args[++i];
diff --git a/src/Ryujinx/Utilities/ShortcutHelper.cs b/src/Ryujinx/Utilities/ShortcutHelper.cs
index db843959f8..b92f97f558 100644
--- a/src/Ryujinx/Utilities/ShortcutHelper.cs
+++ b/src/Ryujinx/Utilities/ShortcutHelper.cs
@@ -12,7 +12,7 @@ namespace Ryujinx.Ava.Utilities
public static class ShortcutHelper
{
[SupportedOSPlatform("windows")]
- private static void CreateShortcutWindows(string applicationFilePath, string applicationId, byte[] iconData, string iconPath, string cleanedAppName, string desktopPath)
+ private static void CreateShortcutWindows(string applicationFilePath, string applicationId, byte[] iconData, string iconPath, string cleanedAppName, string desktopPath, string args = "")
{
string basePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppDomain.CurrentDomain.FriendlyName + ".exe");
iconPath += ".ico";
@@ -22,13 +22,13 @@ private static void CreateShortcutWindows(string applicationFilePath, string app
image.Resize(new SKImageInfo(128, 128), SKFilterQuality.High);
SaveBitmapAsIcon(image, iconPath);
- Shortcut shortcut = Shortcut.CreateShortcut(basePath, GetArgsString(applicationFilePath, applicationId), iconPath, 0);
+ Shortcut shortcut = Shortcut.CreateShortcut(basePath, GetArgsString(applicationFilePath, applicationId, args), iconPath, 0);
shortcut.StringData.NameString = cleanedAppName;
shortcut.WriteToFile(Path.Combine(desktopPath, cleanedAppName + ".lnk"));
}
[SupportedOSPlatform("linux")]
- private static void CreateShortcutLinux(string applicationFilePath, string applicationId, byte[] iconData, string iconPath, string desktopPath, string cleanedAppName)
+ private static void CreateShortcutLinux(string applicationFilePath, string applicationId, byte[] iconData, string iconPath, string desktopPath, string cleanedAppName, string args = "")
{
string basePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Ryujinx.sh");
string desktopFile = EmbeddedResources.ReadAllText("Ryujinx/Assets/ShortcutFiles/shortcut-template.desktop");
@@ -40,11 +40,11 @@ private static void CreateShortcutLinux(string applicationFilePath, string appli
data.SaveTo(file);
using StreamWriter outputFile = new(Path.Combine(desktopPath, cleanedAppName + ".desktop"));
- outputFile.Write(desktopFile, cleanedAppName, iconPath, $"{basePath} {GetArgsString(applicationFilePath, applicationId)}");
+ outputFile.Write(desktopFile, cleanedAppName, iconPath, $"{basePath} {GetArgsString(applicationFilePath, applicationId, args)}");
}
[SupportedOSPlatform("macos")]
- private static void CreateShortcutMacos(string appFilePath, string applicationId, byte[] iconData, string desktopPath, string cleanedAppName)
+ private static void CreateShortcutMacos(string appFilePath, string applicationId, byte[] iconData, string desktopPath, string cleanedAppName, string args = "")
{
string basePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Ryujinx");
string plistFile = EmbeddedResources.ReadAllText("Ryujinx/Assets/ShortcutFiles/shortcut-template.plist");
@@ -63,7 +63,7 @@ private static void CreateShortcutMacos(string appFilePath, string applicationId
string scriptPath = Path.Combine(scriptFolderPath, ScriptName);
using StreamWriter scriptFile = new(scriptPath);
- scriptFile.Write(shortcutScript, basePath, GetArgsString(appFilePath, applicationId));
+ scriptFile.Write(shortcutScript, basePath, GetArgsString(appFilePath, applicationId, args));
// Set execute permission
FileInfo fileInfo = new(scriptPath);
@@ -87,7 +87,7 @@ private static void CreateShortcutMacos(string appFilePath, string applicationId
outputFile.Write(plistFile, ScriptName, cleanedAppName, IconName);
}
- public static void CreateAppShortcut(string applicationFilePath, string applicationName, string applicationId, byte[] iconData)
+ public static void CreateAppShortcut(string applicationFilePath, string applicationName, string applicationId, byte[] iconData, string args = "")
{
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
string cleanedAppName = string.Join("_", applicationName.Split(Path.GetInvalidFileNameChars()));
@@ -96,7 +96,7 @@ public static void CreateAppShortcut(string applicationFilePath, string applicat
{
string iconPath = Path.Combine(AppDataManager.BaseDirPath, "games", applicationId, "app");
- CreateShortcutWindows(applicationFilePath, applicationId, iconData, iconPath, cleanedAppName, desktopPath);
+ CreateShortcutWindows(applicationFilePath, applicationId, iconData, iconPath, cleanedAppName, desktopPath, args);
return;
}
@@ -106,14 +106,14 @@ public static void CreateAppShortcut(string applicationFilePath, string applicat
string iconPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".local", "share", "icons", "Ryujinx");
Directory.CreateDirectory(iconPath);
- CreateShortcutLinux(applicationFilePath, applicationId, iconData, Path.Combine(iconPath, applicationId), desktopPath, cleanedAppName);
+ CreateShortcutLinux(applicationFilePath, applicationId, iconData, Path.Combine(iconPath, applicationId), desktopPath, cleanedAppName, args);
return;
}
if (OperatingSystem.IsMacOS())
{
- CreateShortcutMacos(applicationFilePath, applicationId, iconData, desktopPath, cleanedAppName);
+ CreateShortcutMacos(applicationFilePath, applicationId, iconData, desktopPath, cleanedAppName, args);
return;
}
@@ -121,7 +121,7 @@ public static void CreateAppShortcut(string applicationFilePath, string applicat
throw new NotImplementedException("Shortcut support has not been implemented yet for this OS.");
}
- private static string GetArgsString(string appFilePath, string applicationId)
+ private static string GetArgsString(string appFilePath, string applicationId, string config = "")
{
// args are first defined as a list, for easier adjustments in the future
List argsList = [];
@@ -132,6 +132,11 @@ private static string GetArgsString(string appFilePath, string applicationId)
argsList.Add($"\"{CommandLineState.BaseDirPathArg}\"");
}
+ if (!string.IsNullOrEmpty(config))
+ {
+ argsList.Add(config);
+ }
+
if (appFilePath.ToLower().EndsWith(".xci"))
{
argsList.Add("--application-id");