From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dinput/device.c | 51 +++++++++++++------ dlls/dinput/device_private.h | 8 ++- dlls/dinput/joystick_hid.c | 96 ++++++++++++++---------------------- dlls/dinput/keyboard.c | 18 +++---- dlls/dinput/mouse.c | 15 +++--- 5 files changed, 97 insertions(+), 91 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c index b2487df529b..7fa2a89cf35 100644 --- a/dlls/dinput/device.c +++ b/dlls/dinput/device.c @@ -792,8 +792,22 @@ static ULONG WINAPI dinput_device_AddRef( IDirectInputDevice8W *iface ) return ref; }
-static HRESULT WINAPI dinput_device_EnumObjects( IDirectInputDevice8W *iface, - LPDIENUMDEVICEOBJECTSCALLBACKW callback, +struct enum_objects_params +{ + LPDIENUMDEVICEOBJECTSCALLBACKW callback; + void *context; +}; + +static BOOL enum_objects_callback( struct dinput_device *impl, UINT index, struct hid_value_caps *caps, + const DIDEVICEOBJECTINSTANCEW *instance, void *data ) +{ + struct enum_objects_params *params = data; + if (instance->wUsagePage == HID_USAGE_PAGE_PID && !(instance->dwType & DIDFT_NODATA)) + return DIENUM_CONTINUE; + return params->callback( instance, params->context ); +} + +static HRESULT WINAPI dinput_device_EnumObjects( IDirectInputDevice8W *iface, LPDIENUMDEVICEOBJECTSCALLBACKW callback, void *context, DWORD flags ) { static const DIPROPHEADER filter = @@ -802,6 +816,7 @@ static HRESULT WINAPI dinput_device_EnumObjects( IDirectInputDevice8W *iface, .dwHeaderSize = sizeof(filter), .dwHow = DIPH_DEVICE, }; + struct enum_objects_params params = {.callback = callback, .context = context}; struct dinput_device *impl = impl_from_IDirectInputDevice8W( iface ); HRESULT hr;
@@ -813,25 +828,25 @@ static HRESULT WINAPI dinput_device_EnumObjects( IDirectInputDevice8W *iface,
if (flags == DIDFT_ALL || (flags & DIDFT_AXIS)) { - hr = impl->vtbl->enum_objects( iface, &filter, DIDFT_AXIS, callback, context ); + hr = impl->vtbl->enum_objects( iface, &filter, DIDFT_AXIS, enum_objects_callback, ¶ms ); if (FAILED(hr)) return hr; if (hr != DIENUM_CONTINUE) return DI_OK; } if (flags == DIDFT_ALL || (flags & DIDFT_POV)) { - hr = impl->vtbl->enum_objects( iface, &filter, DIDFT_POV, callback, context ); + hr = impl->vtbl->enum_objects( iface, &filter, DIDFT_POV, enum_objects_callback, ¶ms ); if (FAILED(hr)) return hr; if (hr != DIENUM_CONTINUE) return DI_OK; } if (flags == DIDFT_ALL || (flags & DIDFT_BUTTON)) { - hr = impl->vtbl->enum_objects( iface, &filter, DIDFT_BUTTON, callback, context ); + hr = impl->vtbl->enum_objects( iface, &filter, DIDFT_BUTTON, enum_objects_callback, ¶ms ); if (FAILED(hr)) return hr; if (hr != DIENUM_CONTINUE) return DI_OK; } if (flags == DIDFT_ALL || (flags & (DIDFT_NODATA | DIDFT_COLLECTION))) { - hr = impl->vtbl->enum_objects( iface, &filter, DIDFT_NODATA, callback, context ); + hr = impl->vtbl->enum_objects( iface, &filter, DIDFT_NODATA, enum_objects_callback, ¶ms ); if (FAILED(hr)) return hr; if (hr != DIENUM_CONTINUE) return DI_OK; } @@ -1045,9 +1060,10 @@ static HRESULT check_property( struct dinput_device *impl, const GUID *guid, con return DI_OK; }
-static BOOL CALLBACK find_object( const DIDEVICEOBJECTINSTANCEW *instance, void *context ) +static BOOL find_object( struct dinput_device *device, UINT index, struct hid_value_caps *caps, + const DIDEVICEOBJECTINSTANCEW *instance, void *data ) { - *(DIDEVICEOBJECTINSTANCEW *)context = *instance; + *(DIDEVICEOBJECTINSTANCEW *)data = *instance; return DIENUM_STOP; }
@@ -1058,7 +1074,8 @@ struct get_object_property_params DWORD property; };
-static BOOL CALLBACK get_object_property( const DIDEVICEOBJECTINSTANCEW *instance, void *context ) +static BOOL get_object_property( struct dinput_device *device, UINT index, struct hid_value_caps *caps, + const DIDEVICEOBJECTINSTANCEW *instance, void *data ) { static const struct object_properties default_properties = { @@ -1066,7 +1083,7 @@ static BOOL CALLBACK get_object_property( const DIDEVICEOBJECTINSTANCEW *instanc .range_max = DIPROPRANGE_NOMAX, .granularity = 1, }; - struct get_object_property_params *params = context; + struct get_object_property_params *params = data; struct dinput_device *impl = impl_from_IDirectInputDevice8W( params->iface ); const struct object_properties *properties = NULL;
@@ -1235,9 +1252,10 @@ struct set_object_property_params DWORD property; };
-static BOOL CALLBACK set_object_property( const DIDEVICEOBJECTINSTANCEW *instance, void *context ) +static BOOL set_object_property( struct dinput_device *device, UINT index, struct hid_value_caps *caps, + const DIDEVICEOBJECTINSTANCEW *instance, void *data ) { - struct set_object_property_params *params = context; + struct set_object_property_params *params = data; struct dinput_device *impl = impl_from_IDirectInputDevice8W( params->iface ); struct object_properties *properties = NULL;
@@ -1276,9 +1294,9 @@ static BOOL CALLBACK set_object_property( const DIDEVICEOBJECTINSTANCEW *instanc return DIENUM_STOP; }
-static BOOL CALLBACK reset_object_value( const DIDEVICEOBJECTINSTANCEW *instance, void *context ) +static BOOL reset_object_value( struct dinput_device *impl, UINT index, struct hid_value_caps *caps, + const DIDEVICEOBJECTINSTANCEW *instance, void *context ) { - struct dinput_device *impl = context; struct object_properties *properties; LONG tmp = -1;
@@ -1445,7 +1463,8 @@ static void dinput_device_set_username( struct dinput_device *impl, const DIPROP lstrcpynW( device_player->username, value->wsz, ARRAY_SIZE(device_player->username) ); }
-static BOOL CALLBACK get_object_info( const DIDEVICEOBJECTINSTANCEW *instance, void *data ) +static BOOL get_object_info( struct dinput_device *device, UINT index, struct hid_value_caps *caps, + const DIDEVICEOBJECTINSTANCEW *instance, void *data ) { DIDEVICEOBJECTINSTANCEW *dest = data; DWORD size = dest->dwSize; @@ -2194,7 +2213,7 @@ static BOOL CALLBACK enum_objects_init( const DIDEVICEOBJECTINSTANCEW *instance, }
if (impl->object_properties && (instance->dwType & (DIDFT_AXIS | DIDFT_POV))) - reset_object_value( instance, impl ); + reset_object_value( impl, format->dwNumObjs, NULL, instance, NULL );
format->dwNumObjs++; return DIENUM_CONTINUE; diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h index b044c52ba36..65453f6313d 100644 --- a/dlls/dinput/device_private.h +++ b/dlls/dinput/device_private.h @@ -34,6 +34,12 @@ typedef struct UINT_PTR uAppData; } ActionMap;
+struct dinput_device; +struct hid_value_caps; + +typedef BOOL (*enum_object_callback)( struct dinput_device *impl, UINT index, struct hid_value_caps *caps, + const DIDEVICEOBJECTINSTANCEW *instance, void *data ); + struct dinput_device_vtbl { void (*destroy)( IDirectInputDevice8W *iface ); @@ -42,7 +48,7 @@ struct dinput_device_vtbl HRESULT (*acquire)( IDirectInputDevice8W *iface ); HRESULT (*unacquire)( IDirectInputDevice8W *iface ); HRESULT (*enum_objects)( IDirectInputDevice8W *iface, const DIPROPHEADER *filter, DWORD flags, - LPDIENUMDEVICEOBJECTSCALLBACKW callback, void *context ); + enum_object_callback callback, void *context ); HRESULT (*get_property)( IDirectInputDevice8W *iface, DWORD property, DIPROPHEADER *header, const DIDEVICEOBJECTINSTANCEW *instance ); HRESULT (*get_effect_info)( IDirectInputDevice8W *iface, DIEFFECTINFOW *info, const GUID *guid ); diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c index a91db46c994..e8a554142f4 100644 --- a/dlls/dinput/joystick_hid.c +++ b/dlls/dinput/joystick_hid.c @@ -478,11 +478,8 @@ static HRESULT find_next_effect_id( struct hid_joystick *impl, ULONG *index, USA return DI_OK; }
-typedef BOOL (*enum_object_callback)( struct hid_joystick *impl, struct hid_value_caps *caps, - DIDEVICEOBJECTINSTANCEW *instance, void *data ); - static BOOL enum_object( struct hid_joystick *impl, const DIPROPHEADER *filter, DWORD flags, - enum_object_callback callback, struct hid_value_caps *caps, + enum_object_callback callback, UINT index, struct hid_value_caps *caps, DIDEVICEOBJECTINSTANCEW *instance, void *data ) { if (flags != DIDFT_ALL && !(flags & DIDFT_GETTYPE( instance->dwType ))) return DIENUM_CONTINUE; @@ -490,17 +487,17 @@ static BOOL enum_object( struct hid_joystick *impl, const DIPROPHEADER *filter, switch (filter->dwHow) { case DIPH_DEVICE: - return callback( impl, caps, instance, data ); + return callback( &impl->base, index, caps, instance, data ); case DIPH_BYOFFSET: if (filter->dwObj != instance->dwOfs) return DIENUM_CONTINUE; - return callback( impl, caps, instance, data ); + return callback( &impl->base, index, caps, instance, data ); case DIPH_BYID: if ((filter->dwObj & 0x00ffffff) != (instance->dwType & 0x00ffffff)) return DIENUM_CONTINUE; - return callback( impl, caps, instance, data ); + return callback( &impl->base, index, caps, instance, data ); case DIPH_BYUSAGE: if (HIWORD( filter->dwObj ) != instance->wUsagePage) return DIENUM_CONTINUE; if (LOWORD( filter->dwObj ) != instance->wUsage) return DIENUM_CONTINUE; - return callback( impl, caps, instance, data ); + return callback( &impl->base, index, caps, instance, data ); default: FIXME( "unimplemented filter dwHow %#lx dwObj %#lx\n", filter->dwHow, filter->dwObj ); break; @@ -616,7 +613,7 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter, if ((tmp = object_usage_to_string( &instance ))) lstrcpynW( instance.tszName, tmp, MAX_PATH ); else swprintf( instance.tszName, MAX_PATH, L"Unknown %u", DIDFT_GETINSTANCE( instance.dwType ) ); check_pid_effect_axis_caps( impl, &instance ); - ret = enum_object( impl, filter, flags, callback, caps, &instance, data ); + ret = enum_object( impl, filter, flags, callback, object, caps, &instance, data ); if (ret != DIENUM_CONTINUE) return ret; value_ofs += sizeof(LONG); object++; @@ -651,7 +648,7 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter, instance.dwDimension = caps->units; instance.wExponent = caps->units_exp; swprintf( instance.tszName, MAX_PATH, L"Button %u", DIDFT_GETINSTANCE( instance.dwType ) ); - ret = enum_object( impl, filter, flags, callback, caps, &instance, data ); + ret = enum_object( impl, filter, flags, callback, object, caps, &instance, data ); if (ret != DIENUM_CONTINUE) return ret; button_ofs++; object++; @@ -690,7 +687,7 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter, instance.wExponent = caps->units_exp; if ((tmp = object_usage_to_string( &instance ))) lstrcpynW( instance.tszName, tmp, MAX_PATH ); else swprintf( instance.tszName, MAX_PATH, L"Unknown %u", DIDFT_GETINSTANCE( instance.dwType ) ); - ret = enum_object( impl, filter, flags, callback, nary, &instance, data ); + ret = enum_object( impl, filter, flags, callback, -1, nary, &instance, data ); if (ret != DIENUM_CONTINUE) return ret; button_ofs++; } @@ -712,7 +709,7 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter, instance.wExponent = caps->units_exp; if ((tmp = object_usage_to_string( &instance ))) lstrcpynW( instance.tszName, tmp, MAX_PATH ); else swprintf( instance.tszName, MAX_PATH, L"Unknown %u", DIDFT_GETINSTANCE( instance.dwType ) ); - ret = enum_object( impl, filter, flags, callback, caps, &instance, data ); + ret = enum_object( impl, filter, flags, callback, -1, caps, &instance, data ); if (ret != DIENUM_CONTINUE) return ret;
if (caps->flags & HID_VALUE_CAPS_IS_BUTTON) button_ofs++; @@ -739,7 +736,7 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter, len = swprintf( instance.tszName, MAX_PATH, L"Collection %u - ", DIDFT_GETINSTANCE( instance.dwType ) ); if ((tmp = object_usage_to_string( &instance ))) lstrcpynW( instance.tszName + len, tmp, MAX_PATH - len ); else swprintf( instance.tszName + len, MAX_PATH - len, L"Unknown %u", DIDFT_GETINSTANCE( instance.dwType ) ); - ret = enum_object( impl, filter, flags, callback, NULL, &instance, data ); + ret = enum_object( impl, filter, flags, callback, -1, NULL, &instance, data ); if (ret != DIENUM_CONTINUE) return ret; } } @@ -1103,21 +1100,19 @@ struct parse_device_state_params DWORD seq; };
-static BOOL check_device_state_button( struct hid_joystick *impl, struct hid_value_caps *caps, - DIDEVICEOBJECTINSTANCEW *instance, void *data ) +static BOOL check_device_state_button( struct dinput_device *device, UINT index, struct hid_value_caps *caps, + const DIDEVICEOBJECTINSTANCEW *instance, void *data ) { - IDirectInputDevice8W *iface = &impl->base.IDirectInputDevice8W_iface; + IDirectInputDevice8W *iface = &device->IDirectInputDevice8W_iface; struct parse_device_state_params *params = data; BYTE old_value, value; - int index;
- if (instance->wReportId != impl->base.device_state_report_id) return DIENUM_CONTINUE; + if (instance->wReportId != device->device_state_report_id) return DIENUM_CONTINUE;
value = params->buttons[instance->wUsage - 1]; old_value = params->old_state[instance->dwOfs]; - impl->base.device_state[instance->dwOfs] = value; - if (old_value != value && (index = dinput_device_object_index_from_id( iface, instance->dwType )) >= 0) - queue_event( iface, index, value, params->time, params->seq ); + device->device_state[instance->dwOfs] = value; + if (old_value != value) queue_event( iface, index, value, params->time, params->seq );
return DIENUM_CONTINUE; } @@ -1177,9 +1172,10 @@ static LONG scale_axis_value( ULONG value, struct object_properties *properties return phy_min + MulDiv( tmp - log_min, phy_max - phy_min, log_max - log_min ); }
-static BOOL read_device_state_value( struct hid_joystick *impl, struct hid_value_caps *caps, - DIDEVICEOBJECTINSTANCEW *instance, void *data ) +static BOOL read_device_state_value( struct dinput_device *device, UINT index, struct hid_value_caps *caps, + const DIDEVICEOBJECTINSTANCEW *instance, void *data ) { + struct hid_joystick *impl = CONTAINING_RECORD( device, struct hid_joystick, base ); struct object_properties *properties = impl->base.object_properties + instance->dwOfs / sizeof(LONG); IDirectInputDevice8W *iface = &impl->base.IDirectInputDevice8W_iface; ULONG logical_value, report_len = impl->caps.InputReportByteLength; @@ -1187,7 +1183,6 @@ static BOOL read_device_state_value( struct hid_joystick *impl, struct hid_value char *report_buf = impl->input_report_buf; LONG old_value, value; NTSTATUS status; - int index;
if (instance->wReportId != impl->base.device_state_report_id) return DIENUM_CONTINUE;
@@ -1200,8 +1195,7 @@ static BOOL read_device_state_value( struct hid_joystick *impl, struct hid_value
old_value = *(LONG *)(params->old_state + instance->dwOfs); *(LONG *)(impl->base.device_state + instance->dwOfs) = value; - if (old_value != value && (index = dinput_device_object_index_from_id( iface, instance->dwType )) >= 0) - queue_event( iface, index, value, params->time, params->seq ); + if (old_value != value) queue_event( iface, index, value, params->time, params->seq );
return DIENUM_CONTINUE; } @@ -1331,27 +1325,11 @@ static HRESULT hid_joystick_read( IDirectInputDevice8W *iface ) return hr; }
-struct enum_objects_params -{ - LPDIENUMDEVICEOBJECTSCALLBACKW callback; - void *context; -}; - -static BOOL enum_objects_callback( struct hid_joystick *impl, struct hid_value_caps *caps, - DIDEVICEOBJECTINSTANCEW *instance, void *data ) -{ - struct enum_objects_params *params = data; - if (instance->wUsagePage == HID_USAGE_PAGE_PID && !(instance->dwType & DIDFT_NODATA)) - return DIENUM_CONTINUE; - return params->callback( instance, params->context ); -} - static HRESULT hid_joystick_enum_objects( IDirectInputDevice8W *iface, const DIPROPHEADER *filter, - DWORD flags, LPDIENUMDEVICEOBJECTSCALLBACKW callback, void *context ) + DWORD flags, enum_object_callback callback, void *context ) { - struct enum_objects_params params = {.callback = callback, .context = context}; struct hid_joystick *impl = impl_from_IDirectInputDevice8W( iface ); - return enum_objects( impl, filter, flags, enum_objects_callback, ¶ms ); + return enum_objects( impl, filter, flags, callback, context ); }
static const struct dinput_device_vtbl hid_joystick_vtbl = @@ -1664,10 +1642,10 @@ HRESULT hid_joystick_enum_device( DWORD type, DWORD flags, DIDEVICEINSTANCEW *in return DI_OK; }
-static BOOL init_object_properties( struct hid_joystick *impl, struct hid_value_caps *caps, - DIDEVICEOBJECTINSTANCEW *instance, void *data ) +static BOOL init_object_properties( struct dinput_device *device, UINT index, struct hid_value_caps *caps, + const DIDEVICEOBJECTINSTANCEW *instance, void *data ) { - struct object_properties *properties = impl->base.object_properties + instance->dwOfs / sizeof(LONG); + struct object_properties *properties = device->object_properties + instance->dwOfs / sizeof(LONG); LONG tmp;
properties->bit_size = caps->bit_size; @@ -1689,9 +1667,10 @@ static BOOL init_object_properties( struct hid_joystick *impl, struct hid_value_ return DIENUM_CONTINUE; }
-static BOOL init_pid_reports( struct hid_joystick *impl, struct hid_value_caps *caps, - DIDEVICEOBJECTINSTANCEW *instance, void *data ) +static BOOL init_pid_reports( struct dinput_device *device, UINT index, struct hid_value_caps *caps, + const DIDEVICEOBJECTINSTANCEW *instance, void *data ) { + struct hid_joystick *impl = CONTAINING_RECORD( device, struct hid_joystick, base ); struct pid_set_constant_force *set_constant_force = &impl->pid_set_constant_force; struct pid_set_ramp_force *set_ramp_force = &impl->pid_set_ramp_force; struct pid_control_report *device_control = &impl->pid_device_control; @@ -1763,9 +1742,10 @@ static BOOL init_pid_reports( struct hid_joystick *impl, struct hid_value_caps * return DIENUM_CONTINUE; }
-static BOOL init_pid_caps( struct hid_joystick *impl, struct hid_value_caps *caps, - DIDEVICEOBJECTINSTANCEW *instance, void *data ) +static BOOL init_pid_caps( struct dinput_device *device, UINT index, struct hid_value_caps *caps, + const DIDEVICEOBJECTINSTANCEW *instance, void *data ) { + struct hid_joystick *impl = CONTAINING_RECORD( device, struct hid_joystick, base ); struct pid_set_constant_force *set_constant_force = &impl->pid_set_constant_force; struct pid_set_ramp_force *set_ramp_force = &impl->pid_set_ramp_force; struct pid_control_report *device_control = &impl->pid_device_control; @@ -2257,17 +2237,17 @@ static HRESULT WINAPI hid_joystick_effect_GetEffectGuid( IDirectInputEffect *ifa return DI_OK; }
-static BOOL get_parameters_object_id( struct hid_joystick *impl, struct hid_value_caps *caps, - DIDEVICEOBJECTINSTANCEW *instance, void *data ) +static BOOL get_parameters_object_id( struct dinput_device *device, UINT index, struct hid_value_caps *caps, + const DIDEVICEOBJECTINSTANCEW *instance, void *data ) { *(DWORD *)data = instance->dwType; return DIENUM_STOP; }
-static BOOL get_parameters_object_ofs( struct hid_joystick *impl, struct hid_value_caps *caps, - DIDEVICEOBJECTINSTANCEW *instance, void *data ) +static BOOL get_parameters_object_ofs( struct dinput_device *device, UINT index, struct hid_value_caps *caps, + const DIDEVICEOBJECTINSTANCEW *instance, void *data ) { - DIDATAFORMAT *device_format = &impl->base.device_format, *user_format = &impl->base.user_format; + DIDATAFORMAT *device_format = &device->device_format, *user_format = &device->user_format; DIOBJECTDATAFORMAT *device_obj, *user_obj;
if (!user_format->rgodf) return DIENUM_CONTINUE; @@ -2518,8 +2498,8 @@ static HRESULT WINAPI hid_joystick_effect_GetParameters( IDirectInputEffect *ifa return DI_OK; }
-static BOOL set_parameters_object( struct hid_joystick *impl, struct hid_value_caps *caps, - DIDEVICEOBJECTINSTANCEW *instance, void *data ) +static BOOL set_parameters_object( struct dinput_device *device, UINT index, struct hid_value_caps *caps, + const DIDEVICEOBJECTINSTANCEW *instance, void *data ) { DWORD usages = MAKELONG( instance->wUsage, instance->wUsagePage ); *(DWORD *)data = usages; diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c index 73d369b3b5d..0dfc909585a 100644 --- a/dlls/dinput/keyboard.c +++ b/dlls/dinput/keyboard.c @@ -228,28 +228,28 @@ static HRESULT keyboard_unacquire( IDirectInputDevice8W *iface ) return DI_OK; }
-static BOOL try_enum_object( const DIPROPHEADER *filter, DWORD flags, LPDIENUMDEVICEOBJECTSCALLBACKW callback, - DIDEVICEOBJECTINSTANCEW *instance, void *data ) +static BOOL try_enum_object( struct dinput_device *impl, const DIPROPHEADER *filter, DWORD flags, enum_object_callback callback, + UINT index, DIDEVICEOBJECTINSTANCEW *instance, void *data ) { if (flags != DIDFT_ALL && !(flags & DIDFT_GETTYPE( instance->dwType ))) return DIENUM_CONTINUE;
switch (filter->dwHow) { case DIPH_DEVICE: - return callback( instance, data ); + return callback( impl, index, NULL, instance, data ); case DIPH_BYOFFSET: if (filter->dwObj != instance->dwOfs) return DIENUM_CONTINUE; - return callback( instance, data ); + return callback( impl, index, NULL, instance, data ); case DIPH_BYID: if ((filter->dwObj & 0x00ffffff) != (instance->dwType & 0x00ffffff)) return DIENUM_CONTINUE; - return callback( instance, data ); + return callback( impl, index, NULL, instance, data ); }
return DIENUM_CONTINUE; }
static HRESULT keyboard_enum_objects( IDirectInputDevice8W *iface, const DIPROPHEADER *filter, - DWORD flags, LPDIENUMDEVICEOBJECTSCALLBACKW callback, void *context ) + DWORD flags, enum_object_callback callback, void *context ) { struct keyboard *impl = impl_from_IDirectInputDevice8W( iface ); BYTE subtype = GET_DIDEVICE_SUBTYPE( impl->base.instance.dwDevType ); @@ -260,16 +260,16 @@ static HRESULT keyboard_enum_objects( IDirectInputDevice8W *iface, const DIPROPH .dwOfs = DIK_ESCAPE, .dwType = DIDFT_PSHBUTTON | DIDFT_MAKEINSTANCE( DIK_ESCAPE ), }; - DWORD i, dik; + DWORD index, i, dik; BOOL ret;
- for (i = 0; i < 512; ++i) + for (i = 0, index = 0; i < 512; ++i) { if (!GetKeyNameTextW( i << 16, instance.tszName, ARRAY_SIZE(instance.tszName) )) continue; if (!(dik = map_dik_code( i, 0, subtype, impl->base.dinput->dwVersion ))) continue; instance.dwOfs = dik; instance.dwType = DIDFT_PSHBUTTON | DIDFT_MAKEINSTANCE( dik ); - ret = try_enum_object( filter, flags, callback, &instance, context ); + ret = try_enum_object( &impl->base, filter, flags, callback, index++, &instance, context ); if (ret != DIENUM_CONTINUE) return DIENUM_STOP; }
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c index 8e852907d11..9b1bf74b8d5 100644 --- a/dlls/dinput/mouse.c +++ b/dlls/dinput/mouse.c @@ -456,29 +456,30 @@ static HRESULT mouse_unacquire( IDirectInputDevice8W *iface ) return DI_OK; }
-static BOOL try_enum_object( const DIPROPHEADER *filter, DWORD flags, LPDIENUMDEVICEOBJECTSCALLBACKW callback, - DIDEVICEOBJECTINSTANCEW *instance, void *data ) +static BOOL try_enum_object( struct dinput_device *impl, const DIPROPHEADER *filter, DWORD flags, enum_object_callback callback, + UINT index, DIDEVICEOBJECTINSTANCEW *instance, void *data ) { if (flags != DIDFT_ALL && !(flags & DIDFT_GETTYPE( instance->dwType ))) return DIENUM_CONTINUE;
switch (filter->dwHow) { case DIPH_DEVICE: - return callback( instance, data ); + return callback( impl, index, NULL, instance, data ); case DIPH_BYOFFSET: if (filter->dwObj != instance->dwOfs) return DIENUM_CONTINUE; - return callback( instance, data ); + return callback( impl, index, NULL, instance, data ); case DIPH_BYID: if ((filter->dwObj & 0x00ffffff) != (instance->dwType & 0x00ffffff)) return DIENUM_CONTINUE; - return callback( instance, data ); + return callback( impl, index, NULL, instance, data ); }
return DIENUM_CONTINUE; }
static HRESULT mouse_enum_objects( IDirectInputDevice8W *iface, const DIPROPHEADER *filter, - DWORD flags, LPDIENUMDEVICEOBJECTSCALLBACKW callback, void *context ) + DWORD flags, enum_object_callback callback, void *context ) { + struct mouse *impl = impl_from_IDirectInputDevice8W( iface ); DIDEVICEOBJECTINSTANCEW instances[] = { { @@ -546,7 +547,7 @@ static HRESULT mouse_enum_objects( IDirectInputDevice8W *iface, const DIPROPHEAD
for (i = 0; i < ARRAY_SIZE(instances); ++i) { - ret = try_enum_object( filter, flags, callback, instances + i, context ); + ret = try_enum_object( &impl->base, filter, flags, callback, i, instances + i, context ); if (ret != DIENUM_CONTINUE) return DIENUM_STOP; }