Преглед изворни кода

Fix Steam Controller 2 touchpad finger detection (#15644)

(cherry picked from commit a20530cf15e1edf9d1444263a03e1fe44731c691)
Kuratius пре 1 дан
родитељ
комит
d147bb2a06
1 измењених фајлова са 34 додато и 11 уклоњено
  1. 34 11
      src/joystick/hidapi/SDL_hidapi_steam_triton.c

+ 34 - 11
src/joystick/hidapi/SDL_hidapi_steam_triton.c

@@ -107,6 +107,13 @@ typedef struct
     Uint16 low_frequency_rumble;
     Uint16 high_frequency_rumble;
     Uint64 last_rumble_time;
+
+    bool left_touch_down;
+    float left_touch_x;
+    float left_touch_y;
+    bool right_touch_down;
+    float right_touch_x;
+    float right_touch_y;
 } SDL_DriverSteamTriton_Context;
 
 static bool IsProteusDongle(Uint16 product_id)
@@ -247,17 +254,33 @@ static void HIDAPI_DriverSteamTriton_HandleState(SDL_HIDAPI_Device *device,
         ctx->last_sensor_tick = pTritonReport->imu.timestamp;
     }
 
-    SDL_SendJoystickTouchpad(timestamp, joystick, 0, 0,
-                             pTritonReport->sPressureLeft > 0,
-                             pTritonReport->sLeftPadX / 65536.0f + 0.5f,
-                             -(float)pTritonReport->sLeftPadY / 65536.0f + 0.5f,
-                             pTritonReport->sPressureLeft / 32768.0f);
-
-    SDL_SendJoystickTouchpad(timestamp, joystick, 1, 0,
-                             pTritonReport->sPressureRight > 0,
-                             pTritonReport->sRightPadX / 65536.0f + 0.5f,
-                             -(float)pTritonReport->sRightPadY / 65536.0f + 0.5f,
-                             pTritonReport->sPressureRight / 32768.0f);
+    bool left_touch_down = (pTritonReport->buttons & TRITON_LEFT_TOUCHPAD_TOUCH) ? true : false;
+    bool right_touch_down = (pTritonReport->buttons & TRITON_RIGHT_TOUCHPAD_TOUCH) ? true : false;
+    if (left_touch_down || ctx->left_touch_down) {
+        if (left_touch_down) {
+            ctx->left_touch_x = pTritonReport->sLeftPadX / 65536.0f + 0.5f;
+            ctx->left_touch_y = -(float)pTritonReport->sLeftPadY / 65536.0f + 0.5f;
+
+        }
+        SDL_SendJoystickTouchpad(timestamp, joystick, 0, 0,
+                                 left_touch_down,
+                                 ctx->left_touch_x,
+                                 ctx->left_touch_y,
+                                 pTritonReport->sPressureLeft / 32768.0f);
+        ctx->left_touch_down = left_touch_down;
+    }
+    if (right_touch_down || ctx->right_touch_down) {
+        if (right_touch_down) {
+            ctx->right_touch_x = pTritonReport->sRightPadX / 65536.0f + 0.5f;
+            ctx->right_touch_y = -(float)pTritonReport->sRightPadY / 65536.0f + 0.5f;
+        }
+        SDL_SendJoystickTouchpad(timestamp, joystick, 1, 0,
+                                 right_touch_down,
+                                 ctx->right_touch_x,
+                                 ctx->right_touch_y,
+                                 pTritonReport->sPressureRight / 32768.0f);
+        ctx->right_touch_down = right_touch_down;
+    }
 }
 
 static void HIDAPI_DriverSteamTriton_HandleBatteryStatus(SDL_HIDAPI_Device *device,