diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 21dc3eb0b..aeb12a575 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -64,14 +64,9 @@ jobs:
run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx --self-contained
if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
- - name: Publish Ryujinx.Headless.SDL2
- run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx.Headless.SDL2 --self-contained
- if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
-
- name: Set executable bit
run: |
chmod +x ./publish/Ryujinx ./publish/Ryujinx.sh
- chmod +x ./publish_sdl2_headless/Ryujinx.Headless.SDL2 ./publish_sdl2_headless/Ryujinx.sh
if: github.event_name == 'pull_request' && matrix.platform.os == 'ubuntu-latest'
- name: Build AppImage
@@ -119,13 +114,6 @@ jobs:
name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}-AppImage
path: publish_appimage
- - name: Upload Ryujinx.Headless.SDL2 artifact
- uses: actions/upload-artifact@v4
- with:
- name: nogui-ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-${{ matrix.platform.zip_os_name }}
- path: publish_sdl2_headless
- if: github.event_name == 'pull_request' && matrix.platform.os != 'macos-13'
-
build_macos:
name: macOS Universal (${{ matrix.configuration }})
runs-on: ubuntu-latest
@@ -171,20 +159,9 @@ jobs:
run: |
./distribution/macos/create_macos_build_ava.sh . publish_tmp publish ./distribution/macos/entitlements.xml "${{ env.RYUJINX_BASE_VERSION }}" "${{ steps.git_short_hash.outputs.result }}" "${{ matrix.configuration }}" "-p:ExtraDefineConstants=DISABLE_UPDATER"
- - name: Publish macOS Ryujinx.Headless.SDL2
- run: |
- ./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ env.RYUJINX_BASE_VERSION }}" "${{ steps.git_short_hash.outputs.result }}" "${{ matrix.configuration }}" "-p:ExtraDefineConstants=DISABLE_UPDATER"
-
- name: Upload Ryujinx artifact
uses: actions/upload-artifact@v4
with:
name: ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-macos_universal
path: "publish/*.tar.gz"
if: github.event_name == 'pull_request'
-
- - name: Upload Ryujinx.Headless.SDL2 artifact
- uses: actions/upload-artifact@v4
- with:
- name: nogui-ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-macos_universal
- path: "publish_headless/*.tar.gz"
- if: github.event_name == 'pull_request'
diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml
index df28e4784..58b659117 100644
--- a/.github/workflows/canary.yml
+++ b/.github/workflows/canary.yml
@@ -104,7 +104,6 @@ jobs:
- name: Publish
run: |
dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_ava/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained
- dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless/publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained
- name: Packing Windows builds
if: matrix.platform.os == 'windows-latest'
@@ -113,11 +112,6 @@ jobs:
rm publish/libarmeilleure-jitsupport.dylib
7z a ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish
popd
-
- pushd publish_sdl2_headless
- rm publish/libarmeilleure-jitsupport.dylib
- 7z a ../release_output/nogui-ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip publish
- popd
shell: bash
- name: Packing Linux builds
@@ -128,12 +122,6 @@ jobs:
chmod +x publish/Ryujinx.sh publish/Ryujinx
tar -czvf ../release_output/ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish
popd
-
- pushd publish_sdl2_headless
- rm publish/libarmeilleure-jitsupport.dylib
- chmod +x publish/Ryujinx.sh publish/Ryujinx.Headless.SDL2
- tar -czvf ../release_output/nogui-ryujinx-canary-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz publish
- popd
shell: bash
#- name: Build AppImage (Linux)
@@ -179,7 +167,7 @@ jobs:
with:
name: ${{ steps.version_info.outputs.build_version }}
artifacts: "release_output/*.tar.gz,release_output/*.zip"
- #artifacts: "release_output/*.tar.gz,release_output/*.zip/*AppImage*"
+ #artifacts: "release_output/*.tar.gz,release_output/*.zip,release_output/*AppImage*"
tag: ${{ steps.version_info.outputs.build_version }}
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}"
omitBodyDuringUpdate: true
@@ -238,15 +226,11 @@ jobs:
run: |
./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish_ava ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 1
- - name: Publish macOS Ryujinx.Headless.SDL2
- run: |
- ./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 1
-
- name: Pushing new release
uses: ncipollo/release-action@v1
with:
name: "Canary ${{ steps.version_info.outputs.build_version }}"
- artifacts: "publish_ava/*.tar.gz, publish_headless/*.tar.gz"
+ artifacts: "publish_ava/*.tar.gz"
tag: ${{ steps.version_info.outputs.build_version }}
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/Canary-${{ steps.version_info.outputs.prev_build_version }}...Canary-${{ steps.version_info.outputs.build_version }}"
omitBodyDuringUpdate: true
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index fbf715756..d4bdd2430 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -103,7 +103,6 @@ jobs:
- name: Publish
run: |
dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx --self-contained
- dotnet publish -c Release -r "${{ matrix.platform.name }}" -o ./publish_sdl2_headless -p:Version="${{ steps.version_info.outputs.build_version }}" -p:SourceRevisionId="${{ steps.version_info.outputs.git_short_hash }}" -p:DebugType=embedded src/Ryujinx.Headless.SDL2 --self-contained
- name: Packing Windows builds
if: matrix.platform.os == 'windows-latest'
@@ -112,11 +111,6 @@ jobs:
rm libarmeilleure-jitsupport.dylib
7z a ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish
popd
-
- pushd publish_sdl2_headless
- rm libarmeilleure-jitsupport.dylib
- 7z a ../release_output/nogui-ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.zip ../publish
- popd
shell: bash
- name: Build AppImage (Linux)
@@ -163,11 +157,6 @@ jobs:
chmod +x Ryujinx.sh Ryujinx
tar -czvf ../release_output/ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish
popd
-
- pushd publish_sdl2_headless
- chmod +x Ryujinx.sh Ryujinx.Headless.SDL2
- tar -czvf ../release_output/nogui-ryujinx-${{ steps.version_info.outputs.build_version }}-${{ matrix.platform.zip_os_name }}.tar.gz ../publish
- popd
shell: bash
- name: Pushing new release
@@ -233,15 +222,11 @@ jobs:
run: |
./distribution/macos/create_macos_build_ava.sh . publish_tmp_ava publish ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0
- - name: Publish macOS Ryujinx.Headless.SDL2
- run: |
- ./distribution/macos/create_macos_build_headless.sh . publish_tmp_headless publish_headless ./distribution/macos/entitlements.xml "${{ steps.version_info.outputs.build_version }}" "${{ steps.version_info.outputs.git_short_hash }}" Release 0
-
- name: Pushing new release
uses: ncipollo/release-action@v1
with:
name: ${{ steps.version_info.outputs.build_version }}
- artifacts: "publish/*.tar.gz, publish_headless/*.tar.gz"
+ artifacts: "publish/*.tar.gz"
tag: ${{ steps.version_info.outputs.build_version }}
body: "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.version_info.outputs.prev_build_version }}...${{ steps.version_info.outputs.build_version }}"
omitBodyDuringUpdate: true
diff --git a/Ryujinx.sln b/Ryujinx.sln
index d661b903c..58c556efc 100644
--- a/Ryujinx.sln
+++ b/Ryujinx.sln
@@ -57,8 +57,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.SDL2.Common", "src\
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Audio.Backends.SDL2", "src\Ryujinx.Audio.Backends.SDL2\Ryujinx.Audio.Backends.SDL2.csproj", "{D99A395A-8569-4DB0-B336-900647890052}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Headless.SDL2", "src\Ryujinx.Headless.SDL2\Ryujinx.Headless.SDL2.csproj", "{390DC343-5CB4-4C79-A5DD-E3ED235E4C49}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Graphics.Nvdec.FFmpeg", "src\Ryujinx.Graphics.Nvdec.FFmpeg\Ryujinx.Graphics.Nvdec.FFmpeg.csproj", "{BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx", "src\Ryujinx\Ryujinx.csproj", "{7C1B2721-13DA-4B62-B046-C626605ECCE6}"
@@ -204,10 +202,6 @@ Global
{D99A395A-8569-4DB0-B336-900647890052}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D99A395A-8569-4DB0-B336-900647890052}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D99A395A-8569-4DB0-B336-900647890052}.Release|Any CPU.Build.0 = Release|Any CPU
- {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {390DC343-5CB4-4C79-A5DD-E3ED235E4C49}.Release|Any CPU.Build.0 = Release|Any CPU
{BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BEE1C184-C9A4-410B-8DFC-FB74D5C93AEB}.Release|Any CPU.ActiveCfg = Release|Any CPU
diff --git a/src/Ryujinx.Common/Logging/Logger.cs b/src/Ryujinx.Common/Logging/Logger.cs
index 26d343969..6ea6b7ac3 100644
--- a/src/Ryujinx.Common/Logging/Logger.cs
+++ b/src/Ryujinx.Common/Logging/Logger.cs
@@ -4,6 +4,7 @@ using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
+using System.Linq;
using System.Runtime.CompilerServices;
using System.Threading;
@@ -157,21 +158,16 @@ namespace Ryujinx.Common.Logging
_time.Restart();
}
- private static ILogTarget GetTarget(string targetName)
- {
- foreach (var target in _logTargets)
- {
- if (target.Name.Equals(targetName))
- {
- return target;
- }
- }
-
- return null;
- }
+ private static ILogTarget GetTarget(string targetName)
+ => _logTargets.FirstOrDefault(target => target.Name.Equals(targetName));
public static void AddTarget(ILogTarget target)
{
+ if (_logTargets.Any(t => t.Name == target.Name))
+ {
+ return;
+ }
+
_logTargets.Add(target);
Updated += target.Log;
diff --git a/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj b/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj
index 8fbf9be1e..6cb8d66ae 100644
--- a/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj
+++ b/src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj
@@ -38,27 +38,12 @@
-
-
- Always
- THIRDPARTY.md
-
-
- Always
- LICENSE.txt
-
-
-
Always
-
-
-
-
false
diff --git a/src/Ryujinx.Headless.SDL2/HeadlessDynamicTextInputHandler.cs b/src/Ryujinx/Headless/HeadlessDynamicTextInputHandler.cs
similarity index 97%
rename from src/Ryujinx.Headless.SDL2/HeadlessDynamicTextInputHandler.cs
rename to src/Ryujinx/Headless/HeadlessDynamicTextInputHandler.cs
index 40eb5ba98..2a507d2b7 100644
--- a/src/Ryujinx.Headless.SDL2/HeadlessDynamicTextInputHandler.cs
+++ b/src/Ryujinx/Headless/HeadlessDynamicTextInputHandler.cs
@@ -2,7 +2,7 @@ using Ryujinx.HLE.UI;
using System.Threading;
using System.Threading.Tasks;
-namespace Ryujinx.Headless.SDL2
+namespace Ryujinx.Headless
{
///
/// Headless text processing class, right now there is no way to forward the input to it.
diff --git a/src/Ryujinx.Headless.SDL2/HeadlessHostUiTheme.cs b/src/Ryujinx/Headless/HeadlessHostUiTheme.cs
similarity index 93%
rename from src/Ryujinx.Headless.SDL2/HeadlessHostUiTheme.cs
rename to src/Ryujinx/Headless/HeadlessHostUiTheme.cs
index 78cd43ae5..b5e1ce526 100644
--- a/src/Ryujinx.Headless.SDL2/HeadlessHostUiTheme.cs
+++ b/src/Ryujinx/Headless/HeadlessHostUiTheme.cs
@@ -1,6 +1,6 @@
using Ryujinx.HLE.UI;
-namespace Ryujinx.Headless.SDL2
+namespace Ryujinx.Headless
{
internal class HeadlessHostUiTheme : IHostUITheme
{
diff --git a/src/Ryujinx.Headless.SDL2/Program.cs b/src/Ryujinx/Headless/HeadlessRyujinx.cs
similarity index 91%
rename from src/Ryujinx.Headless.SDL2/Program.cs
rename to src/Ryujinx/Headless/HeadlessRyujinx.cs
index 46743b4eb..2918e130b 100644
--- a/src/Ryujinx.Headless.SDL2/Program.cs
+++ b/src/Ryujinx/Headless/HeadlessRyujinx.cs
@@ -1,7 +1,12 @@
+using Avalonia.Threading;
using CommandLine;
+using DiscordRPC;
using Gommon;
using LibHac.Tools.FsSystem;
using Ryujinx.Audio.Backends.SDL2;
+using Ryujinx.Ava;
+using Ryujinx.Ava.Common.Locale;
+using Ryujinx.Ava.UI.Windows;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
@@ -21,8 +26,6 @@ using Ryujinx.Graphics.Gpu.Shader;
using Ryujinx.Graphics.OpenGL;
using Ryujinx.Graphics.Vulkan;
using Ryujinx.Graphics.Vulkan.MoltenVK;
-using Ryujinx.Headless.SDL2.OpenGL;
-using Ryujinx.Headless.SDL2.Vulkan;
using Ryujinx.HLE;
using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS;
@@ -31,22 +34,25 @@ using Ryujinx.Input;
using Ryujinx.Input.HLE;
using Ryujinx.Input.SDL2;
using Ryujinx.SDL2.Common;
+using Ryujinx.UI.App.Common;
+using Ryujinx.UI.Common;
+using Ryujinx.UI.Common.Configuration;
+using Ryujinx.UI.Common.Helper;
using Silk.NET.Vulkan;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
using System.Threading;
+using System.Threading.Tasks;
using ConfigGamepadInputId = Ryujinx.Common.Configuration.Hid.Controller.GamepadInputId;
using ConfigStickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId;
using Key = Ryujinx.Common.Configuration.Hid.Key;
-namespace Ryujinx.Headless.SDL2
+namespace Ryujinx.Headless
{
- public class Program
+ public class HeadlessRyujinx
{
- public static string Version { get; private set; }
-
private static VirtualFileSystem _virtualFileSystem;
private static ContentManager _contentManager;
private static AccountManager _accountManager;
@@ -62,14 +68,63 @@ namespace Ryujinx.Headless.SDL2
private static readonly InputConfigJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
- public static void Main(string[] args)
+ public static void Initialize(string[] args)
{
- Version = ReleaseInformation.Version;
+ // Ensure Discord presence timestamp begins at the absolute start of when Ryujinx is launched
+ DiscordIntegrationModule.StartedAt = Timestamps.Now;
+ // Delete backup files after updating.
+ Task.Run(Updater.CleanupUpdate);
+
+ // Hook unhandled exception and process exit events.
+ AppDomain.CurrentDomain.UnhandledException += (sender, e)
+ => Program.ProcessUnhandledException(sender, e.ExceptionObject as Exception, e.IsTerminating);
+ AppDomain.CurrentDomain.ProcessExit += (_, _) => Program.Exit();
+
+ // Setup base data directory.
+ AppDataManager.Initialize(CommandLineState.BaseDirPathArg);
+
+ // Set the delegate for localizing the word "never" in the UI
+ ApplicationData.LocalizedNever = () => LocaleManager.Instance[LocaleKeys.Never];
+
+ // Initialize the configuration.
+ ConfigurationState.Initialize();
+
+ // Initialize the logger system.
+ LoggerModule.Initialize();
+
+ // Initialize Discord integration.
+ DiscordIntegrationModule.Initialize();
+
+ // Initialize SDL2 driver
+ SDL2Driver.MainThreadDispatcher = action => Dispatcher.UIThread.InvokeAsync(action, DispatcherPriority.Input);
+
+ Program.ReloadConfig();
+
+ // Logging system information.
+ Program.PrintSystemInfo();
+
+ // Enable OGL multithreading on the driver, and some other flags.
+ DriverUtilities.InitDriverConfig(ConfigurationState.Instance.Graphics.BackendThreading == BackendThreading.Off);
+
+ // Check if keys exists.
+ if (!File.Exists(Path.Combine(AppDataManager.KeysDirPath, "prod.keys")))
+ {
+ if (!(AppDataManager.Mode == AppDataManager.LaunchMode.UserProfile && File.Exists(Path.Combine(AppDataManager.KeysDirPathUser, "prod.keys"))))
+ {
+ Logger.Error?.Print(LogClass.Application, "Keys not found");
+ }
+ }
+
+ Entrypoint(args);
+ }
+
+ public static void Entrypoint(string[] args)
+ {
// Make process DPI aware for proper window sizing on high-res screens.
ForceDpiAware.Windows();
- Console.Title = $"Ryujinx Console {Version} (Headless SDL2)";
+ Console.Title = $"Ryujinx Console {Program.Version} (Headless SDL2)";
if (OperatingSystem.IsMacOS() || OperatingSystem.IsLinux())
{
diff --git a/src/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs b/src/Ryujinx/Headless/OpenGL/OpenGLWindow.cs
similarity index 99%
rename from src/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs
rename to src/Ryujinx/Headless/OpenGL/OpenGLWindow.cs
index 8c4854a11..c00a0648f 100644
--- a/src/Ryujinx.Headless.SDL2/OpenGL/OpenGLWindow.cs
+++ b/src/Ryujinx/Headless/OpenGL/OpenGLWindow.cs
@@ -7,7 +7,7 @@ using Ryujinx.Input.HLE;
using System;
using static SDL2.SDL;
-namespace Ryujinx.Headless.SDL2.OpenGL
+namespace Ryujinx.Headless
{
class OpenGLWindow : WindowBase
{
diff --git a/src/Ryujinx.Headless.SDL2/Options.cs b/src/Ryujinx/Headless/Options.cs
similarity index 97%
rename from src/Ryujinx.Headless.SDL2/Options.cs
rename to src/Ryujinx/Headless/Options.cs
index 4e2ad5b58..db873b921 100644
--- a/src/Ryujinx.Headless.SDL2/Options.cs
+++ b/src/Ryujinx/Headless/Options.cs
@@ -2,13 +2,22 @@ using CommandLine;
using Ryujinx.Common.Configuration;
using Ryujinx.HLE;
using Ryujinx.HLE.HOS.SystemState;
+using Ryujinx.UI.Common.Configuration;
-namespace Ryujinx.Headless.SDL2
+namespace Ryujinx.Headless
{
public class Options
{
// General
+ public void InheritMainConfig(ConfigurationState configurationState)
+ {
+
+ }
+
+ [Option("use-main-config", Required = false, Default = false, HelpText = "Use the settings from what was configured via the UI.")]
+ public bool InheritConfig { get; set; }
+
[Option("root-data-dir", Required = false, HelpText = "Set the custom folder path for Ryujinx data.")]
public string BaseDataDir { get; set; }
diff --git a/src/Ryujinx.Headless.SDL2/Ryujinx.bmp b/src/Ryujinx/Headless/Ryujinx.bmp
similarity index 100%
rename from src/Ryujinx.Headless.SDL2/Ryujinx.bmp
rename to src/Ryujinx/Headless/Ryujinx.bmp
diff --git a/src/Ryujinx.Headless.SDL2/StatusUpdatedEventArgs.cs b/src/Ryujinx/Headless/StatusUpdatedEventArgs.cs
similarity index 94%
rename from src/Ryujinx.Headless.SDL2/StatusUpdatedEventArgs.cs
rename to src/Ryujinx/Headless/StatusUpdatedEventArgs.cs
index c1dd3805f..6c76a43a1 100644
--- a/src/Ryujinx.Headless.SDL2/StatusUpdatedEventArgs.cs
+++ b/src/Ryujinx/Headless/StatusUpdatedEventArgs.cs
@@ -1,6 +1,6 @@
using System;
-namespace Ryujinx.Headless.SDL2
+namespace Ryujinx.Headless
{
class StatusUpdatedEventArgs(
string vSyncMode,
diff --git a/src/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs b/src/Ryujinx/Headless/Vulkan/VulkanWindow.cs
similarity index 98%
rename from src/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs
rename to src/Ryujinx/Headless/Vulkan/VulkanWindow.cs
index b88e0fe83..92caad34e 100644
--- a/src/Ryujinx.Headless.SDL2/Vulkan/VulkanWindow.cs
+++ b/src/Ryujinx/Headless/Vulkan/VulkanWindow.cs
@@ -6,7 +6,7 @@ using System;
using System.Runtime.InteropServices;
using static SDL2.SDL;
-namespace Ryujinx.Headless.SDL2.Vulkan
+namespace Ryujinx.Headless
{
class VulkanWindow : WindowBase
{
diff --git a/src/Ryujinx.Headless.SDL2/WindowBase.cs b/src/Ryujinx/Headless/WindowBase.cs
similarity index 99%
rename from src/Ryujinx.Headless.SDL2/WindowBase.cs
rename to src/Ryujinx/Headless/WindowBase.cs
index fbe7cb49c..1862c2757 100644
--- a/src/Ryujinx.Headless.SDL2/WindowBase.cs
+++ b/src/Ryujinx/Headless/WindowBase.cs
@@ -1,5 +1,6 @@
using Humanizer;
using LibHac.Tools.Fs;
+using Ryujinx.Ava;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Logging;
@@ -26,7 +27,7 @@ using AntiAliasing = Ryujinx.Common.Configuration.AntiAliasing;
using ScalingFilter = Ryujinx.Common.Configuration.ScalingFilter;
using Switch = Ryujinx.HLE.Switch;
-namespace Ryujinx.Headless.SDL2
+namespace Ryujinx.Headless
{
abstract partial class WindowBase : IHostUIHandler, IDisposable
{
@@ -318,7 +319,7 @@ namespace Ryujinx.Headless.SDL2
Device.VSyncMode.ToString(),
dockedMode,
Device.Configuration.AspectRatio.ToText(),
- $"Game: {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)",
+ $"{Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)",
$"FIFO: {Device.Statistics.GetFifoPercent():0.00} %",
$"GPU: {_gpuDriverName}"));
diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs
index 0f6d1bfae..35cdb6c0e 100644
--- a/src/Ryujinx/Program.cs
+++ b/src/Ryujinx/Program.cs
@@ -14,6 +14,7 @@ using Ryujinx.Common.GraphicsDriver;
using Ryujinx.Common.Logging;
using Ryujinx.Common.SystemInterop;
using Ryujinx.Graphics.Vulkan.MoltenVK;
+using Ryujinx.Headless;
using Ryujinx.SDL2.Common;
using Ryujinx.UI.App.Common;
using Ryujinx.UI.Common;
@@ -57,7 +58,7 @@ namespace Ryujinx.Ava
if (args[0] is "--no-gui" or "nogui")
{
- Headless.SDL2.Program.Main(args.Skip(1).ToArray());
+ HeadlessRyujinx.Initialize(args[1..]);
return 0;
}
@@ -228,7 +229,7 @@ namespace Ryujinx.Ava
UseHardwareAcceleration = CommandLineState.OverrideHardwareAcceleration.Value;
}
- private static void PrintSystemInfo()
+ internal static void PrintSystemInfo()
{
Logger.Notice.Print(LogClass.Application, $"{App.FullAppName} Version: {Version}");
SystemInfo.Gather().Print();
@@ -245,7 +246,7 @@ namespace Ryujinx.Ava
: $"Launch Mode: {AppDataManager.Mode}");
}
- private static void ProcessUnhandledException(object sender, Exception ex, bool isTerminating)
+ internal static void ProcessUnhandledException(object sender, Exception ex, bool isTerminating)
{
Logger.Log log = Logger.Error ?? Logger.Notice;
string message = $"Unhandled exception caught: {ex}";
@@ -260,7 +261,7 @@ namespace Ryujinx.Ava
Exit();
}
- public static void Exit()
+ internal static void Exit()
{
DiscordIntegrationModule.Exit();
diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj
index 74f4e479a..8412044c7 100644
--- a/src/Ryujinx/Ryujinx.csproj
+++ b/src/Ryujinx/Ryujinx.csproj
@@ -43,6 +43,7 @@
+
@@ -67,7 +68,6 @@
-
@@ -163,6 +163,7 @@
+