Module: wine Branch: master Commit: 50690e08bd712c0b31c40197584b1c89a804dd53 URL: https://gitlab.winehq.org/wine/wine/-/commit/50690e08bd712c0b31c40197584b1c8...
Author: Arkadiusz Hiler ahiler@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; }