From e187a8870a6f19ac0a85b08aece3c1a1e196e379 Mon Sep 17 00:00:00 2001 From: TSRBerry <20988865+TSRBerry@users.noreply.github.com> Date: Wed, 12 Apr 2023 03:09:47 +0200 Subject: [PATCH] HLE: Deal with empty title names properly (#4643) * hle: Deal with empty titleNames in some languages * gui: Fix displaying the wrong title name * Remove unnecessary bounds check * Fix a NRE when getting the version string * Restore empty string logic --- Ryujinx.Ava/AppHost.cs | 12 +++---- .../Loaders/Processes/ProcessResult.cs | 36 +++++++------------ Ryujinx/Ui/RendererWidgetBase.cs | 12 +++---- 3 files changed, 23 insertions(+), 37 deletions(-) diff --git a/Ryujinx.Ava/AppHost.cs b/Ryujinx.Ava/AppHost.cs index 3cdb3906f..ae9e8e53d 100644 --- a/Ryujinx.Ava/AppHost.cs +++ b/Ryujinx.Ava/AppHost.cs @@ -321,17 +321,15 @@ namespace Ryujinx.Ava _viewModel.IsGameRunning = true; var activeProcess = Device.Processes.ActiveApplication; - var nacp = activeProcess.ApplicationControlProperties; - int desiredLanguage = (int)Device.System.State.DesiredTitleLanguage; - string titleNameSection = string.IsNullOrWhiteSpace(nacp.Title[desiredLanguage].NameString.ToString()) ? string.Empty : $" - {nacp.Title[desiredLanguage].NameString.ToString()}"; - string titleVersionSection = string.IsNullOrWhiteSpace(nacp.DisplayVersionString.ToString()) ? string.Empty : $" v{nacp.DisplayVersionString.ToString()}"; - string titleIdSection = string.IsNullOrWhiteSpace(activeProcess.ProgramIdText) ? string.Empty : $" ({activeProcess.ProgramIdText.ToUpper()})"; - string titleArchSection = activeProcess.Is64Bit ? " (64-bit)" : " (32-bit)"; + string titleNameSection = string.IsNullOrWhiteSpace(activeProcess.Name) ? string.Empty : $" {activeProcess.Name}"; + string titleVersionSection = string.IsNullOrWhiteSpace(activeProcess.DisplayVersion) ? string.Empty : $" v{activeProcess.DisplayVersion}"; + string titleIdSection = $" ({activeProcess.ProgramIdText.ToUpper()})"; + string titleArchSection = activeProcess.Is64Bit ? " (64-bit)" : " (32-bit)"; Dispatcher.UIThread.InvokeAsync(() => { - _viewModel.Title = $"Ryujinx {Program.Version}{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}"; + _viewModel.Title = $"Ryujinx {Program.Version} -{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}"; }); _viewModel.SetUIProgressHandlers(Device); diff --git a/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs b/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs index b9596c8fd..2801e4e08 100644 --- a/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs +++ b/Ryujinx.HLE/Loaders/Processes/ProcessResult.cs @@ -5,6 +5,7 @@ using Ryujinx.Cpu; using Ryujinx.HLE.HOS.SystemState; using Ryujinx.HLE.Loaders.Processes.Extensions; using Ryujinx.Horizon.Common; +using System.Linq; namespace Ryujinx.HLE.Loaders.Processes { @@ -21,8 +22,9 @@ namespace Ryujinx.HLE.Loaders.Processes public readonly ApplicationControlProperty ApplicationControlProperties; public readonly ulong ProcessId; - public string Name; - public ulong ProgramId; + public readonly string Name; + public readonly string DisplayVersion; + public readonly ulong ProgramId; public readonly string ProgramIdText; public readonly bool Is64Bit; public readonly bool DiskCacheEnabled; @@ -52,20 +54,17 @@ namespace Ryujinx.HLE.Loaders.Processes { ulong programId = metaLoader.GetProgramId(); - if (ApplicationControlProperties.Title.ItemsRo.Length > 0) - { - var langIndex = ApplicationControlProperties.Title.ItemsRo.Length > (int)titleLanguage ? (int)titleLanguage : 0; + Name = ApplicationControlProperties.Title[(int)titleLanguage].NameString.ToString(); - Name = ApplicationControlProperties.Title[langIndex].NameString.ToString(); - } - else + if (string.IsNullOrWhiteSpace(Name)) { - Name = metaLoader.GetProgramName(); + Name = ApplicationControlProperties.Title.ItemsRo.ToArray().FirstOrDefault(x => x.Name[0] != 0).NameString.ToString(); } - ProgramId = programId; - ProgramIdText = $"{programId:x16}"; - Is64Bit = metaLoader.IsProgram64Bit(); + DisplayVersion = ApplicationControlProperties.DisplayVersionString.ToString(); + ProgramId = programId; + ProgramIdText = $"{programId:x16}"; + Is64Bit = metaLoader.IsProgram64Bit(); } DiskCacheEnabled = diskCacheEnabled; @@ -85,20 +84,11 @@ namespace Ryujinx.HLE.Loaders.Processes } // TODO: LibHac npdm currently doesn't support version field. - string version; - - if (ProgramId > 0x0100000000007FFF) - { - version = ApplicationControlProperties.DisplayVersionString.ToString(); - } - else - { - version = device.System.ContentManager.GetCurrentFirmwareVersion().VersionString; - } + string version = ProgramId > 0x0100000000007FFF ? DisplayVersion : device.System.ContentManager.GetCurrentFirmwareVersion()?.VersionString ?? "?"; Logger.Info?.Print(LogClass.Loader, $"Application Loaded: {Name} v{version} [{ProgramIdText}] [{(Is64Bit ? "64-bit" : "32-bit")}]"); return true; } } -} \ No newline at end of file +} diff --git a/Ryujinx/Ui/RendererWidgetBase.cs b/Ryujinx/Ui/RendererWidgetBase.cs index 7cb5b3275..65afa6e47 100644 --- a/Ryujinx/Ui/RendererWidgetBase.cs +++ b/Ryujinx/Ui/RendererWidgetBase.cs @@ -496,15 +496,13 @@ namespace Ryujinx.Ui parent.Present(); var activeProcess = Device.Processes.ActiveApplication; - var nacp = activeProcess.ApplicationControlProperties; - int desiredLanguage = (int)Device.System.State.DesiredTitleLanguage; - string titleNameSection = string.IsNullOrWhiteSpace(nacp.Title[desiredLanguage].NameString.ToString()) ? string.Empty : $" - {nacp.Title[desiredLanguage].NameString.ToString()}"; - string titleVersionSection = string.IsNullOrWhiteSpace(nacp.DisplayVersionString.ToString()) ? string.Empty : $" v{nacp.DisplayVersionString.ToString()}"; - string titleIdSection = string.IsNullOrWhiteSpace(activeProcess.ProgramIdText) ? string.Empty : $" ({activeProcess.ProgramIdText.ToUpper()})"; - string titleArchSection = activeProcess.Is64Bit ? " (64-bit)" : " (32-bit)"; + string titleNameSection = string.IsNullOrWhiteSpace(activeProcess.Name) ? string.Empty : $" {activeProcess.Name}"; + string titleVersionSection = string.IsNullOrWhiteSpace(activeProcess.DisplayVersion) ? string.Empty : $" v{activeProcess.DisplayVersion}"; + string titleIdSection = $" ({activeProcess.ProgramIdText.ToUpper()})"; + string titleArchSection = activeProcess.Is64Bit ? " (64-bit)" : " (32-bit)"; - parent.Title = $"Ryujinx {Program.Version}{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}"; + parent.Title = $"Ryujinx {Program.Version} -{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}"; }); Thread renderLoopThread = new Thread(Render)