Arkadiusz Hiler : dinput: Enumerate user format object forwards.

Alexandre Julliard julliard at winehq.org
Mon Jul 25 16:19:29 CDT 2022


Module: wine
Branch: master
Commit: 50690e08bd712c0b31c40197584b1c89a804dd53
URL:    https://gitlab.winehq.org/wine/wine/-/commit/50690e08bd712c0b31c40197584b1c89a804dd53

Author: Arkadiusz Hiler <ahiler at codeweavers.com>
Date:   Fri Jul 22 14:54:41 2022 +0300

dinput: Enumerate user format object forwards.

It's important for the default broken formats like c_dfDIJoystick2 which
have multiple sets of sliders defined with the same offsets.

---

 dlls/dinput/device.c | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index e15a22bb413..f0220252279 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -880,25 +880,23 @@ static HRESULT WINAPI dinput_device_EnumObjects( IDirectInputDevice8W *iface,
 
 static HRESULT enum_object_filter_init( struct dinput_device *impl, DIPROPHEADER *filter )
 {
-    DIDATAFORMAT *device_format = &impl->device_format, *user_format = &impl->user_format;
-    DIOBJECTDATAFORMAT *device_obj, *user_obj;
+    DIOBJECTDATAFORMAT *user_objs = impl->user_format.rgodf;
+    DWORD i, count = impl->device_format.dwNumObjs;
 
     if (filter->dwHow > DIPH_BYUSAGE) return DIERR_INVALIDPARAM;
     if (filter->dwHow == DIPH_BYUSAGE && !(impl->instance.dwDevType & DIDEVTYPE_HID)) return DIERR_UNSUPPORTED;
     if (filter->dwHow != DIPH_BYOFFSET) return DI_OK;
 
-    if (!user_format->rgodf) return DIERR_NOTFOUND;
+    if (!user_objs) return DIERR_NOTFOUND;
 
-    user_obj = user_format->rgodf + device_format->dwNumObjs;
-    device_obj = device_format->rgodf + device_format->dwNumObjs;
-    while (user_obj-- > user_format->rgodf && device_obj-- > device_format->rgodf)
+    for (i = 0; i < count; i++)
     {
-        if (!user_obj->dwType) continue;
-        if (user_obj->dwOfs == filter->dwObj) break;
+        if (!user_objs[i].dwType) continue;
+        if (user_objs[i].dwOfs == filter->dwObj) break;
     }
-    if (user_obj < user_format->rgodf) return DIERR_NOTFOUND;
+    if (i == count) return DIERR_NOTFOUND;
 
-    filter->dwObj = device_obj->dwOfs;
+    filter->dwObj = impl->device_format.rgodf[i].dwOfs;
     return DI_OK;
 }
 




More information about the wine-cvs mailing list