فهرست منبع

Fixed incorrect WGI controller state when the application loses focus

Recenter the controller elements when WGI stops reporting valid state

Fixes https://github.com/libsdl-org/SDL/issues/5261
Sam Lantinga 2 سال پیش
والد
کامیت
b7e65a81f1
3فایلهای تغییر یافته به همراه21 افزوده شده و 8 حذف شده
  1. 1 1
      src/joystick/SDL_joystick.c
  2. 1 0
      src/joystick/SDL_joystick_c.h
  3. 19 7
      src/joystick/windows/SDL_windows_gaming_input.c

+ 1 - 1
src/joystick/SDL_joystick.c

@@ -1432,7 +1432,7 @@ static void UpdateEventsForDeviceRemoval(int device_index, Uint32 type)
     SDL_small_free(events, isstack);
 }
 
-static void
+void
 SDL_PrivateJoystickForceRecentering(SDL_Joystick *joystick)
 {
     int i, j;

+ 1 - 0
src/joystick/SDL_joystick_c.h

@@ -152,6 +152,7 @@ extern void SDL_PrivateJoystickAddTouchpad(SDL_Joystick *joystick, int nfingers)
 extern void SDL_PrivateJoystickAddSensor(SDL_Joystick *joystick, SDL_SensorType type, float rate);
 extern void SDL_PrivateJoystickAdded(SDL_JoystickID device_instance);
 extern void SDL_PrivateJoystickRemoved(SDL_JoystickID device_instance);
+extern void SDL_PrivateJoystickForceRecentering(SDL_Joystick *joystick);
 extern int SDL_PrivateJoystickAxis(SDL_Joystick *joystick,
                                    Uint8 axis, Sint16 value);
 extern int SDL_PrivateJoystickBall(SDL_Joystick *joystick,

+ 19 - 7
src/joystick/windows/SDL_windows_gaming_input.c

@@ -852,15 +852,27 @@ WGI_JoystickUpdate(SDL_Joystick *joystick)
     hr = __x_ABI_CWindows_CGaming_CInput_CIRawGameController_GetCurrentReading(hwdata->controller, nbuttons, buttons, nhats, hats, naxes, axes, &timestamp);
     if (SUCCEEDED(hr) && timestamp != hwdata->timestamp) {
         UINT32 i;
+        SDL_bool all_zero = SDL_TRUE;
 
-        for (i = 0; i < nbuttons; ++i) {
-            SDL_PrivateJoystickButton(joystick, (Uint8)i, buttons[i]);
-        }
-        for (i = 0; i < nhats; ++i) {
-            SDL_PrivateJoystickHat(joystick, (Uint8)i, ConvertHatValue(hats[i]));
-        }
+        /* The axes are all zero when the application loses focus */
         for (i = 0; i < naxes; ++i) {
-            SDL_PrivateJoystickAxis(joystick, (Uint8)i, (Sint16)((int) (axes[i] * 65535) - 32768));
+            if (axes[i] != 0.0f) {
+                all_zero = SDL_FALSE;
+                break;
+            }
+        }
+        if (all_zero) {
+            SDL_PrivateJoystickForceRecentering(joystick);
+        } else {
+            for (i = 0; i < nbuttons; ++i) {
+                SDL_PrivateJoystickButton(joystick, (Uint8) i, buttons[i]);
+            }
+            for (i = 0; i < nhats; ++i) {
+                SDL_PrivateJoystickHat(joystick, (Uint8) i, ConvertHatValue(hats[i]));
+            }
+            for (i = 0; i < naxes; ++i) {
+                SDL_PrivateJoystickAxis(joystick, (Uint8)i, (Sint16)((int) (axes[i] * 65535) - 32768));
+            }
         }
         hwdata->timestamp = timestamp;
     }