Fix GetDesiredLanguage (#1275)

* Fix GetDesiredLanguage

* Correct tzcnt slip-up

* Address gdkchan's comments
This commit is contained in:
mageven 2020-05-27 14:10:23 +05:30 committed by GitHub
parent 6b55cedd73
commit b663cd22c8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 37 additions and 3 deletions

View file

@ -12,7 +12,9 @@ using Ryujinx.HLE.HOS.Kernel.Memory;
using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Kernel.Threading;
using Ryujinx.HLE.HOS.Services.Am.AppletAE.Storage; using Ryujinx.HLE.HOS.Services.Am.AppletAE.Storage;
using Ryujinx.HLE.HOS.Services.Sdb.Pdm.QueryService; using Ryujinx.HLE.HOS.Services.Sdb.Pdm.QueryService;
using Ryujinx.HLE.HOS.SystemState;
using System; using System;
using System.Numerics;
using static LibHac.Fs.ApplicationSaveDataManagement; using static LibHac.Fs.ApplicationSaveDataManagement;
using AccountUid = Ryujinx.HLE.HOS.Services.Account.Acc.UserId; using AccountUid = Ryujinx.HLE.HOS.Services.Account.Acc.UserId;
@ -79,7 +81,36 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati
// GetDesiredLanguage() -> nn::settings::LanguageCode // GetDesiredLanguage() -> nn::settings::LanguageCode
public ResultCode GetDesiredLanguage(ServiceCtx context) public ResultCode GetDesiredLanguage(ServiceCtx context)
{ {
context.ResponseData.Write(context.Device.System.State.DesiredLanguageCode); // This seems to be calling ns:am GetApplicationDesiredLanguage followed by ConvertApplicationLanguageToLanguageCode
// Calls are from a IReadOnlyApplicationControlDataInterface object
// ConvertApplicationLanguageToLanguageCode compares language code strings and returns the index
// TODO: When above calls are implemented, switch to using ns:am
long desiredLanguageCode = context.Device.System.State.DesiredLanguageCode;
int supportedLanguages = (int)context.Device.Application.ControlData.Value.SupportedLanguages;
int firstSupported = BitOperations.TrailingZeroCount(supportedLanguages);
if (firstSupported > (int)SystemState.TitleLanguage.Chinese)
{
Logger.PrintWarning(LogClass.ServiceAm, "Application has zero supported languages");
context.ResponseData.Write(desiredLanguageCode);
return ResultCode.Success;
}
// If desired language is not supported by application, use first supported language from TitleLanguage.
// TODO: In the future, a GUI could enable user-specified search priority
if (((1 << (int)context.Device.System.State.DesiredTitleLanguage) & supportedLanguages) == 0)
{
SystemLanguage newLanguage = Enum.Parse<SystemLanguage>(Enum.GetName(typeof(SystemState.TitleLanguage), firstSupported));
desiredLanguageCode = SystemStateMgr.GetLanguageCode((int)newLanguage);
Logger.PrintInfo(LogClass.ServiceAm, $"Application doesn't support configured language. Using {newLanguage}");
}
context.ResponseData.Write(desiredLanguageCode);
return ResultCode.Success; return ResultCode.Success;
} }

View file

@ -37,6 +37,8 @@ namespace Ryujinx.HLE.HOS.SystemState
internal long DesiredKeyboardLayout { get; private set; } internal long DesiredKeyboardLayout { get; private set; }
internal SystemLanguage DesiredSystemLanguage { get; private set; }
internal long DesiredLanguageCode { get; private set; } internal long DesiredLanguageCode { get; private set; }
internal uint DesiredRegionCode { get; private set; } internal uint DesiredRegionCode { get; private set; }
@ -68,7 +70,8 @@ namespace Ryujinx.HLE.HOS.SystemState
public void SetLanguage(SystemLanguage language) public void SetLanguage(SystemLanguage language)
{ {
DesiredLanguageCode = GetLanguageCode((int)language); DesiredSystemLanguage = language;
DesiredLanguageCode = GetLanguageCode((int)DesiredSystemLanguage);
switch (language) switch (language)
{ {

View file

@ -16,6 +16,6 @@
Russian, Russian,
Korean, Korean,
Taiwanese, Taiwanese,
Chinese Chinese
} }
} }