Fix some input controller issues (mapping sticks and duplicate controller names) (#31)
Автор
TheToid

Коммитер
GitHub
9 месяцев назад 
Файлов изменено: 2
+65
–25
b4cac89
src/Ryujinx.Input.SDL2/SDL2Gamepad.cs
+43
–15
@@ -313,6 +313,32 @@ | ||
return value * ConvertRate; | ||
} | ||
private JoyconConfigControllerStick<GamepadInputId, Common.Configuration.Hid.Controller.StickInputId> GetLogicalJoyStickConfig(StickInputId inputId) | ||
{ | ||
switch (inputId) | ||
{ | ||
case StickInputId.Left: | ||
if (_configuration.RightJoyconStick.Joystick == Common.Configuration.Hid.Controller.StickInputId.Left) | ||
{ | ||
return _configuration.RightJoyconStick; | ||
} | ||
else | ||
{ | ||
return _configuration.LeftJoyconStick; | ||
} | ||
case StickInputId.Right: | ||
if (_configuration.LeftJoyconStick.Joystick == Common.Configuration.Hid.Controller.StickInputId.Right) | ||
{ | ||
return _configuration.LeftJoyconStick; | ||
} | ||
else | ||
{ | ||
return _configuration.RightJoyconStick; | ||
} | ||
} | ||
return null; | ||
} | ||
public (float, float) GetStick(StickInputId inputId) | ||
{ | ||
if (inputId == StickInputId.Unbound) | ||
@@ -343,24 +369,26 @@ | ||
if (HasConfiguration) | ||
{ | ||
if ((inputId == StickInputId.Left && _configuration.LeftJoyconStick.InvertStickX) || | ||
(inputId == StickInputId.Right && _configuration.RightJoyconStick.InvertStickX)) | ||
{ | ||
resultX = -resultX; | ||
} | ||
var joyconStickConfig = GetLogicalJoyStickConfig(inputId); | ||
if ((inputId == StickInputId.Left && _configuration.LeftJoyconStick.InvertStickY) || | ||
(inputId == StickInputId.Right && _configuration.RightJoyconStick.InvertStickY)) | ||
if (joyconStickConfig != null) | ||
{ | ||
resultY = -resultY; | ||
} | ||
if (joyconStickConfig.InvertStickX) | ||
{ | ||
resultX = -resultX; | ||
} | ||
if ((inputId == StickInputId.Left && _configuration.LeftJoyconStick.Rotate90CW) || | ||
(inputId == StickInputId.Right && _configuration.RightJoyconStick.Rotate90CW)) | ||
{ | ||
float temp = resultX; | ||
resultX = resultY; | ||
resultY = -temp; | ||
if (joyconStickConfig.InvertStickY) | ||
{ | ||
resultY = -resultY; | ||
} | ||
if (joyconStickConfig.Rotate90CW) | ||
{ | ||
float temp = resultX; | ||
resultX = resultY; | ||
resultY = -temp; | ||
} | ||
} | ||
} | ||
src/Ryujinx/.../InputViewModel.cs
+22
–10
@@ -45,7 +45,6 @@ | ||
private PlayerIndex _playerId; | ||
private int _controller; | ||
private int _controllerNumber; | ||
private string _controllerImage; | ||
private int _device; | ||
private object _configViewModel; | ||
@@ -439,6 +438,24 @@ | ||
public void LoadDevices() | ||
{ | ||
string GetGamepadName(IGamepad gamepad, int controllerNumber) | ||
{ | ||
return $"{GetShortGamepadName(gamepad.Name)} ({controllerNumber})"; | ||
} | ||
string GetUniqueGamepadName(IGamepad gamepad, ref int controllerNumber) | ||
{ | ||
string name = GetGamepadName(gamepad, controllerNumber); | ||
if (Devices.Any(controller => controller.Name == name)) | ||
{ | ||
controllerNumber++; | ||
name = GetGamepadName(gamepad, controllerNumber); | ||
} | ||
return name; | ||
} | ||
lock (Devices) | ||
{ | ||
Devices.Clear(); | ||
@@ -455,23 +472,18 @@ | ||
} | ||
} | ||
int controllerNumber = 0; | ||
foreach (string id in _mainWindow.InputManager.GamepadDriver.GamepadsIds) | ||
{ | ||
using IGamepad gamepad = _mainWindow.InputManager.GamepadDriver.GetGamepad(id); | ||
if (gamepad != null) | ||
{ | ||
if (Devices.Any(controller => GetShortGamepadId(controller.Id) == GetShortGamepadId(gamepad.Id))) | ||
{ | ||
_controllerNumber++; | ||
} | ||
Devices.Add((DeviceType.Controller, id, $"{GetShortGamepadName(gamepad.Name)} ({_controllerNumber})")); | ||
string name = GetUniqueGamepadName(gamepad, ref controllerNumber); | ||
Devices.Add((DeviceType.Controller, id, name)); | ||
} | ||
} | ||
_controllerNumber = 0; | ||
DeviceList.AddRange(Devices.Select(x => x.Name)); | ||
Device = Math.Min(Device, DeviceList.Count); | ||
} | ||
@@ -685,7 +697,7 @@ | ||
if (!File.Exists(path)) | ||
{ | ||
var index = ProfilesList.IndexOf(ProfileName); | ||
int index = ProfilesList.IndexOf(ProfileName); | ||
if (index != -1) | ||
{ | ||
ProfilesList.RemoveAt(index); |
GPG верификация
Статус: Неверифицирован
Причина: Не найден публичный ключ
ID ключа: b5690eeebb952194
Cherry-pick
Команда cherry-pick позволяет выбрать отдельные коммиты из одной ветки и применить их к другой.