Throttle that comes with Thrustmaster T16000M FCS has a dial that doesn't work / is usassignable in many games (e.g. Elite Dangerous).
Returning correct GUID and name would be enough but it breaks the tests due to some quirks of the default format so that is also fixed.
From: Arkadiusz Hiler ahiler@codeweavers.com
--- dlls/dinput/joystick_hid.c | 2 ++ dlls/dinput/tests/joystick8.c | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c index 3dc7b70aac4..7370982d4c9 100644 --- a/dlls/dinput/joystick_hid.c +++ b/dlls/dinput/joystick_hid.c @@ -354,6 +354,8 @@ static const WCHAR *object_usage_to_string( DIDEVICEOBJECTINSTANCEW *instance ) case MAKELONG(HID_USAGE_GENERIC_X, HID_USAGE_PAGE_GENERIC): return L"X Axis"; case MAKELONG(HID_USAGE_GENERIC_Y, HID_USAGE_PAGE_GENERIC): return L"Y Axis"; case MAKELONG(HID_USAGE_GENERIC_Z, HID_USAGE_PAGE_GENERIC): return L"Z Axis"; + case MAKELONG(HID_USAGE_GENERIC_SLIDER, HID_USAGE_PAGE_GENERIC): return L"Slider"; + case MAKELONG(HID_USAGE_GENERIC_DIAL, HID_USAGE_PAGE_GENERIC): return L"Dial";
case MAKELONG(PID_USAGE_ATTACK_LEVEL, HID_USAGE_PAGE_PID): return L"Attack Level"; case MAKELONG(PID_USAGE_ATTACK_TIME, HID_USAGE_PAGE_PID): return L"Attack Time"; diff --git a/dlls/dinput/tests/joystick8.c b/dlls/dinput/tests/joystick8.c index e73330815a0..95c78aa5563 100644 --- a/dlls/dinput/tests/joystick8.c +++ b/dlls/dinput/tests/joystick8.c @@ -2992,8 +2992,8 @@ static void test_many_axes_joystick(void) {0}, {0}, {0}, - {.name = TRUE}, - {.name = TRUE, .guid = TRUE}, + {0}, + {.guid = TRUE}, {.flags = TRUE}, {.flags = TRUE}, {.flags = TRUE}, @@ -3120,7 +3120,7 @@ static void test_many_axes_joystick(void) check_member( objinst, expect_objects[8], "%#lx", dwOfs ); check_member( objinst, expect_objects[8], "%#lx", dwType ); check_member( objinst, expect_objects[8], "%#lx", dwFlags ); - if (!localized) todo_wine check_member_wstr( objinst, expect_objects[8], tszName ); + if (!localized) check_member_wstr( objinst, expect_objects[8], tszName ); check_member( objinst, expect_objects[8], "%lu", dwFFMaxForce ); check_member( objinst, expect_objects[8], "%lu", dwFFForceResolution ); check_member( objinst, expect_objects[8], "%u", wCollectionNumber );
From: Arkadiusz Hiler ahiler@codeweavers.com
--- dlls/dinput/tests/dinput_test.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/dlls/dinput/tests/dinput_test.h b/dlls/dinput/tests/dinput_test.h index 04738cffb44..6badadd0e18 100644 --- a/dlls/dinput/tests/dinput_test.h +++ b/dlls/dinput/tests/dinput_test.h @@ -73,19 +73,19 @@ DWORD WINAPI dinput_test_device_thread( void *stop_event ); void fill_context_( const char *file, int line, char *buffer, SIZE_T size );
#define check_member_( file, line, val, exp, fmt, member ) \ - ok_(file, line)( (val).member == (exp).member, "got " #member " " fmt "\n", (val).member ) + ok_(file, line)( (val).member == (exp).member, "got " #member " " fmt " expected " fmt "\n", (val).member, (exp).member) #define check_member( val, exp, fmt, member ) \ check_member_( __FILE__, __LINE__, val, exp, fmt, member )
#define check_member_guid_( file, line, val, exp, member ) \ - ok_(file, line)( IsEqualGUID( &(val).member, &(exp).member ), "got " #member " %s\n", \ - debugstr_guid( &(val).member ) ) + ok_(file, line)( IsEqualGUID( &(val).member, &(exp).member ), "got " #member " %s expected %s\n", \ + debugstr_guid( &(val).member ), debugstr_guid( &(exp).member ) ) #define check_member_guid( val, exp, member ) \ check_member_guid_( __FILE__, __LINE__, val, exp, member )
#define check_member_wstr_( file, line, val, exp, member ) \ - ok_(file, line)( !wcscmp( (val).member, (exp).member ), "got " #member " %s\n", \ - debugstr_w((val).member) ) + ok_(file, line)( !wcscmp( (val).member, (exp).member ), "got " #member " %s expected %s\n", \ + debugstr_w((val).member), debugstr_w((exp).member) ) #define check_member_wstr( val, exp, member ) \ check_member_wstr_( __FILE__, __LINE__, val, exp, member )
From: Arkadiusz Hiler ahiler@codeweavers.com
--- dlls/dinput/device.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c index f4bdce51633..e15a22bb413 100644 --- a/dlls/dinput/device.c +++ b/dlls/dinput/device.c @@ -244,7 +244,7 @@ LPDIOBJECTDATAFORMAT dataformat_to_odf_by_type(LPCDIDATAFORMAT df, int n, DWORD }
static BOOL match_device_object( const DIDATAFORMAT *device_format, DIDATAFORMAT *user_format, - const DIDATAFORMAT *format, const DIOBJECTDATAFORMAT *match_obj, DWORD version ) + const DIOBJECTDATAFORMAT *match_obj, DWORD version ) { DWORD i, device_instance, instance = DIDFT_GETINSTANCE( match_obj->dwType ); DIOBJECTDATAFORMAT *device_obj, *user_obj; @@ -292,7 +292,7 @@ static HRESULT dinput_device_init_user_format( struct dinput_device *impl, const { match_obj = format->rgodf + i;
- if (!match_device_object( device_format, user_format, format, match_obj, impl->dinput->dwVersion )) + if (!match_device_object( device_format, user_format, match_obj, impl->dinput->dwVersion )) { WARN( "object %s not found\n", debugstr_diobjectdataformat( match_obj ) ); if (!(match_obj->dwType & DIDFT_OPTIONAL)) goto failed;
From: Arkadiusz Hiler ahiler@codeweavers.com
Everything but dwFlags which still has some pending TODOs. --- dlls/dinput/tests/joystick8.c | 116 ++++++++-------------------------- 1 file changed, 26 insertions(+), 90 deletions(-)
diff --git a/dlls/dinput/tests/joystick8.c b/dlls/dinput/tests/joystick8.c index 95c78aa5563..0e1985f98a8 100644 --- a/dlls/dinput/tests/joystick8.c +++ b/dlls/dinput/tests/joystick8.c @@ -3074,122 +3074,58 @@ static void test_many_axes_joystick(void) hr = IDirectInputDevice8_SetDataFormat( device, &c_dfDIJoystick2 ); ok( hr == DI_OK, "SetDataFormat returned: %#lx\n", hr );
+ #define check_object_inst( actual, expected) \ + { \ + check_member( (actual), (expected), "%lu", dwSize ); \ + check_member_guid( (actual), (expected), guidType ); \ + check_member( (actual), (expected), "%#lx", dwOfs ); \ + check_member( (actual), (expected), "%#lx", dwType ); \ + if (!localized) check_member_wstr( (actual), (expected), tszName ); \ + check_member( (actual), (expected), "%lu", dwFFMaxForce ); \ + check_member( (actual), (expected), "%lu", dwFFForceResolution ); \ + check_member( (actual), (expected), "%u", wCollectionNumber ); \ + check_member( (actual), (expected), "%u", wDesignatorIndex ); \ + check_member( (actual), (expected), "%#04x", wUsagePage ); \ + check_member( (actual), (expected), "%#04x", wUsage ); \ + check_member( (actual), (expected), "%#lx", dwDimension ); \ + check_member( (actual), (expected), "%#04x", wExponent ); \ + check_member( (actual), (expected), "%u", wReportId ); \ + } + hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, DIJOFS_RZ, DIPH_BYOFFSET ); ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr ); - - check_member( objinst, expect_objects[5], "%lu", dwSize ); - check_member_guid( objinst, expect_objects[5], guidType ); - check_member( objinst, expect_objects[5], "%#lx", dwOfs ); - check_member( objinst, expect_objects[5], "%#lx", dwType ); + check_object_inst( objinst, expect_objects[5] ); check_member( objinst, expect_objects[5], "%#lx", dwFlags ); - if (!localized) check_member_wstr( objinst, expect_objects[5], tszName ); - check_member( objinst, expect_objects[5], "%lu", dwFFMaxForce ); - check_member( objinst, expect_objects[5], "%lu", dwFFForceResolution ); - check_member( objinst, expect_objects[5], "%u", wCollectionNumber ); - check_member( objinst, expect_objects[5], "%u", wDesignatorIndex ); - check_member( objinst, expect_objects[5], "%#04x", wUsagePage ); - check_member( objinst, expect_objects[5], "%#04x", wUsage ); - check_member( objinst, expect_objects[5], "%#lx", dwDimension ); - check_member( objinst, expect_objects[5], "%#04x", wExponent ); - check_member( objinst, expect_objects[5], "%u", wReportId );
hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(DIJOYSTATE2, rglSlider[0]), DIPH_BYOFFSET ); ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr ); - - check_member( objinst, expect_objects[6], "%lu", dwSize ); - check_member_guid( objinst, expect_objects[6], guidType ); - check_member( objinst, expect_objects[6], "%#lx", dwOfs ); - check_member( objinst, expect_objects[6], "%#lx", dwType ); + check_object_inst( objinst, expect_objects[6] ); check_member( objinst, expect_objects[6], "%#lx", dwFlags ); - if (!localized) check_member_wstr( objinst, expect_objects[6], tszName ); - check_member( objinst, expect_objects[6], "%lu", dwFFMaxForce ); - check_member( objinst, expect_objects[6], "%lu", dwFFForceResolution ); - check_member( objinst, expect_objects[6], "%u", wCollectionNumber ); - check_member( objinst, expect_objects[6], "%u", wDesignatorIndex ); - check_member( objinst, expect_objects[6], "%#04x", wUsagePage ); - check_member( objinst, expect_objects[6], "%#04x", wUsage ); - check_member( objinst, expect_objects[6], "%#lx", dwDimension ); - check_member( objinst, expect_objects[6], "%#04x", wExponent ); - check_member( objinst, expect_objects[6], "%u", wReportId );
hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(DIJOYSTATE2, rglSlider[1]), DIPH_BYOFFSET ); ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr ); - - check_member( objinst, expect_objects[8], "%lu", dwSize ); - check_member_guid( objinst, expect_objects[8], guidType ); - check_member( objinst, expect_objects[8], "%#lx", dwOfs ); - check_member( objinst, expect_objects[8], "%#lx", dwType ); + check_object_inst( objinst, expect_objects[8] ); check_member( objinst, expect_objects[8], "%#lx", dwFlags ); - if (!localized) check_member_wstr( objinst, expect_objects[8], tszName ); - check_member( objinst, expect_objects[8], "%lu", dwFFMaxForce ); - check_member( objinst, expect_objects[8], "%lu", dwFFForceResolution ); - check_member( objinst, expect_objects[8], "%u", wCollectionNumber ); - check_member( objinst, expect_objects[8], "%u", wDesignatorIndex ); - check_member( objinst, expect_objects[8], "%#04x", wUsagePage ); - check_member( objinst, expect_objects[8], "%#04x", wUsage ); - check_member( objinst, expect_objects[8], "%#lx", dwDimension ); - check_member( objinst, expect_objects[8], "%#04x", wExponent ); - check_member( objinst, expect_objects[8], "%u", wReportId );
hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(DIJOYSTATE2, lVX), DIPH_BYOFFSET ); ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr ); - - check_member( objinst, expect_objects[10], "%lu", dwSize ); - check_member_guid( objinst, expect_objects[10], guidType ); - check_member( objinst, expect_objects[10], "%#lx", dwOfs ); - check_member( objinst, expect_objects[10], "%#lx", dwType ); + check_object_inst( objinst, expect_objects[10] ); todo_wine check_member( objinst, expect_objects[10], "%#lx", dwFlags ); - if (!localized) check_member_wstr( objinst, expect_objects[10], tszName ); - check_member( objinst, expect_objects[10], "%lu", dwFFMaxForce ); - check_member( objinst, expect_objects[10], "%lu", dwFFForceResolution ); - check_member( objinst, expect_objects[10], "%u", wCollectionNumber ); - check_member( objinst, expect_objects[10], "%u", wDesignatorIndex ); - check_member( objinst, expect_objects[10], "%#04x", wUsagePage ); - check_member( objinst, expect_objects[10], "%#04x", wUsage ); - check_member( objinst, expect_objects[10], "%#lx", dwDimension ); - check_member( objinst, expect_objects[10], "%#04x", wExponent ); - check_member( objinst, expect_objects[10], "%u", wReportId );
hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(DIJOYSTATE2, lAX), DIPH_BYOFFSET ); ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr ); - - check_member( objinst, expect_objects[13], "%lu", dwSize ); - check_member_guid( objinst, expect_objects[13], guidType ); - check_member( objinst, expect_objects[13], "%#lx", dwOfs ); - check_member( objinst, expect_objects[13], "%#lx", dwType ); + check_object_inst( objinst, expect_objects[13] ); todo_wine check_member( objinst, expect_objects[13], "%#lx", dwFlags ); - if (!localized) check_member_wstr( objinst, expect_objects[13], tszName ); - check_member( objinst, expect_objects[13], "%lu", dwFFMaxForce ); - check_member( objinst, expect_objects[13], "%lu", dwFFForceResolution ); - check_member( objinst, expect_objects[13], "%u", wCollectionNumber ); - check_member( objinst, expect_objects[13], "%u", wDesignatorIndex ); - check_member( objinst, expect_objects[13], "%#04x", wUsagePage ); - check_member( objinst, expect_objects[13], "%#04x", wUsage ); - check_member( objinst, expect_objects[13], "%#lx", dwDimension ); - check_member( objinst, expect_objects[13], "%#04x", wExponent ); - check_member( objinst, expect_objects[13], "%u", wReportId );
hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(DIJOYSTATE2, lFX), DIPH_BYOFFSET ); ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr ); - - check_member( objinst, expect_objects[16], "%lu", dwSize ); - check_member_guid( objinst, expect_objects[16], guidType ); - check_member( objinst, expect_objects[16], "%#lx", dwOfs ); - check_member( objinst, expect_objects[16], "%#lx", dwType ); + check_object_inst( objinst, expect_objects[16] ); todo_wine check_member( objinst, expect_objects[16], "%#lx", dwFlags ); - if (!localized) check_member_wstr( objinst, expect_objects[16], tszName ); - check_member( objinst, expect_objects[16], "%lu", dwFFMaxForce ); - check_member( objinst, expect_objects[16], "%lu", dwFFForceResolution ); - check_member( objinst, expect_objects[16], "%u", wCollectionNumber ); - check_member( objinst, expect_objects[16], "%u", wDesignatorIndex ); - check_member( objinst, expect_objects[16], "%#04x", wUsagePage ); - check_member( objinst, expect_objects[16], "%#04x", wUsage ); - check_member( objinst, expect_objects[16], "%#lx", dwDimension ); - check_member( objinst, expect_objects[16], "%#04x", wExponent ); - check_member( objinst, expect_objects[16], "%u", wReportId ); + + #undef check_object_inst
ref = IDirectInputDevice8_Release( device ); ok( ref == 0, "Release returned %ld\n", ref );
From: Arkadiusz Hiler ahiler@codeweavers.com
It's important for the default broken formats like c_dfDIJoystick2 which have multiple sets of sliders defined with the same offsets. --- dlls/dinput/device.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c index e15a22bb413..7323cb93c7a 100644 --- a/dlls/dinput/device.c +++ b/dlls/dinput/device.c @@ -882,6 +882,8 @@ static HRESULT enum_object_filter_init( struct dinput_device *impl, DIPROPHEADER { DIDATAFORMAT *device_format = &impl->device_format, *user_format = &impl->user_format; DIOBJECTDATAFORMAT *device_obj, *user_obj; + DWORD i; + BOOL found;
if (filter->dwHow > DIPH_BYUSAGE) return DIERR_INVALIDPARAM; if (filter->dwHow == DIPH_BYUSAGE && !(impl->instance.dwDevType & DIDEVTYPE_HID)) return DIERR_UNSUPPORTED; @@ -889,14 +891,14 @@ static HRESULT enum_object_filter_init( struct dinput_device *impl, DIPROPHEADER
if (!user_format->rgodf) return DIERR_NOTFOUND;
- user_obj = user_format->rgodf + device_format->dwNumObjs; - device_obj = device_format->rgodf + device_format->dwNumObjs; - while (user_obj-- > user_format->rgodf && device_obj-- > device_format->rgodf) + for (found = FALSE, i = 0; !found && i < device_format->dwNumObjs; i++) { + user_obj = user_format->rgodf + i; + device_obj = device_format->rgodf + i; if (!user_obj->dwType) continue; - if (user_obj->dwOfs == filter->dwObj) break; + if (user_obj->dwOfs == filter->dwObj) found = TRUE; } - if (user_obj < user_format->rgodf) return DIERR_NOTFOUND; + if (!found) return DIERR_NOTFOUND;
filter->dwObj = device_obj->dwOfs; return DI_OK;
From: Arkadiusz Hiler ahiler@codeweavers.com
--- dlls/dinput/joystick_hid.c | 1 + dlls/dinput/tests/joystick8.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c index 7370982d4c9..ebebbee6eb2 100644 --- a/dlls/dinput/joystick_hid.c +++ b/dlls/dinput/joystick_hid.c @@ -276,6 +276,7 @@ static const GUID *object_usage_to_guid( USAGE usage_page, USAGE usage ) case HID_USAGE_GENERIC_RY: return &GUID_RyAxis; case HID_USAGE_GENERIC_RZ: return &GUID_RzAxis; case HID_USAGE_GENERIC_SLIDER: return &GUID_Slider; + case HID_USAGE_GENERIC_DIAL: return &GUID_Slider; case HID_USAGE_GENERIC_HATSWITCH: return &GUID_POV; } break; diff --git a/dlls/dinput/tests/joystick8.c b/dlls/dinput/tests/joystick8.c index 0e1985f98a8..3cd46058dcf 100644 --- a/dlls/dinput/tests/joystick8.c +++ b/dlls/dinput/tests/joystick8.c @@ -2993,7 +2993,7 @@ static void test_many_axes_joystick(void) {0}, {0}, {0}, - {.guid = TRUE}, + {0}, {.flags = TRUE}, {.flags = TRUE}, {.flags = TRUE},
From: Arkadiusz Hiler ahiler@codeweavers.com
--- dlls/dinput/tests/joystick8.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/dlls/dinput/tests/joystick8.c b/dlls/dinput/tests/joystick8.c index 3cd46058dcf..e391104bc97 100644 --- a/dlls/dinput/tests/joystick8.c +++ b/dlls/dinput/tests/joystick8.c @@ -3107,6 +3107,10 @@ static void test_many_axes_joystick(void) check_object_inst( objinst, expect_objects[8] ); check_member( objinst, expect_objects[8], "%#lx", dwFlags );
+ /* c_dfDIJoystick2 is broken when it comes to more than two sliders */ + hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(DIJOYSTATE2, rglVSlider[0]), DIPH_BYOFFSET ); + ok( hr == DIERR_NOTFOUND, "GetObjectInfo returned: %#lx\n", hr ); + hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(DIJOYSTATE2, lVX), DIPH_BYOFFSET ); ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr ); check_object_inst( objinst, expect_objects[10] );
From: Arkadiusz Hiler ahiler@codeweavers.com
--- dlls/dinput/tests/joystick8.c | 38 +++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+)
diff --git a/dlls/dinput/tests/joystick8.c b/dlls/dinput/tests/joystick8.c index e391104bc97..5591840b653 100644 --- a/dlls/dinput/tests/joystick8.c +++ b/dlls/dinput/tests/joystick8.c @@ -2629,6 +2629,25 @@ static BOOL test_device_types( DWORD version ) return success; }
+struct three_sliders_state { + LONG slider[3]; +}; + +static const DIOBJECTDATAFORMAT df_three_sliders[] = { + { &GUID_Slider,FIELD_OFFSET(struct three_sliders_state, slider[0]),DIDFT_OPTIONAL|DIDFT_AXIS|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION}, + { &GUID_Slider,FIELD_OFFSET(struct three_sliders_state, slider[1]),DIDFT_OPTIONAL|DIDFT_AXIS|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION}, + { &GUID_Slider,FIELD_OFFSET(struct three_sliders_state, slider[2]),DIDFT_OPTIONAL|DIDFT_AXIS|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION}, +}; + +static const DIDATAFORMAT c_df_three_sliders = { + sizeof(DIDATAFORMAT), + sizeof(DIOBJECTDATAFORMAT), + DIDF_ABSAXIS, + sizeof(struct three_sliders_state), + ARRAY_SIZE(df_three_sliders), + (LPDIOBJECTDATAFORMAT)df_three_sliders +}; + static void test_many_axes_joystick(void) { #include "psh_hid_macros.h" @@ -3129,6 +3148,25 @@ static void test_many_axes_joystick(void) todo_wine check_member( objinst, expect_objects[16], "%#lx", dwFlags );
+ /* make sure that we handle three sliders correctly when the format allows */ + hr = IDirectInputDevice8_SetDataFormat( device, &c_df_three_sliders ); + ok( hr == DI_OK, "SetDataFormat returned: %#lx\n", hr ); + + hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(struct three_sliders_state, slider[0]), DIPH_BYOFFSET ); + ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr ); + check_object_inst( objinst, expect_objects[6] ); + check_member( objinst, expect_objects[6], "%#lx", dwFlags ); + + hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(struct three_sliders_state, slider[1]), DIPH_BYOFFSET ); + ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr ); + check_object_inst( objinst, expect_objects[8] ); + check_member( objinst, expect_objects[8], "%#lx", dwFlags ); + + hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(struct three_sliders_state, slider[2]), DIPH_BYOFFSET ); + ok( hr == DI_OK, "GetObjectInfo returned: %#lx\n", hr ); + check_object_inst( objinst, expect_objects[9] ); + check_member( objinst, expect_objects[9], "%#lx", dwFlags ); + #undef check_object_inst
ref = IDirectInputDevice8_Release( device );
R��mi Bernon (@rbernon) commented about dlls/dinput/tests/dinput_test.h:
void fill_context_( const char *file, int line, char *buffer, SIZE_T size );
#define check_member_( file, line, val, exp, fmt, member ) \
- ok_(file, line)( (val).member == (exp).member, "got " #member " " fmt "\n", (val).member )
I had this at some point, but it tends to get very verbose when there's todos and quickly overflows the testbot limit (though arguably there's much less now). I think I'd prefer to keep it out.
R��mi Bernon (@rbernon) commented about dlls/dinput/tests/joystick8.c:
hr = IDirectInputDevice8_SetDataFormat( device, &c_dfDIJoystick2 ); ok( hr == DI_OK, "SetDataFormat returned: %#lx\n", hr );
- #define check_object_inst( actual, expected) \
I'd prefer a static helper, and use it more consistently. Something like https://gitlab.winehq.org/rbernon/wine/-/commit/850ff678030236cd043f0404b37f....
R��mi Bernon (@rbernon) commented about dlls/dinput/tests/joystick8.c:
check_object_inst( objinst, expect_objects[8] ); check_member( objinst, expect_objects[8], "%#lx", dwFlags );
- /* c_dfDIJoystick2 is broken when it comes to more than two sliders */
- hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, offsetof(DIJOYSTATE2, rglVSlider[0]), DIPH_BYOFFSET );
- ok( hr == DIERR_NOTFOUND, "GetObjectInfo returned: %#lx\n", hr );
This should be broken with the backward lookup and fixed by going forward, right? Is there a way we can have the tests first, then the fixes to make it clear?
I understand the GUID change also plays a part here, so don't bother too much if it gets complicated.
R��mi Bernon (@rbernon) commented about dlls/dinput/device.c:
{ DIDATAFORMAT *device_format = &impl->device_format, *user_format = &impl->user_format; DIOBJECTDATAFORMAT *device_obj, *user_obj;
- DWORD i;
- BOOL found;
I'd prefer to reduce the number of variables, like https://gitlab.winehq.org/rbernon/wine/-/commit/19ae7e1ba41 for instance.
On Mon Jul 25 10:03:25 2022 +0000, R��mi Bernon wrote:
I had this at some point, but it tends to get very verbose when there's todos and quickly overflows the testbot limit (though arguably there's much less now). I think I'd prefer to keep it out.
My logic with adding those is that it's annoying to debug issues without them, especially when you get mostly meaningless line numbers like in the case of `check_objects()` - you don't know which exact object has failed.
On Mon Jul 25 10:03:27 2022 +0000, R��mi Bernon wrote:
This should be broken with the backward lookup and fixed by going forward, right? Is there a way we can have the tests first, then the fixes to make it clear? I understand the GUID change also plays a part here, so don't bother too much if it gets complicated.
It's broken because of the format. No object uses the real offset of `DIJOYSTATE2`'s`rglVSlider[0]`, even the backwards loop won't find this. I find it confusing so I've added the test so we have this quirk documented.