Skip to content

Commit

Permalink
dinput: Enumerate user format object forwards.
Browse files Browse the repository at this point in the history
It's important for the default broken formats like c_dfDIJoystick2 which
have multiple sets of sliders defined with the same offsets.
  • Loading branch information
ivyl authored and julliard committed Jul 25, 2022
1 parent 76a1fd2 commit 50690e0
Showing 1 changed file with 8 additions and 10 deletions.
18 changes: 8 additions & 10 deletions dlls/dinput/device.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit 50690e0

Please sign in to comment.