dinput: Improve object dwOfs values for dinput version <= 0x700.
It's not completely correct yet as dinput version 0x500 and probably below enumerate objects following the default data format instead of a device specific one. Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
ec3ffba786
commit
f183f8f946
|
@ -400,11 +400,15 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter,
|
||||||
DIDEVICEOBJECTINSTANCEW instance = {.dwSize = sizeof(DIDEVICEOBJECTINSTANCEW)};
|
DIDEVICEOBJECTINSTANCEW instance = {.dwSize = sizeof(DIDEVICEOBJECTINSTANCEW)};
|
||||||
struct hid_value_caps *caps, *caps_end, *nary, *nary_end, *effect_caps;
|
struct hid_value_caps *caps, *caps_end, *nary, *nary_end, *effect_caps;
|
||||||
struct hid_collection_node *node, *node_end;
|
struct hid_collection_node *node, *node_end;
|
||||||
|
WORD version = impl->base.dinput->dwVersion;
|
||||||
BOOL ret, seen_axis[6] = {0};
|
BOOL ret, seen_axis[6] = {0};
|
||||||
|
|
||||||
button_ofs += impl->caps.NumberInputValueCaps * sizeof(LONG);
|
button_ofs += impl->caps.NumberInputValueCaps * sizeof(LONG);
|
||||||
button_ofs += impl->caps.NumberOutputValueCaps * sizeof(LONG);
|
if (version >= 0x800)
|
||||||
button_ofs += impl->caps.NumberFeatureValueCaps * sizeof(LONG);
|
{
|
||||||
|
button_ofs += impl->caps.NumberOutputValueCaps * sizeof(LONG);
|
||||||
|
button_ofs += impl->caps.NumberFeatureValueCaps * sizeof(LONG);
|
||||||
|
}
|
||||||
|
|
||||||
for (caps = HID_INPUT_VALUE_CAPS( preparsed ), caps_end = caps + preparsed->input_caps_count;
|
for (caps = HID_INPUT_VALUE_CAPS( preparsed ), caps_end = caps + preparsed->input_caps_count;
|
||||||
caps != caps_end; ++caps)
|
caps != caps_end; ++caps)
|
||||||
|
@ -545,7 +549,9 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter,
|
||||||
|
|
||||||
for (nary = caps; nary != nary_end; nary--)
|
for (nary = caps; nary != nary_end; nary--)
|
||||||
{
|
{
|
||||||
instance.dwOfs = button_ofs;
|
if (version < 0x800) instance.dwOfs = 0;
|
||||||
|
else instance.dwOfs = button_ofs;
|
||||||
|
|
||||||
instance.dwType = DIDFT_NODATA | DIDFT_MAKEINSTANCE( object++ ) | DIDFT_OUTPUT;
|
instance.dwType = DIDFT_NODATA | DIDFT_MAKEINSTANCE( object++ ) | DIDFT_OUTPUT;
|
||||||
instance.dwFlags = 0x80008000;
|
instance.dwFlags = 0x80008000;
|
||||||
instance.wUsagePage = nary->usage_page;
|
instance.wUsagePage = nary->usage_page;
|
||||||
|
@ -562,7 +568,8 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter,
|
||||||
}
|
}
|
||||||
else for (j = caps->usage_min; j <= caps->usage_max; ++j)
|
else for (j = caps->usage_min; j <= caps->usage_max; ++j)
|
||||||
{
|
{
|
||||||
if (caps->flags & HID_VALUE_CAPS_IS_BUTTON) instance.dwOfs = button_ofs;
|
if (version < 0x800) instance.dwOfs = 0;
|
||||||
|
else if (caps->flags & HID_VALUE_CAPS_IS_BUTTON) instance.dwOfs = button_ofs;
|
||||||
else instance.dwOfs = value_ofs;
|
else instance.dwOfs = value_ofs;
|
||||||
|
|
||||||
instance.dwType = DIDFT_NODATA | DIDFT_MAKEINSTANCE( object++ ) | DIDFT_OUTPUT;
|
instance.dwType = DIDFT_NODATA | DIDFT_MAKEINSTANCE( object++ ) | DIDFT_OUTPUT;
|
||||||
|
|
Loading…
Reference in New Issue