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:
parent
8be7335176
commit
7f500e7cae
7 changed files with 5001 additions and 8 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue