dinput: Pass additional information to enum_object callback.
This commit is contained in:
parent
1e594b1c0f
commit
1cda150973
5 changed files with 97 additions and 91 deletions
|
@ -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;
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue