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