dinput: Use the correct index to remap the axis

Bruno Jesus 00cpxxx at gmail.com
Thu Aug 18 01:34:37 CDT 2016


Games can either remap the whole device or individual axes, for the
whole device it works. For individual axes it does not because it uses
an incorrect variable, so use the same approach from the whole device
[1].

[1] https://source.winehq.org/source/dlls/dinput/joystick.c#0306

Tested with the game Fairy Bloom Freesia and Megaman X8.

Fixes bug https://bugs.winehq.org/show_bug.cgi?id=31693

Signed-off-by: Bruno Jesus <00cpxxx at gmail.com>
-------------- next part --------------
diff --git a/dlls/dinput/joystick.c b/dlls/dinput/joystick.c
index 1c4b436..c02a559 100644
--- a/dlls/dinput/joystick.c
+++ b/dlls/dinput/joystick.c
@@ -291,6 +291,11 @@ HRESULT WINAPI JoystickWGenericImpl_SetProperty(LPDIRECTINPUTDEVICE8W iface, REF
         case (DWORD_PTR)DIPROP_RANGE: {
             LPCDIPROPRANGE pr = (LPCDIPROPRANGE)ph;
             if (ph->dwHow == DIPH_DEVICE) {
+
+                /* Many games poll the joystick immediately after setting the range
+                 * for calibration purposes, so the old values need to be remapped
+                 * to the new range before it does so */
+
                 TRACE("proprange(%d,%d) all\n", pr->lMin, pr->lMax);
                 for (i = 0; i < This->base.data_format.wine_df->dwNumObjs; i++) {
 
@@ -324,8 +329,6 @@ HRESULT WINAPI JoystickWGenericImpl_SetProperty(LPDIRECTINPUTDEVICE8W iface, REF
                 TRACE("proprange(%d,%d) obj=%d\n", pr->lMin, pr->lMax, obj);
                 if (obj >= 0) {
 
-                    /*ePSXe polls the joystick immediately after setting the range for calibration purposes, so the old values need to be remapped to the new range before it does so*/
-
                     remap_props.lDevMin = This->props[obj].lMin;
                     remap_props.lDevMax = This->props[obj].lMax;
 
@@ -335,7 +338,7 @@ HRESULT WINAPI JoystickWGenericImpl_SetProperty(LPDIRECTINPUTDEVICE8W iface, REF
                     remap_props.lMin = pr->lMin;
                     remap_props.lMax = pr->lMax;
 
-                    switch (ph->dwObj) {
+                    switch (This->base.data_format.wine_df->rgodf[obj].dwOfs) {
                     case DIJOFS_X        : This->js.lX  = joystick_map_axis(&remap_props, This->js.lX); break;
                     case DIJOFS_Y        : This->js.lY  = joystick_map_axis(&remap_props, This->js.lY); break;
                     case DIJOFS_Z        : This->js.lZ  = joystick_map_axis(&remap_props, This->js.lZ); break;


More information about the wine-patches mailing list