# Ryujinx
[](https://github.com/Ryubing/Ryujinx/actions/workflows/release.yml)
-[](https://github.com/Ryubing/Ryujinx/releases/latest)
+[](https://github.com/Ryubing/Ryujinx/releases/latest)
[](https://github.com/Ryubing/Ryujinx/actions/workflows/canary.yml)
[](https://github.com/Ryubing/Canary-Releases/releases/latest)
@@ -97,7 +97,7 @@ If you are planning to contribute or just want to learn more about this project
- **Input**
- We currently have support for keyboard, mouse, touch input, JoyCon input support, and nearly all controllers.
+ We currently have support for keyboard, mouse, touch input, Joy-Con input support, and nearly all controllers.
Motion controls are natively supported in most cases; for dual-JoyCon motion support, DS4Windows or BetterJoy are currently required.
In all scenarios, you can set up everything inside the input configuration menu.
diff --git a/docs/compatibility.csv b/docs/compatibility.csv
index a3c9aa619..7b3f814c5 100644
--- a/docs/compatibility.csv
+++ b/docs/compatibility.csv
@@ -631,6 +631,7 @@
010030D012FF6000,"Bus Driver Simulator",,playable,2022-10-17 13:55:27
0100A9101418C000,"BUSTAFELLOWS",nvdec,playable,2020-10-17 20:04:41
0100177005C8A000,"BUTCHER",,playable,2021-01-11 18:50:17
+01008c2019598000,"Bluey: The Videogame",,playable,2025-02-11 04:38:00
01000B900D8B0000,"Cadence of Hyrule: Crypt of the NecroDancer Featuring The Legend of Zelda",slow;nvdec,playable,2024-04-01 22:43:40
010065700EE06000,"Cadence of Hyrule: Crypt of the NecroDancer Featuring The Legend of Zelda Demo",demo;gpu;nvdec,ingame,2021-02-14 21:48:15
01005C00117A8000,"Café Enchanté",,playable,2020-11-13 14:54:25
@@ -1382,6 +1383,9 @@
0100763015C2E000,"Gunvolt Chronicles: Luminous Avenger iX 2",crash;Needs Update,nothing,2022-04-29 15:34:34
01002C8018554000,"Gurimugurimoa OnceMore Demo",,playable,2022-07-29 22:07:31
0100AC601DCA8000,"GYLT",crash,ingame,2024-03-18 20:16:51
+0100c3c012718000,"Grand Theft Auto: III – The Definitive Edition",gpu;UE4,ingame,2022-10-31 20:13:52
+0100182014022000,"Grand Theft Auto: Vice City – The Definitive Edition",gpu;UE4,ingame,2022-10-31 20:13:52
+010065a014024000,"Grand Theft Auto: San Andreas – The Definitive Edition",gpu;UE4,ingame,2022-10-31 20:13:52
0100822012D76000,"HAAK",gpu,ingame,2023-02-19 14:31:05
01007E100EFA8000,"Habroxia",,playable,2020-06-16 23:04:42
0100535012974000,"Hades",vulkan,playable,2022-10-05 10:45:21
@@ -2729,7 +2733,7 @@
0100C2500FC20000,"Splatoon™ 3",ldn-works;opengl-backend-bug;LAN;amd-vendor-bug,playable,2024-08-04 23:49:11
0100BA0018500000,"Splatoon™ 3: Splatfest World Premiere",gpu;online-broken;demo,ingame,2022-09-19 03:17:12
010062800D39C000,"SpongeBob SquarePants: Battle for Bikini Bottom - Rehydrated",online-broken;UE4;ldn-broken;vulkan-backend-bug,playable,2023-08-01 19:29:34
-01009FB0172F4000,"SpongeBob SquarePants: The Cosmic Shake",gpu;UE4,ingame,2023-08-01 19:29:53
+01009FB0172F4000,"SpongeBob SquarePants: The Cosmic Shake",gpu;UE4,ingame,2024-03-04 16:35:00
010097C01336A000,"Spooky Chase",,playable,2022-11-04 12:17:44
0100C6100D75E000,"Spooky Ghosts Dot Com",,playable,2021-06-15 15:16:11
0100DE9005170000,"Sports Party",nvdec,playable,2021-03-05 13:40:42
diff --git a/src/Ryujinx.Common/Configuration/DirtyHack.cs b/src/Ryujinx.Common/Configuration/DirtyHack.cs
index 3959c0a99..71ac88f56 100644
--- a/src/Ryujinx.Common/Configuration/DirtyHack.cs
+++ b/src/Ryujinx.Common/Configuration/DirtyHack.cs
@@ -9,7 +9,8 @@ namespace Ryujinx.Common.Configuration
public enum DirtyHack : byte
{
Xc2MenuSoftlockFix = 1,
- ShaderTranslationDelay = 2
+ // ShaderTranslationDelay = 2
+ NifmServiceDisableIsAnyInternetRequestAccepted = 3
}
public readonly struct EnabledDirtyHack(DirtyHack hack, int value)
diff --git a/src/Ryujinx.Common/ReleaseInformation.cs b/src/Ryujinx.Common/ReleaseInformation.cs
index cbf93013f..68db97465 100644
--- a/src/Ryujinx.Common/ReleaseInformation.cs
+++ b/src/Ryujinx.Common/ReleaseInformation.cs
@@ -37,9 +37,9 @@ namespace Ryujinx.Common
public static string GetChangelogUrl(Version currentVersion, Version newVersion) =>
IsCanaryBuild
? $"https://github.com/{ReleaseChannelOwner}/{ReleaseChannelSourceRepo}/compare/Canary-{currentVersion}...Canary-{newVersion}"
- : $"https://github.com/{ReleaseChannelOwner}/{ReleaseChannelSourceRepo}/releases/tag/{newVersion}";
+ : GetChangelogForVersion(newVersion);
public static string GetChangelogForVersion(Version version) =>
- $"https://github.com/{ReleaseChannelOwner}/{ReleaseChannelRepo}/releases/tag/{version}";
+ $"https://github.com/{ReleaseChannelOwner}/{ReleaseChannelRepo}/releases/{version}";
}
}
diff --git a/src/Ryujinx.Common/TitleIDs.cs b/src/Ryujinx.Common/TitleIDs.cs
index 82be1572f..76a8a7126 100644
--- a/src/Ryujinx.Common/TitleIDs.cs
+++ b/src/Ryujinx.Common/TitleIDs.cs
@@ -1,7 +1,4 @@
using Gommon;
-using Ryujinx.Common.Configuration;
-using Ryujinx.Common.Helper;
-using System;
using System.Linq;
namespace Ryujinx.Common
diff --git a/src/Ryujinx.Graphics.GAL/IRenderer.cs b/src/Ryujinx.Graphics.GAL/IRenderer.cs
index c2fdcbe4b..9d822e7c2 100644
--- a/src/Ryujinx.Graphics.GAL/IRenderer.cs
+++ b/src/Ryujinx.Graphics.GAL/IRenderer.cs
@@ -1,4 +1,6 @@
using Ryujinx.Common.Configuration;
+using Ryujinx.Common.Logging;
+using Ryujinx.Graphics.GAL.Multithreading;
using System;
using System.Threading;
@@ -10,6 +12,20 @@ namespace Ryujinx.Graphics.GAL
bool PreferThreading { get; }
+ public IRenderer TryMakeThreaded(BackendThreading backendThreading = BackendThreading.Auto)
+ {
+ if (backendThreading is BackendThreading.On ||
+ (backendThreading is BackendThreading.Auto && PreferThreading))
+ {
+ Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({backendThreading}): True");
+ return new ThreadedRenderer(this);
+ }
+
+ Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({backendThreading}): False");
+
+ return this;
+ }
+
IPipeline Pipeline { get; }
IWindow Window { get; }
diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs
index 40697d122..35fc783c2 100644
--- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnMitm/LdnMitmClient.cs
@@ -19,7 +19,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnMitm
private readonly LanDiscovery _lanDiscovery;
- public LdnMitmClient(HLEConfiguration config)
+ public LdnMitmClient(HleConfiguration config)
{
UnicastIPAddressInformation localIpInterface = NetworkHelpers.GetLocalInterface(config.MultiplayerLanInterfaceId).Item2;
diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs
index 712967180..c2bbcb471 100644
--- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/LdnMasterProxyClient.cs
@@ -51,13 +51,13 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu
private string _passphrase;
private byte[] _gameVersion = new byte[0x10];
- private readonly HLEConfiguration _config;
+ private readonly HleConfiguration _config;
public event EventHandler NetworkChange;
public ProxyConfig Config { get; private set; }
- public LdnMasterProxyClient(string address, int port, HLEConfiguration config) : base(address, port)
+ public LdnMasterProxyClient(string address, int port, HleConfiguration config) : base(address, port)
{
if (ProxyHelpers.SupportsNoDelay())
{
diff --git a/src/Ryujinx.HLE/HOS/Services/Nifm/IStaticService.cs b/src/Ryujinx.HLE/HOS/Services/Nifm/IStaticService.cs
index 96e71cd07..d669caba1 100644
--- a/src/Ryujinx.HLE/HOS/Services/Nifm/IStaticService.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Nifm/IStaticService.cs
@@ -13,7 +13,7 @@ namespace Ryujinx.HLE.HOS.Services.Nifm
// CreateGeneralServiceOld() -> object
public ResultCode CreateGeneralServiceOld(ServiceCtx context)
{
- MakeObject(context, new IGeneralService());
+ MakeObject(context, new IGeneralService(context));
return ResultCode.Success;
}
@@ -22,7 +22,7 @@ namespace Ryujinx.HLE.HOS.Services.Nifm
// CreateGeneralService(u64, pid) -> object
public ResultCode CreateGeneralService(ServiceCtx context)
{
- MakeObject(context, new IGeneralService());
+ MakeObject(context, new IGeneralService(context));
return ResultCode.Success;
}
diff --git a/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs b/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs
index a5a822db3..dd4efce6e 100644
--- a/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IGeneralService.cs
@@ -1,4 +1,5 @@
using Ryujinx.Common;
+using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
using Ryujinx.HLE.HOS.Services.Nifm.StaticService.GeneralService;
@@ -17,12 +18,12 @@ namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService
private UnicastIPAddressInformation _targetAddressInfoCache = null;
private string _cacheChosenInterface = null;
- public IGeneralService()
+ public IGeneralService(ServiceCtx context)
{
_generalServiceDetail = new GeneralServiceDetail
{
ClientId = GeneralServiceManager.Count,
- IsAnyInternetRequestAccepted = true, // NOTE: Why not accept any internet request?
+ IsAnyInternetRequestAccepted = !context.Device.DirtyHacks.IsEnabled(DirtyHack.NifmServiceDisableIsAnyInternetRequestAccepted), // NOTE: Why not accept any internet request?
};
NetworkChange.NetworkAddressChanged += LocalInterfaceCacheHandler;
diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs
index b442cf802..660803714 100644
--- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs
+++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs
@@ -1,6 +1,5 @@
using Ryujinx.Common.Logging;
using Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy;
-using Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types;
using System;
using System.Collections.Generic;
using System.Linq;
diff --git a/src/Ryujinx.HLE/HLEConfiguration.cs b/src/Ryujinx.HLE/HleConfiguration.cs
similarity index 88%
rename from src/Ryujinx.HLE/HLEConfiguration.cs
rename to src/Ryujinx.HLE/HleConfiguration.cs
index 0b7ae3974..97835033e 100644
--- a/src/Ryujinx.HLE/HLEConfiguration.cs
+++ b/src/Ryujinx.HLE/HleConfiguration.cs
@@ -15,55 +15,55 @@ namespace Ryujinx.HLE
///
/// HLE configuration.
///
- public class HLEConfiguration
+ public class HleConfiguration
{
///
/// The virtual file system used by the FS service.
///
/// This cannot be changed after instantiation.
- internal readonly VirtualFileSystem VirtualFileSystem;
+ internal VirtualFileSystem VirtualFileSystem { get; private set; }
///
/// The manager for handling a LibHac Horizon instance.
///
/// This cannot be changed after instantiation.
- internal readonly LibHacHorizonManager LibHacHorizonManager;
+ internal LibHacHorizonManager LibHacHorizonManager { get; private set; }
///
/// The account manager used by the account service.
///
/// This cannot be changed after instantiation.
- internal readonly AccountManager AccountManager;
+ internal AccountManager AccountManager { get; private set; }
///
/// The content manager used by the NCM service.
///
/// This cannot be changed after instantiation.
- internal readonly ContentManager ContentManager;
+ internal ContentManager ContentManager { get; private set; }
///
/// The persistent information between run for multi-application capabilities.
///
/// This cannot be changed after instantiation.
- public readonly UserChannelPersistence UserChannelPersistence;
+ public UserChannelPersistence UserChannelPersistence { get; private set; }
///
/// The GPU renderer to use for all GPU operations.
///
/// This cannot be changed after instantiation.
- internal readonly IRenderer GpuRenderer;
+ internal IRenderer GpuRenderer { get; private set; }
///
/// The audio device driver to use for all audio operations.
///
/// This cannot be changed after instantiation.
- internal readonly IHardwareDeviceDriver AudioDeviceDriver;
+ internal IHardwareDeviceDriver AudioDeviceDriver { get; private set; }
///
/// The handler for various UI related operations needed outside of HLE.
///
/// This cannot be changed after instantiation.
- internal readonly IHostUIHandler HostUIHandler;
+ internal IHostUIHandler HostUIHandler { get; private set; }
///
/// Control the memory configuration used by the emulation context.
@@ -195,15 +195,7 @@ namespace Ryujinx.HLE
/// This cannot be changed after instantiation.
public EnabledDirtyHack[] Hacks { internal get; set; }
- public HLEConfiguration(VirtualFileSystem virtualFileSystem,
- LibHacHorizonManager libHacHorizonManager,
- ContentManager contentManager,
- AccountManager accountManager,
- UserChannelPersistence userChannelPersistence,
- IRenderer gpuRenderer,
- IHardwareDeviceDriver audioDeviceDriver,
- MemoryConfiguration memoryConfiguration,
- IHostUIHandler hostUIHandler,
+ public HleConfiguration(MemoryConfiguration memoryConfiguration,
SystemLanguage systemLanguage,
RegionCode region,
VSyncMode vSyncMode,
@@ -227,15 +219,7 @@ namespace Ryujinx.HLE
int customVSyncInterval,
EnabledDirtyHack[] dirtyHacks = null)
{
- VirtualFileSystem = virtualFileSystem;
- LibHacHorizonManager = libHacHorizonManager;
- AccountManager = accountManager;
- ContentManager = contentManager;
- UserChannelPersistence = userChannelPersistence;
- GpuRenderer = gpuRenderer;
- AudioDeviceDriver = audioDeviceDriver;
MemoryConfiguration = memoryConfiguration;
- HostUIHandler = hostUIHandler;
SystemLanguage = systemLanguage;
Region = region;
VSyncMode = vSyncMode;
@@ -259,5 +243,30 @@ namespace Ryujinx.HLE
MultiplayerLdnServer = multiplayerLdnServer;
Hacks = dirtyHacks ?? [];
}
+
+ ///
+ /// Set the pre-configured services to use for this instance.
+ ///
+ public HleConfiguration Configure(
+ VirtualFileSystem virtualFileSystem,
+ LibHacHorizonManager libHacHorizonManager,
+ ContentManager contentManager,
+ AccountManager accountManager,
+ UserChannelPersistence userChannelPersistence,
+ IRenderer gpuRenderer,
+ IHardwareDeviceDriver audioDeviceDriver,
+ IHostUIHandler hostUIHandler
+ )
+ {
+ VirtualFileSystem = virtualFileSystem;
+ LibHacHorizonManager = libHacHorizonManager;
+ AccountManager = accountManager;
+ ContentManager = contentManager;
+ UserChannelPersistence = userChannelPersistence;
+ GpuRenderer = gpuRenderer;
+ AudioDeviceDriver = audioDeviceDriver;
+ HostUIHandler = hostUIHandler;
+ return this;
+ }
}
}
diff --git a/src/Ryujinx.HLE/Switch.cs b/src/Ryujinx.HLE/Switch.cs
index 86b04061e..df5b48103 100644
--- a/src/Ryujinx.HLE/Switch.cs
+++ b/src/Ryujinx.HLE/Switch.cs
@@ -20,7 +20,7 @@ namespace Ryujinx.HLE
{
public static Switch Shared { get; private set; }
- public HLEConfiguration Configuration { get; }
+ public HleConfiguration Configuration { get; }
public IHardwareDeviceDriver AudioDeviceDriver { get; }
public MemoryBlock Memory { get; }
public GpuContext Gpu { get; }
@@ -44,7 +44,7 @@ namespace Ryujinx.HLE
public DirtyHacks DirtyHacks { get; }
- public Switch(HLEConfiguration configuration)
+ public Switch(HleConfiguration configuration)
{
ArgumentNullException.ThrowIfNull(configuration.GpuRenderer);
ArgumentNullException.ThrowIfNull(configuration.AudioDeviceDriver);
@@ -94,16 +94,20 @@ namespace Ryujinx.HLE
Gpu.GPFifo.DispatchCalls();
}
- public void IncrementCustomVSyncInterval()
+ public int IncrementCustomVSyncInterval()
{
CustomVSyncInterval += 1;
UpdateVSyncInterval();
+
+ return CustomVSyncInterval;
}
- public void DecrementCustomVSyncInterval()
+ public int DecrementCustomVSyncInterval()
{
CustomVSyncInterval -= 1;
UpdateVSyncInterval();
+
+ return CustomVSyncInterval;
}
public void UpdateVSyncInterval()
diff --git a/src/Ryujinx/Assets/Styles/Styles.xaml b/src/Ryujinx/Assets/Styles/Styles.xaml
index eb40e853c..112815fb5 100644
--- a/src/Ryujinx/Assets/Styles/Styles.xaml
+++ b/src/Ryujinx/Assets/Styles/Styles.xaml
@@ -440,7 +440,7 @@
132628
- 900
+ 700756
diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json
index 7c6e0828b..d3c901424 100644
--- a/src/Ryujinx/Assets/locales.json
+++ b/src/Ryujinx/Assets/locales.json
@@ -2763,12 +2763,12 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
- "ru_RU": "",
+ "ru_RU": "Создать пользовательскую конфигурацию",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
- "uk_UA": "",
- "zh_CN": "",
+ "uk_UA": "Створити користувацьку конфігурацію",
+ "zh_CN": "创建自定义设置",
"zh_TW": ""
}
},
@@ -2788,12 +2788,12 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
- "ru_RU": "",
+ "ru_RU": "Изменить пользовательскую конфигурацию",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
- "uk_UA": "",
- "zh_CN": "",
+ "uk_UA": "Редагувати користувацьку конфігурацію",
+ "zh_CN": "编辑自定义设置",
"zh_TW": ""
}
},
@@ -2842,7 +2842,7 @@
"sv_SE": "Skapar en oberoende konfiguration för det aktuella spelet",
"th_TH": "สร้างการกำหนดค่าที่เป็นอิสระสำหรับเกมปัจจุบัน",
"tr_TR": "Mevcut oyun için bağımsız bir yapılandırma oluşturur",
- "uk_UA": "Створює незалежну конфігурацію для поточної гри",
+ "uk_UA": "Створюйте незалежну конфігурацію для поточної гри",
"zh_CN": "为当前游戏创建独立的配置",
"zh_TW": "為當前遊戲創建獨立的配置"
}
@@ -2863,12 +2863,12 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
- "ru_RU": "",
+ "ru_RU": "Отредактировать существующую независимую конфигурацию для выбранной игры.",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
- "uk_UA": "",
- "zh_CN": "",
+ "uk_UA": "Відредагувати наявну індивідуальну конфігурацію для цієї гри.",
+ "zh_CN": "编辑选定游戏的现存独立配置",
"zh_TW": ""
}
},
@@ -3442,7 +3442,7 @@
"sv_SE": "Användargränssnitt",
"th_TH": "หน้าจอผู้ใช้",
"tr_TR": "Kullancı Arayüzü",
- "uk_UA": "Інтерфейс користувача",
+ "uk_UA": "Інтерфейс",
"zh_CN": "用户界面",
"zh_TW": "使用者介面"
}
@@ -3817,34 +3817,59 @@
"sv_SE": "Inaktivera inmatning när fokus tappas",
"th_TH": "",
"tr_TR": "",
- "uk_UA": "",
+ "uk_UA": "Вимкнути введення, якщо вікно неактивне",
"zh_CN": "在后台时禁用输入",
"zh_TW": ""
}
},
{
- "ID": "SettingsTabGeneralShowTitleBar",
+ "ID": "SettingsTabGeneralShowOldUI",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
- "en_US": "Show Title Bar (Requires restart)",
- "es_ES": "Mostrar Barra de Título (Requiere reinicio)",
- "fr_FR": "Afficher Barre de Titre (Nécessite redémarrage)",
+ "en_US": "Show Original UI Style (Requires restart)",
+ "es_ES": "",
+ "fr_FR": "",
"he_IL": "",
- "it_IT": "Mostra barra del titolo (Richiede il riavvio)",
+ "it_IT": "",
"ja_JP": "",
- "ko_KR": "제목 표시줄 표시(다시 시작해야 함)",
- "no_NO": "Vis tittellinje (krever omstart)",
+ "ko_KR": "",
+ "no_NO": "Vis original UI-stil (krever omstart)",
"pl_PL": "",
- "pt_BR": "Mostrar Barra de Título (Requer reinicialização)",
- "ru_RU": "Показать строку заголовка (требуется перезапуск)",
- "sv_SE": "Visa titelrad (kräver omstart)",
+ "pt_BR": "",
+ "ru_RU": "",
+ "sv_SE": "",
"th_TH": "",
"tr_TR": "",
- "uk_UA": "Показувати рядок заголовка (Потрібен перезапуск)",
- "zh_CN": "显示标题栏 (需要重启)",
- "zh_TW": "顯示「標題列」 (需要重新開啟Ryujinx)"
+ "uk_UA": "Показати оригінальний UI (Потрібен перезапуск)",
+ "zh_CN": "显示原始 UI 样式 (需要重启)",
+ "zh_TW": ""
+ }
+ },
+ {
+ "ID": "SettingsTabGeneralShowOldUIToolTip",
+ "Translations": {
+ "ar_SA": "",
+ "de_DE": "",
+ "el_GR": "",
+ "en_US": "Show the older Avalonia Ryujinx UI reminiscent of Ryujinx 1.1.1403. This is enabled by default on platforms that are not Windows.\nThe classic-style title bar is back and major window layout reworkings are reversed; such as the settings navigation placement above this tooltip.",
+ "es_ES": "",
+ "fr_FR": "",
+ "he_IL": "",
+ "it_IT": "",
+ "ja_JP": "",
+ "ko_KR": "",
+ "no_NO": "Vis det eldre Avalonia Ryujinx-grensesnittet som minner om Ryujinx 1.1.1403. Dette er aktivert som standard på plattformer som ikke er Windows.\nTittellinjen i klassisk stil er tilbake, og store omarbeidinger av vindusoppsettet er reversert, for eksempel plasseringen av innstillingsnavigasjonen over dette verktøytipset.",
+ "pl_PL": "",
+ "pt_BR": "",
+ "ru_RU": "",
+ "sv_SE": "",
+ "th_TH": "",
+ "tr_TR": "",
+ "uk_UA": "Показати старий інтерфейс Avalonia Ryujinx, який був у Ryujinx 1.1.1403. Ця опція активна за замовчуванням на всіх інших, окрім Windows платформах.\nПовернеться класична панель заголовка, а всі суттєві зміни інтерфейсу будуть скасовані, зокрема горизонтальне розміщення навігації в налаштуваннях.",
+ "zh_CN": "显示旧的类似 Ryujinx 1.1.1403 的 Avalonia Ryujinx UI。在非 Windows 平台上默认启用此选项。\n经典样式的标题栏已回归并且恢复了对窗口布局的重大重构;例如在工具提示上方放置设置导航。",
+ "zh_TW": ""
}
},
{
@@ -4842,7 +4867,7 @@
"sv_SE": "Matcha systemtid",
"th_TH": "",
"tr_TR": "",
- "uk_UA": "",
+ "uk_UA": "Синхронізувати з системним годинником",
"zh_CN": "与系统时间同步",
"zh_TW": ""
}
@@ -5013,7 +5038,7 @@
"no_NO": "Lyd Inn/Ut",
"pl_PL": "",
"pt_BR": "",
- "ru_RU": "",
+ "ru_RU": "Выход/Вход звука",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -6563,7 +6588,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
- "ru_RU": "",
+ "ru_RU": "Ок",
"sv_SE": "Ok",
"th_TH": "ตกลง",
"tr_TR": "Tamam",
@@ -7013,7 +7038,7 @@
"no_NO": "",
"pl_PL": "Pro Kontroler",
"pt_BR": "",
- "ru_RU": "",
+ "ru_RU": "Pro контроллер",
"sv_SE": "",
"th_TH": "โปรคอนโทรลเลอร์",
"tr_TR": "Profesyonel Kumanda",
@@ -8442,7 +8467,7 @@
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
- "uk_UA": "",
+ "uk_UA": "LED-підсвітка",
"zh_CN": "",
"zh_TW": ""
}
@@ -8467,7 +8492,7 @@
"sv_SE": "Inaktivera",
"th_TH": "",
"tr_TR": "",
- "uk_UA": "",
+ "uk_UA": "Вимкнути",
"zh_CN": "关闭",
"zh_TW": ""
}
@@ -8492,7 +8517,7 @@
"sv_SE": "Regnbåge",
"th_TH": "",
"tr_TR": "",
- "uk_UA": "",
+ "uk_UA": "Веселка",
"zh_CN": "彩虹",
"zh_TW": ""
}
@@ -8517,7 +8542,7 @@
"sv_SE": "Regnbågshastighet",
"th_TH": "",
"tr_TR": "",
- "uk_UA": "",
+ "uk_UA": "Швидкість зміни кольорів",
"zh_CN": "彩虹滚动速度",
"zh_TW": ""
}
@@ -9142,7 +9167,7 @@
"sv_SE": "",
"th_TH": "",
"tr_TR": "Esc",
- "uk_UA": "",
+ "uk_UA": "Esc",
"zh_CN": "Esc",
"zh_TW": "Esc 鍵"
}
@@ -10842,7 +10867,7 @@
"sv_SE": "Diverse",
"th_TH": "",
"tr_TR": "Diğer",
- "uk_UA": "",
+ "uk_UA": "Інше",
"zh_CN": "截图键",
"zh_TW": "其他按鍵"
}
@@ -17667,7 +17692,7 @@
"sv_SE": "Ändra ljudvolym",
"th_TH": "ปรับระดับเสียง",
"tr_TR": "Ses seviyesini değiştirir",
- "uk_UA": "Змінити гучність звуку",
+ "uk_UA": "Регулювання гучності",
"zh_CN": "调节音量",
"zh_TW": "調節音量"
}
@@ -19567,7 +19592,7 @@
"sv_SE": "Alla tangentbord",
"th_TH": "คีย์บอร์ดทั้งหมด",
"tr_TR": "Tüm Klavyeler",
- "uk_UA": "Всі клавіатури",
+ "uk_UA": "Усі клавіатури",
"zh_CN": "所有键盘",
"zh_TW": "所有鍵盤"
}
@@ -19717,7 +19742,7 @@
"sv_SE": "Snabbtangenter för tangentbord",
"th_TH": "ปุ่มลัดของคีย์บอร์ด",
"tr_TR": "Klavye Kısayolları",
- "uk_UA": "Гарячі клавіші клавіатури",
+ "uk_UA": "Гарячі клавіші",
"zh_CN": "快捷键",
"zh_TW": "鍵盤快速鍵"
}
@@ -20013,7 +20038,7 @@
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
- "ru_RU": "",
+ "ru_RU": "Амибо",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
@@ -22442,7 +22467,7 @@
"sv_SE": "Tillämpar anti-aliasing på spelrenderaren.\n\nFXAA kommer att sudda det mesta av bilden, medan SMAA kommer att försöka hitta taggiga kanter och släta ut dem.\n\nRekommenderas inte att använda tillsammans med skalfiltret FSR.\n\nDet här alternativet kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. Du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nLämna som INGEN om du är osäker.",
"th_TH": "ใช้การลดรอยหยักกับการเรนเดอร์เกม\n\nFXAA จะเบลอภาพส่วนใหญ่ ในขณะที่ SMAA จะพยายามค้นหารอยหยักและปรับให้เรียบ\n\nไม่แนะนำให้ใช้ร่วมกับตัวกรองสเกล FSR\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม\n\nปล่อยไว้ที่ NONE หากไม่แน่ใจ",
"tr_TR": "",
- "uk_UA": "Застосовує згладження до рендера гри.\n\nFXAA розмиє більшість зображення, а SMAA спробує знайти нерівні краї та згладити їх.\n\nНе рекомендується використовувати разом з фільтром масштабування FSR.\n\nЦю опцію можна міняти коли гра запущена кліком на \"Застосувати; ви можете відсунути вікно налаштувань і поекспериментувати з видом гри.\n\nЗалиште на \"Немає\", якщо не впевнені.",
+ "uk_UA": "Застосовує згладження до рендера гри.\n\nFXAA розмиє більшість зображення, а SMAA спробує знайти нерівні краї та згладити їх.\n\nНе рекомендується використовувати разом з фільтром масштабування FSR.\n\nЦю опцію можна міняти коли гра запущена кліком на \"Застосувати; ви можете відсунути вікно налаштувань і поекспериментувати з видом гри.\n\nЗалиште \"Немає\", якщо не впевнені.",
"zh_CN": "抗锯齿是一种图形处理技术,用于减少图像边缘的锯齿状现象,使图像更加平滑。\n\nFXAA(快速近似抗锯齿)是一种性能开销相对较小的抗锯齿方法,但可能会使得整体图像看起来有些模糊。\n\nSMAA(增强型子像素抗锯齿)则更加精细,它会尝试找到锯齿边缘并平滑它们,相比 FXAA 有更好的图像质量,但性能开销可能会稍大一些。\n\n如果开启了 FSR(FidelityFX Super Resolution,超级分辨率锐画技术)来提高性能或图像质量,不建议再启用抗锯齿,因为它们会产生不必要的图形处理开销,或者相互之间效果不协调。\n\n在游戏运行时,通过点击下面的“应用”按钮可以使设置生效;你可以将设置窗口移开,并试验找到您喜欢的游戏画面效果。\n\n如果不确定,请保持为“无”。",
"zh_TW": "對遊戲繪製進行反鋸齒處理。\n\nFXAA 會模糊大部分圖像,而 SMAA 則會嘗試找出鋸齒邊緣並將其平滑化。\n\n不建議與 FSR 縮放濾鏡一起使用。\n\n此選項可在遊戲執行時透過點選下方的「套用」進行變更;您只需將設定視窗移到一旁,然後進行試驗,直到找到您喜歡的遊戲效果。\n\n如果不確定,請選擇無狀態。"
}
@@ -22517,7 +22542,7 @@
"sv_SE": "Välj det skalfilter som ska tillämpas vid användning av upplösningsskala.\n\nBilinjär fungerar bra för 3D-spel och är ett säkert standardalternativ.\n\nNärmast rekommenderas för pixel art-spel.\n\nFSR 1.0 är bara ett skarpningsfilter, rekommenderas inte för FXAA eller SMAA.\n\nOmrådesskalning rekommenderas vid nedskalning av upplösning som är större än utdatafönstret. Det kan användas för att uppnå en supersamplad anti-alias-effekt vid nedskalning med mer än 2x.\n\nDetta alternativ kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nLämna som BILINJÄR om du är osäker.",
"th_TH": "เลือกตัวกรองสเกลที่จะใช้เมื่อใช้สเกลความละเอียด\n\nBilinear ทำงานได้ดีกับเกม 3D และเป็นตัวเลือกเริ่มต้นที่ปลอดภัย\n\nแนะนำให้ใช้เกมภาพพิกเซลที่ใกล้เคียงที่สุด\n\nFSR 1.0 เป็นเพียงตัวกรองความคมชัด ไม่แนะนำให้ใช้กับ FXAA หรือ SMAA\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม",
"tr_TR": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.",
- "uk_UA": "Виберіть фільтр масштабування, що використається при збільшенні роздільної здатності.\n\n\"Білінійний\" добре виглядає в 3D іграх, і хороше налаштування за умовчуванням.\n\n\"Найближчий\" рекомендується для ігор з піксель-артом.\n\n\"FSR 1.0\" - фільтр різкості. Не варто використовувати разом з FXAA або SMAA.\n\nЦю опцію можна змінювати під час гри кліком на \"Застосувати\" нижче; ви можете відсунути вікно налаштувань і поекспериментувати з тим, як відображатиметься гра.\n\nЗалиште на \"Білінійний\", якщо не впевнені.",
+ "uk_UA": "Виберіть фільтр масштабування, що використається при збільшенні роздільної здатності.\n\n\"Білінійний\" добре виглядає в 3D іграх, і хороше налаштування за умовчуванням.\n\n\"Найближчий\" рекомендується для ігор з піксель-артом.\n\n\"FSR 1.0\" - фільтр різкості. Не варто використовувати разом з FXAA або SMAA.\n\nЦю опцію можна змінювати під час гри кліком на \"Застосувати\" нижче; ви можете відсунути вікно налаштувань і поекспериментувати з тим, як відображатиметься гра.\n\nЗалиште \"Білінійний\", якщо не впевнені.",
"zh_CN": "选择在分辨率缩放时将使用的缩放过滤器。\n\nBilinear(双线性过滤)对于3D游戏效果较好,是一个安全的默认选项。\n\nNearest(最近邻过滤)推荐用于像素艺术游戏。\n\nFSR(超级分辨率锐画)只是一个锐化过滤器,不推荐与 FXAA 或 SMAA 抗锯齿一起使用。\n\nArea(局部过滤),当渲染分辨率大于窗口实际分辨率,推荐该选项。该选项在渲染比例大于2.0的情况下,可以实现超采样的效果。\n\n在游戏运行时,通过点击下面的“应用”按钮可以使设置生效;你可以将设置窗口移开,并试验找到您喜欢的游戏画面效果。\n\n如果不确定,请保持为“Bilinear(双线性过滤)”。",
"zh_TW": "選擇使用解析度縮放時套用的縮放過濾器。\n\n雙線性 (Bilinear) 濾鏡適用於 3D 遊戲,是一個安全的預設選項。\n\n建議像素美術遊戲使用近鄰性 (Nearest) 濾鏡。\n\nFSR 1.0 只是一個銳化濾鏡,不建議與 FXAA 或 SMAA 一起使用。\n\n此選項可在遊戲執行時透過點選下方的「套用」進行變更;您只需將設定視窗移到一旁,然後進行試驗,直到找到您喜歡的遊戲效果。\n\n如果不確定,請保持雙線性 (Bilinear) 狀態。"
}
@@ -23822,6 +23847,31 @@
"zh_TW": "上次更新時間: {0}"
}
},
+ {
+ "ID": "CompatibilityListTitle",
+ "Translations": {
+ "ar_SA": "",
+ "de_DE": "",
+ "el_GR": "",
+ "en_US": "Compatibility List - {0} entries",
+ "es_ES": "",
+ "fr_FR": "",
+ "he_IL": "",
+ "it_IT": "",
+ "ja_JP": "",
+ "ko_KR": "",
+ "no_NO": "",
+ "pl_PL": "",
+ "pt_BR": "",
+ "ru_RU": "",
+ "sv_SE": "",
+ "th_TH": "",
+ "tr_TR": "",
+ "uk_UA": "Список сумісності — {0} ігор",
+ "zh_CN": "兼容性列表 - {0} 条",
+ "zh_TW": ""
+ }
+ },
{
"ID": "CompatibilityListWarning",
"Translations": {
@@ -23872,6 +23922,31 @@
"zh_TW": "搜尋相容性列表紀錄..."
}
},
+ {
+ "ID": "CompatibilityListSearchBoxWatermarkWithCount",
+ "Translations": {
+ "ar_SA": "",
+ "de_DE": "",
+ "el_GR": "",
+ "en_US": "Search {0} compatibility entries...",
+ "es_ES": "",
+ "fr_FR": "",
+ "he_IL": "",
+ "it_IT": "",
+ "ja_JP": "",
+ "ko_KR": "",
+ "no_NO": "Søk i {0} kompatibilitetsoppføringer...",
+ "pl_PL": "",
+ "pt_BR": "",
+ "ru_RU": "",
+ "sv_SE": "",
+ "th_TH": "",
+ "tr_TR": "",
+ "uk_UA": "Шукати серед {0} перевірених ігор...",
+ "zh_CN": "搜索 {0} 兼容性条目...",
+ "zh_TW": ""
+ }
+ },
{
"ID": "CompatibilityListOpen",
"Translations": {
@@ -23942,7 +24017,7 @@
"sv_SE": "Spelbart",
"th_TH": "",
"tr_TR": "",
- "uk_UA": "Оптимально",
+ "uk_UA": "Справна",
"zh_CN": "可游玩",
"zh_TW": "可暢順遊玩"
}
@@ -24192,8 +24267,8 @@
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
- "uk_UA": "",
- "zh_CN": "",
+ "uk_UA": "Власна конфігурація",
+ "zh_CN": "自定义配置",
"zh_TW": ""
}
},
@@ -24217,8 +24292,8 @@
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
- "uk_UA": "",
- "zh_CN": "",
+ "uk_UA": "(Глобальні)",
+ "zh_CN": "(全局)",
"zh_TW": ""
}
},
diff --git a/src/Ryujinx/Common/ApplicationHelper.cs b/src/Ryujinx/Common/ApplicationHelper.cs
index f4f76d0d3..0b81e8cff 100644
--- a/src/Ryujinx/Common/ApplicationHelper.cs
+++ b/src/Ryujinx/Common/ApplicationHelper.cs
@@ -13,10 +13,10 @@ using LibHac.Tools.Fs;
using LibHac.Tools.FsSystem;
using LibHac.Tools.FsSystem.NcaUtils;
using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.UI.Controls;
+using Ryujinx.Ava.UI.Windows;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.Utilities;
-using Ryujinx.Ava.Utilities.Configuration;
+using Ryujinx.Ava.Systems.Configuration;
using Ryujinx.Common.Helper;
using Ryujinx.Common.Logging;
using Ryujinx.HLE.FileSystem;
@@ -216,11 +216,7 @@ namespace Ryujinx.Ava.Common
return;
}
- IntegrityCheckLevel checkLevel = ConfigurationState.Instance.System.EnableFsIntegrityChecks
- ? IntegrityCheckLevel.ErrorOnInvalid
- : IntegrityCheckLevel.None;
-
- (Nca updatePatchNca, _) = mainNca.GetUpdateData(_virtualFileSystem, checkLevel, programIndex, out _);
+ (Nca updatePatchNca, _) = mainNca.GetUpdateData(_virtualFileSystem, ConfigurationState.Instance.System.IntegrityCheckLevel, programIndex, out _);
if (updatePatchNca is not null)
{
patchNca = updatePatchNca;
diff --git a/src/Ryujinx/Common/LocaleManager.cs b/src/Ryujinx/Common/LocaleManager.cs
index f60cff49b..d116fe709 100644
--- a/src/Ryujinx/Common/LocaleManager.cs
+++ b/src/Ryujinx/Common/LocaleManager.cs
@@ -1,6 +1,7 @@
using Gommon;
+using Ryujinx.Ava.Systems;
using Ryujinx.Ava.UI.ViewModels;
-using Ryujinx.Ava.Utilities.Configuration;
+using Ryujinx.Ava.Systems.Configuration;
using Ryujinx.Common;
using Ryujinx.Common.Utilities;
using System;
@@ -25,7 +26,21 @@ namespace Ryujinx.Ava.Common.Locale
public LocaleManager()
{
_localeStrings = new Dictionary();
- _dynamicValues = new ConcurrentDictionary();
+ _dynamicValues = new ConcurrentDictionary(new Dictionary
+ {
+ { LocaleKeys.DialogConfirmationTitle, [RyujinxApp.FullAppName] },
+ { LocaleKeys.DialogUpdaterTitle, [RyujinxApp.FullAppName] },
+ { LocaleKeys.DialogErrorTitle, [RyujinxApp.FullAppName] },
+ { LocaleKeys.DialogWarningTitle, [RyujinxApp.FullAppName] },
+ { LocaleKeys.DialogExitTitle, [RyujinxApp.FullAppName] },
+ { LocaleKeys.DialogStopEmulationTitle, [RyujinxApp.FullAppName] },
+ { LocaleKeys.RyujinxInfo, [RyujinxApp.FullAppName] },
+ { LocaleKeys.RyujinxConfirm, [RyujinxApp.FullAppName] },
+ { LocaleKeys.RyujinxUpdater, [RyujinxApp.FullAppName] },
+ { LocaleKeys.RyujinxRebooter, [RyujinxApp.FullAppName] },
+ { LocaleKeys.CompatibilityListSearchBoxWatermarkWithCount, [CompatibilityDatabase.Entries.Length] },
+ { LocaleKeys.CompatibilityListTitle, [CompatibilityDatabase.Entries.Length] }
+ });
Load();
}
@@ -44,17 +59,6 @@ namespace Ryujinx.Ava.Common.Locale
ConfigurationState.Instance.ToFileFormat().SaveConfig(Program.ConfigurationPath);
}
-
- SetDynamicValues(LocaleKeys.DialogConfirmationTitle, RyujinxApp.FullAppName);
- SetDynamicValues(LocaleKeys.DialogUpdaterTitle, RyujinxApp.FullAppName);
- SetDynamicValues(LocaleKeys.DialogErrorTitle, RyujinxApp.FullAppName);
- SetDynamicValues(LocaleKeys.DialogWarningTitle, RyujinxApp.FullAppName);
- SetDynamicValues(LocaleKeys.DialogExitTitle, RyujinxApp.FullAppName);
- SetDynamicValues(LocaleKeys.DialogStopEmulationTitle, RyujinxApp.FullAppName);
- SetDynamicValues(LocaleKeys.RyujinxInfo, RyujinxApp.FullAppName);
- SetDynamicValues(LocaleKeys.RyujinxConfirm, RyujinxApp.FullAppName);
- SetDynamicValues(LocaleKeys.RyujinxUpdater, RyujinxApp.FullAppName);
- SetDynamicValues(LocaleKeys.RyujinxRebooter, RyujinxApp.FullAppName);
}
public string this[LocaleKeys key]
diff --git a/src/Ryujinx/Common/Markup/MarkupExtensions.cs b/src/Ryujinx/Common/Markup/MarkupExtensions.cs
index 9e8ff00ef..2c8290847 100644
--- a/src/Ryujinx/Common/Markup/MarkupExtensions.cs
+++ b/src/Ryujinx/Common/Markup/MarkupExtensions.cs
@@ -24,4 +24,17 @@ namespace Ryujinx.Ava.Common.Markup
protected override void ConfigureBindingExtension(CompiledBindingExtension bindingExtension)
=> bindingExtension.Source = LocaleManager.Instance;
}
+
+ internal class WindowTitleExtension(LocaleKeys key, bool includeVersion) : BasicMarkupExtension
+ {
+ public WindowTitleExtension(LocaleKeys key) : this(key, true)
+ {
+ }
+
+ public override string Name => "WindowTitleTranslation";
+ protected override string Value => RyujinxApp.FormatTitle(key, includeVersion);
+
+ protected override void ConfigureBindingExtension(CompiledBindingExtension bindingExtension)
+ => bindingExtension.Source = LocaleManager.Instance;
+ }
}
diff --git a/src/Ryujinx/Common/Models/XCITrimmerFileModel.cs b/src/Ryujinx/Common/Models/XCITrimmerFileModel.cs
index da59a5d52..cddc5de22 100644
--- a/src/Ryujinx/Common/Models/XCITrimmerFileModel.cs
+++ b/src/Ryujinx/Common/Models/XCITrimmerFileModel.cs
@@ -1,4 +1,4 @@
-using Ryujinx.Ava.Utilities.AppLibrary;
+using Ryujinx.Ava.Systems.AppLibrary;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
diff --git a/src/Ryujinx/Common/XCITrimmerLog.cs b/src/Ryujinx/Common/XCITrimmerLog.cs
index b661d918d..751831a66 100644
--- a/src/Ryujinx/Common/XCITrimmerLog.cs
+++ b/src/Ryujinx/Common/XCITrimmerLog.cs
@@ -26,9 +26,9 @@ namespace Ryujinx.Ava.Common
internal class TrimmerWindow : Ryujinx.Common.Logging.XCIFileTrimmerLog
{
- private readonly XCITrimmerViewModel _viewModel;
+ private readonly XciTrimmerViewModel _viewModel;
- public TrimmerWindow(XCITrimmerViewModel viewModel)
+ public TrimmerWindow(XciTrimmerViewModel viewModel)
{
_viewModel = viewModel;
}
diff --git a/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs b/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs
index 3ebfee751..751a86571 100644
--- a/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs
+++ b/src/Ryujinx/Headless/HeadlessRyujinx.Init.cs
@@ -2,7 +2,8 @@ using DiscordRPC;
using LibHac.Tools.FsSystem;
using Ryujinx.Audio.Backends.SDL2;
using Ryujinx.Ava;
-using Ryujinx.Ava.Utilities.Configuration;
+using Ryujinx.Ava.Systems;
+using Ryujinx.Ava.Systems.Configuration;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Configuration.Hid.Controller;
@@ -11,7 +12,6 @@ using Ryujinx.Common.Configuration.Hid.Keyboard;
using Ryujinx.Common.Logging;
using Ryujinx.Common.Utilities;
using Ryujinx.Graphics.GAL;
-using Ryujinx.Graphics.GAL.Multithreading;
using Ryujinx.Graphics.OpenGL;
using Ryujinx.Graphics.Vulkan;
using Ryujinx.HLE;
@@ -312,49 +312,42 @@ namespace Ryujinx.Headless
return new OpenGLRenderer();
}
- private static Switch InitializeEmulationContext(WindowBase window, IRenderer renderer, Options options)
- {
- BackendThreading threadingMode = options.BackendThreading;
-
- bool threadedGAL = threadingMode == BackendThreading.On || (threadingMode == BackendThreading.Auto && renderer.PreferThreading);
-
- if (threadedGAL)
- {
- renderer = new ThreadedRenderer(renderer);
- }
-
- HLEConfiguration configuration = new(_virtualFileSystem,
- _libHacHorizonManager,
- _contentManager,
- _accountManager,
- _userChannelPersistence,
- renderer,
- new SDL2HardwareDeviceDriver(),
- options.DramSize,
- window,
- options.SystemLanguage,
- options.SystemRegion,
- options.VSyncMode,
- !options.DisableDockedMode,
- !options.DisablePTC,
- options.EnableInternetAccess,
- !options.DisableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
- options.FsGlobalAccessLogMode,
- options.SystemTimeOffset,
- options.SystemTimeZone,
- options.MemoryManagerMode,
- options.IgnoreMissingServices,
- options.AspectRatio,
- options.AudioVolume,
- options.UseHypervisor ?? true,
- options.MultiplayerLanInterfaceId,
- Common.Configuration.Multiplayer.MultiplayerMode.Disabled,
- false,
- string.Empty,
- string.Empty,
- options.CustomVSyncInterval);
-
- return new Switch(configuration);
- }
+ private static Switch InitializeEmulationContext(WindowBase window, IRenderer renderer, Options options) =>
+ new(
+ new HleConfiguration(
+ options.DramSize,
+ options.SystemLanguage,
+ options.SystemRegion,
+ options.VSyncMode,
+ !options.DisableDockedMode,
+ !options.DisablePTC,
+ options.EnableInternetAccess,
+ !options.DisableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
+ options.FsGlobalAccessLogMode,
+ options.SystemTimeOffset,
+ options.SystemTimeZone,
+ options.MemoryManagerMode,
+ options.IgnoreMissingServices,
+ options.AspectRatio,
+ options.AudioVolume,
+ options.UseHypervisor ?? true,
+ options.MultiplayerLanInterfaceId,
+ Common.Configuration.Multiplayer.MultiplayerMode.Disabled,
+ false,
+ string.Empty,
+ string.Empty,
+ options.CustomVSyncInterval
+ )
+ .Configure(
+ _virtualFileSystem,
+ _libHacHorizonManager,
+ _contentManager,
+ _accountManager,
+ _userChannelPersistence,
+ renderer.TryMakeThreaded(options.BackendThreading),
+ new SDL2HardwareDeviceDriver(),
+ window
+ )
+ );
}
}
diff --git a/src/Ryujinx/Headless/HeadlessRyujinx.cs b/src/Ryujinx/Headless/HeadlessRyujinx.cs
index 9a69c56dd..f346f1f63 100644
--- a/src/Ryujinx/Headless/HeadlessRyujinx.cs
+++ b/src/Ryujinx/Headless/HeadlessRyujinx.cs
@@ -1,7 +1,7 @@
using CommandLine;
using Gommon;
using Ryujinx.Ava;
-using Ryujinx.Ava.Utilities.Configuration;
+using Ryujinx.Ava.Systems.Configuration;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
diff --git a/src/Ryujinx/Headless/Options.cs b/src/Ryujinx/Headless/Options.cs
index 6658ba3ad..8305cd311 100644
--- a/src/Ryujinx/Headless/Options.cs
+++ b/src/Ryujinx/Headless/Options.cs
@@ -1,6 +1,7 @@
using CommandLine;
using Gommon;
-using Ryujinx.Ava.Utilities.Configuration;
+using Ryujinx.Ava.Systems.Configuration;
+using Ryujinx.Ava.Systems.Configuration.System;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
using Ryujinx.HLE;
@@ -37,7 +38,7 @@ namespace Ryujinx.Headless
EnableInternetAccess = configurationState.System.EnableInternetAccess;
if (NeedsOverride(nameof(DisableFsIntegrityChecks)))
- DisableFsIntegrityChecks = configurationState.System.EnableFsIntegrityChecks;
+ DisableFsIntegrityChecks = !configurationState.System.EnableFsIntegrityChecks;
if (NeedsOverride(nameof(FsGlobalAccessLogMode)))
FsGlobalAccessLogMode = configurationState.System.FsGlobalAccessLogMode;
@@ -58,10 +59,10 @@ namespace Ryujinx.Headless
DisableDockedMode = !configurationState.System.EnableDockedMode;
if (NeedsOverride(nameof(SystemLanguage)))
- SystemLanguage = (SystemLanguage)(int)configurationState.System.Language.Value;
+ SystemLanguage = configurationState.System.Language.Value.ToHLE();
if (NeedsOverride(nameof(SystemRegion)))
- SystemRegion = (RegionCode)(int)configurationState.System.Region.Value;
+ SystemRegion = configurationState.System.Region.Value.ToHLE();
if (NeedsOverride(nameof(SystemTimeZone)))
SystemTimeZone = configurationState.System.TimeZone;
diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs
index f0a3f93e0..a7db32e87 100644
--- a/src/Ryujinx/Program.cs
+++ b/src/Ryujinx/Program.cs
@@ -5,10 +5,12 @@ using Gommon;
using Projektanker.Icons.Avalonia;
using Projektanker.Icons.Avalonia.FontAwesome;
using Projektanker.Icons.Avalonia.MaterialDesign;
+using Ryujinx.Ava.Systems;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.Windows;
using Ryujinx.Ava.Utilities;
-using Ryujinx.Ava.Utilities.Configuration;
+using Ryujinx.Ava.Systems.Configuration;
+using Ryujinx.Ava.Systems.Configuration.System;
using Ryujinx.Ava.Utilities.SystemInfo;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
@@ -282,16 +284,16 @@ namespace Ryujinx.Ava
// Check if region was overridden.
if (CommandLineState.OverrideSystemRegion is not null)
- if (Enum.TryParse(CommandLineState.OverrideSystemRegion, true, out Ryujinx.HLE.HOS.SystemState.RegionCode result))
+ if (Enum.TryParse(CommandLineState.OverrideSystemRegion, true, out HLE.HOS.SystemState.RegionCode result))
{
- ConfigurationState.Instance.System.Region.Value = (Utilities.Configuration.System.Region)result;
+ ConfigurationState.Instance.System.Region.Value = result.ToUI();
}
//Check if language was overridden.
if (CommandLineState.OverrideSystemLanguage is not null)
- if (Enum.TryParse(CommandLineState.OverrideSystemLanguage, true, out Ryujinx.HLE.HOS.SystemState.SystemLanguage result))
+ if (Enum.TryParse(CommandLineState.OverrideSystemLanguage, true, out HLE.HOS.SystemState.SystemLanguage result))
{
- ConfigurationState.Instance.System.Language.Value = (Utilities.Configuration.System.Language)result;
+ ConfigurationState.Instance.System.Language.Value = result.ToUI();
}
// Check if hardware-acceleration was overridden.
diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj
index 698b392ee..1f9642466 100644
--- a/src/Ryujinx/Ryujinx.csproj
+++ b/src/Ryujinx/Ryujinx.csproj
@@ -91,10 +91,12 @@
AlwaysTHIRDPARTY.md
+ FalseAlwaysLICENSE.txt
+ False
diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/Systems/AppHost.cs
similarity index 93%
rename from src/Ryujinx/AppHost.cs
rename to src/Ryujinx/Systems/AppHost.cs
index b741eb977..455afaf45 100644
--- a/src/Ryujinx/AppHost.cs
+++ b/src/Ryujinx/Systems/AppHost.cs
@@ -6,7 +6,6 @@ using Avalonia.Threading;
using DiscordRPC;
using LibHac.Common;
using LibHac.Ns;
-using LibHac.Tools.FsSystem;
using Ryujinx.Audio.Backends.Dummy;
using Ryujinx.Audio.Backends.OpenAL;
using Ryujinx.Audio.Backends.SDL2;
@@ -21,8 +20,8 @@ using Ryujinx.Ava.UI.Renderer;
using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.Ava.UI.Windows;
using Ryujinx.Ava.Utilities;
-using Ryujinx.Ava.Utilities.AppLibrary;
-using Ryujinx.Ava.Utilities.Configuration;
+using Ryujinx.Ava.Systems.AppLibrary;
+using Ryujinx.Ava.Systems.Configuration;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Multiplayer;
@@ -35,11 +34,9 @@ using Ryujinx.Graphics.GAL.Multithreading;
using Ryujinx.Graphics.Gpu;
using Ryujinx.Graphics.OpenGL;
using Ryujinx.Graphics.Vulkan;
-using Ryujinx.HLE;
using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS;
using Ryujinx.HLE.HOS.Services.Account.Acc;
-using Ryujinx.HLE.HOS.SystemState;
using Ryujinx.Input;
using Ryujinx.Input.HLE;
using SkiaSharp;
@@ -62,7 +59,7 @@ using Size = Avalonia.Size;
using Switch = Ryujinx.HLE.Switch;
using VSyncMode = Ryujinx.Common.Configuration.VSyncMode;
-namespace Ryujinx.Ava
+namespace Ryujinx.Ava.Systems
{
internal class AppHost
{
@@ -470,7 +467,7 @@ namespace Ryujinx.Ava
Dispatcher.UIThread.InvokeAsync(() =>
{
- _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowTitleBar);
+ _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowOldUI);
});
_viewModel.SetUiProgressHandlers(Device);
@@ -872,7 +869,7 @@ namespace Ryujinx.Ava
Device?.System.TogglePauseEmulation(false);
_viewModel.IsPaused = false;
- _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowTitleBar);
+ _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowOldUI);
Logger.Info?.Print(LogClass.Emulation, "Emulation was resumed");
}
@@ -881,7 +878,7 @@ namespace Ryujinx.Ava
Device?.System.TogglePauseEmulation(true);
_viewModel.IsPaused = true;
- _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowTitleBar, LocaleManager.Instance[LocaleKeys.Paused]);
+ _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, !ConfigurationState.Instance.ShowOldUI, LocaleManager.Instance[LocaleKeys.Paused]);
Logger.Info?.Print(LogClass.Emulation, "Emulation was paused");
}
@@ -902,53 +899,19 @@ namespace Ryujinx.Ava
_ => new OpenGLRenderer()
};
- BackendThreading threadingMode = ConfigurationState.Instance.Graphics.BackendThreading;
-
- bool isGALThreaded = threadingMode == BackendThreading.On || (threadingMode == BackendThreading.Auto && renderer.PreferThreading);
- if (isGALThreaded)
- {
- renderer = new ThreadedRenderer(renderer);
- }
-
- Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({threadingMode}): {isGALThreaded}");
-
// Initialize Configuration.
- MemoryConfiguration memoryConfiguration = ConfigurationState.Instance.System.DramSize.Value;
-
- Device = new Switch(new HLEConfiguration(
- VirtualFileSystem,
- _viewModel.LibHacHorizonManager,
- ContentManager,
- _accountManager,
- _userChannelPersistence,
- renderer,
- InitializeAudio(),
- memoryConfiguration,
- _viewModel.UiHandler,
- (SystemLanguage)ConfigurationState.Instance.System.Language.Value,
- (RegionCode)ConfigurationState.Instance.System.Region.Value,
- ConfigurationState.Instance.Graphics.VSyncMode,
- ConfigurationState.Instance.System.EnableDockedMode,
- ConfigurationState.Instance.System.EnablePtc,
- ConfigurationState.Instance.System.EnableInternetAccess,
- ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
- ConfigurationState.Instance.System.FsGlobalAccessLogMode,
- ConfigurationState.Instance.System.MatchSystemTime
- ? 0
- : ConfigurationState.Instance.System.SystemTimeOffset,
- ConfigurationState.Instance.System.TimeZone,
- ConfigurationState.Instance.System.MemoryManagerMode,
- ConfigurationState.Instance.System.IgnoreMissingServices,
- ConfigurationState.Instance.Graphics.AspectRatio,
- ConfigurationState.Instance.System.AudioVolume,
- ConfigurationState.Instance.System.UseHypervisor,
- ConfigurationState.Instance.Multiplayer.LanInterfaceId.Value,
- ConfigurationState.Instance.Multiplayer.Mode,
- ConfigurationState.Instance.Multiplayer.DisableP2p,
- ConfigurationState.Instance.Multiplayer.LdnPassphrase,
- ConfigurationState.Instance.Multiplayer.GetLdnServer(),
- ConfigurationState.Instance.Graphics.CustomVSyncInterval.Value,
- ConfigurationState.Instance.Hacks.ShowDirtyHacks ? ConfigurationState.Instance.Hacks.EnabledHacks : null));
+ Device = new Switch(ConfigurationState.Instance.CreateHleConfiguration()
+ .Configure(
+ VirtualFileSystem,
+ _viewModel.LibHacHorizonManager,
+ ContentManager,
+ _accountManager,
+ _userChannelPersistence,
+ renderer.TryMakeThreaded(ConfigurationState.Instance.Graphics.BackendThreading),
+ InitializeAudio(),
+ _viewModel.UiHandler
+ )
+ );
}
private static IHardwareDeviceDriver InitializeAudio()
@@ -1182,6 +1145,9 @@ namespace Ryujinx.Ava
private void UpdateShaderCount()
{
+ if (_displayCount is 0 && _renderer.ProgramCount is 0)
+ return;
+
// If there is a mismatch between total program compile and previous count
// this means new shaders have been compiled and should be displayed.
if (_renderer.ProgramCount != _previousCount)
@@ -1255,12 +1221,10 @@ namespace Ryujinx.Ava
VSyncModeToggle();
break;
case KeyboardHotkeyState.CustomVSyncIntervalDecrement:
- Device.DecrementCustomVSyncInterval();
- _viewModel.CustomVSyncInterval -= 1;
+ _viewModel.CustomVSyncInterval = Device.DecrementCustomVSyncInterval();
break;
case KeyboardHotkeyState.CustomVSyncIntervalIncrement:
- Device.IncrementCustomVSyncInterval();
- _viewModel.CustomVSyncInterval += 1;
+ _viewModel.CustomVSyncInterval = Device.IncrementCustomVSyncInterval();
break;
case KeyboardHotkeyState.Screenshot:
ScreenshotRequested = true;
diff --git a/src/Ryujinx/Utilities/AppLibrary/ApplicationCountUpdatedEventArgs.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationCountUpdatedEventArgs.cs
similarity index 81%
rename from src/Ryujinx/Utilities/AppLibrary/ApplicationCountUpdatedEventArgs.cs
rename to src/Ryujinx/Systems/AppLibrary/ApplicationCountUpdatedEventArgs.cs
index 9bbaef0e3..7866ffa3a 100644
--- a/src/Ryujinx/Utilities/AppLibrary/ApplicationCountUpdatedEventArgs.cs
+++ b/src/Ryujinx/Systems/AppLibrary/ApplicationCountUpdatedEventArgs.cs
@@ -1,6 +1,6 @@
using System;
-namespace Ryujinx.Ava.Utilities.AppLibrary
+namespace Ryujinx.Ava.Systems.AppLibrary
{
public class ApplicationCountUpdatedEventArgs : EventArgs
{
diff --git a/src/Ryujinx/Utilities/AppLibrary/ApplicationData.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationData.cs
similarity index 97%
rename from src/Ryujinx/Utilities/AppLibrary/ApplicationData.cs
rename to src/Ryujinx/Systems/AppLibrary/ApplicationData.cs
index 16e7dec06..0819b86b8 100644
--- a/src/Ryujinx/Utilities/AppLibrary/ApplicationData.cs
+++ b/src/Ryujinx/Systems/AppLibrary/ApplicationData.cs
@@ -9,8 +9,8 @@ using LibHac.Tools.Fs;
using LibHac.Tools.FsSystem;
using LibHac.Tools.FsSystem.NcaUtils;
using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.Utilities.Compat;
-using Ryujinx.Ava.Utilities.PlayReport;
+using Ryujinx.Ava.Utilities;
+using Ryujinx.Ava.Systems.PlayReport;
using Ryujinx.Common.Logging;
using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.Loaders.Processes.Extensions;
@@ -18,7 +18,7 @@ using System;
using System.IO;
using System.Text.Json.Serialization;
-namespace Ryujinx.Ava.Utilities.AppLibrary
+namespace Ryujinx.Ava.Systems.AppLibrary
{
public class ApplicationData
{
@@ -36,7 +36,7 @@ namespace Ryujinx.Ava.Utilities.AppLibrary
{
_id = value;
- Compatibility = CompatibilityCsv.Find(value);
+ Compatibility = CompatibilityDatabase.Find(value);
RichPresenceSpec = PlayReports.Analyzer.TryGetSpec(IdString, out GameSpec gameSpec)
? gameSpec
: default(Optional);
diff --git a/src/Ryujinx/Utilities/AppLibrary/ApplicationJsonSerializerContext.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationJsonSerializerContext.cs
similarity index 85%
rename from src/Ryujinx/Utilities/AppLibrary/ApplicationJsonSerializerContext.cs
rename to src/Ryujinx/Systems/AppLibrary/ApplicationJsonSerializerContext.cs
index d443ab66e..3fd24a6ba 100644
--- a/src/Ryujinx/Utilities/AppLibrary/ApplicationJsonSerializerContext.cs
+++ b/src/Ryujinx/Systems/AppLibrary/ApplicationJsonSerializerContext.cs
@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
-namespace Ryujinx.Ava.Utilities.AppLibrary
+namespace Ryujinx.Ava.Systems.AppLibrary
{
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(ApplicationMetadata))]
diff --git a/src/Ryujinx/Utilities/AppLibrary/ApplicationLibrary.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs
similarity index 99%
rename from src/Ryujinx/Utilities/AppLibrary/ApplicationLibrary.cs
rename to src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs
index c85053723..b7321d6c1 100644
--- a/src/Ryujinx/Utilities/AppLibrary/ApplicationLibrary.cs
+++ b/src/Ryujinx/Systems/AppLibrary/ApplicationLibrary.cs
@@ -12,8 +12,9 @@ using LibHac.Tools.Fs;
using LibHac.Tools.FsSystem;
using LibHac.Tools.FsSystem.NcaUtils;
using Ryujinx.Ava.Common.Models;
-using Ryujinx.Ava.Utilities.Configuration;
-using Ryujinx.Ava.Utilities.Configuration.System;
+using Ryujinx.Ava.Utilities;
+using Ryujinx.Ava.Systems.Configuration;
+using Ryujinx.Ava.Systems.Configuration.System;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Multiplayer;
@@ -38,7 +39,7 @@ using MissingKeyException = LibHac.Common.Keys.MissingKeyException;
using Path = System.IO.Path;
using TimeSpan = System.TimeSpan;
-namespace Ryujinx.Ava.Utilities.AppLibrary
+namespace Ryujinx.Ava.Systems.AppLibrary
{
public class ApplicationLibrary
{
@@ -617,15 +618,11 @@ namespace Ryujinx.Ava.Utilities.AppLibrary
case ".xci":
case ".nsp":
{
- IntegrityCheckLevel checkLevel = ConfigurationState.Instance.System.EnableFsIntegrityChecks
- ? IntegrityCheckLevel.ErrorOnInvalid
- : IntegrityCheckLevel.None;
-
using IFileSystem pfs =
PartitionFileSystemUtils.OpenApplicationFileSystem(filePath, _virtualFileSystem);
Dictionary updates =
- pfs.GetContentData(ContentMetaType.Patch, _virtualFileSystem, checkLevel);
+ pfs.GetContentData(ContentMetaType.Patch, _virtualFileSystem, ConfigurationState.Instance.System.IntegrityCheckLevel);
if (updates.Count == 0)
{
diff --git a/src/Ryujinx/Utilities/AppLibrary/ApplicationMetadata.cs b/src/Ryujinx/Systems/AppLibrary/ApplicationMetadata.cs
similarity index 97%
rename from src/Ryujinx/Utilities/AppLibrary/ApplicationMetadata.cs
rename to src/Ryujinx/Systems/AppLibrary/ApplicationMetadata.cs
index d823c7482..9d8488aeb 100644
--- a/src/Ryujinx/Utilities/AppLibrary/ApplicationMetadata.cs
+++ b/src/Ryujinx/Systems/AppLibrary/ApplicationMetadata.cs
@@ -1,7 +1,7 @@
using System;
using System.Text.Json.Serialization;
-namespace Ryujinx.Ava.Utilities.AppLibrary
+namespace Ryujinx.Ava.Systems.AppLibrary
{
public class ApplicationMetadata
{
diff --git a/src/Ryujinx/Utilities/AppLibrary/LdnGameData.cs b/src/Ryujinx/Systems/AppLibrary/LdnGameData.cs
similarity index 97%
rename from src/Ryujinx/Utilities/AppLibrary/LdnGameData.cs
rename to src/Ryujinx/Systems/AppLibrary/LdnGameData.cs
index 252c0ecdc..6750983d6 100644
--- a/src/Ryujinx/Utilities/AppLibrary/LdnGameData.cs
+++ b/src/Ryujinx/Systems/AppLibrary/LdnGameData.cs
@@ -4,7 +4,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
-namespace Ryujinx.Ava.Utilities.AppLibrary
+namespace Ryujinx.Ava.Systems.AppLibrary
{
public struct LdnGameData
{
diff --git a/src/Ryujinx/Utilities/AppLibrary/LdnGameDataReceivedEventArgs.cs b/src/Ryujinx/Systems/AppLibrary/LdnGameDataReceivedEventArgs.cs
similarity index 82%
rename from src/Ryujinx/Utilities/AppLibrary/LdnGameDataReceivedEventArgs.cs
rename to src/Ryujinx/Systems/AppLibrary/LdnGameDataReceivedEventArgs.cs
index 0eaa6ecb3..21d24ff2d 100644
--- a/src/Ryujinx/Utilities/AppLibrary/LdnGameDataReceivedEventArgs.cs
+++ b/src/Ryujinx/Systems/AppLibrary/LdnGameDataReceivedEventArgs.cs
@@ -1,7 +1,6 @@
using System;
-using System.Collections.Generic;
-namespace Ryujinx.Ava.Utilities.AppLibrary
+namespace Ryujinx.Ava.Systems.AppLibrary
{
public class LdnGameDataReceivedEventArgs : EventArgs
{
diff --git a/src/Ryujinx/Utilities/AppLibrary/LdnGameDataSerializerContext.cs b/src/Ryujinx/Systems/AppLibrary/LdnGameDataSerializerContext.cs
similarity index 83%
rename from src/Ryujinx/Utilities/AppLibrary/LdnGameDataSerializerContext.cs
rename to src/Ryujinx/Systems/AppLibrary/LdnGameDataSerializerContext.cs
index 90d1894c7..ff7718ed5 100644
--- a/src/Ryujinx/Utilities/AppLibrary/LdnGameDataSerializerContext.cs
+++ b/src/Ryujinx/Systems/AppLibrary/LdnGameDataSerializerContext.cs
@@ -1,7 +1,7 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
-namespace Ryujinx.Ava.Utilities.AppLibrary
+namespace Ryujinx.Ava.Systems.AppLibrary
{
[JsonSerializable(typeof(IEnumerable))]
internal partial class LdnGameDataSerializerContext : JsonSerializerContext;
diff --git a/src/Ryujinx/Utilities/Compat/CompatibilityCsv.cs b/src/Ryujinx/Systems/CompatibilityDatabase.cs
similarity index 82%
rename from src/Ryujinx/Utilities/Compat/CompatibilityCsv.cs
rename to src/Ryujinx/Systems/CompatibilityDatabase.cs
index b58c05299..bfc7ba903 100644
--- a/src/Ryujinx/Utilities/Compat/CompatibilityCsv.cs
+++ b/src/Ryujinx/Systems/CompatibilityDatabase.cs
@@ -9,26 +9,11 @@ using System.Linq;
using System.Reflection;
using System.Text;
-namespace Ryujinx.Ava.Utilities.Compat
+namespace Ryujinx.Ava.Systems
{
- public struct ColumnIndices(Func, int> getIndex)
+ public class CompatibilityDatabase
{
- public const string TitleIdCol = "\"title_id\"";
- public const string GameNameCol = "\"game_name\"";
- public const string LabelsCol = "\"labels\"";
- public const string StatusCol = "\"status\"";
- public const string LastUpdatedCol = "\"last_updated\"";
-
- public readonly int TitleId = getIndex(TitleIdCol);
- public readonly int GameName = getIndex(GameNameCol);
- public readonly int Labels = getIndex(LabelsCol);
- public readonly int Status = getIndex(StatusCol);
- public readonly int LastUpdated = getIndex(LastUpdatedCol);
- }
-
- public class CompatibilityCsv
- {
- static CompatibilityCsv() => Load();
+ static CompatibilityDatabase() => Load();
public static void Load()
{
@@ -65,16 +50,6 @@ namespace Ryujinx.Ava.Utilities.Compat
public static CompatibilityEntry Find(ulong titleId)
=> Find(titleId.ToString("X16"));
-
- public static LocaleKeys? GetStatus(string titleId)
- => Find(titleId)?.Status;
-
- public static LocaleKeys? GetStatus(ulong titleId) => GetStatus(titleId.ToString("X16"));
-
- public static string GetLabels(string titleId)
- => Find(titleId)?.FormattedIssueLabels;
-
- public static string GetLabels(ulong titleId) => GetLabels(titleId.ToString("X16"));
}
public class CompatibilityEntry
@@ -135,6 +110,7 @@ namespace Ryujinx.Ava.Utilities.Compat
public string FormattedIssueLabels => Labels
.Select(FormatLabelName)
+ .Where(x => x != null)
.JoinToString(", ");
public override string ToString() =>
@@ -158,7 +134,6 @@ namespace Ryujinx.Ava.Utilities.Compat
"gui" => "GUI",
"help wanted" => "Help Wanted",
"horizon" => "Horizon",
- "infra" => "Project Infra",
"invalid" => "Invalid",
"kernel" => "Kernel",
"ldn" => "LDN",
@@ -172,9 +147,9 @@ namespace Ryujinx.Ava.Utilities.Compat
"ldn-untested" => "LDN Untested",
"ldn-broken" => "LDN Broken",
"ldn-partial" => "Partial LDN",
- "nvdec" => "NVDEC",
- "services" => "NX Services",
- "services-horizon" => "Horizon OS Services",
+ "nvdec" => "GPU Video Decoding",
+ "services" => "HLE Services",
+ "services-horizon" => "New HLE Services",
"slow" => "Runs Slow",
"crash" => "Crashes",
"deadlock" => "Deadlock",
@@ -182,7 +157,7 @@ namespace Ryujinx.Ava.Utilities.Compat
"opengl" => "OpenGL",
"opengl-backend-bug" => "OpenGL Backend Bug",
"vulkan-backend-bug" => "Vulkan Backend Bug",
- "mac-bug" => "Mac-specific Bug(s)",
+ "mac-bug" => "Mac-specific Problems",
"amd-vendor-bug" => "AMD GPU Bug",
"intel-vendor-bug" => "Intel GPU Bug",
"loader-allocator" => "Loader Allocator",
@@ -191,18 +166,22 @@ namespace Ryujinx.Ava.Utilities.Compat
"UE4" => "Unreal Engine 4",
"homebrew" => "Homebrew Content",
"online-broken" => "Online Broken",
- _ => Capitalize(labelName)
+ _ => null
};
+ }
+
+ public struct ColumnIndices(Func, int> getIndex)
+ {
+ private const string TitleIdCol = "\"title_id\"";
+ private const string GameNameCol = "\"game_name\"";
+ private const string LabelsCol = "\"labels\"";
+ private const string StatusCol = "\"status\"";
+ private const string LastUpdatedCol = "\"last_updated\"";
- public static string Capitalize(string value)
- {
- if (value == string.Empty)
- return string.Empty;
-
- char firstChar = value[0];
- string rest = value[1..];
-
- return $"{char.ToUpper(firstChar)}{rest}";
- }
+ public readonly int TitleId = getIndex(TitleIdCol);
+ public readonly int GameName = getIndex(GameNameCol);
+ public readonly int Labels = getIndex(LabelsCol);
+ public readonly int Status = getIndex(StatusCol);
+ public readonly int LastUpdated = getIndex(LastUpdatedCol);
}
}
diff --git a/src/Ryujinx/Utilities/Configuration/AudioBackend.cs b/src/Ryujinx/Systems/Configuration/AudioBackend.cs
similarity index 84%
rename from src/Ryujinx/Utilities/Configuration/AudioBackend.cs
rename to src/Ryujinx/Systems/Configuration/AudioBackend.cs
index 8394bb282..a0aa30f38 100644
--- a/src/Ryujinx/Utilities/Configuration/AudioBackend.cs
+++ b/src/Ryujinx/Systems/Configuration/AudioBackend.cs
@@ -1,7 +1,7 @@
using Ryujinx.Common.Utilities;
using System.Text.Json.Serialization;
-namespace Ryujinx.Ava.Utilities.Configuration
+namespace Ryujinx.Ava.Systems.Configuration
{
[JsonConverter(typeof(TypedStringEnumConverter))]
public enum AudioBackend
diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormat.cs b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs
similarity index 98%
rename from src/Ryujinx/Utilities/Configuration/ConfigurationFileFormat.cs
rename to src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs
index 814a48e53..c5315ab12 100644
--- a/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormat.cs
+++ b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormat.cs
@@ -1,5 +1,5 @@
-using Ryujinx.Ava.Utilities.Configuration.System;
-using Ryujinx.Ava.Utilities.Configuration.UI;
+using Ryujinx.Ava.Systems.Configuration.System;
+using Ryujinx.Ava.Systems.Configuration.UI;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Configuration.Multiplayer;
@@ -8,14 +8,14 @@ using Ryujinx.Common.Utilities;
using Ryujinx.HLE;
using System.Collections.Generic;
-namespace Ryujinx.Ava.Utilities.Configuration
+namespace Ryujinx.Ava.Systems.Configuration
{
public class ConfigurationFileFormat
{
///
/// The current version of the file format
///
- public const int CurrentVersion = 67;
+ public const int CurrentVersion = 68;
///
/// Version of the configuration file format
diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormatSettings.cs b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormatSettings.cs
similarity index 83%
rename from src/Ryujinx/Utilities/Configuration/ConfigurationFileFormatSettings.cs
rename to src/Ryujinx/Systems/Configuration/ConfigurationFileFormatSettings.cs
index 175d4dee8..1d0350dd3 100644
--- a/src/Ryujinx/Utilities/Configuration/ConfigurationFileFormatSettings.cs
+++ b/src/Ryujinx/Systems/Configuration/ConfigurationFileFormatSettings.cs
@@ -1,6 +1,6 @@
using Ryujinx.Common.Utilities;
-namespace Ryujinx.Ava.Utilities.Configuration
+namespace Ryujinx.Ava.Systems.Configuration
{
internal static class ConfigurationFileFormatSettings
{
diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationJsonSerializerContext.cs b/src/Ryujinx/Systems/Configuration/ConfigurationJsonSerializerContext.cs
similarity index 84%
rename from src/Ryujinx/Utilities/Configuration/ConfigurationJsonSerializerContext.cs
rename to src/Ryujinx/Systems/Configuration/ConfigurationJsonSerializerContext.cs
index a81e00f4a..8574b3a93 100644
--- a/src/Ryujinx/Utilities/Configuration/ConfigurationJsonSerializerContext.cs
+++ b/src/Ryujinx/Systems/Configuration/ConfigurationJsonSerializerContext.cs
@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
-namespace Ryujinx.Ava.Utilities.Configuration
+namespace Ryujinx.Ava.Systems.Configuration
{
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(ConfigurationFileFormat))]
diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs b/src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs
similarity index 97%
rename from src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs
rename to src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs
index 8a0ddb560..b10cc3926 100644
--- a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Migration.cs
+++ b/src/Ryujinx/Systems/Configuration/ConfigurationState.Migration.cs
@@ -1,7 +1,7 @@
using Avalonia.Media;
using Gommon;
-using Ryujinx.Ava.Utilities.Configuration.System;
-using Ryujinx.Ava.Utilities.Configuration.UI;
+using Ryujinx.Ava.Systems.Configuration.System;
+using Ryujinx.Ava.Systems.Configuration.UI;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Configuration.Hid.Controller;
@@ -14,7 +14,7 @@ using System.Collections.Generic;
using System.Linq;
using RyuLogger = Ryujinx.Common.Logging.Logger;
-namespace Ryujinx.Ava.Utilities.Configuration
+namespace Ryujinx.Ava.Systems.Configuration
{
public partial class ConfigurationState
{
@@ -46,12 +46,11 @@ namespace Ryujinx.Ava.Utilities.Configuration
EnableDiscordIntegration.Value = cff.EnableDiscordIntegration;
- CheckUpdatesOnStart.Value = shouldLoadFromFile ? cff.CheckUpdatesOnStart : CheckUpdatesOnStart.Value; // Get from global config only
UpdateCheckerType.Value = shouldLoadFromFile ? cff.UpdateCheckerType : UpdateCheckerType.Value; // Get from global config only
FocusLostActionType.Value = cff.FocusLostActionType;
ShowConfirmExit.Value = shouldLoadFromFile ? cff.ShowConfirmExit : ShowConfirmExit.Value; // Get from global config only
RememberWindowState.Value = shouldLoadFromFile ? cff.RememberWindowState : RememberWindowState.Value; // Get from global config only
- ShowTitleBar.Value = shouldLoadFromFile ? cff.ShowTitleBar : ShowTitleBar.Value; // Get from global config only
+ ShowOldUI.Value = shouldLoadFromFile ? cff.ShowTitleBar : ShowOldUI.Value; // Get from global config only
EnableHardwareAcceleration.Value = shouldLoadFromFile ? cff.EnableHardwareAcceleration : EnableHardwareAcceleration.Value; // Get from global config only
HideCursor.Value = cff.HideCursor;
@@ -161,9 +160,7 @@ namespace Ryujinx.Ava.Utilities.Configuration
DirtyHacks hacks = new (cff.DirtyHacks ?? []);
Hacks.Xc2MenuSoftlockFix.Value = hacks.IsEnabled(DirtyHack.Xc2MenuSoftlockFix);
-
- Hacks.EnableShaderTranslationDelay.Value = hacks.IsEnabled(DirtyHack.ShaderTranslationDelay);
- Hacks.ShaderTranslationDelay.Value = hacks[DirtyHack.ShaderTranslationDelay].CoerceAtLeast(0);
+
}
if (configurationFileUpdated)
@@ -442,6 +439,8 @@ namespace Ryujinx.Ava.Utilities.Configuration
(65, static cff => cff.UpdateCheckerType = cff.CheckUpdatesOnStart ? UpdaterType.PromptAtStartup : UpdaterType.Off),
(66, static cff => cff.DisableInputWhenOutOfFocus = false),
(67, static cff => cff.FocusLostActionType = cff.DisableInputWhenOutOfFocus ? FocusLostType.BlockInput : FocusLostType.DoNothing)
+ // 68 was the version that added per-game configs; the file structure did not change
+ // the version was increased so external tools could know that your Ryujinx version has per-game config capabilities.
);
}
}
diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs b/src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs
similarity index 93%
rename from src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs
rename to src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs
index ead99fbac..b52c624e3 100644
--- a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs
+++ b/src/Ryujinx/Systems/Configuration/ConfigurationState.Model.cs
@@ -1,8 +1,8 @@
using ARMeilleure;
using Gommon;
-using Ryujinx.Ava.Utilities.AppLibrary;
-using Ryujinx.Ava.Utilities.Configuration.System;
-using Ryujinx.Ava.Utilities.Configuration.UI;
+using LibHac.Tools.FsSystem;
+using Ryujinx.Ava.Systems.Configuration.System;
+using Ryujinx.Ava.Systems.Configuration.UI;
using Ryujinx.Common;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
@@ -15,11 +15,11 @@ using System.Collections.Generic;
using System.Linq;
using RyuLogger = Ryujinx.Common.Logging.Logger;
-namespace Ryujinx.Ava.Utilities.Configuration
+namespace Ryujinx.Ava.Systems.Configuration
{
public partial class ConfigurationState
{
- ///
+ ///
/// UI configuration section
///
public class UISection
@@ -351,6 +351,10 @@ namespace Ryujinx.Ava.Utilities.Configuration
///
public ReactiveObject EnableFsIntegrityChecks { get; private set; }
+ public IntegrityCheckLevel IntegrityCheckLevel => EnableFsIntegrityChecks
+ ? IntegrityCheckLevel.ErrorOnInvalid
+ : IntegrityCheckLevel.None;
+
///
/// Enables FS access log output to the console. Possible modes are 0-3
///
@@ -679,18 +683,15 @@ namespace Ryujinx.Ava.Utilities.Configuration
public ReactiveObject Xc2MenuSoftlockFix { get; private set; }
- public ReactiveObject EnableShaderTranslationDelay { get; private set; }
-
- public ReactiveObject ShaderTranslationDelay { get; private set; }
+ public ReactiveObject DisableNifmIsAnyInternetRequestAccepted { get; private set; }
public HacksSection()
{
ShowDirtyHacks = new ReactiveObject();
Xc2MenuSoftlockFix = new ReactiveObject();
Xc2MenuSoftlockFix.Event += HackChanged;
- EnableShaderTranslationDelay = new ReactiveObject();
- EnableShaderTranslationDelay.Event += HackChanged;
- ShaderTranslationDelay = new ReactiveObject();
+ DisableNifmIsAnyInternetRequestAccepted = new ReactiveObject();
+ DisableNifmIsAnyInternetRequestAccepted.Event += HackChanged;
}
private void HackChanged(object sender, ReactiveEventArgs rxe)
@@ -721,8 +722,8 @@ namespace Ryujinx.Ava.Utilities.Configuration
if (Xc2MenuSoftlockFix)
Apply(DirtyHack.Xc2MenuSoftlockFix);
- if (EnableShaderTranslationDelay)
- Apply(DirtyHack.ShaderTranslationDelay, ShaderTranslationDelay);
+ if (DisableNifmIsAnyInternetRequestAccepted)
+ Apply(DirtyHack.NifmServiceDisableIsAnyInternetRequestAccepted);
return enabledHacks.ToArray();
@@ -778,11 +779,6 @@ namespace Ryujinx.Ava.Utilities.Configuration
/// Enables or disables Discord Rich Presence
///
public ReactiveObject EnableDiscordIntegration { get; private set; }
-
- ///
- /// Checks for updates when Ryujinx starts when enabled
- ///
- public ReactiveObject CheckUpdatesOnStart { get; private set; }
///
/// Checks for updates when Ryujinx starts when enabled, either prompting when an update is found or just showing a notification.
@@ -805,9 +801,9 @@ namespace Ryujinx.Ava.Utilities.Configuration
public ReactiveObject RememberWindowState { get; private set; }
///
- /// Enables or disables the redesigned title bar
+ /// Disable the new title bar layout & window layout changes.
///
- public ReactiveObject ShowTitleBar { get; private set; }
+ public ReactiveObject ShowOldUI { get; private set; }
///
/// Enables hardware-accelerated rendering for Avalonia
@@ -828,15 +824,44 @@ namespace Ryujinx.Ava.Utilities.Configuration
Hid = new HidSection();
Multiplayer = new MultiplayerSection();
Hacks = new HacksSection();
- EnableDiscordIntegration = new ReactiveObject();
- CheckUpdatesOnStart = new ReactiveObject();
UpdateCheckerType = new ReactiveObject();
FocusLostActionType = new ReactiveObject();
+ HideCursor = new ReactiveObject();
+ EnableDiscordIntegration = new ReactiveObject();
ShowConfirmExit = new ReactiveObject();
RememberWindowState = new ReactiveObject();
- ShowTitleBar = new ReactiveObject();
+ ShowOldUI = new ReactiveObject();
EnableHardwareAcceleration = new ReactiveObject();
- HideCursor = new ReactiveObject();
}
+
+ public HleConfiguration CreateHleConfiguration() =>
+ new(
+ System.DramSize,
+ System.Language.Value.ToHLE(),
+ System.Region.Value.ToHLE(),
+ Graphics.VSyncMode,
+ System.EnableDockedMode,
+ System.EnablePtc,
+ System.EnableInternetAccess,
+ System.EnableFsIntegrityChecks
+ ? IntegrityCheckLevel.ErrorOnInvalid
+ : IntegrityCheckLevel.None,
+ System.FsGlobalAccessLogMode,
+ System.MatchSystemTime
+ ? 0
+ : System.SystemTimeOffset,
+ System.TimeZone,
+ System.MemoryManagerMode,
+ System.IgnoreMissingServices,
+ Graphics.AspectRatio,
+ System.AudioVolume,
+ System.UseHypervisor,
+ Multiplayer.LanInterfaceId,
+ Multiplayer.Mode,
+ Multiplayer.DisableP2p,
+ Multiplayer.LdnPassphrase,
+ Instance.Multiplayer.GetLdnServer(),
+ Instance.Graphics.CustomVSyncInterval,
+ Instance.Hacks.ShowDirtyHacks ? Instance.Hacks.EnabledHacks : null);
}
}
diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationState.cs b/src/Ryujinx/Systems/Configuration/ConfigurationState.cs
similarity index 97%
rename from src/Ryujinx/Utilities/Configuration/ConfigurationState.cs
rename to src/Ryujinx/Systems/Configuration/ConfigurationState.cs
index 4fdf7c4f0..6fe35c744 100644
--- a/src/Ryujinx/Utilities/Configuration/ConfigurationState.cs
+++ b/src/Ryujinx/Systems/Configuration/ConfigurationState.cs
@@ -1,5 +1,5 @@
-using Ryujinx.Ava.Utilities.Configuration.System;
-using Ryujinx.Ava.Utilities.Configuration.UI;
+using Ryujinx.Ava.Systems.Configuration.System;
+using Ryujinx.Ava.Systems.Configuration.UI;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Configuration.Hid;
using Ryujinx.Common.Configuration.Hid.Keyboard;
@@ -9,7 +9,7 @@ using Ryujinx.HLE;
using System;
using System.Linq;
-namespace Ryujinx.Ava.Utilities.Configuration
+namespace Ryujinx.Ava.Systems.Configuration
{
public partial class ConfigurationState
{
@@ -56,12 +56,11 @@ namespace Ryujinx.Ava.Utilities.Configuration
MatchSystemTime = System.MatchSystemTime,
DockedMode = System.EnableDockedMode,
EnableDiscordIntegration = EnableDiscordIntegration,
- CheckUpdatesOnStart = CheckUpdatesOnStart,
UpdateCheckerType = UpdateCheckerType,
FocusLostActionType = FocusLostActionType,
ShowConfirmExit = ShowConfirmExit,
RememberWindowState = RememberWindowState,
- ShowTitleBar = ShowTitleBar,
+ ShowTitleBar = ShowOldUI,
EnableHardwareAcceleration = EnableHardwareAcceleration,
HideCursor = HideCursor,
VSyncMode = Graphics.VSyncMode,
@@ -183,7 +182,7 @@ namespace Ryujinx.Ava.Utilities.Configuration
FocusLostActionType.Value = FocusLostType.DoNothing;
ShowConfirmExit.Value = true;
RememberWindowState.Value = true;
- ShowTitleBar.Value = !OperatingSystem.IsWindows();
+ ShowOldUI.Value = !OperatingSystem.IsWindows();
EnableHardwareAcceleration.Value = true;
HideCursor.Value = HideCursorMode.OnIdle;
Graphics.VSyncMode.Value = VSyncMode.Switch;
@@ -327,5 +326,5 @@ namespace Ryujinx.Ava.Utilities.Configuration
return GraphicsBackend.OpenGl;
}
- }
- }
+ }
+}
diff --git a/src/Ryujinx/Utilities/Configuration/FileTypes.cs b/src/Ryujinx/Systems/Configuration/FileTypes.cs
similarity index 90%
rename from src/Ryujinx/Utilities/Configuration/FileTypes.cs
rename to src/Ryujinx/Systems/Configuration/FileTypes.cs
index c4550b5a6..70517683b 100644
--- a/src/Ryujinx/Utilities/Configuration/FileTypes.cs
+++ b/src/Ryujinx/Systems/Configuration/FileTypes.cs
@@ -1,8 +1,8 @@
using System;
-using static Ryujinx.Ava.Utilities.Configuration.ConfigurationState.UISection;
+using static Ryujinx.Ava.Systems.Configuration.ConfigurationState.UISection;
-namespace Ryujinx.Ava.Utilities.Configuration
+namespace Ryujinx.Ava.Systems.Configuration
{
public enum FileTypes
{
diff --git a/src/Ryujinx/Utilities/Configuration/LoggerModule.cs b/src/Ryujinx/Systems/Configuration/LoggerModule.cs
similarity index 98%
rename from src/Ryujinx/Utilities/Configuration/LoggerModule.cs
rename to src/Ryujinx/Systems/Configuration/LoggerModule.cs
index f6c1be082..941556c43 100644
--- a/src/Ryujinx/Utilities/Configuration/LoggerModule.cs
+++ b/src/Ryujinx/Systems/Configuration/LoggerModule.cs
@@ -4,7 +4,7 @@ using Ryujinx.Common.Logging.Targets;
using System;
using System.IO;
-namespace Ryujinx.Ava.Utilities.Configuration
+namespace Ryujinx.Ava.Systems.Configuration
{
public static class LoggerModule
{
diff --git a/src/Ryujinx/Utilities/Configuration/System/Language.cs b/src/Ryujinx/Systems/Configuration/System/Language.cs
similarity index 58%
rename from src/Ryujinx/Utilities/Configuration/System/Language.cs
rename to src/Ryujinx/Systems/Configuration/System/Language.cs
index 81a9bd192..ff1476b73 100644
--- a/src/Ryujinx/Utilities/Configuration/System/Language.cs
+++ b/src/Ryujinx/Systems/Configuration/System/Language.cs
@@ -1,7 +1,7 @@
using Ryujinx.Common.Utilities;
using System.Text.Json.Serialization;
-namespace Ryujinx.Ava.Utilities.Configuration.System
+namespace Ryujinx.Ava.Systems.Configuration.System
{
[JsonConverter(typeof(TypedStringEnumConverter))]
public enum Language
@@ -25,4 +25,13 @@ namespace Ryujinx.Ava.Utilities.Configuration.System
TraditionalChinese,
BrazilianPortuguese,
}
+
+ public static class LanguageEnumHelper
+ {
+ public static Language ToUI(this HLE.HOS.SystemState.SystemLanguage hleLanguage)
+ => (Language)hleLanguage;
+
+ public static HLE.HOS.SystemState.SystemLanguage ToHLE(this Language uiLanguage)
+ => (HLE.HOS.SystemState.SystemLanguage)uiLanguage;
+ }
}
diff --git a/src/Ryujinx/Systems/Configuration/System/Region.cs b/src/Ryujinx/Systems/Configuration/System/Region.cs
new file mode 100644
index 000000000..0089f073c
--- /dev/null
+++ b/src/Ryujinx/Systems/Configuration/System/Region.cs
@@ -0,0 +1,26 @@
+using Ryujinx.Common.Utilities;
+using System.Text.Json.Serialization;
+
+namespace Ryujinx.Ava.Systems.Configuration.System
+{
+ [JsonConverter(typeof(TypedStringEnumConverter))]
+ public enum Region
+ {
+ Japan,
+ USA,
+ Europe,
+ Australia,
+ China,
+ Korea,
+ Taiwan,
+ }
+
+ public static class RegionEnumHelper
+ {
+ public static Region ToUI(this HLE.HOS.SystemState.RegionCode hleRegion)
+ => (Region)hleRegion;
+
+ public static HLE.HOS.SystemState.RegionCode ToHLE(this Region uiRegion)
+ => (HLE.HOS.SystemState.RegionCode)uiRegion;
+ }
+}
diff --git a/src/Ryujinx/Utilities/Configuration/UI/ColumnSort.cs b/src/Ryujinx/Systems/Configuration/UI/ColumnSort.cs
similarity index 73%
rename from src/Ryujinx/Utilities/Configuration/UI/ColumnSort.cs
rename to src/Ryujinx/Systems/Configuration/UI/ColumnSort.cs
index e74ca0ec5..e5f54c799 100644
--- a/src/Ryujinx/Utilities/Configuration/UI/ColumnSort.cs
+++ b/src/Ryujinx/Systems/Configuration/UI/ColumnSort.cs
@@ -1,4 +1,4 @@
-namespace Ryujinx.Ava.Utilities.Configuration.UI
+namespace Ryujinx.Ava.Systems.Configuration.UI
{
public struct ColumnSort
{
diff --git a/src/Ryujinx/Utilities/Configuration/UI/FocusLostType.cs b/src/Ryujinx/Systems/Configuration/UI/FocusLostType.cs
similarity index 86%
rename from src/Ryujinx/Utilities/Configuration/UI/FocusLostType.cs
rename to src/Ryujinx/Systems/Configuration/UI/FocusLostType.cs
index eea588539..2d0341022 100644
--- a/src/Ryujinx/Utilities/Configuration/UI/FocusLostType.cs
+++ b/src/Ryujinx/Systems/Configuration/UI/FocusLostType.cs
@@ -1,7 +1,7 @@
using Ryujinx.Common.Utilities;
using System.Text.Json.Serialization;
-namespace Ryujinx.Ava.Utilities.Configuration.UI
+namespace Ryujinx.Ava.Systems.Configuration.UI
{
[JsonConverter(typeof(TypedStringEnumConverter))]
public enum FocusLostType
diff --git a/src/Ryujinx/Utilities/Configuration/UI/GuiColumns.cs b/src/Ryujinx/Systems/Configuration/UI/GuiColumns.cs
similarity index 91%
rename from src/Ryujinx/Utilities/Configuration/UI/GuiColumns.cs
rename to src/Ryujinx/Systems/Configuration/UI/GuiColumns.cs
index 0ab9885fe..a0021be96 100644
--- a/src/Ryujinx/Utilities/Configuration/UI/GuiColumns.cs
+++ b/src/Ryujinx/Systems/Configuration/UI/GuiColumns.cs
@@ -1,4 +1,4 @@
-namespace Ryujinx.Ava.Utilities.Configuration.UI
+namespace Ryujinx.Ava.Systems.Configuration.UI
{
public struct GuiColumns
{
diff --git a/src/Ryujinx/Utilities/Configuration/UI/ShownFileTypes.cs b/src/Ryujinx/Systems/Configuration/UI/ShownFileTypes.cs
similarity index 85%
rename from src/Ryujinx/Utilities/Configuration/UI/ShownFileTypes.cs
rename to src/Ryujinx/Systems/Configuration/UI/ShownFileTypes.cs
index 9541b4885..bc32bd153 100644
--- a/src/Ryujinx/Utilities/Configuration/UI/ShownFileTypes.cs
+++ b/src/Ryujinx/Systems/Configuration/UI/ShownFileTypes.cs
@@ -1,4 +1,4 @@
-namespace Ryujinx.Ava.Utilities.Configuration.UI
+namespace Ryujinx.Ava.Systems.Configuration.UI
{
public struct ShownFileTypes
{
diff --git a/src/Ryujinx/Utilities/Configuration/UI/UpdaterType.cs b/src/Ryujinx/Systems/Configuration/UI/UpdaterType.cs
similarity index 83%
rename from src/Ryujinx/Utilities/Configuration/UI/UpdaterType.cs
rename to src/Ryujinx/Systems/Configuration/UI/UpdaterType.cs
index 2ab17a497..06cf35d10 100644
--- a/src/Ryujinx/Utilities/Configuration/UI/UpdaterType.cs
+++ b/src/Ryujinx/Systems/Configuration/UI/UpdaterType.cs
@@ -1,7 +1,7 @@
using Ryujinx.Common.Utilities;
using System.Text.Json.Serialization;
-namespace Ryujinx.Ava.Utilities.Configuration.UI
+namespace Ryujinx.Ava.Systems.Configuration.UI
{
[JsonConverter(typeof(TypedStringEnumConverter))]
public enum UpdaterType
diff --git a/src/Ryujinx/Utilities/Configuration/UI/WindowStartup.cs b/src/Ryujinx/Systems/Configuration/UI/WindowStartup.cs
similarity index 85%
rename from src/Ryujinx/Utilities/Configuration/UI/WindowStartup.cs
rename to src/Ryujinx/Systems/Configuration/UI/WindowStartup.cs
index 6c5e36879..be93ef4b6 100644
--- a/src/Ryujinx/Utilities/Configuration/UI/WindowStartup.cs
+++ b/src/Ryujinx/Systems/Configuration/UI/WindowStartup.cs
@@ -1,4 +1,4 @@
-namespace Ryujinx.Ava.Utilities.Configuration.UI
+namespace Ryujinx.Ava.Systems.Configuration.UI
{
public struct WindowStartup
{
diff --git a/src/Ryujinx/DiscordIntegrationModule.cs b/src/Ryujinx/Systems/DiscordIntegrationModule.cs
similarity index 96%
rename from src/Ryujinx/DiscordIntegrationModule.cs
rename to src/Ryujinx/Systems/DiscordIntegrationModule.cs
index 8d232b4fb..8a3b42ac8 100644
--- a/src/Ryujinx/DiscordIntegrationModule.cs
+++ b/src/Ryujinx/Systems/DiscordIntegrationModule.cs
@@ -1,18 +1,17 @@
using DiscordRPC;
using Gommon;
using Ryujinx.Ava.Utilities;
-using Ryujinx.Ava.Utilities.AppLibrary;
-using Ryujinx.Ava.Utilities.Configuration;
-using Ryujinx.Ava.Utilities.PlayReport;
+using Ryujinx.Ava.Systems.AppLibrary;
+using Ryujinx.Ava.Systems.Configuration;
+using Ryujinx.Ava.Systems.PlayReport;
using Ryujinx.Common;
using Ryujinx.Common.Logging;
using Ryujinx.HLE;
using Ryujinx.HLE.Loaders.Processes;
using Ryujinx.Horizon;
-using Ryujinx.Horizon.Prepo.Types;
using System.Text;
-namespace Ryujinx.Ava
+namespace Ryujinx.Ava.Systems
{
public static class DiscordIntegrationModule
{
@@ -124,7 +123,7 @@ namespace Ryujinx.Ava
_currentApp = null;
}
- private static void HandlePlayReport(PlayReport playReport)
+ private static void HandlePlayReport(Horizon.Prepo.Types.PlayReport playReport)
{
if (_discordClient is null) return;
if (!TitleIDs.CurrentApplication.Value.HasValue) return;
diff --git a/src/Ryujinx/Utilities/PlayReport/Analyzer.cs b/src/Ryujinx/Systems/PlayReport/Analyzer.cs
similarity index 98%
rename from src/Ryujinx/Utilities/PlayReport/Analyzer.cs
rename to src/Ryujinx/Systems/PlayReport/Analyzer.cs
index 8faf4fb31..d4198cdcf 100644
--- a/src/Ryujinx/Utilities/PlayReport/Analyzer.cs
+++ b/src/Ryujinx/Systems/PlayReport/Analyzer.cs
@@ -1,5 +1,5 @@
using Gommon;
-using Ryujinx.Ava.Utilities.AppLibrary;
+using Ryujinx.Ava.Systems.AppLibrary;
using Ryujinx.Common.Logging;
using System;
using System.Collections.Generic;
@@ -7,7 +7,7 @@ using System.Collections.ObjectModel;
using System.Globalization;
using System.Linq;
-namespace Ryujinx.Ava.Utilities.PlayReport
+namespace Ryujinx.Ava.Systems.PlayReport
{
///
/// The entrypoint for the Play Report analysis system.
diff --git a/src/Ryujinx/Utilities/PlayReport/Delegates.cs b/src/Ryujinx/Systems/PlayReport/Delegates.cs
similarity index 97%
rename from src/Ryujinx/Utilities/PlayReport/Delegates.cs
rename to src/Ryujinx/Systems/PlayReport/Delegates.cs
index 92569d32e..b3496ec4d 100644
--- a/src/Ryujinx/Utilities/PlayReport/Delegates.cs
+++ b/src/Ryujinx/Systems/PlayReport/Delegates.cs
@@ -1,4 +1,4 @@
-namespace Ryujinx.Ava.Utilities.PlayReport
+namespace Ryujinx.Ava.Systems.PlayReport
{
///
/// The delegate type that powers single value formatters.
diff --git a/src/Ryujinx/Utilities/PlayReport/MatchedValues.cs b/src/Ryujinx/Systems/PlayReport/MatchedValues.cs
similarity index 96%
rename from src/Ryujinx/Utilities/PlayReport/MatchedValues.cs
rename to src/Ryujinx/Systems/PlayReport/MatchedValues.cs
index 46cae678a..025130758 100644
--- a/src/Ryujinx/Utilities/PlayReport/MatchedValues.cs
+++ b/src/Ryujinx/Systems/PlayReport/MatchedValues.cs
@@ -1,8 +1,8 @@
using MsgPack;
-using Ryujinx.Ava.Utilities.AppLibrary;
+using Ryujinx.Ava.Systems.AppLibrary;
using System.Collections.Generic;
-namespace Ryujinx.Ava.Utilities.PlayReport
+namespace Ryujinx.Ava.Systems.PlayReport
{
public abstract class MatchedValue
{
diff --git a/src/Ryujinx/Utilities/PlayReport/PlayReports.Formatters.cs b/src/Ryujinx/Systems/PlayReport/PlayReports.Formatters.cs
similarity index 99%
rename from src/Ryujinx/Utilities/PlayReport/PlayReports.Formatters.cs
rename to src/Ryujinx/Systems/PlayReport/PlayReports.Formatters.cs
index b5215c693..5c5fb40f4 100644
--- a/src/Ryujinx/Utilities/PlayReport/PlayReports.Formatters.cs
+++ b/src/Ryujinx/Systems/PlayReport/PlayReports.Formatters.cs
@@ -5,7 +5,7 @@ using System.Buffers.Binary;
using System.Collections.Generic;
using System.Linq;
-namespace Ryujinx.Ava.Utilities.PlayReport
+namespace Ryujinx.Ava.Systems.PlayReport
{
public partial class PlayReports
{
diff --git a/src/Ryujinx/Utilities/PlayReport/PlayReports.cs b/src/Ryujinx/Systems/PlayReport/PlayReports.cs
similarity index 99%
rename from src/Ryujinx/Utilities/PlayReport/PlayReports.cs
rename to src/Ryujinx/Systems/PlayReport/PlayReports.cs
index c46ae2be5..e42ca185c 100644
--- a/src/Ryujinx/Utilities/PlayReport/PlayReports.cs
+++ b/src/Ryujinx/Systems/PlayReport/PlayReports.cs
@@ -1,6 +1,6 @@
using System;
-namespace Ryujinx.Ava.Utilities.PlayReport
+namespace Ryujinx.Ava.Systems.PlayReport
{
public static partial class PlayReports
{
diff --git a/src/Ryujinx/Utilities/PlayReport/Specs.cs b/src/Ryujinx/Systems/PlayReport/Specs.cs
similarity index 97%
rename from src/Ryujinx/Utilities/PlayReport/Specs.cs
rename to src/Ryujinx/Systems/PlayReport/Specs.cs
index c162d4c2c..2dd1c02ac 100644
--- a/src/Ryujinx/Utilities/PlayReport/Specs.cs
+++ b/src/Ryujinx/Systems/PlayReport/Specs.cs
@@ -1,10 +1,10 @@
using MsgPack;
-using Ryujinx.Ava.Utilities.AppLibrary;
+using Ryujinx.Ava.Systems.AppLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
-namespace Ryujinx.Ava.Utilities.PlayReport
+namespace Ryujinx.Ava.Systems.PlayReport
{
///
/// A mapping of title IDs to value formatter specs.
@@ -103,7 +103,7 @@ namespace Ryujinx.Ava.Utilities.PlayReport
/// matching a specific set of keys that could exist in a Play Report for the previously specified title IDs.
///
/// The 'Sparse' multi-value formatters do not require every key to be present.
- /// If you need this requirement, use .
+ /// If you need this requirement, use .
///
/// The key names to match.
/// The function which can format the values.
@@ -118,7 +118,7 @@ namespace Ryujinx.Ava.Utilities.PlayReport
/// matching a specific set of keys that could exist in a Play Report for the previously specified title IDs.
///
/// The 'Sparse' multi-value formatters do not require every key to be present.
- /// If you need this requirement, use .
+ /// If you need this requirement, use .
///
/// The resolution priority of this value formatter. Higher resolves sooner.
/// The key names to match.
diff --git a/src/Ryujinx/Utilities/PlayReport/Value.cs b/src/Ryujinx/Systems/PlayReport/Value.cs
similarity index 99%
rename from src/Ryujinx/Utilities/PlayReport/Value.cs
rename to src/Ryujinx/Systems/PlayReport/Value.cs
index b3108a41e..1c738c213 100644
--- a/src/Ryujinx/Utilities/PlayReport/Value.cs
+++ b/src/Ryujinx/Systems/PlayReport/Value.cs
@@ -3,7 +3,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
-namespace Ryujinx.Ava.Utilities.PlayReport
+namespace Ryujinx.Ava.Systems.PlayReport
{
///
/// The base input data to a ValueFormatter delegate,
diff --git a/src/Ryujinx/Rebooter.cs b/src/Ryujinx/Systems/Rebooter.cs
similarity index 96%
rename from src/Ryujinx/Rebooter.cs
rename to src/Ryujinx/Systems/Rebooter.cs
index 8c7755a4c..4b149e9e3 100644
--- a/src/Ryujinx/Rebooter.cs
+++ b/src/Ryujinx/Systems/Rebooter.cs
@@ -1,8 +1,6 @@
using FluentAvalonia.UI.Controls;
using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.Ava.Utilities;
-using SkiaSharp;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -10,7 +8,7 @@ using System.IO;
using System.Linq;
using System.Threading.Tasks;
-namespace Ryujinx.Ava
+namespace Ryujinx.Ava.Systems
{
internal static class Rebooter
{
diff --git a/src/Ryujinx/Updater.cs b/src/Ryujinx/Systems/Updater.cs
similarity index 99%
rename from src/Ryujinx/Updater.cs
rename to src/Ryujinx/Systems/Updater.cs
index 7ca5e885a..850bacc60 100644
--- a/src/Ryujinx/Updater.cs
+++ b/src/Ryujinx/Systems/Updater.cs
@@ -27,7 +27,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
-namespace Ryujinx.Ava
+namespace Ryujinx.Ava.Systems
{
internal static class Updater
{
diff --git a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs
index a8a6f24c6..18252f337 100644
--- a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs
+++ b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs
@@ -7,7 +7,7 @@ using Ryujinx.Ava.UI.Controls;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.Ava.UI.Windows;
-using Ryujinx.Ava.Utilities.Configuration;
+using Ryujinx.Ava.Systems.Configuration;
using Ryujinx.Common;
using Ryujinx.HLE;
using Ryujinx.HLE.HOS.Applets;
diff --git a/src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml b/src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml
index d929cc501..20d466031 100644
--- a/src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml
+++ b/src/Ryujinx/UI/Applet/ProfileSelectorDialog.axaml
@@ -17,12 +17,8 @@
-
-
-
-
-
-
+
+
{
- public ProfileSelectorDialogViewModel ViewModel { get; set; }
-
public ProfileSelectorDialog(ProfileSelectorDialogViewModel viewModel)
{
DataContext = ViewModel = viewModel;
diff --git a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs
index b2beb23e0..64377ba51 100644
--- a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs
+++ b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs
@@ -11,8 +11,8 @@ using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.Ava.UI.Windows;
using Ryujinx.Ava.Utilities;
-using Ryujinx.Ava.Utilities.AppLibrary;
-using Ryujinx.Ava.Utilities.Compat;
+using Ryujinx.Ava.Systems.AppLibrary;
+using Ryujinx.Ava.UI.Views.Dialog;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Helper;
using Ryujinx.HLE.HOS;
@@ -26,6 +26,7 @@ namespace Ryujinx.Ava.UI.Controls
{
public class ApplicationContextMenu : MenuFlyout
{
+
public ApplicationContextMenu()
{
InitializeComponent();
@@ -79,13 +80,13 @@ namespace Ryujinx.Ava.UI.Controls
public async void OpenTitleUpdateManager_Click(object sender, RoutedEventArgs args)
{
if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
- await TitleUpdateWindow.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication);
+ await TitleUpdateManagerView.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication);
}
public async void OpenDownloadableContentManager_Click(object sender, RoutedEventArgs args)
{
if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
- await DownloadableContentManagerWindow.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication);
+ await DownloadableContentManagerView.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication);
}
public async void OpenCheatManager_Click(object sender, RoutedEventArgs args)
@@ -126,7 +127,7 @@ namespace Ryujinx.Ava.UI.Controls
public async void OpenModManager_Click(object sender, RoutedEventArgs args)
{
if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
- await ModManagerWindow.Show(
+ await ModManagerView.Show(
viewModel.SelectedApplication.Id,
viewModel.SelectedApplication.IdBase,
viewModel.ApplicationLibrary,
@@ -406,7 +407,7 @@ namespace Ryujinx.Ava.UI.Controls
public async void OpenApplicationCompatibility_Click(object sender, RoutedEventArgs args)
{
if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
- await CompatibilityList.Show(viewModel.SelectedApplication.IdString);
+ await CompatibilityListWindow.Show(viewModel.SelectedApplication.IdString);
}
public async void OpenApplicationData_Click(object sender, RoutedEventArgs args)
diff --git a/src/Ryujinx/UI/Controls/StatusBarSeparator.cs b/src/Ryujinx/UI/Controls/MiniVerticalSeparator.cs
similarity index 100%
rename from src/Ryujinx/UI/Controls/StatusBarSeparator.cs
rename to src/Ryujinx/UI/Controls/MiniVerticalSeparator.cs
diff --git a/src/Ryujinx/UI/Controls/NavigationDialogHost.axaml.cs b/src/Ryujinx/UI/Controls/NavigationDialogHost.axaml.cs
index fdfc588e2..12c6a9daf 100644
--- a/src/Ryujinx/UI/Controls/NavigationDialogHost.axaml.cs
+++ b/src/Ryujinx/UI/Controls/NavigationDialogHost.axaml.cs
@@ -23,13 +23,12 @@ using UserProfile = Ryujinx.Ava.UI.Models.UserProfile;
namespace Ryujinx.Ava.UI.Controls
{
- public partial class NavigationDialogHost : UserControl
+ public partial class NavigationDialogHost : RyujinxControl
{
public AccountManager AccountManager { get; }
public ContentManager ContentManager { get; }
public VirtualFileSystem VirtualFileSystem { get; }
public HorizonClient HorizonClient { get; }
- public UserProfileViewModel ViewModel { get; set; }
public NavigationDialogHost()
{
diff --git a/src/Ryujinx/UI/Controls/RyujinxControl.cs b/src/Ryujinx/UI/Controls/RyujinxControl.cs
new file mode 100644
index 000000000..748d7ed94
--- /dev/null
+++ b/src/Ryujinx/UI/Controls/RyujinxControl.cs
@@ -0,0 +1,24 @@
+using Avalonia.Controls;
+using Gommon;
+using Ryujinx.Ava.UI.ViewModels;
+using System;
+
+namespace Ryujinx.Ava.UI.Controls
+{
+ public class RyujinxControl : UserControl where TViewModel : BaseModel
+ {
+ public TViewModel ViewModel
+ {
+ get
+ {
+ if (DataContext is not TViewModel viewModel)
+ throw new InvalidOperationException(
+ $"Underlying DataContext is not of type {typeof(TViewModel).AsPrettyString()}; " +
+ $"Actual type is {DataContext?.GetType().AsPrettyString()}");
+
+ return viewModel;
+ }
+ set => DataContext = value;
+ }
+ }
+}
diff --git a/src/Ryujinx/UI/Controls/RyujinxLogo.cs b/src/Ryujinx/UI/Controls/RyujinxLogo.cs
new file mode 100644
index 000000000..89b89f311
--- /dev/null
+++ b/src/Ryujinx/UI/Controls/RyujinxLogo.cs
@@ -0,0 +1,28 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Media.Imaging;
+using Ryujinx.Ava.Systems.Configuration;
+using Ryujinx.Ava.UI.ViewModels;
+using System.Reflection;
+
+namespace Ryujinx.Ava.UI.Controls
+{
+ public class RyujinxLogo : Image
+ {
+ // The UI specifically uses a thicker bordered variant of the icon to avoid crunching out the border at lower resolutions.
+ // For an example of this, download canary 1.2.95, then open the settings menu, and look at the icon in the top-left.
+ // The border gets reduced to colored pixels in the 4 corners.
+ public static readonly Bitmap Bitmap =
+ new(Assembly.GetAssembly(typeof(MainWindowViewModel))!
+ .GetManifestResourceStream("Ryujinx.Assets.UIImages.Logo_Ryujinx_AntiAlias.png")!);
+
+ public RyujinxLogo()
+ {
+ Margin = new Thickness(7, 7, 7, 0);
+ Height = 25;
+ Width = 25;
+ Source = Bitmap;
+ IsVisible = !ConfigurationState.Instance.ShowOldUI;
+ }
+ }
+}
diff --git a/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs b/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs
index 0ceaa6c4c..93f6b4c3c 100644
--- a/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs
+++ b/src/Ryujinx/UI/Helpers/ApplicationOpenedEventArgs.cs
@@ -1,5 +1,5 @@
using Avalonia.Interactivity;
-using Ryujinx.Ava.Utilities.AppLibrary;
+using Ryujinx.Ava.Systems.AppLibrary;
namespace Ryujinx.Ava.UI.Helpers
{
diff --git a/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs b/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs
index b523e1143..a93b2894e 100644
--- a/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs
+++ b/src/Ryujinx/UI/Helpers/ContentDialogHelper.cs
@@ -4,6 +4,7 @@ using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Input;
using Avalonia.Layout;
using Avalonia.Media;
+using Avalonia.Styling;
using Avalonia.Threading;
using FluentAvalonia.Core;
using FluentAvalonia.UI.Controls;
@@ -21,6 +22,23 @@ namespace Ryujinx.Ava.UI.Helpers
private static bool _isChoiceDialogOpen;
private static ContentDialogOverlayWindow _contentDialogOverlayWindow;
+ public static ContentDialog ApplyStyles(
+ this ContentDialog contentDialog,
+ double closeButtonWidth = 80,
+ HorizontalAlignment buttonSpaceAlignment = HorizontalAlignment.Right)
+ {
+ Style closeButton = new(x => x.Name("CloseButton"));
+ closeButton.Setters.Add(new Setter(Layoutable.WidthProperty, closeButtonWidth));
+
+ Style closeButtonParent = new(x => x.Name("CommandSpace"));
+ closeButtonParent.Setters.Add(new Setter(Layoutable.HorizontalAlignmentProperty, buttonSpaceAlignment));
+
+ contentDialog.Styles.Add(closeButton);
+ contentDialog.Styles.Add(closeButtonParent);
+
+ return contentDialog;
+ }
+
private async static Task ShowContentDialog(
string title,
object content,
@@ -40,19 +58,19 @@ namespace Ryujinx.Ava.UI.Helpers
SecondaryButtonText = secondaryButton,
CloseButtonText = closeButton,
Content = content,
- PrimaryButtonCommand = MiniCommand.Create(() =>
+ PrimaryButtonCommand = Commands.Create(() =>
{
result = primaryButtonResult;
})
};
- contentDialog.SecondaryButtonCommand = MiniCommand.Create(() =>
+ contentDialog.SecondaryButtonCommand = Commands.Create(() =>
{
result = UserResult.No;
contentDialog.PrimaryButtonClick -= deferCloseAction;
});
- contentDialog.CloseButtonCommand = MiniCommand.Create(() =>
+ contentDialog.CloseButtonCommand = Commands.Create(() =>
{
result = UserResult.Cancel;
contentDialog.PrimaryButtonClick -= deferCloseAction;
diff --git a/src/Ryujinx/UI/Helpers/Converters/MultiplayerInfoConverter.cs b/src/Ryujinx/UI/Helpers/Converters/MultiplayerInfoConverter.cs
index 7694e8883..1dca0d164 100644
--- a/src/Ryujinx/UI/Helpers/Converters/MultiplayerInfoConverter.cs
+++ b/src/Ryujinx/UI/Helpers/Converters/MultiplayerInfoConverter.cs
@@ -2,7 +2,7 @@ using Avalonia.Data.Converters;
using Avalonia.Markup.Xaml;
using Gommon;
using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.Utilities.AppLibrary;
+using Ryujinx.Ava.Systems.AppLibrary;
using System;
using System.Globalization;
using System.Text;
diff --git a/src/Ryujinx/UI/Windows/IconColorPicker.cs b/src/Ryujinx/UI/Helpers/IconColorPicker.cs
similarity index 98%
rename from src/Ryujinx/UI/Windows/IconColorPicker.cs
rename to src/Ryujinx/UI/Helpers/IconColorPicker.cs
index ca9ac2c05..b6ee8bbbf 100644
--- a/src/Ryujinx/UI/Windows/IconColorPicker.cs
+++ b/src/Ryujinx/UI/Helpers/IconColorPicker.cs
@@ -2,9 +2,9 @@ using SkiaSharp;
using System;
using System.Collections.Generic;
-namespace Ryujinx.Ava.UI.Windows
+namespace Ryujinx.Ava.UI.Helpers
{
- static class IconColorPicker
+ public static class IconColorPicker
{
private const int ColorsPerLine = 64;
private const int TotalColors = ColorsPerLine * ColorsPerLine;
diff --git a/src/Ryujinx/UI/Helpers/LoggerAdapter.cs b/src/Ryujinx/UI/Helpers/LoggerAdapter.cs
index ba317e74a..902d3966f 100644
--- a/src/Ryujinx/UI/Helpers/LoggerAdapter.cs
+++ b/src/Ryujinx/UI/Helpers/LoggerAdapter.cs
@@ -1,7 +1,7 @@
using Avalonia.Logging;
using Avalonia.Utilities;
using Gommon;
-using Ryujinx.Ava.Utilities.Configuration;
+using Ryujinx.Ava.Systems.Configuration;
using Ryujinx.Common.Logging;
using System;
using System.Text;
diff --git a/src/Ryujinx/UI/Helpers/MiniCommand.cs b/src/Ryujinx/UI/Helpers/MiniCommand.cs
deleted file mode 100644
index 9782aa69d..000000000
--- a/src/Ryujinx/UI/Helpers/MiniCommand.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using System;
-using System.Threading.Tasks;
-using System.Windows.Input;
-
-namespace Ryujinx.Ava.UI.Helpers
-{
- public sealed class MiniCommand : MiniCommand, ICommand
- {
- private readonly Action _callback;
- private bool _busy;
- private readonly Func _asyncCallback;
-
- public MiniCommand(Action callback)
- {
- _callback = callback;
- }
-
- public MiniCommand(Func callback)
- {
- _asyncCallback = callback;
- }
-
- private bool Busy
- {
- get => _busy;
- set
- {
- _busy = value;
- CanExecuteChanged?.Invoke(this, EventArgs.Empty);
- }
- }
-
- public override event EventHandler CanExecuteChanged;
- public override bool CanExecute(object parameter) => !_busy;
-
- public override async void Execute(object parameter)
- {
- if (Busy)
- {
- return;
- }
- try
- {
- Busy = true;
- if (_callback != null)
- {
- _callback((T)parameter);
- }
- else
- {
- await _asyncCallback((T)parameter);
- }
- }
- finally
- {
- Busy = false;
- }
- }
- }
-
- public abstract class MiniCommand : ICommand
- {
- public static MiniCommand Create(Action callback) => new MiniCommand
diff --git a/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml.cs b/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml.cs
index 2b0e57cb5..fb839a473 100644
--- a/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml.cs
+++ b/src/Ryujinx/UI/Views/Settings/SettingsUIView.axaml.cs
@@ -3,10 +3,10 @@ using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Platform.Storage;
using Gommon;
+using Ryujinx.Ava.UI.Controls;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.Ava.Utilities;
-using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -14,20 +14,18 @@ using System.Threading.Tasks;
namespace Ryujinx.Ava.UI.Views.Settings
{
- public partial class SettingsUiView : UserControl
+ public partial class SettingsUiView : RyujinxControl
{
- public SettingsViewModel ViewModel;
-
public SettingsUiView()
{
InitializeComponent();
AddGameDirButton.Command =
- Commands.Create(() => AddDirButton(GameDirPathBox, ViewModel.GameDirectories, true));
+ Commands.Create(() => AddDirButton(GameDirPathBox, ViewModel.GameDirectories));
AddAutoloadDirButton.Command =
- Commands.Create(() => AddDirButton(AutoloadDirPathBox, ViewModel.AutoloadDirectories, false));
+ Commands.Create(() => AddDirButton(AutoloadDirPathBox, ViewModel.AutoloadDirectories));
}
- private async Task AddDirButton(TextBox addDirBox, AvaloniaList directories, bool isGameList)
+ private async Task AddDirButton(TextBox addDirBox, AvaloniaList directories)
{
string path = addDirBox.Text;
diff --git a/src/Ryujinx/UI/Views/User/UserEditorView.axaml b/src/Ryujinx/UI/Views/User/UserEditorView.axaml
index 8b5375eb4..47f6a60e1 100644
--- a/src/Ryujinx/UI/Views/User/UserEditorView.axaml
+++ b/src/Ryujinx/UI/Views/User/UserEditorView.axaml
@@ -14,15 +14,7 @@
mc:Ignorable="d"
Focusable="True"
x:DataType="models:TempProfile">
-
-
-
-
-
-
-
-
-
+
{
private NavigationDialogHost _parent;
private UserProfile _profile;
private bool _isNewUser;
-
- public TempProfile TempProfile { get; set; }
+
public static uint MaxProfileNameLength => 0x20;
public bool IsDeletable => _profile.UserId != AccountManager.DefaultUserId;
@@ -42,7 +40,7 @@ namespace Ryujinx.Ava.UI.Views.User
(NavigationDialogHost parent, UserProfile profile, bool isNewUser) = ((NavigationDialogHost parent, UserProfile profile, bool isNewUser))arg.Parameter;
_isNewUser = isNewUser;
_profile = profile;
- TempProfile = new TempProfile(_profile);
+ ViewModel = new TempProfile(_profile);
_parent = parent;
break;
@@ -51,8 +49,6 @@ namespace Ryujinx.Ava.UI.Views.User
((ContentDialog)_parent.Parent).Title = $"{LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle]} - " +
$"{(_isNewUser ? LocaleManager.Instance[LocaleKeys.UserEditorTitleCreate] : LocaleManager.Instance[LocaleKeys.UserEditorTitle])}";
- DataContext = TempProfile;
-
AddPictureButton.IsVisible = _isNewUser;
ChangePictureButton.IsVisible = !_isNewUser;
IdLabel.IsVisible = _profile != null;
@@ -72,7 +68,7 @@ namespace Ryujinx.Ava.UI.Views.User
{
if (_isNewUser)
{
- if (TempProfile.Name != String.Empty || TempProfile.Image != null)
+ if (ViewModel.Name != string.Empty || ViewModel.Image != null)
{
if (await ContentDialogHelper.CreateChoiceDialog(
LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesTitle],
@@ -89,7 +85,7 @@ namespace Ryujinx.Ava.UI.Views.User
}
else
{
- if (_profile.Name != TempProfile.Name || _profile.Image != TempProfile.Image)
+ if (_profile.Name != ViewModel.Name || _profile.Image != ViewModel.Image)
{
if (await ContentDialogHelper.CreateChoiceDialog(
LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesTitle],
@@ -115,31 +111,31 @@ namespace Ryujinx.Ava.UI.Views.User
{
DataValidationErrors.ClearErrors(NameBox);
- if (string.IsNullOrWhiteSpace(TempProfile.Name))
+ if (string.IsNullOrWhiteSpace(ViewModel.Name))
{
DataValidationErrors.SetError(NameBox, new DataValidationException(LocaleManager.Instance[LocaleKeys.UserProfileEmptyNameError]));
return;
}
- if (TempProfile.Image == null)
+ if (ViewModel.Image == null)
{
- _parent.Navigate(typeof(UserProfileImageSelectorView), (_parent, TempProfile));
+ _parent.Navigate(typeof(UserProfileImageSelectorView), (_parent, ViewModel));
return;
}
if (_profile != null && !_isNewUser)
{
- _profile.Name = TempProfile.Name;
- _profile.Image = TempProfile.Image;
+ _profile.Name = ViewModel.Name;
+ _profile.Image = ViewModel.Image;
_profile.UpdateState();
_parent.AccountManager.SetUserName(_profile.UserId, _profile.Name);
_parent.AccountManager.SetUserImage(_profile.UserId, _profile.Image);
}
else if (_isNewUser)
{
- _parent.AccountManager.AddUser(TempProfile.Name, TempProfile.Image, TempProfile.UserId);
+ _parent.AccountManager.AddUser(ViewModel.Name, ViewModel.Image, ViewModel.UserId);
}
else
{
@@ -151,7 +147,7 @@ namespace Ryujinx.Ava.UI.Views.User
public void SelectProfileImage()
{
- _parent.Navigate(typeof(UserProfileImageSelectorView), (_parent, TempProfile));
+ _parent.Navigate(typeof(UserProfileImageSelectorView), (_parent, ViewModel));
}
private void ChangePictureButton_Click(object sender, RoutedEventArgs e)
diff --git a/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml b/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml
index b6442918b..c22624fd5 100644
--- a/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml
+++ b/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml
@@ -20,13 +20,7 @@
-
-
-
-
-
-
+ VerticalAlignment="Stretch" RowDefinitions="Auto,*,Auto,Auto">
{
private NavigationDialogHost _parent;
private TempProfile _profile;
@@ -20,8 +19,6 @@ namespace Ryujinx.Ava.UI.Views.User
{
ContentManager = contentManager;
- DataContext = ViewModel;
-
InitializeComponent();
}
@@ -55,8 +52,6 @@ namespace Ryujinx.Ava.UI.Views.User
public ContentManager ContentManager { get; private set; }
- internal UserFirmwareAvatarSelectorViewModel ViewModel { get; set; }
-
private void GoBack(object sender, RoutedEventArgs e)
{
_parent.GoBack();
diff --git a/src/Ryujinx/UI/Views/User/UserProfileImageSelectorView.axaml b/src/Ryujinx/UI/Views/User/UserProfileImageSelectorView.axaml
index 26e27176b..03aebec8f 100644
--- a/src/Ryujinx/UI/Views/User/UserProfileImageSelectorView.axaml
+++ b/src/Ryujinx/UI/Views/User/UserProfileImageSelectorView.axaml
@@ -17,12 +17,7 @@
-
-
-
-
-
+ VerticalAlignment="Center" RowDefinitions="Auto,70,Auto">
{
private ContentManager _contentManager;
private NavigationDialogHost _parent;
private TempProfile _profile;
- internal UserProfileImageSelectorViewModel ViewModel { get; private set; }
-
public UserProfileImageSelectorView()
{
InitializeComponent();
diff --git a/src/Ryujinx/UI/Views/User/UserRecovererView.axaml b/src/Ryujinx/UI/Views/User/UserRecovererView.axaml
index f49444642..43d84787d 100644
--- a/src/Ryujinx/UI/Views/User/UserRecovererView.axaml
+++ b/src/Ryujinx/UI/Views/User/UserRecovererView.axaml
@@ -18,11 +18,7 @@
-
-
-
-
+ VerticalAlignment="Stretch" RowDefinitions="*,Auto">
-
-
-
-
-
+
{
private NavigationDialogHost _parent;
diff --git a/src/Ryujinx/UI/Views/User/UserSaveManagerView.axaml b/src/Ryujinx/UI/Views/User/UserSaveManagerView.axaml
index 576b15731..f04b8a7a3 100644
--- a/src/Ryujinx/UI/Views/User/UserSaveManagerView.axaml
+++ b/src/Ryujinx/UI/Views/User/UserSaveManagerView.axaml
@@ -19,19 +19,10 @@
-
-
-
-
-
-
+
-
-
-
-
+ HorizontalAlignment="Stretch" ColumnDefinitions="Auto,*">
-
-
-
-
+ Margin="10,0, 0, 0" ColumnDefinitions="Auto,*">
-
-
-
-
-
+
{
- internal UserSaveManagerViewModel ViewModel { get; private set; }
-
private AccountManager _accountManager;
private HorizonClient _horizonClient;
private VirtualFileSystem _virtualFileSystem;
@@ -66,7 +63,7 @@ namespace Ryujinx.Ava.UI.Views.User
public void LoadSaves()
{
- ViewModel.Saves.Clear();
+ Dispatcher.UIThread.Post(() => ViewModel.Saves.Clear());
ObservableCollection saves = [];
SaveDataFilter saveDataFilter = SaveDataFilter.Make(
programId: default,
diff --git a/src/Ryujinx/UI/Views/User/UserSelectorView.axaml b/src/Ryujinx/UI/Views/User/UserSelectorView.axaml
index 5d86d9d55..d0fd5eeda 100644
--- a/src/Ryujinx/UI/Views/User/UserSelectorView.axaml
+++ b/src/Ryujinx/UI/Views/User/UserSelectorView.axaml
@@ -18,11 +18,7 @@
-
-
-
-
-
+
{
private NavigationDialogHost _parent;
- public UserProfileViewModel ViewModel { get; set; }
-
public UserSelectorViews()
{
InitializeComponent();
diff --git a/src/Ryujinx/UI/Windows/AmiiboWindow.axaml b/src/Ryujinx/UI/Windows/AmiiboWindow.axaml
index ce410923d..ad77a9b6b 100644
--- a/src/Ryujinx/UI/Windows/AmiiboWindow.axaml
+++ b/src/Ryujinx/UI/Windows/AmiiboWindow.axaml
@@ -6,6 +6,7 @@
xmlns:window="clr-namespace:Ryujinx.Ava.UI.Windows"
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup"
+ xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
mc:Ignorable="d"
d:DesignWidth="400"
d:DesignHeight="350"
@@ -23,7 +24,25 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs b/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs
index 8c76b8e2f..2d6eb4716 100644
--- a/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs
+++ b/src/Ryujinx/UI/Windows/AmiiboWindow.axaml.cs
@@ -1,13 +1,14 @@
using Avalonia.Interactivity;
using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.Common.Models.Amiibo;
+using Ryujinx.Ava.Systems.Configuration;
using Ryujinx.Ava.UI.ViewModels;
namespace Ryujinx.Ava.UI.Windows
{
public partial class AmiiboWindow : StyleableAppWindow
{
- public AmiiboWindow(bool showAll, string lastScannedAmiiboId, string titleId)
+ public AmiiboWindow(bool showAll, string lastScannedAmiiboId, string titleId) : base(true, 40)
{
DataContext = ViewModel = new AmiiboWindowViewModel(this, lastScannedAmiiboId, titleId)
{
@@ -16,6 +17,9 @@ namespace Ryujinx.Ava.UI.Windows
InitializeComponent();
+ FlushControls.IsVisible = !ConfigurationState.Instance.ShowOldUI;
+ NormalControls.IsVisible = ConfigurationState.Instance.ShowOldUI;
+
Title = RyujinxApp.FormatTitle(LocaleKeys.Amiibo);
}
diff --git a/src/Ryujinx/UI/Windows/CheatWindow.axaml b/src/Ryujinx/UI/Windows/CheatWindow.axaml
index 32f914019..49b13048f 100644
--- a/src/Ryujinx/UI/Windows/CheatWindow.axaml
+++ b/src/Ryujinx/UI/Windows/CheatWindow.axaml
@@ -6,6 +6,7 @@
xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:window="clr-namespace:Ryujinx.Ava.UI.Windows"
+ xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
Width="600"
Height="750"
MinWidth="500"
@@ -20,38 +21,81 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml.cs b/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml.cs
new file mode 100644
index 000000000..a2b98f8f8
--- /dev/null
+++ b/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml.cs
@@ -0,0 +1,46 @@
+using Avalonia.Controls;
+using Ryujinx.Ava.Common.Locale;
+using Ryujinx.Ava.Systems.Configuration;
+using Ryujinx.Ava.UI.ViewModels;
+using System.Threading.Tasks;
+
+namespace Ryujinx.Ava.UI.Windows
+{
+ public partial class CompatibilityListWindow : StyleableAppWindow
+ {
+ public static async Task Show(string titleId = null)
+ {
+ using CompatibilityViewModel compatWindow = new(RyujinxApp.MainWindow.ViewModel.ApplicationLibrary);
+
+ await ShowAsync(new CompatibilityListWindow
+ {
+ DataContext = compatWindow,
+ SearchBoxFlush = { Text = titleId ?? string.Empty },
+ SearchBoxNormal = { Text = titleId ?? string.Empty }
+ });
+ }
+
+ public CompatibilityListWindow() : base(useCustomTitleBar: true, 37)
+ {
+ Title = RyujinxApp.FormatTitle(LocaleKeys.CompatibilityListTitle);
+
+ InitializeComponent();
+
+ FlushControls.IsVisible = !ConfigurationState.Instance.ShowOldUI;
+ NormalControls.IsVisible = ConfigurationState.Instance.ShowOldUI;
+ }
+
+ // ReSharper disable once UnusedMember.Local
+ // its referenced in the axaml but rider keeps yelling at me that its unused so
+ private void TextBox_OnTextChanged(object sender, TextChangedEventArgs e)
+ {
+ if (DataContext is not CompatibilityViewModel cvm)
+ return;
+
+ if (sender is not TextBox searchBox)
+ return;
+
+ cvm.Search(searchBox.Text);
+ }
+ }
+}
diff --git a/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml b/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml
index 0e2c5ca37..f51f14c1e 100644
--- a/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml
+++ b/src/Ryujinx/UI/Windows/GameSpecificSettingsWindow.axaml
@@ -13,7 +13,7 @@
xmlns:helper="clr-namespace:Ryujinx.Common.Helper;assembly=Ryujinx.Common"
Width="1100"
Height="910"
- MinWidth="800"
+ MinWidth="1037"
MinHeight="480"
WindowStartupLocation="CenterOwner"
x:DataType="viewModels:SettingsViewModel"
@@ -53,18 +53,12 @@
-
-
-
-
-
-
-
+
+ HorizontalAlignment="Center"
+ VerticalAlignment="Center"
+ Margin="0,0,0,10"
+ TextAlignment="Center" Grid.Row="0" />
-
-
-
+
+
+
+
-
+
@@ -41,12 +49,11 @@
@@ -108,7 +115,7 @@
-