diff --git a/Ryujinx/Config.cs b/Ryujinx/Config.cs
index b437a006dd..56eb7e8898 100644
--- a/Ryujinx/Config.cs
+++ b/Ryujinx/Config.cs
@@ -12,6 +12,8 @@ namespace Ryujinx
{
public static JoyCon FakeJoyCon { get; private set; }
+ public static XInputController XInput { get; private set; }
+
public static void Read(Logger Log)
{
string IniFolder = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
@@ -56,6 +58,24 @@ namespace Ryujinx
}
}
+ XInput = new XInputController
+ {
+ ButtonA = Convert.ToInt32(Parser.Value("Controls_XInput_Button_A")),
+ ButtonB = Convert.ToInt32(Parser.Value("Controls_XInput_Button_B")),
+ ButtonX = Convert.ToInt32(Parser.Value("Controls_XInput_Button_X")),
+ ButtonY = Convert.ToInt32(Parser.Value("Controls_XInput_Button_Y")),
+ ButtonPlus = Convert.ToInt32(Parser.Value("Controls_XInput_Button_Plus")),
+ ButtonMinus = Convert.ToInt32(Parser.Value("Controls_XInput_Button_Minus")),
+ DPadUp = Convert.ToInt32(Parser.Value("Controls_XInput_DPad_Up")),
+ DPadDown = Convert.ToInt32(Parser.Value("Controls_XInput_DPad_Down")),
+ DPadLeft = Convert.ToInt32(Parser.Value("Controls_XInput_DPad_Left")),
+ DPadRight = Convert.ToInt32(Parser.Value("Controls_XInput_DPad_Right")),
+ ButtonL = Convert.ToInt32(Parser.Value("Controls_XInput_Button_L")),
+ ButtonZL = Convert.ToInt32(Parser.Value("Controls_XInput_Button_ZL")),
+ ButtonR = Convert.ToInt32(Parser.Value("Controls_XInput_Button_R")),
+ ButtonZR = Convert.ToInt32(Parser.Value("Controls_XInput_Button_ZR"))
+ };
+
FakeJoyCon = new JoyCon
{
Left = new JoyConLeft
diff --git a/Ryujinx/Ryujinx.conf b/Ryujinx/Ryujinx.conf
index 611f320717..91b53dd6bd 100644
--- a/Ryujinx/Ryujinx.conf
+++ b/Ryujinx/Ryujinx.conf
@@ -19,6 +19,22 @@ Logging_Enable_Error = true
#Filtered log classes, seperated by ", ", eg. `Logging_Filtered_Classes = Loader, ServiceFS`
Logging_Filtered_Classes =
+#XInput, https://gist.github.com/Cyuubi/923bb473e412f477b39d7ee4ddae51ed
+Controls_XInput_Button_A = 4096
+Controls_XInput_Button_B = 8192
+Controls_XInput_Button_X = 16384
+Controls_XInput_Button_Y = 32768
+Controls_XInput_Button_Plus = 32
+Controls_XInput_Button_Minus = 16
+Controls_XInput_DPad_Up = 1
+Controls_XInput_DPad_Down = 2
+Controls_XInput_DPad_Left = 4
+Controls_XInput_DPad_Right = 8
+Controls_XInput_Button_L = 64
+Controls_XInput_Button_ZL = 256
+Controls_XInput_Button_R = 128
+Controls_XInput_Button_ZR = 512
+
#https://github.com/opentk/opentk/blob/develop/src/OpenTK/Input/Key.cs
Controls_Left_FakeJoycon_Stick_Up = 105
Controls_Left_FakeJoycon_Stick_Down = 101
diff --git a/Ryujinx/Ryujinx.csproj b/Ryujinx/Ryujinx.csproj
index 47076737b0..dd6d44dfc9 100644
--- a/Ryujinx/Ryujinx.csproj
+++ b/Ryujinx/Ryujinx.csproj
@@ -7,6 +7,7 @@
+
diff --git a/Ryujinx/Ui/GLScreen.cs b/Ryujinx/Ui/GLScreen.cs
index 84ba2dd98f..1fddb13d2c 100644
--- a/Ryujinx/Ui/GLScreen.cs
+++ b/Ryujinx/Ui/GLScreen.cs
@@ -1,6 +1,7 @@
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Input;
+using SharpDX.XInput;
using Ryujinx.Graphics.Gal;
using Ryujinx.HLE;
using Ryujinx.HLE.Input;
@@ -20,6 +21,19 @@ namespace Ryujinx
private IGalRenderer Renderer;
+ //Initialize XInput
+ private Controller[] InputControllers = new[]
+ {
+ new Controller(UserIndex.One),
+ new Controller(UserIndex.Two),
+ new Controller(UserIndex.Three),
+ new Controller(UserIndex.Four)
+ };
+
+ private Controller InputController = null;
+
+ private bool XInputEnabled = false;
+
public GLScreen(Switch Ns, IGalRenderer Renderer)
: base(1280, 720,
new GraphicsMode(), "Ryujinx", 0,
@@ -29,6 +43,26 @@ namespace Ryujinx
this.Ns = Ns;
this.Renderer = Renderer;
+ //Get 1st controller detected
+ foreach (Controller SelectController in InputControllers)
+ {
+ if (SelectController.IsConnected)
+ {
+ InputController = SelectController;
+ break;
+ }
+ }
+
+ if (InputController != null)
+ {
+ XInputEnabled = true;
+ Console.WriteLine("XInput controller detected!");
+ }
+ else
+ {
+ Console.WriteLine("XInput controller not detected!");
+ }
+
Location = new Point(
(DisplayDevice.Default.Width / 2) - (Width / 2),
(DisplayDevice.Default.Height / 2) - (Height / 2));
@@ -54,7 +88,35 @@ namespace Ryujinx
int RightJoystickDX = 0;
int RightJoystickDY = 0;
- //RightJoystick
+ //XInput
+ if (XInputEnabled)
+ {
+ State CurrentState = InputController.GetState();
+
+ //Buttons
+ if (CurrentState.Gamepad.Buttons.HasFlag((GamepadButtonFlags)Config.XInput.ButtonA)) CurrentButton |= HidControllerButtons.KEY_A;
+ if (CurrentState.Gamepad.Buttons.HasFlag((GamepadButtonFlags)Config.XInput.ButtonB)) CurrentButton |= HidControllerButtons.KEY_B;
+ if (CurrentState.Gamepad.Buttons.HasFlag((GamepadButtonFlags)Config.XInput.ButtonX)) CurrentButton |= HidControllerButtons.KEY_X;
+ if (CurrentState.Gamepad.Buttons.HasFlag((GamepadButtonFlags)Config.XInput.ButtonY)) CurrentButton |= HidControllerButtons.KEY_Y;
+
+ //Plus/Minus
+ if (CurrentState.Gamepad.Buttons.HasFlag((GamepadButtonFlags)Config.XInput.ButtonPlus)) CurrentButton |= HidControllerButtons.KEY_PLUS;
+ if (CurrentState.Gamepad.Buttons.HasFlag((GamepadButtonFlags)Config.XInput.ButtonMinus)) CurrentButton |= HidControllerButtons.KEY_MINUS;
+
+ //DPad
+ if (CurrentState.Gamepad.Buttons.HasFlag((GamepadButtonFlags)Config.XInput.DPadUp)) CurrentButton |= HidControllerButtons.KEY_DUP;
+ if (CurrentState.Gamepad.Buttons.HasFlag((GamepadButtonFlags)Config.XInput.DPadDown)) CurrentButton |= HidControllerButtons.KEY_DDOWN;
+ if (CurrentState.Gamepad.Buttons.HasFlag((GamepadButtonFlags)Config.XInput.DPadLeft)) CurrentButton |= HidControllerButtons.KEY_DLEFT;
+ if (CurrentState.Gamepad.Buttons.HasFlag((GamepadButtonFlags)Config.XInput.DPadRight)) CurrentButton |= HidControllerButtons.KEY_DRIGHT;
+
+ //L/ZL/R/ZR
+ if (CurrentState.Gamepad.Buttons.HasFlag((GamepadButtonFlags)Config.XInput.ButtonL)) CurrentButton |= HidControllerButtons.KEY_L;
+ if (CurrentState.Gamepad.Buttons.HasFlag((GamepadButtonFlags)Config.XInput.ButtonZL)) CurrentButton |= HidControllerButtons.KEY_ZL;
+ if (CurrentState.Gamepad.Buttons.HasFlag((GamepadButtonFlags)Config.XInput.ButtonR)) CurrentButton |= HidControllerButtons.KEY_R;
+ if (CurrentState.Gamepad.Buttons.HasFlag((GamepadButtonFlags)Config.XInput.ButtonZR)) CurrentButton |= HidControllerButtons.KEY_ZR;
+ }
+
+ //LeftJoystick
if (Keyboard[(Key)Config.FakeJoyCon.Left.StickUp]) LeftJoystickDY = short.MaxValue;
if (Keyboard[(Key)Config.FakeJoyCon.Left.StickDown]) LeftJoystickDY = -short.MaxValue;
if (Keyboard[(Key)Config.FakeJoyCon.Left.StickLeft]) LeftJoystickDX = -short.MaxValue;
diff --git a/Ryujinx/XInputController.cs b/Ryujinx/XInputController.cs
new file mode 100644
index 0000000000..5c8758a97c
--- /dev/null
+++ b/Ryujinx/XInputController.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Ryujinx
+{
+ public struct XInputController
+ {
+ public int ButtonA;
+ public int ButtonB;
+ public int ButtonX;
+ public int ButtonY;
+ public int ButtonPlus;
+ public int ButtonMinus;
+ public int DPadUp;
+ public int DPadDown;
+ public int DPadLeft;
+ public int DPadRight;
+ public int ButtonL;
+ public int ButtonZL;
+ public int ButtonR;
+ public int ButtonZR;
+ }
+}