From f898a5ecf4370c1d286e6187c8f00981f44244de Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sat, 21 Dec 2024 20:06:59 -0600 Subject: [PATCH 01/12] Remove code references to having a flatpak version --- src/Ryujinx.Common/ReleaseInformation.cs | 3 --- .../Helper/FileAssociationHelper.cs | 2 +- src/Ryujinx/Assets/locales.json | 24 ------------------- .../UI/Controls/ApplicationContextMenu.axaml | 1 - .../UI/ViewModels/MainWindowViewModel.cs | 2 -- src/Ryujinx/Updater.cs | 19 ++++----------- 6 files changed, 5 insertions(+), 46 deletions(-) diff --git a/src/Ryujinx.Common/ReleaseInformation.cs b/src/Ryujinx.Common/ReleaseInformation.cs index 011d9848a..cbf93013f 100644 --- a/src/Ryujinx.Common/ReleaseInformation.cs +++ b/src/Ryujinx.Common/ReleaseInformation.cs @@ -6,7 +6,6 @@ namespace Ryujinx.Common // DO NOT EDIT, filled by CI public static class ReleaseInformation { - private const string FlatHubChannel = "flathub"; private const string CanaryChannel = "canary"; private const string ReleaseChannel = "release"; @@ -29,8 +28,6 @@ namespace Ryujinx.Common !ReleaseChannelRepo.StartsWith("%%") && !ConfigFileName.StartsWith("%%"); - public static bool IsFlatHubBuild => IsValid && ReleaseChannelOwner.Equals(FlatHubChannel); - public static bool IsCanaryBuild => IsValid && ReleaseChannelName.Equals(CanaryChannel); public static bool IsReleaseBuild => IsValid && ReleaseChannelName.Equals(ReleaseChannel); diff --git a/src/Ryujinx.UI.Common/Helper/FileAssociationHelper.cs b/src/Ryujinx.UI.Common/Helper/FileAssociationHelper.cs index 9333a1b76..44860d080 100644 --- a/src/Ryujinx.UI.Common/Helper/FileAssociationHelper.cs +++ b/src/Ryujinx.UI.Common/Helper/FileAssociationHelper.cs @@ -23,7 +23,7 @@ namespace Ryujinx.UI.Common.Helper [LibraryImport("shell32.dll", SetLastError = true)] public static partial void SHChangeNotify(uint wEventId, uint uFlags, nint dwItem1, nint dwItem2); - public static bool IsTypeAssociationSupported => (OperatingSystem.IsLinux() || OperatingSystem.IsWindows()) && !ReleaseInformation.IsFlatHubBuild; + public static bool IsTypeAssociationSupported => (OperatingSystem.IsLinux() || OperatingSystem.IsWindows()); public static bool AreMimeTypesRegistered { diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index 4c426f062..007f1d1e6 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -16173,30 +16173,6 @@ "zh_TW": "CPU 模式" } }, - { - "ID": "DialogUpdaterFlatpakNotSupportedMessage", - "Translations": { - "ar_SA": "الرجاء تحديث ريوجينكس عبر فلات هاب.", - "de_DE": "Bitte aktualisiere Ryujinx über FlatHub", - "el_GR": "Παρακαλούμε ενημερώστε το Ryujinx μέσω FlatHub.", - "en_US": "Please update Ryujinx via FlatHub.", - "es_ES": "Por favor, actualiza Ryujinx a través de FlatHub.", - "fr_FR": "Merci de mettre à jour Ryujinx via FlatHub.", - "he_IL": "בבקשה עדכן את ריוג'ינקס דרך פלאטהב.", - "it_IT": "Aggiorna Ryujinx tramite FlatHub.", - "ja_JP": "FlatHub を使用して Ryujinx をアップデートしてください.", - "ko_KR": "FlatHub를 통해 Ryujinx를 업데이트하세요.", - "no_NO": "Vennligst oppdater Ryujinx via FlatHub.", - "pl_PL": "Zaktualizuj Ryujinx przez FlatHub.", - "pt_BR": "Por favor, atualize o Ryujinx pelo FlatHub.", - "ru_RU": "Пожалуйста, обновите Ryujinx через FlatHub.", - "th_TH": "โปรดอัปเดต Ryujinx ผ่านช่องทาง FlatHub", - "tr_TR": "Lütfen Ryujinx'i FlatHub aracılığıyla güncelleyin.", - "uk_UA": "", - "zh_CN": "请通过 FlatHub 更新 Ryujinx 模拟器。", - "zh_TW": "請透過 Flathub 更新 Ryujinx。" - } - }, { "ID": "UpdaterDisabledWarningTitle", "Translations": { diff --git a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml index 951f7f616..7708936ca 100644 --- a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml +++ b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml @@ -17,7 +17,6 @@ diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index cebd65701..ae373c267 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -424,8 +424,6 @@ namespace Ryujinx.Ava.UI.ViewModels public bool OpenBcatSaveDirectoryEnabled => !SelectedApplication.ControlHolder.ByteSpan.IsZeros() && SelectedApplication.ControlHolder.Value.BcatDeliveryCacheStorageSize > 0; - public bool CreateShortcutEnabled => !ReleaseInformation.IsFlatHubBuild; - public string LoadHeading { get => _loadHeading; diff --git a/src/Ryujinx/Updater.cs b/src/Ryujinx/Updater.cs index e240ad141..21d991d97 100644 --- a/src/Ryujinx/Updater.cs +++ b/src/Ryujinx/Updater.cs @@ -686,22 +686,11 @@ namespace Ryujinx.Ava #else if (showWarnings) { - if (ReleaseInformation.IsFlatHubBuild) - { - Dispatcher.UIThread.InvokeAsync(() => - ContentDialogHelper.CreateWarningDialog( - LocaleManager.Instance[LocaleKeys.UpdaterDisabledWarningTitle], - LocaleManager.Instance[LocaleKeys.DialogUpdaterFlatpakNotSupportedMessage]) + Dispatcher.UIThread.InvokeAsync(() => + ContentDialogHelper.CreateWarningDialog( + LocaleManager.Instance[LocaleKeys.UpdaterDisabledWarningTitle], + LocaleManager.Instance[LocaleKeys.DialogUpdaterDirtyBuildSubMessage]) ); - } - else - { - Dispatcher.UIThread.InvokeAsync(() => - ContentDialogHelper.CreateWarningDialog( - LocaleManager.Instance[LocaleKeys.UpdaterDisabledWarningTitle], - LocaleManager.Instance[LocaleKeys.DialogUpdaterDirtyBuildSubMessage]) - ); - } } return false; From 4c7cb54ec63f907523a9c56b4cbcf899a6b893ef Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sat, 21 Dec 2024 21:52:04 -0600 Subject: [PATCH 02/12] misc: I may be stupid --- src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs b/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs index ce2b7185a..1763edce2 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs @@ -15,7 +15,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Common private readonly long[] _current2; private readonly long[] _peak; - private readonly Lock _lock = new(); + // type is not Lock due to Monitor class usage + private readonly object _lock = new(); private readonly LinkedList _waitingThreads; From 67ec10feea0db14a9647db4deebb11523c6f05da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hack=E8=8C=B6=E3=82=93?= <120134269+Hackjjang@users.noreply.github.com> Date: Sun, 22 Dec 2024 13:46:57 +0900 Subject: [PATCH 03/12] Korean translation update (#422) --- src/Ryujinx/Assets/locales.json | 54 ++++++++++++++++----------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index 007f1d1e6..5df389381 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -705,7 +705,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "Amiibo 스캔(빈에서)", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -1137,7 +1137,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "자주 묻는 질문(FAQ) 및 문제해결 페이지", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -1161,7 +1161,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "공식 Ryujinx 위키에서 자주 묻는 질문(FAQ) 및 문제 해결 페이지 열기", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -1185,7 +1185,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "설치 및 구성 안내", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -1209,7 +1209,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "공식 Ryujinx 위키에서 설정 및 구성 안내 열기", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -1233,7 +1233,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "멀티플레이어(LDN/LAN) 안내", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -1257,7 +1257,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "공식 Ryujinx 위키에서 멀티플레이어 안내 열기", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -8073,7 +8073,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "지우기", + "ko_KR": "", "no_NO": "Tøm", "pl_PL": "", "pt_BR": "", @@ -11865,7 +11865,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "{0} : {1}", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -18777,7 +18777,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "{0:n0}MB", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -19065,7 +19065,7 @@ "he_IL": "{0} הרחבות משחק", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "{0} DLC 사용 가능", "no_NO": "{0} Nedlastbare innhold(er)", "pl_PL": "", "pt_BR": "", @@ -21201,7 +21201,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "수직 동기화 :", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -21225,7 +21225,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "사용자 정의 주사율 활성화(실험적)", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -21249,7 +21249,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "스위치", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -21273,7 +21273,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "무제한", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -21297,7 +21297,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "사용자 정의 주사율", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -21321,7 +21321,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "에뮬레이트된 수직 동기화. '스위치'는 스위치의 60Hz 주사율을 에뮬레이트합니다. '무한'은 무제한 주사율입니다.", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -21345,7 +21345,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "에뮬레이트된 수직 동기화. '스위치'는 스위치의 60Hz 주사율을 에뮬레이트합니다. '무한'은 무제한 주사율입니다. '사용자 지정'은 지정된 사용자 지정 주사율을 에뮬레이트합니다.", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -21369,7 +21369,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "사용자가 에뮬레이트된 화면 주사율을 지정할 수 있습니다. 일부 타이틀에서는 게임플레이 로직 속도가 빨라지거나 느려질 수 있습니다. 다른 타이틀에서는 주사율의 배수로 FPS를 제한하거나 예측할 수 없는 동작으로 이어질 수 있습니다. 이는 실험적 기능으로 게임 플레이에 어떤 영향을 미칠지 보장할 수 없습니다. \n\n모르면 끔으로 두세요.", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -21393,7 +21393,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "사용자 정의 주사율 목표 값입니다.", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -21417,7 +21417,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "일반 스위치 주사율의 백분율로 나타낸 사용자 지정 주사율입니다.", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -21441,7 +21441,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "사용자 정의 주사율 % :", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -21465,7 +21465,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "사용자 정의 주사율 값 :", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -21489,7 +21489,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "간격", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -21513,7 +21513,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "수직 동기화 모드 전환 :", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -21537,7 +21537,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "사용자 정의 주사율 증가", "no_NO": "", "pl_PL": "", "pt_BR": "", @@ -21561,7 +21561,7 @@ "he_IL": "", "it_IT": "", "ja_JP": "", - "ko_KR": "", + "ko_KR": "사용자 정의 주사율 감소", "no_NO": "", "pl_PL": "", "pt_BR": "", From decd37ce6d670d6a1136409292d253dabd69475d Mon Sep 17 00:00:00 2001 From: Marco Carvalho Date: Sun, 22 Dec 2024 02:28:31 -0300 Subject: [PATCH 04/12] Add missing "yield return" (#424) --- src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs | 34 +++++++-------- src/Ryujinx.Cpu/Jit/MemoryManager.cs | 34 +++++++-------- .../Jit/MemoryManagerHostTracked.cs | 14 +++---- .../LightningJit/CodeGen/Arm64/StackWalker.cs | 6 +-- .../BufferMirrorRangeList.cs | 10 ++--- src/Ryujinx.HLE/HOS/ModLoader.cs | 9 ++-- src/Ryujinx.Memory/AddressSpaceManager.cs | 42 +++++++------------ 7 files changed, 54 insertions(+), 95 deletions(-) diff --git a/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs b/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs index bb56a4344..74c39d6a8 100644 --- a/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs +++ b/src/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs @@ -230,25 +230,20 @@ namespace Ryujinx.Cpu.AppleHv { if (size == 0) { - return Enumerable.Empty(); + yield break; } var guestRegions = GetPhysicalRegionsImpl(va, size); if (guestRegions == null) { - return null; + yield break; } - var regions = new HostMemoryRange[guestRegions.Count]; - - for (int i = 0; i < regions.Length; i++) + foreach (var guestRegion in guestRegions) { - var guestRegion = guestRegions[i]; nint pointer = _backingMemory.GetPointer(guestRegion.Address, guestRegion.Size); - regions[i] = new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size); + yield return new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size); } - - return regions; } /// @@ -256,23 +251,24 @@ namespace Ryujinx.Cpu.AppleHv { if (size == 0) { - return Enumerable.Empty(); + yield break; } - return GetPhysicalRegionsImpl(va, size); + foreach (var physicalRegion in GetPhysicalRegionsImpl(va, size)) + { + yield return physicalRegion; + } } - private List GetPhysicalRegionsImpl(ulong va, ulong size) + private IEnumerable GetPhysicalRegionsImpl(ulong va, ulong size) { if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size)) { - return null; + yield break; } int pages = GetPagesCount(va, (uint)size, out va); - var regions = new List(); - ulong regionStart = GetPhysicalAddressInternal(va); ulong regionSize = PageSize; @@ -280,14 +276,14 @@ namespace Ryujinx.Cpu.AppleHv { if (!ValidateAddress(va + PageSize)) { - return null; + yield break; } ulong newPa = GetPhysicalAddressInternal(va + PageSize); if (GetPhysicalAddressInternal(va) + PageSize != newPa) { - regions.Add(new MemoryRange(regionStart, regionSize)); + yield return new MemoryRange(regionStart, regionSize); regionStart = newPa; regionSize = 0; } @@ -296,9 +292,7 @@ namespace Ryujinx.Cpu.AppleHv regionSize += PageSize; } - regions.Add(new MemoryRange(regionStart, regionSize)); - - return regions; + yield return new MemoryRange(regionStart, regionSize); } /// diff --git a/src/Ryujinx.Cpu/Jit/MemoryManager.cs b/src/Ryujinx.Cpu/Jit/MemoryManager.cs index 049e508d0..076fb6ad8 100644 --- a/src/Ryujinx.Cpu/Jit/MemoryManager.cs +++ b/src/Ryujinx.Cpu/Jit/MemoryManager.cs @@ -250,25 +250,20 @@ namespace Ryujinx.Cpu.Jit { if (size == 0) { - return Enumerable.Empty(); + yield break; } var guestRegions = GetPhysicalRegionsImpl(va, size); if (guestRegions == null) { - return null; + yield break; } - var regions = new HostMemoryRange[guestRegions.Count]; - - for (int i = 0; i < regions.Length; i++) + foreach (var guestRegion in guestRegions) { - var guestRegion = guestRegions[i]; nint pointer = _backingMemory.GetPointer(guestRegion.Address, guestRegion.Size); - regions[i] = new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size); + yield return new HostMemoryRange((nuint)(ulong)pointer, guestRegion.Size); } - - return regions; } /// @@ -276,23 +271,24 @@ namespace Ryujinx.Cpu.Jit { if (size == 0) { - return Enumerable.Empty(); + yield break; } - return GetPhysicalRegionsImpl(va, size); + foreach (var physicalRegion in GetPhysicalRegionsImpl(va, size)) + { + yield return physicalRegion; + } } - private List GetPhysicalRegionsImpl(ulong va, ulong size) + private IEnumerable GetPhysicalRegionsImpl(ulong va, ulong size) { if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size)) { - return null; + yield break; } int pages = GetPagesCount(va, (uint)size, out va); - var regions = new List(); - ulong regionStart = GetPhysicalAddressInternal(va); ulong regionSize = PageSize; @@ -300,14 +296,14 @@ namespace Ryujinx.Cpu.Jit { if (!ValidateAddress(va + PageSize)) { - return null; + yield break; } ulong newPa = GetPhysicalAddressInternal(va + PageSize); if (GetPhysicalAddressInternal(va) + PageSize != newPa) { - regions.Add(new MemoryRange(regionStart, regionSize)); + yield return new MemoryRange(regionStart, regionSize); regionStart = newPa; regionSize = 0; } @@ -316,9 +312,7 @@ namespace Ryujinx.Cpu.Jit regionSize += PageSize; } - regions.Add(new MemoryRange(regionStart, regionSize)); - - return regions; + yield return new MemoryRange(regionStart, regionSize); } /// diff --git a/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs b/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs index 4dab212a7..499f991f2 100644 --- a/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs +++ b/src/Ryujinx.Cpu/Jit/MemoryManagerHostTracked.cs @@ -475,17 +475,15 @@ namespace Ryujinx.Cpu.Jit return GetPhysicalRegionsImpl(va, size); } - private List GetPhysicalRegionsImpl(ulong va, ulong size) + private IEnumerable GetPhysicalRegionsImpl(ulong va, ulong size) { if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size)) { - return null; + yield break; } int pages = GetPagesCount(va, (uint)size, out va); - var regions = new List(); - ulong regionStart = GetPhysicalAddressInternal(va); ulong regionSize = PageSize; @@ -493,14 +491,14 @@ namespace Ryujinx.Cpu.Jit { if (!ValidateAddress(va + PageSize)) { - return null; + yield break; } ulong newPa = GetPhysicalAddressInternal(va + PageSize); if (GetPhysicalAddressInternal(va) + PageSize != newPa) { - regions.Add(new MemoryRange(regionStart, regionSize)); + yield return new MemoryRange(regionStart, regionSize); regionStart = newPa; regionSize = 0; } @@ -509,9 +507,7 @@ namespace Ryujinx.Cpu.Jit regionSize += PageSize; } - regions.Add(new MemoryRange(regionStart, regionSize)); - - return regions; + yield return new MemoryRange(regionStart, regionSize); } /// diff --git a/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs index 3ce7c4f9c..1432c4598 100644 --- a/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs +++ b/src/Ryujinx.Cpu/LightningJit/CodeGen/Arm64/StackWalker.cs @@ -8,8 +8,6 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64 { public IEnumerable GetCallStack(nint framePointer, nint codeRegionStart, int codeRegionSize, nint codeRegion2Start, int codeRegion2Size) { - List functionPointers = new(); - while (true) { nint functionPointer = Marshal.ReadIntPtr(framePointer, nint.Size); @@ -20,11 +18,9 @@ namespace Ryujinx.Cpu.LightningJit.CodeGen.Arm64 break; } - functionPointers.Add((ulong)functionPointer - 4); + yield return (ulong)functionPointer - 4; framePointer = Marshal.ReadIntPtr(framePointer); } - - return functionPointers; } } } diff --git a/src/Ryujinx.Graphics.Vulkan/BufferMirrorRangeList.cs b/src/Ryujinx.Graphics.Vulkan/BufferMirrorRangeList.cs index 5722ca1ac..e79248a47 100644 --- a/src/Ryujinx.Graphics.Vulkan/BufferMirrorRangeList.cs +++ b/src/Ryujinx.Graphics.Vulkan/BufferMirrorRangeList.cs @@ -168,16 +168,14 @@ namespace Ryujinx.Graphics.Vulkan return BinarySearch(list, offset, size) >= 0; } - public readonly List FindOverlaps(int offset, int size) + public readonly IEnumerable FindOverlaps(int offset, int size) { var list = _ranges; if (list == null) { - return null; + yield break; } - List result = null; - int index = BinarySearch(list, offset, size); if (index >= 0) @@ -189,12 +187,10 @@ namespace Ryujinx.Graphics.Vulkan do { - (result ??= new List()).Add(list[index++]); + yield return list[index++]; } while (index < list.Count && list[index].OverlapsWith(offset, size)); } - - return result; } private static int BinarySearch(List list, int offset, int size) diff --git a/src/Ryujinx.HLE/HOS/ModLoader.cs b/src/Ryujinx.HLE/HOS/ModLoader.cs index d8c62fc66..4bd695ae5 100644 --- a/src/Ryujinx.HLE/HOS/ModLoader.cs +++ b/src/Ryujinx.HLE/HOS/ModLoader.cs @@ -357,7 +357,6 @@ namespace Ryujinx.HLE.HOS { string cheatName = DefaultCheatName; List instructions = new(); - List cheats = new(); using StreamReader cheatData = cheatFile.OpenText(); while (cheatData.ReadLine() is { } line) @@ -373,13 +372,13 @@ namespace Ryujinx.HLE.HOS Logger.Warning?.Print(LogClass.ModLoader, $"Ignoring cheat '{cheatFile.FullName}' because it is malformed"); - return Array.Empty(); + yield break; } // Add the previous section to the list. if (instructions.Count > 0) { - cheats.Add(new Cheat($"<{cheatName} Cheat>", cheatFile, instructions)); + yield return new Cheat($"<{cheatName} Cheat>", cheatFile, instructions); } // Start a new cheat section. @@ -396,10 +395,8 @@ namespace Ryujinx.HLE.HOS // Add the last section being processed. if (instructions.Count > 0) { - cheats.Add(new Cheat($"<{cheatName} Cheat>", cheatFile, instructions)); + yield return new Cheat($"<{cheatName} Cheat>", cheatFile, instructions); } - - return cheats; } // Assumes searchDirPaths don't overlap diff --git a/src/Ryujinx.Memory/AddressSpaceManager.cs b/src/Ryujinx.Memory/AddressSpaceManager.cs index 807c5c0f4..7bd572d7a 100644 --- a/src/Ryujinx.Memory/AddressSpaceManager.cs +++ b/src/Ryujinx.Memory/AddressSpaceManager.cs @@ -106,10 +106,13 @@ namespace Ryujinx.Memory { if (size == 0) { - return Enumerable.Empty(); + yield break; } - return GetHostRegionsImpl(va, size); + foreach (var hostRegion in GetHostRegionsImpl(va, size)) + { + yield return hostRegion; + } } /// @@ -117,51 +120,36 @@ namespace Ryujinx.Memory { if (size == 0) { - return Enumerable.Empty(); + yield break; } var hostRegions = GetHostRegionsImpl(va, size); if (hostRegions == null) { - return null; + yield break; } - var regions = new MemoryRange[hostRegions.Count]; - ulong backingStart = (ulong)_backingMemory.Pointer; ulong backingEnd = backingStart + _backingMemory.Size; - int count = 0; - - for (int i = 0; i < regions.Length; i++) + foreach (var hostRegion in hostRegions) { - var hostRegion = hostRegions[i]; - if (hostRegion.Address >= backingStart && hostRegion.Address < backingEnd) { - regions[count++] = new MemoryRange(hostRegion.Address - backingStart, hostRegion.Size); + yield return new MemoryRange(hostRegion.Address - backingStart, hostRegion.Size); } } - - if (count != regions.Length) - { - return new ArraySegment(regions, 0, count); - } - - return regions; } - private List GetHostRegionsImpl(ulong va, ulong size) + private IEnumerable GetHostRegionsImpl(ulong va, ulong size) { if (!ValidateAddress(va) || !ValidateAddressAndSize(va, size)) { - return null; + yield break; } int pages = GetPagesCount(va, size, out va); - var regions = new List(); - nuint regionStart = GetHostAddress(va); ulong regionSize = PageSize; @@ -169,14 +157,14 @@ namespace Ryujinx.Memory { if (!ValidateAddress(va + PageSize)) { - return null; + yield break; } nuint newHostAddress = GetHostAddress(va + PageSize); if (GetHostAddress(va) + PageSize != newHostAddress) { - regions.Add(new HostMemoryRange(regionStart, regionSize)); + yield return new HostMemoryRange(regionStart, regionSize); regionStart = newHostAddress; regionSize = 0; } @@ -185,9 +173,7 @@ namespace Ryujinx.Memory regionSize += PageSize; } - regions.Add(new HostMemoryRange(regionStart, regionSize)); - - return regions; + yield return new HostMemoryRange(regionStart, regionSize); } [MethodImpl(MethodImplOptions.AggressiveInlining)] From 5913ceda4061028327521ed14b1c521ce6e87cf2 Mon Sep 17 00:00:00 2001 From: Marco Carvalho Date: Sun, 22 Dec 2024 14:36:05 -0300 Subject: [PATCH 05/12] Avoid zero-length array allocations (#427) --- src/Ryujinx.HLE/HOS/Horizon.cs | 4 ++-- src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Ryujinx.HLE/HOS/Horizon.cs b/src/Ryujinx.HLE/HOS/Horizon.cs index c585aed54..f9c5ddecf 100644 --- a/src/Ryujinx.HLE/HOS/Horizon.cs +++ b/src/Ryujinx.HLE/HOS/Horizon.cs @@ -341,7 +341,7 @@ namespace Ryujinx.HLE.HOS { if (VirtualAmiibo.ApplicationBytes.Length > 0) { - VirtualAmiibo.ApplicationBytes = new byte[0]; + VirtualAmiibo.ApplicationBytes = Array.Empty(); VirtualAmiibo.InputBin = string.Empty; } if (NfpDevices[nfpDeviceId].State == NfpDeviceState.SearchingForTag) @@ -356,7 +356,7 @@ namespace Ryujinx.HLE.HOS VirtualAmiibo.InputBin = path; if (VirtualAmiibo.ApplicationBytes.Length > 0) { - VirtualAmiibo.ApplicationBytes = new byte[0]; + VirtualAmiibo.ApplicationBytes = Array.Empty(); } byte[] encryptedData = File.ReadAllBytes(path); VirtualAmiiboFile newFile = AmiiboBinReader.ReadBinFile(encryptedData); diff --git a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs index ee43fc307..2cb35472f 100644 --- a/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs +++ b/src/Ryujinx.HLE/HOS/Services/Nfc/Nfp/VirtualAmiibo.cs @@ -16,7 +16,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp static class VirtualAmiibo { public static uint OpenedApplicationAreaId; - public static byte[] ApplicationBytes = new byte[0]; + public static byte[] ApplicationBytes = Array.Empty(); public static string InputBin = string.Empty; public static string NickName = string.Empty; private static readonly AmiiboJsonSerializerContext _serializerContext = AmiiboJsonSerializerContext.Default; @@ -137,7 +137,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp if (ApplicationBytes.Length > 0) { byte[] bytes = ApplicationBytes; - ApplicationBytes = new byte[0]; + ApplicationBytes = Array.Empty(); return bytes; } VirtualAmiiboFile virtualAmiiboFile = LoadAmiiboFile(amiiboId); From 1ea345faa7a908125ecdb278873451b5920cfed1 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sun, 22 Dec 2024 12:53:48 -0600 Subject: [PATCH 06/12] UI: Move Match PC Time to next to the time selector & change label & tooltip to clarify behavior further. --- src/Ryujinx/Assets/locales.json | 4 ++-- src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml | 6 +----- src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml.cs | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index 5df389381..167accd34 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -3771,7 +3771,7 @@ "ar_SA": "", "de_DE": "", "el_GR": "", - "en_US": "Match PC Time", + "en_US": "Resync to PC Date & Time", "es_ES": "", "fr_FR": "", "he_IL": "", @@ -14571,7 +14571,7 @@ "ar_SA": "", "de_DE": "", "el_GR": "", - "en_US": "Change System Time to match your PC's date & time.", + "en_US": "Resync System Time to match your PC's current date & time.\n\nThis is not an active setting, it can still fall out of sync; in which case just click this button again.", "es_ES": "", "fr_FR": "", "he_IL": "", diff --git a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml index 73cc70a23..9295413ba 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml @@ -181,15 +181,11 @@ SelectedTime="{Binding CurrentTime}" Width="350" ToolTip.Tip="{ext:Locale TimeTooltip}" /> - - diff --git a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml.cs b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml.cs index 5cecd7221..5103ce383 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml.cs +++ b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml.cs @@ -1,7 +1,7 @@ +using Avalonia; using Avalonia.Controls; using Avalonia.Interactivity; using Ryujinx.Ava.UI.ViewModels; -using System; using TimeZone = Ryujinx.Ava.UI.Models.TimeZone; namespace Ryujinx.Ava.UI.Views.Settings From 8259f790d75ca5c18ef8e3d56824b8f86dde1eff Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sun, 22 Dec 2024 13:19:10 -0600 Subject: [PATCH 07/12] misc: Cleanup locale validator --- .../LocaleValidationTask.cs | 21 ++++++++----------- src/Ryujinx/Assets/locales.json | 2 +- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/Ryujinx.BuildValidationTasks/LocaleValidationTask.cs b/src/Ryujinx.BuildValidationTasks/LocaleValidationTask.cs index 183228fdd..6dc3d8aa8 100644 --- a/src/Ryujinx.BuildValidationTasks/LocaleValidationTask.cs +++ b/src/Ryujinx.BuildValidationTasks/LocaleValidationTask.cs @@ -14,20 +14,20 @@ namespace Ryujinx.BuildValidationTasks { string path = System.Reflection.Assembly.GetExecutingAssembly().Location; - if (path.Split(new string[] { "src" }, StringSplitOptions.None).Length == 1 ) + if (path.Split(["src"], StringSplitOptions.None).Length == 1) { //i assume that we are in a build directory in the solution dir - path = new FileInfo(path).Directory.Parent.GetDirectories("src")[0].GetDirectories("Ryujinx")[0].GetDirectories("Assets")[0].GetFiles("locales.json")[0].FullName; + path = new FileInfo(path).Directory!.Parent!.GetDirectories("src")[0].GetDirectories("Ryujinx")[0].GetDirectories("Assets")[0].GetFiles("locales.json")[0].FullName; } else { - path = path.Split(new string[] { "src" }, StringSplitOptions.None)[0]; - path = new FileInfo(path).Directory.GetDirectories("src")[0].GetDirectories("Ryujinx")[0].GetDirectories("Assets")[0].GetFiles("locales.json")[0].FullName; + path = path.Split(["src"], StringSplitOptions.None)[0]; + path = new FileInfo(path).Directory!.GetDirectories("src")[0].GetDirectories("Ryujinx")[0].GetDirectories("Assets")[0].GetFiles("locales.json")[0].FullName; } string data; - using (StreamReader sr = new StreamReader(path)) + using (StreamReader sr = new(path)) { data = sr.ReadToEnd(); } @@ -38,13 +38,10 @@ namespace Ryujinx.BuildValidationTasks { LocalesEntry locale = json.Locales[i]; - foreach (string language in json.Languages) + foreach (string langCode in json.Languages.Where(it => !locale.Translations.ContainsKey(it))) { - if (!locale.Translations.ContainsKey(language)) - { - locale.Translations.Add(language, ""); - Log.LogMessage(MessageImportance.High, $"Added {{{language}}} to Locale {{{locale.ID}}}"); - } + locale.Translations.Add(langCode, string.Empty); + Log.LogMessage(MessageImportance.High, $"Added '{langCode}' to Locale '{locale.ID}'"); } locale.Translations = locale.Translations.OrderBy(pair => pair.Key).ToDictionary(pair => pair.Key, pair => pair.Value); @@ -53,7 +50,7 @@ namespace Ryujinx.BuildValidationTasks string jsonString = JsonConvert.SerializeObject(json, Formatting.Indented); - using (StreamWriter sw = new StreamWriter(path)) + using (StreamWriter sw = new(path)) { sw.Write(jsonString); } diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index 167accd34..33dd61d42 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -21574,4 +21574,4 @@ } } ] -} +} \ No newline at end of file From b5483d8fe028e18fe0ac4a69e40eb3780eaf76e1 Mon Sep 17 00:00:00 2001 From: Marco Carvalho Date: Sun, 22 Dec 2024 16:23:35 -0300 Subject: [PATCH 08/12] Prefer generic overload when type is known (#430) --- src/Ryujinx.Graphics.Vulkan/FormatCapabilities.cs | 2 +- src/Ryujinx.Graphics.Vulkan/FormatTable.cs | 2 +- src/Ryujinx.Graphics.Vulkan/Queries/Counters.cs | 2 +- src/Ryujinx.HLE/HOS/Services/IpcService.cs | 12 ++++++------ .../IUserLocalCommunicationService.cs | 2 +- src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs | 2 +- src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs | 4 ++-- src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Ryujinx.Graphics.Vulkan/FormatCapabilities.cs b/src/Ryujinx.Graphics.Vulkan/FormatCapabilities.cs index 4971a63b6..09f22889c 100644 --- a/src/Ryujinx.Graphics.Vulkan/FormatCapabilities.cs +++ b/src/Ryujinx.Graphics.Vulkan/FormatCapabilities.cs @@ -62,7 +62,7 @@ namespace Ryujinx.Graphics.Vulkan _api = api; _physicalDevice = physicalDevice; - int totalFormats = Enum.GetNames(typeof(Format)).Length; + int totalFormats = Enum.GetNames().Length; _bufferTable = new FormatFeatureFlags[totalFormats]; _optimalTable = new FormatFeatureFlags[totalFormats]; diff --git a/src/Ryujinx.Graphics.Vulkan/FormatTable.cs b/src/Ryujinx.Graphics.Vulkan/FormatTable.cs index 98796d9bf..305224cad 100644 --- a/src/Ryujinx.Graphics.Vulkan/FormatTable.cs +++ b/src/Ryujinx.Graphics.Vulkan/FormatTable.cs @@ -12,7 +12,7 @@ namespace Ryujinx.Graphics.Vulkan static FormatTable() { - _table = new VkFormat[Enum.GetNames(typeof(Format)).Length]; + _table = new VkFormat[Enum.GetNames().Length]; _reverseMap = new Dictionary(); #pragma warning disable IDE0055 // Disable formatting diff --git a/src/Ryujinx.Graphics.Vulkan/Queries/Counters.cs b/src/Ryujinx.Graphics.Vulkan/Queries/Counters.cs index 518ede5f3..c07e1c09c 100644 --- a/src/Ryujinx.Graphics.Vulkan/Queries/Counters.cs +++ b/src/Ryujinx.Graphics.Vulkan/Queries/Counters.cs @@ -13,7 +13,7 @@ namespace Ryujinx.Graphics.Vulkan.Queries { _pipeline = pipeline; - int count = Enum.GetNames(typeof(CounterType)).Length; + int count = Enum.GetNames().Length; _counterQueues = new CounterQueue[count]; diff --git a/src/Ryujinx.HLE/HOS/Services/IpcService.cs b/src/Ryujinx.HLE/HOS/Services/IpcService.cs index 808f21c0e..cd3df4edf 100644 --- a/src/Ryujinx.HLE/HOS/Services/IpcService.cs +++ b/src/Ryujinx.HLE/HOS/Services/IpcService.cs @@ -23,18 +23,18 @@ namespace Ryujinx.HLE.HOS.Services public IpcService(ServerBase server = null) { - CmifCommands = typeof(IpcService).Assembly.GetTypes() + CmifCommands = GetType().Assembly.GetTypes() .Where(type => type == GetType()) .SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)) - .SelectMany(methodInfo => methodInfo.GetCustomAttributes(typeof(CommandCmifAttribute)) - .Select(command => (((CommandCmifAttribute)command).Id, methodInfo))) + .SelectMany(methodInfo => methodInfo.GetCustomAttributes() + .Select(command => (command.Id, methodInfo))) .ToDictionary(command => command.Id, command => command.methodInfo); - TipcCommands = typeof(IpcService).Assembly.GetTypes() + TipcCommands = GetType().Assembly.GetTypes() .Where(type => type == GetType()) .SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public)) - .SelectMany(methodInfo => methodInfo.GetCustomAttributes(typeof(CommandTipcAttribute)) - .Select(command => (((CommandTipcAttribute)command).Id, methodInfo))) + .SelectMany(methodInfo => methodInfo.GetCustomAttributes() + .Select(command => (command.Id, methodInfo))) .ToDictionary(command => command.Id, command => command.methodInfo); Server = server; diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs index 9f65aed4b..b8b3014f1 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs @@ -444,7 +444,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator private ResultCode ScanInternal(IVirtualMemoryManager memory, ushort channel, ScanFilter scanFilter, ulong bufferPosition, ulong bufferSize, out ulong counter) { - ulong networkInfoSize = (ulong)Marshal.SizeOf(typeof(NetworkInfo)); + ulong networkInfoSize = (ulong)Marshal.SizeOf(); ulong maxGames = bufferSize / networkInfoSize; MemoryHelper.FillWithZeros(memory, bufferPosition, (int)bufferSize); diff --git a/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs b/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs index 7a90c664e..271b8fc84 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs @@ -94,7 +94,7 @@ namespace Ryujinx.HLE.HOS.Services.Sm { if (_services.TryGetValue(name, out Type type)) { - ServiceAttribute serviceAttribute = (ServiceAttribute)type.GetCustomAttributes(typeof(ServiceAttribute)).First(service => ((ServiceAttribute)service).Name == name); + ServiceAttribute serviceAttribute = type.GetCustomAttributes().First(service => service.Name == name); IpcService service = GetServiceInstance(type, context, serviceAttribute.Parameter); diff --git a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs index f11d6e404..493e6659d 100644 --- a/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/Input/InputViewModel.cs @@ -97,7 +97,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input { if (IsModified) { - + _playerIdChoose = value; return; } @@ -105,7 +105,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input IsModified = false; _playerId = value; - if (!Enum.IsDefined(typeof(PlayerIndex), _playerId)) + if (!Enum.IsDefined(_playerId)) { _playerId = PlayerIndex.Player1; diff --git a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs index dd4ed8297..1b017dbeb 100644 --- a/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs +++ b/src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs @@ -52,7 +52,7 @@ namespace Ryujinx.Ava.UI.Views.Main private void AspectRatioStatus_OnClick(object sender, RoutedEventArgs e) { AspectRatio aspectRatio = ConfigurationState.Instance.Graphics.AspectRatio.Value; - ConfigurationState.Instance.Graphics.AspectRatio.Value = (int)aspectRatio + 1 > Enum.GetNames(typeof(AspectRatio)).Length - 1 ? AspectRatio.Fixed4x3 : aspectRatio + 1; + ConfigurationState.Instance.Graphics.AspectRatio.Value = (int)aspectRatio + 1 > Enum.GetNames().Length - 1 ? AspectRatio.Fixed4x3 : aspectRatio + 1; } private void Refresh_OnClick(object sender, RoutedEventArgs e) => Window.LoadApplications(); From cb355f504d8875defa5f9047dd63b7548e225212 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sun, 22 Dec 2024 16:01:09 -0600 Subject: [PATCH 09/12] UI: Rearrange help menu item & merge wiki page link buttons into a "category" button. --- .../SyscallGenerator.cs | 6 +-- src/Ryujinx/Assets/locales.json | 26 +++++++++- .../UI/Views/Main/MainMenuBarView.axaml | 49 ++++++++++--------- 3 files changed, 53 insertions(+), 28 deletions(-) diff --git a/src/Ryujinx.Horizon.Kernel.Generators/SyscallGenerator.cs b/src/Ryujinx.Horizon.Kernel.Generators/SyscallGenerator.cs index 7419a839a..06b98e09d 100644 --- a/src/Ryujinx.Horizon.Kernel.Generators/SyscallGenerator.cs +++ b/src/Ryujinx.Horizon.Kernel.Generators/SyscallGenerator.cs @@ -34,14 +34,14 @@ namespace Ryujinx.Horizon.Kernel.Generators private const string TypeResult = NamespaceHorizonCommon + "." + TypeResultName; private const string TypeExecutionContext = "IExecutionContext"; - private static readonly string[] _expectedResults = new string[] - { + private static readonly string[] _expectedResults = + [ $"{TypeResultName}.Success", $"{TypeKernelResultName}.TimedOut", $"{TypeKernelResultName}.Cancelled", $"{TypeKernelResultName}.PortRemoteClosed", $"{TypeKernelResultName}.InvalidState", - }; + ]; private readonly struct OutParameter { diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index 33dd61d42..ee6bf3792 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -1125,6 +1125,30 @@ "zh_TW": "檢查更新" } }, + { + "ID": "MenuBarHelpFaqAndGuides", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "FAQ & Guides", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, { "ID": "MenuBarHelpFaq", "Translations": { @@ -21574,4 +21598,4 @@ } } ] -} \ No newline at end of file +} diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml index be805566e..65f048bee 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml @@ -290,6 +290,11 @@ + - - - - - + + + + + From 23b0b2240069b3a9b683d6270f39e30ba729cf0c Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Sun, 22 Dec 2024 16:08:12 -0600 Subject: [PATCH 10/12] UI: Ensure last played date & time are always on 2 separate lines, for consistency. --- src/Ryujinx.UI.Common/App/ApplicationData.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ryujinx.UI.Common/App/ApplicationData.cs b/src/Ryujinx.UI.Common/App/ApplicationData.cs index 151220f39..657b9a022 100644 --- a/src/Ryujinx.UI.Common/App/ApplicationData.cs +++ b/src/Ryujinx.UI.Common/App/ApplicationData.cs @@ -38,7 +38,7 @@ namespace Ryujinx.UI.App.Common public string TimePlayedString => ValueFormatUtils.FormatTimeSpan(TimePlayed); - public string LastPlayedString => ValueFormatUtils.FormatDateTime(LastPlayed) ?? LocalizedNever(); + public string LastPlayedString => ValueFormatUtils.FormatDateTime(LastPlayed)?.Replace(" ", "\n") ?? LocalizedNever(); public string FileSizeString => ValueFormatUtils.FormatFileSize(FileSize); From a270dc721ccd12873c36d8b766cf8f3483c08a78 Mon Sep 17 00:00:00 2001 From: asfasagag Date: Sun, 22 Dec 2024 20:49:40 -0800 Subject: [PATCH 11/12] UI: Option to resize window to 1440p, 2160p (#432) Minor but useful quality of life addition --- src/Ryujinx/Assets/locales.json | 48 +++++++++++++++++++ .../UI/Views/Main/MainMenuBarView.axaml | 2 + 2 files changed, 50 insertions(+) diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index ee6bf3792..a6d0ece6a 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -1077,6 +1077,54 @@ "zh_TW": "" } }, + { + "ID": "MenuBarViewWindow1440", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "1440p", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, + { + "ID": "MenuBarViewWindow2160", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "2160p", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, { "ID": "MenuBarHelp", "Translations": { diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml index 65f048bee..7d8135dcf 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml @@ -287,6 +287,8 @@ + + From a560d2efdb759bea4c7300985295200980b008ae Mon Sep 17 00:00:00 2001 From: GabCoolGuy Date: Mon, 23 Dec 2024 22:43:06 +0100 Subject: [PATCH 12/12] UI: Added missing french locales/Translated french locales (#415) Custom refresh rate locales and fixed a couple others too --- src/Ryujinx/Assets/locales.json | 114 ++++++++++++++++---------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index a6d0ece6a..c4038eeef 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -701,7 +701,7 @@ "el_GR": "", "en_US": "Scan An Amiibo (From Bin)", "es_ES": "", - "fr_FR": "", + "fr_FR": "Scanner un Amiibo (à partir d'un .bin)", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -749,7 +749,7 @@ "el_GR": "Εγκατάσταση Firmware", "en_US": "Install Firmware", "es_ES": "Instalar firmware", - "fr_FR": "Installer un firmware", + "fr_FR": "Installer le firmware", "he_IL": "התקן קושחה", "it_IT": "Installa firmware", "ja_JP": "ファームウェアをインストール", @@ -821,7 +821,7 @@ "el_GR": "", "en_US": "Install Keys", "es_ES": "", - "fr_FR": "", + "fr_FR": "Installer des clés", "he_IL": "", "it_IT": "Installa Chiavi", "ja_JP": "", @@ -845,7 +845,7 @@ "el_GR": "", "en_US": "Install keys from KEYS or ZIP", "es_ES": "Instalar keys de KEYS o ZIP", - "fr_FR": "", + "fr_FR": "Installer des clés à partir de .KEYS or .ZIP", "he_IL": "", "it_IT": "Installa Chiavi da file KEYS o ZIP", "ja_JP": "", @@ -869,7 +869,7 @@ "el_GR": "", "en_US": "Install keys from a directory", "es_ES": "Instalar keys de un directorio", - "fr_FR": "", + "fr_FR": "Installer des clés à partir d'un dossier", "he_IL": "", "it_IT": "Installa Chiavi da una Cartella", "ja_JP": "", @@ -3221,7 +3221,7 @@ "el_GR": "ΗΠΑ", "en_US": "USA", "es_ES": "EEUU", - "fr_FR": "", + "fr_FR": "États-Unis", "he_IL": "ארה\"ב", "it_IT": "Stati Uniti d'America", "ja_JP": "アメリカ", @@ -3845,7 +3845,7 @@ "el_GR": "", "en_US": "Resync to PC Date & Time", "es_ES": "", - "fr_FR": "", + "fr_FR": "Resynchronier la Date à celle du PC", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -4061,7 +4061,7 @@ "el_GR": "Μικροδιορθώσεις", "en_US": "Hacks", "es_ES": "", - "fr_FR": "", + "fr_FR": "Hacks", "he_IL": "האצות", "it_IT": "Espedienti", "ja_JP": "ハック", @@ -4613,7 +4613,7 @@ "el_GR": "", "en_US": "4x (2880p/4320p) (Not recommended)", "es_ES": "4x (2880p/4320p) (no recomendado)", - "fr_FR": "4x (2880p/4320p) (Non recommandé)", + "fr_FR": "x4 (2880p/4320p) (Non recommandé)", "he_IL": "4x (2880p/4320p) (לא מומלץ)", "it_IT": "4x (2880p/4320p) (Non consigliato)", "ja_JP": "4x (2880p/4320p) (非推奨)", @@ -4637,7 +4637,7 @@ "el_GR": "Αναλογία Απεικόνισης:", "en_US": "Aspect Ratio:", "es_ES": "Relación de aspecto:", - "fr_FR": "Format d'affichage :", + "fr_FR": "Format d'affichage :", "he_IL": "יחס גובה-רוחב:", "it_IT": "Rapporto d'aspetto:", "ja_JP": "アスペクト比:", @@ -10301,7 +10301,7 @@ "el_GR": "", "en_US": "View Profile", "es_ES": "Ver perfil", - "fr_FR": "", + "fr_FR": "Voir Profil", "he_IL": "", "it_IT": "Visualizza profilo", "ja_JP": "", @@ -11237,20 +11237,20 @@ "el_GR": "Αποτυχία μετατροπής της ληφθείσας έκδοσης Ryujinx από την έκδοση GitHub.", "en_US": "Failed to convert the Ryujinx version received from GitHub.", "es_ES": "No se pudo convertir la versión de Ryujinx recibida de GitHub Release.", - "fr_FR": "Impossible de convertir la version reçue de Ryujinx depuis Github Release.", + "fr_FR": "Impossible de convertir la version reçue de Ryujinx depuis GitHub Release.", "he_IL": "המרת גרסת ריוג'ינקס שהתקבלה מ-עדכון הגרסאות של גיטהב נכשלה.", - "it_IT": "La conversione della versione di Ryujinx ricevuta da Github Release è fallita.", + "it_IT": "La conversione della versione di Ryujinx ricevuta da GitHub Release è fallita.", "ja_JP": "Github から取得した Ryujinx バージョンの変換に失敗しました.", "ko_KR": "GitHub에서 받은 Ryujinx 버전을 변환하지 못했습니다.", - "no_NO": "Kan ikke konvertere mottatt Ryujinx-versjon fra Github Utgivelse.", + "no_NO": "Kan ikke konvertere mottatt Ryujinx-versjon fra GitHub Utgivelse.", "pl_PL": "Nie udało się przekonwertować otrzymanej wersji Ryujinx z Github Release.", "pt_BR": "Falha ao converter a versão do Ryujinx recebida do AppVeyor.", - "ru_RU": "Не удалось преобразовать полученную версию Ryujinx из Github Release.", - "th_TH": "ไม่สามารถแปลงเวอร์ชั่น Ryujinx ที่ได้รับจาก Github Release", + "ru_RU": "Не удалось преобразовать полученную версию Ryujinx из GitHub Release.", + "th_TH": "ไม่สามารถแปลงเวอร์ชั่น Ryujinx ที่ได้รับจาก GitHub Release", "tr_TR": "Github Release'den alınan Ryujinx sürümü dönüştürülemedi.", - "uk_UA": "Не вдалося конвертувати отриману версію Ryujinx із випуску Github.", - "zh_CN": "无法切换至从 Github 接收到的新版 Ryujinx 模拟器。", - "zh_TW": "無法轉換從 Github Release 接收到的 Ryujinx 版本。" + "uk_UA": "Не вдалося конвертувати отриману версію Ryujinx із випуску GitHub.", + "zh_CN": "无法切换至从 GitHub 接收到的新版 Ryujinx 模拟器。", + "zh_TW": "無法轉換從 GitHub Release 接收到的 Ryujinx 版本。" } }, { @@ -11357,7 +11357,7 @@ "el_GR": "", "en_US": "Show Changelog", "es_ES": "", - "fr_FR": "", + "fr_FR": "Afficher Changelog", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -12317,7 +12317,7 @@ "el_GR": "Σφάλμα UI: Το επιλεγμένο παιχνίδι δεν έχει έγκυρο αναγνωριστικό τίτλου", "en_US": "UI error: The selected game did not have a valid title ID", "es_ES": "Error de interfaz: El juego seleccionado no tiene una ID válida", - "fr_FR": "Erreur d'UI : le jeu sélectionné n'a pas d'ID de titre valide", + "fr_FR": "Erreur d'UI : Le jeu sélectionné n'a pas d'ID de titre valide", "he_IL": "שגיאת ממשק משתמש: למשחק שנבחר לא קיים מזהה משחק", "it_IT": "Errore UI: Il gioco selezionato non ha un ID titolo valido", "ja_JP": "UI エラー: 選択されたゲームは有効なタイトル ID を保持していません", @@ -12509,7 +12509,7 @@ "el_GR": "", "en_US": "An invalid Keys file was found in {0}", "es_ES": "Se halló un archivo Keys inválido en {0}", - "fr_FR": "", + "fr_FR": "Un fichier de clés invalide a été trouvé dans {0}", "he_IL": "", "it_IT": "E' stato trovato un file di chiavi invalido ' {0}", "ja_JP": "", @@ -12533,7 +12533,7 @@ "el_GR": "", "en_US": "Install Keys", "es_ES": "Instalar Keys", - "fr_FR": "", + "fr_FR": "Installer des clés", "he_IL": "", "it_IT": "Installa Chavi", "ja_JP": "", @@ -12557,7 +12557,7 @@ "el_GR": "", "en_US": "New Keys file will be installed.", "es_ES": "Un nuevo archivo Keys será instalado.", - "fr_FR": "", + "fr_FR": "Nouveau fichier de clés sera installé.", "he_IL": "", "it_IT": "Un nuovo file di Chiavi sarà intallato.", "ja_JP": "", @@ -12581,7 +12581,7 @@ "el_GR": "", "en_US": "\n\nThis may replace some of the current installed Keys.", "es_ES": "\n\nEsto puede reemplazar algunas de las Keys actualmente instaladas.", - "fr_FR": "", + "fr_FR": "\n\nCela pourrait remplacer les clés qui sont installés.", "he_IL": "", "it_IT": "\n\nQuesto potrebbe sovrascrivere alcune delle Chiavi già installate.", "ja_JP": "", @@ -12605,7 +12605,7 @@ "el_GR": "", "en_US": "\n\nDo you want to continue?", "es_ES": "\n\nDeseas continuar?", - "fr_FR": "", + "fr_FR": "\n\nVoulez-vous continuez ?", "he_IL": "", "it_IT": "\n\nVuoi continuare?", "ja_JP": "", @@ -12629,7 +12629,7 @@ "el_GR": "", "en_US": "Installing Keys...", "es_ES": "Instalando Keys...", - "fr_FR": "", + "fr_FR": "Installation des clés...", "he_IL": "", "it_IT": "Installando le chiavi...", "ja_JP": "", @@ -12653,7 +12653,7 @@ "el_GR": "", "en_US": "New Keys file successfully installed.", "es_ES": "Nuevo archivo Keys instalado con éxito.", - "fr_FR": "", + "fr_FR": "Nouveau fichier de clés a été installé.", "he_IL": "", "it_IT": "Nuovo file di chiavi installato con successo.", "ja_JP": "", @@ -13613,7 +13613,7 @@ "el_GR": "", "en_US": "Ryujinx is an emulator for the Nintendo Switch™.\nGet all the latest news in our Discord.\nDevelopers interested in contributing can find out more on our GitHub or Discord.", "es_ES": "", - "fr_FR": "", + "fr_FR": "Ryujinx est un émulateur pour la Nintendo Switch™.\nObtenez le dernières nouvelles sur le Discord.\nLes développeurs qui veulent contribuer peuvent en savoir plus sur notre GitHub ou Discord.", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -13661,7 +13661,7 @@ "el_GR": "", "en_US": "Formerly Maintained By:", "es_ES": "", - "fr_FR": "", + "fr_FR": "Anciennement Maintenu par :", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -14501,7 +14501,7 @@ "el_GR": "", "en_US": "Direct keyboard access (HID) support. Provides games access to your keyboard as a text entry device.\n\nOnly works with games that natively support keyboard usage on Switch hardware.\n\nLeave OFF if unsure.", "es_ES": "Soporte de acceso directo al teclado (HID). Proporciona a los juegos acceso a su teclado como dispositivo de entrada de texto.\n\nSolo funciona con juegos que permiten de forma nativa el uso del teclado en el hardware de Switch.\n\nDesactívalo si no sabes qué hacer.", - "fr_FR": "Prise en charge de l'accès direct au clavier (HID). Permet aux jeux d'accéder à votre clavier comme périphérique de saisie de texte.\n\nFonctionne uniquement avec les jeux prenant en charge nativement l'utilisation du clavier sur le matériel Switch.\n\nLaissez OFF si vous n'êtes pas sûr.", + "fr_FR": "Prise en charge de l'accès direct au clavier (HID). Permet aux jeux d'accéder à votre clavier comme périphérique de saisie de texte.\n\nFonctionne uniquement avec les jeux prenant en charge nativement l'utilisation du clavier sur le matériel Switch.\n\nLaissez désactiver si vous n'êtes pas sûr.", "he_IL": "", "it_IT": "Supporto per l'accesso diretto alla tastiera (HID). Fornisce ai giochi l'accesso alla tastiera come dispositivo di inserimento del testo.\n\nFunziona solo con i giochi che supportano nativamente l'utilizzo della tastiera su hardware Switch.\n\nNel dubbio, lascia l'opzione disattivata.", "ja_JP": "直接キーボード アクセス (HID) のサポートです. テキスト入力デバイスとしてキーボードへのゲームアクセスを提供します.\n\nSwitchハードウェアでキーボードの使用をネイティブにサポートしているゲームでのみ動作します.\n\nわからない場合はオフのままにしてください.", @@ -14525,7 +14525,7 @@ "el_GR": "", "en_US": "Direct mouse access (HID) support. Provides games access to your mouse as a pointing device.\n\nOnly works with games that natively support mouse controls on Switch hardware, which are few and far between.\n\nWhen enabled, touch screen functionality may not work.\n\nLeave OFF if unsure.", "es_ES": "Soporte de acceso directo al mouse (HID). Proporciona a los juegos acceso a su mouse como puntero.\n\nSolo funciona con juegos que permiten de forma nativa el uso de controles con mouse en el hardware de switch, lo cual son pocos.\n\nCuando esté activado, la funcionalidad de pantalla táctil puede no funcionar.\n\nDesactívalo si no sabes qué hacer.", - "fr_FR": "Prise en charge de l'accès direct à la souris (HID). Permet aux jeux d'accéder à votre souris en tant que dispositif de pointage.\n\nFonctionne uniquement avec les jeux qui prennent en charge nativement les contrôles de souris sur le matériel Switch, ce qui est rare.\n\nLorsqu'il est activé, la fonctionnalité de l'écran tactile peut ne pas fonctionner.\n\nLaissez sur OFF si vous n'êtes pas sûr.", + "fr_FR": "Prise en charge de l'accès direct à la souris (HID). Permet aux jeux d'accéder à votre souris en tant que dispositif de pointage.\n\nFonctionne uniquement avec les jeux qui prennent en charge nativement les contrôles de souris sur le matériel Switch, ce qui est rare.\n\nLorsqu'il est activé, la fonctionnalité de l'écran tactile peut ne pas fonctionner.\n\nLaissez désactiver si vous n'êtes pas sûr.", "he_IL": "", "it_IT": "Supporto per l'accesso diretto al mouse (HID). Fornisce ai giochi l'accesso al mouse come dispositivo di puntamento.\n\nFunziona solo con i rari giochi che supportano nativamente l'utilizzo del mouse su hardware Switch.\n\nQuando questa opzione è attivata, il touchscreen potrebbe non funzionare.\n\nNel dubbio, lascia l'opzione disattivata.", "ja_JP": "直接マウスアクセス (HID) のサポートです. ポインティングデバイスとしてマウスへのゲームアクセスを提供します.\n\nSwitchハードウェアでマウスの使用をネイティブにサポートしているゲームでのみ動作します.\n\n有効にしている場合, タッチスクリーン機能は動作しない場合があります.\n\nわからない場合はオフのままにしてください.", @@ -14645,7 +14645,7 @@ "el_GR": "", "en_US": "Resync System Time to match your PC's current date & time.\n\nThis is not an active setting, it can still fall out of sync; in which case just click this button again.", "es_ES": "", - "fr_FR": "", + "fr_FR": "Resynchronise la Date du Système pour qu'elle soit la même que celle du PC.\n\nCeci n'est pas un paramètrage automatique, la date peut se désynchroniser; dans ce cas là, rappuyer sur le boutton.", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -16037,7 +16037,7 @@ "el_GR": "Εύρος:", "en_US": "Range:", "es_ES": "Alcance:", - "fr_FR": "Intervalle :", + "fr_FR": "Intervalle :", "he_IL": "טווח:", "it_IT": "Raggio:", "ja_JP": "範囲:", @@ -17093,7 +17093,7 @@ "el_GR": "", "en_US": "Cabinet Dialog", "es_ES": "Diálogo Gabinete", - "fr_FR": "", + "fr_FR": "Dialogue de Cabinet", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -17117,7 +17117,7 @@ "el_GR": "", "en_US": "Enter your Amiibo's new name", "es_ES": "Ingresa el nuevo nombre de tu Amiibo", - "fr_FR": "", + "fr_FR": "Entrer le nouveau nom de votre Amiibo", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -17141,7 +17141,7 @@ "el_GR": "", "en_US": "Please scan your Amiibo now.", "es_ES": "Escanea tu Amiibo ahora.", - "fr_FR": "", + "fr_FR": "Veuillez scannez votre Amiibo.", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -19133,7 +19133,7 @@ "el_GR": "", "en_US": "{0} DLC(s) available", "es_ES": "", - "fr_FR": "", + "fr_FR": "{0} DLC(s) disponibles", "he_IL": "{0} הרחבות משחק", "it_IT": "", "ja_JP": "", @@ -19589,7 +19589,7 @@ "el_GR": "Όνομα:", "en_US": "Name:", "es_ES": "Nombre:", - "fr_FR": "Nom :", + "fr_FR": "Nom :", "he_IL": "שם:", "it_IT": "Nome:", "ja_JP": "名称:", @@ -21269,7 +21269,7 @@ "el_GR": "", "en_US": "VSync:", "es_ES": "", - "fr_FR": "", + "fr_FR": "VSync :", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -21293,7 +21293,7 @@ "el_GR": "", "en_US": "Enable custom refresh rate (Experimental)", "es_ES": "", - "fr_FR": "", + "fr_FR": "Activer le taux de rafraîchissement customisé (Expérimental)", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -21317,7 +21317,7 @@ "el_GR": "", "en_US": "Switch", "es_ES": "", - "fr_FR": "", + "fr_FR": "Switch", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -21341,7 +21341,7 @@ "el_GR": "", "en_US": "Unbounded", "es_ES": "", - "fr_FR": "", + "fr_FR": "Sans Limite", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -21365,7 +21365,7 @@ "el_GR": "", "en_US": "Custom Refresh Rate", "es_ES": "", - "fr_FR": "", + "fr_FR": "Taux de Rafraîchissement Customisé", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -21389,7 +21389,7 @@ "el_GR": "", "en_US": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate.", "es_ES": "", - "fr_FR": "", + "fr_FR": "VSync émulé. 'Switch' émule le taux de rafraîchissement de la Switch (60Hz). 'Sans Limite' est un taux de rafraîchissement qui n'est pas limité.", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -21411,9 +21411,9 @@ "ar_SA": "", "de_DE": "", "el_GR": "", - "en_US": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate. 'Custom' emulates the specified custom refresh rate.", + "en_US": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate. 'Custom Refresh Rate' emulates the specified custom refresh rate.", "es_ES": "", - "fr_FR": "", + "fr_FR": "VSync émulé. 'Switch' émule le taux de rafraîchissement de la Switch (60Hz). 'Sans Limite' est un taux de rafraîchissement qui n'est pas limité. 'Taux de Rafraîchissement Customisé' émule le taux de rafraîchissement spécifié.", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -21437,7 +21437,7 @@ "el_GR": "", "en_US": "Allows the user to specify an emulated refresh rate. In some titles, this may speed up or slow down the rate of gameplay logic. In other titles, it may allow for capping FPS at some multiple of the refresh rate, or lead to unpredictable behavior. This is an experimental feature, with no guarantees for how gameplay will be affected. \n\nLeave OFF if unsure.", "es_ES": "", - "fr_FR": "", + "fr_FR": "Permet à l'utilisateur de spécifier un taux de rafraîchissement émulé. Dans certains jeux, ceci pourrait accélérer ou ralentir le taux de logique du gameplay. Dans d'autre titres, cela permettrait limiter le FPS à un multiple du taux de rafraîchissement, ou conduire à un comportement imprévisible. Ceci est une fonctionnalité expérimentale, avec aucune garanties pour comment le gameplay sera affecté. \n\nLaisser désactiver en cas de doute.", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -21461,7 +21461,7 @@ "el_GR": "", "en_US": "The custom refresh rate target value.", "es_ES": "", - "fr_FR": "", + "fr_FR": "La valeur cible du taux de rafraîchissement customisé.", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -21485,7 +21485,7 @@ "el_GR": "", "en_US": "The custom refresh rate, as a percentage of the normal Switch refresh rate.", "es_ES": "", - "fr_FR": "", + "fr_FR": "Le taux de rafraîchissement customisé, comme un pourcentage du taux de rafraîchissement normal de la Switch.", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -21509,7 +21509,7 @@ "el_GR": "", "en_US": "Custom Refresh Rate %:", "es_ES": "", - "fr_FR": "", + "fr_FR": "Pourcentage du Taux de Rafraîchissement Customisé :", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -21533,7 +21533,7 @@ "el_GR": "", "en_US": "Custom Refresh Rate Value:", "es_ES": "", - "fr_FR": "", + "fr_FR": "Valeur du Taux de Rafraîchissement Customisé :", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -21557,7 +21557,7 @@ "el_GR": "", "en_US": "Interval", "es_ES": "", - "fr_FR": "", + "fr_FR": "Intervalle", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -21581,7 +21581,7 @@ "el_GR": "", "en_US": "Toggle VSync mode:", "es_ES": "", - "fr_FR": "", + "fr_FR": "Activer/Désactiver mode VSync :", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -21605,7 +21605,7 @@ "el_GR": "", "en_US": "Raise custom refresh rate", "es_ES": "", - "fr_FR": "", + "fr_FR": "Augmenter le taux de rafraîchissement customisé :", "he_IL": "", "it_IT": "", "ja_JP": "", @@ -21627,9 +21627,9 @@ "ar_SA": "", "de_DE": "", "el_GR": "", - "en_US": "Lower custom refresh rate", + "en_US": "Lower custom refresh rate:", "es_ES": "", - "fr_FR": "", + "fr_FR": "Baisser le taux de rafraîchissement customisé :", "he_IL": "", "it_IT": "", "ja_JP": "",