set: Quick implementation of GetKeyCodeMap/GetKeyCodeMap2 (#1210)

* set: Quick implementation of GetKeyCodeMap/GetKeyCodeMap2

This fixed USB keyboard access in official titles.

* hid: Stub SendKeyboardLockKeyEvent

* Update Ryujinx.HLE/HOS/Services/Settings/ISettingsServer.cs

Co-authored-by: Ac_K <Acoustik666@gmail.com>

* Update Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs

Co-authored-by: Ac_K <Acoustik666@gmail.com>

* set: KeyboardLayout bringup

* set: Small bugfix

* Fix GetKeyCodeMapImpl

* Revert SystemRegion > RegionCode in Configuration

* Fix SendKeyboardLockKeyEvent

Co-authored-by: Ac_K <Acoustik666@gmail.com>
This commit is contained in:
plutoo 2020-05-05 11:50:53 -07:00 committed by GitHub
parent 8be7335176
commit 7f500e7cae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 5001 additions and 8 deletions

View file

@ -60,11 +60,11 @@ namespace Ryujinx.HLE.HOS.Services.Settings
{
// NOTE: Service mount 0x8000000000000050 savedata and read the region code here.
SystemRegion regionCode = (SystemRegion)context.Device.System.State.DesiredRegionCode;
RegionCode regionCode = (RegionCode)context.Device.System.State.DesiredRegionCode;
if (regionCode < SystemRegion.Min || regionCode > SystemRegion.Max)
if (regionCode < RegionCode.Min || regionCode > RegionCode.Max)
{
regionCode = SystemRegion.USA;
regionCode = RegionCode.USA;
}
context.ResponseData.Write((uint)regionCode);
@ -92,6 +92,13 @@ namespace Ryujinx.HLE.HOS.Services.Settings
return ResultCode.Success;
}
[Command(7)] // 4.0.0+
// GetKeyCodeMap() -> buffer<nn::kpr::KeyCodeMap, 0x16>
public ResultCode GetKeyCodeMap(ServiceCtx context)
{
return GetKeyCodeMapImpl(context, 1);
}
[Command(8)] // 5.0.0+
// GetQuestFlag() -> bool
public ResultCode GetQuestFlag(ServiceCtx context)
@ -103,6 +110,96 @@ namespace Ryujinx.HLE.HOS.Services.Settings
return ResultCode.Success;
}
[Command(9)] // 6.0.0+
// GetKeyCodeMap2() -> buffer<nn::kpr::KeyCodeMap, 0x16>
public ResultCode GetKeyCodeMap2(ServiceCtx context)
{
return GetKeyCodeMapImpl(context, 2);
}
public ResultCode GetKeyCodeMapImpl(ServiceCtx context, int version)
{
if (context.Request.ReceiveBuff[0].Size != 0x1000)
{
Logger.PrintWarning(LogClass.ServiceSet, "Bad size");
}
byte[] keyCodeMap;
switch ((KeyboardLayout)context.Device.System.State.DesiredKeyboardLayout)
{
case KeyboardLayout.EnglishUs:
long langCode = context.Device.System.State.DesiredLanguageCode;
if (langCode == 0x736e61482d687a) // Zh-Hans
{
keyCodeMap = KeyCodeMaps.ChineseSimplified;
}
else if (langCode == 0x746e61482d687a) // Zh-Hant
{
keyCodeMap = KeyCodeMaps.ChineseTraditional;
}
else
{
keyCodeMap = KeyCodeMaps.EnglishUk;
}
break;
case KeyboardLayout.EnglishUsInternational:
keyCodeMap = KeyCodeMaps.EnglishUsInternational;
break;
case KeyboardLayout.EnglishUk:
keyCodeMap = KeyCodeMaps.EnglishUk;
break;
case KeyboardLayout.French:
keyCodeMap = KeyCodeMaps.French;
break;
case KeyboardLayout.FrenchCa:
keyCodeMap = KeyCodeMaps.FrenchCa;
break;
case KeyboardLayout.Spanish:
keyCodeMap = KeyCodeMaps.Spanish;
break;
case KeyboardLayout.SpanishLatin:
keyCodeMap = KeyCodeMaps.SpanishLatin;
break;
case KeyboardLayout.German:
keyCodeMap = KeyCodeMaps.German;
break;
case KeyboardLayout.Italian:
keyCodeMap = KeyCodeMaps.Italian;
break;
case KeyboardLayout.Portuguese:
keyCodeMap = KeyCodeMaps.Portuguese;
break;
case KeyboardLayout.Russian:
keyCodeMap = KeyCodeMaps.Russian;
break;
case KeyboardLayout.Korean:
keyCodeMap = KeyCodeMaps.Korean;
break;
case KeyboardLayout.ChineseSimplified:
keyCodeMap = KeyCodeMaps.ChineseSimplified;
break;
case KeyboardLayout.ChineseTraditional:
keyCodeMap = KeyCodeMaps.ChineseTraditional;
break;
default: // KeyboardLayout.Default
keyCodeMap = KeyCodeMaps.Default;
break;
}
context.Memory.Write((ulong)context.Request.ReceiveBuff[0].Position, keyCodeMap);
if (version == 1 && context.Device.System.State.DesiredKeyboardLayout == (long)KeyboardLayout.Default)
{
context.Memory.Write((ulong)context.Request.ReceiveBuff[0].Position, (byte)0x01);
}
return ResultCode.Success;
}
public ResultCode GetAvailableLanguagesCodesImpl(ServiceCtx context, long position, long size, int maxSize)
{
int count = (int)(size / 8);
@ -124,4 +221,4 @@ namespace Ryujinx.HLE.HOS.Services.Settings
return ResultCode.Success;
}
}
}
}