Add a virtual controller to merge Joy-Cons.

This commit is contained in:
madwind
2024-12-23 17:57:55 +08:00
parent 23b0b22400
commit e9ecbd44fc
4 changed files with 275 additions and 5 deletions

View File

@@ -1,6 +1,7 @@
using Ryujinx.SDL2.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using static SDL2.SDL;
@@ -11,7 +12,7 @@ namespace Ryujinx.Input.SDL2
private readonly Dictionary<int, string> _gamepadsInstanceIdsMapping;
private readonly List<string> _gamepadsIds;
private readonly Lock _lock = new();
private readonly SDL2JoyConPair joyConPair;
public ReadOnlySpan<string> GamepadsIds
{
get
@@ -36,7 +37,7 @@ namespace Ryujinx.Input.SDL2
SDL2Driver.Instance.Initialize();
SDL2Driver.Instance.OnJoyStickConnected += HandleJoyStickConnected;
SDL2Driver.Instance.OnJoystickDisconnected += HandleJoyStickDisconnected;
joyConPair = new SDL2JoyConPair();
// Add already connected gamepads
int numJoysticks = SDL_NumJoysticks();
@@ -89,6 +90,10 @@ namespace Ryujinx.Input.SDL2
lock (_lock)
{
_gamepadsIds.Remove(id);
if (joyConPair.GetJoyConPair(_gamepadsIds) == null)
{
_gamepadsIds.Remove(joyConPair.Id);
}
}
OnGamepadDisconnected?.Invoke(id);
@@ -120,8 +125,12 @@ namespace Ryujinx.Input.SDL2
_gamepadsIds.Insert(joystickDeviceId, id);
else
_gamepadsIds.Add(id);
if (joyConPair.GetJoyConPair(_gamepadsIds) != null)
{
_gamepadsIds.Remove(joyConPair.Id);
_gamepadsIds.Add(joyConPair.Id);
}
}
OnGamepadConnected?.Invoke(id);
}
}
@@ -157,6 +166,11 @@ namespace Ryujinx.Input.SDL2
public IGamepad GetGamepad(string id)
{
if (id == joyConPair.Id)
{
return joyConPair.GetJoyConPair(_gamepadsIds);
}
int joystickIndex = GetJoystickIndexByGamepadId(id);
if (joystickIndex == -1)