Commit 1cda1509 authored by Rémi Bernon's avatar Rémi Bernon Committed by Alexandre Julliard

dinput: Pass additional information to enum_object callback.

parent 1e594b1c
......@@ -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;
......
......@@ -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 );
......
......@@ -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;
}
......
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment