From 4b1bed1b051439a95adcc03da4175741dbdf5bb4 Mon Sep 17 00:00:00 2001
From: Billy Laws <blaws05@gmail.com>
Date: Sat, 19 Sep 2020 16:10:53 +0100
Subject: [PATCH] Correct the threshold for control stick buttons (#1483)

This was tested against HW with https://github.com/Xpl0itR/Input-Test/tree/master/Input-Test and a few changes to record the minimum value axis value when the stick buttons were marked as pressed.
---
 Ryujinx.HLE/HOS/Services/Hid/Hid.cs | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/Ryujinx.HLE/HOS/Services/Hid/Hid.cs b/Ryujinx.HLE/HOS/Services/Hid/Hid.cs
index 2db67619..18a7ba11 100644
--- a/Ryujinx.HLE/HOS/Services/Hid/Hid.cs
+++ b/Ryujinx.HLE/HOS/Services/Hid/Hid.cs
@@ -87,17 +87,18 @@ namespace Ryujinx.HLE.HOS.Services.Hid
 
         public ControllerKeys UpdateStickButtons(JoystickPosition leftStick, JoystickPosition rightStick)
         {
+            const int stickButtonThreshold = short.MaxValue / 2;
             ControllerKeys result = 0;
 
-            result |= (leftStick.Dx < 0) ? ControllerKeys.LStickLeft  : result;
-            result |= (leftStick.Dx > 0) ? ControllerKeys.LStickRight : result;
-            result |= (leftStick.Dy < 0) ? ControllerKeys.LStickDown  : result;
-            result |= (leftStick.Dy > 0) ? ControllerKeys.LStickUp    : result;
+            result |= (leftStick.Dx < -stickButtonThreshold) ? ControllerKeys.LStickLeft  : result;
+            result |= (leftStick.Dx > stickButtonThreshold)  ? ControllerKeys.LStickRight : result;
+            result |= (leftStick.Dy < -stickButtonThreshold) ? ControllerKeys.LStickDown  : result;
+            result |= (leftStick.Dy > stickButtonThreshold)  ? ControllerKeys.LStickUp    : result;
 
-            result |= (rightStick.Dx < 0) ? ControllerKeys.RStickLeft  : result;
-            result |= (rightStick.Dx > 0) ? ControllerKeys.RStickRight : result;
-            result |= (rightStick.Dy < 0) ? ControllerKeys.RStickDown  : result;
-            result |= (rightStick.Dy > 0) ? ControllerKeys.RStickUp    : result;
+            result |= (rightStick.Dx < -stickButtonThreshold) ? ControllerKeys.RStickLeft  : result;
+            result |= (rightStick.Dx > stickButtonThreshold)  ? ControllerKeys.RStickRight : result;
+            result |= (rightStick.Dy < -stickButtonThreshold) ? ControllerKeys.RStickDown  : result;
+            result |= (rightStick.Dy > stickButtonThreshold)  ? ControllerKeys.RStickUp    : result;
 
             return result;
         }