Improve multi-controller support in HID and Controller Applet (#1453)

* Initial commit

Enable proper LED patterns
Toggle Hotkeys only on focus
Ignore Handheld on Docked mode
Remove PrimaryController
Validate NpadIdType
Rewrite NpadDevices to process config in update loop
Cleanup

* Notify in log periodically when no matched controllers

* Remove duplicate StructArrayHelpers in favor of Common.Memory

Fix struct padding CS0169 warns in Touchscreen

* Remove GTK markup from Controller Applet

Use IList instead of List
Explicit list capacity in 1ms loop
Fix formatting

* Restrict ControllerWindow to show valid controller types

Add selected player name to ControllerWindow title

* ControllerWindow: Fix controller type initial value

NpadDevices: Simplify default battery charge

* Address AcK's comments

Use explicit types and fix formatting

* Remove HashSet for SupportedPlayers

Fixes potential exceptions due to race

* Fix ControllerSupportArg struct packing

Also comes with two revisions of struct for 4/8 players max.
This commit is contained in:
mageven 2020-08-24 02:24:11 +05:30 committed by GitHub
parent 01ff648bdf
commit 27179d0218
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
29 changed files with 445 additions and 242 deletions

View file

@ -594,9 +594,18 @@ namespace Ryujinx.HLE.HOS.Services.Hid
NpadIdType[] supportedPlayerIds = new NpadIdType[arraySize];
context.Device.Hid.Npads.ClearSupportedPlayers();
for (int i = 0; i < arraySize; ++i)
{
supportedPlayerIds[i] = context.Memory.Read<NpadIdType>((ulong)(context.Request.PtrBuff[0].Position + i * 4));
NpadIdType id = context.Memory.Read<NpadIdType>((ulong)(context.Request.PtrBuff[0].Position + i * 4));
if (id >= 0)
{
context.Device.Hid.Npads.SetSupportedPlayer(HidUtils.GetIndexFromNpadIdType(id));
}
supportedPlayerIds[i] = id;
}
Logger.Stub?.PrintStub(LogClass.ServiceHid, $"{arraySize} " + string.Join(",", supportedPlayerIds));
@ -665,9 +674,9 @@ namespace Ryujinx.HLE.HOS.Services.Hid
// GetPlayerLedPattern(uint NpadId) -> ulong LedPattern
public ResultCode GetPlayerLedPattern(ServiceCtx context)
{
int npadId = context.RequestData.ReadInt32();
NpadIdType npadId = (NpadIdType)context.RequestData.ReadInt32();
long ledPattern = 0;
long ledPattern = HidUtils.GetLedPatternFromNpadId(npadId);
context.ResponseData.Write(ledPattern);