1
0
Fork 0
mirror of synced 2025-03-07 03:53:26 +01:00

dinput: Pass additional information to enum_object callback.

This commit is contained in:
Rémi Bernon 2023-03-20 15:27:48 +01:00 committed by Alexandre Julliard
parent 1e594b1c0f
commit 1cda150973
5 changed files with 97 additions and 91 deletions

View file

@ -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, &params );
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, &params );
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, &params );
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, &params );
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;

View file

@ -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 );

View file

@ -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, &params );
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;

View file

@ -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;
}

View file

@ -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;
}