Rémi Bernon : dinput: Reset the HID joystick state values on DIPROP_RANGE changes.

Alexandre Julliard julliard at winehq.org
Tue Sep 28 16:01:56 CDT 2021


Module: wine
Branch: master
Commit: 3886634c82c03306ccc643f0296fee91891eedd7
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=3886634c82c03306ccc643f0296fee91891eedd7

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Tue Sep 28 09:30:11 2021 +0200

dinput: Reset the HID joystick state values on DIPROP_RANGE changes.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dinput/joystick_hid.c | 19 ++++++++++++++++---
 dlls/dinput8/tests/hid.c   | 16 ++++++----------
 2 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index 6d70e188dbe..e20d02224fe 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -20,6 +20,7 @@
 #include <assert.h>
 #include <stdarg.h>
 #include <string.h>
+#include <math.h>
 
 #include "windef.h"
 #include "winbase.h"
@@ -585,11 +586,23 @@ static BOOL set_property_prop_range( struct hid_joystick *impl, struct hid_caps
 {
     HIDP_VALUE_CAPS *value_caps = caps->value;
     DIPROPRANGE *value = data;
-    LONG range = value_caps->LogicalMax - value_caps->LogicalMin;
+    LONG tmp;
+
     value_caps->PhysicalMin = value->lMin;
     value_caps->PhysicalMax = value->lMax;
-    if (instance->dwType & DIDFT_POV && range > 0)
-        value_caps->PhysicalMax -= value->lMax / (range + 1);
+
+    if (instance->dwType & DIDFT_AXIS)
+    {
+        if (!value_caps->PhysicalMin) tmp = value_caps->PhysicalMax / 2;
+        else tmp = round( (value_caps->PhysicalMin + value_caps->PhysicalMax) / 2.0 );
+        *(LONG *)(impl->device_state + instance->dwOfs) = tmp;
+    }
+    else if (instance->dwType & DIDFT_POV)
+    {
+        tmp = value_caps->LogicalMax - value_caps->LogicalMin;
+        if (tmp > 0) value_caps->PhysicalMax -= value->lMax / (tmp + 1);
+        *(LONG *)(impl->device_state + instance->dwOfs) = -1;
+    }
     return DIENUM_CONTINUE;
 }
 
diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c
index 0270467dea8..ae758837d36 100644
--- a/dlls/dinput8/tests/hid.c
+++ b/dlls/dinput8/tests/hid.c
@@ -4098,14 +4098,13 @@ static void test_simple_joystick(void)
         winetest_push_context( "state[%d]", i );
         hr = IDirectInputDevice8_GetDeviceState( device, sizeof(DIJOYSTATE2), &state );
         ok( hr == DI_OK, "IDirectInputDevice8_GetDeviceState returned: %#x\n", hr );
-        todo_wine_if( i != 2 )
+        todo_wine_if( i != 0 && i != 2 )
         check_member( state, expect_state[i], "%d", lX );
-        todo_wine_if( i != 2 )
+        todo_wine_if( i != 0 && i != 2 )
         check_member( state, expect_state[i], "%d", lY );
-        todo_wine
+        todo_wine_if( i != 0 )
         check_member( state, expect_state[i], "%d", lZ );
         check_member( state, expect_state[i], "%d", lRx );
-        todo_wine_if( i == 0 )
         check_member( state, expect_state[i], "%#x", rgdwPOV[0] );
         check_member( state, expect_state[i], "%#x", rgdwPOV[1] );
         check_member( state, expect_state[i], "%#x", rgbButtons[0] );
@@ -4306,11 +4305,8 @@ static void test_simple_joystick(void)
 
     hr = IDirectInputDevice8_GetDeviceState( device, sizeof(DIJOYSTATE2), &state );
     ok( hr == DI_OK, "IDirectInputDevice8_GetDeviceState returned: %#x\n", hr );
-    todo_wine
     check_member( state, expect_state_abs[1], "%d", lX );
-    todo_wine
     check_member( state, expect_state_abs[1], "%d", lY );
-    todo_wine
     check_member( state, expect_state_abs[1], "%d", lZ );
     check_member( state, expect_state_abs[1], "%d", lRx );
     check_member( state, expect_state_abs[1], "%d", rgdwPOV[0] );
@@ -4452,12 +4448,12 @@ static void test_simple_joystick(void)
         if (broken( state.lX == -10750 )) win_skip( "Ignoring 32-bit rounding\n" );
         else
         {
-            todo_wine_if( i != 2 )
+            todo_wine_if( i != 0 && i != 2 )
             check_member( state, expect_state_abs[i], "%d", lX );
-            todo_wine_if( i != 2 )
+            todo_wine_if( i != 0 && i != 2 )
             check_member( state, expect_state_abs[i], "%d", lY );
         }
-        todo_wine
+        todo_wine_if( i != 0 )
         check_member( state, expect_state_abs[i], "%d", lZ );
         check_member( state, expect_state_abs[i], "%d", lRx );
         check_member( state, expect_state_abs[i], "%d", rgdwPOV[0] );




More information about the wine-cvs mailing list