From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53240 Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/dinput/tests/device8.c | 40 ++++++++++++++----------------------- 1 file changed, 15 insertions(+), 25 deletions(-)
diff --git a/dlls/dinput/tests/device8.c b/dlls/dinput/tests/device8.c index 927bf18949a..ebe376d1127 100644 --- a/dlls/dinput/tests/device8.c +++ b/dlls/dinput/tests/device8.c @@ -1893,7 +1893,6 @@ static void test_sys_mouse( DWORD version ) hwnd = CreateWindowW( L"static", L"static", WS_POPUP | WS_VISIBLE, 50, 50, 200, 200, NULL, NULL, NULL, NULL ); ok( !!hwnd, "CreateWindowW failed, error %lu\n", GetLastError() ); - flush_events();
hr = IDirectInputDevice8_SetCooperativeLevel( device, NULL, DISCL_FOREGROUND ); ok( hr == DIERR_INVALIDPARAM, "SetCooperativeLevel returned %#lx\n", hr ); @@ -1926,7 +1925,6 @@ static void test_sys_mouse( DWORD version ) child = CreateWindowW( L"static", L"static", WS_CHILD | WS_VISIBLE, 10, 10, 50, 50, hwnd, NULL, NULL, NULL ); ok( !!child, "CreateWindowW failed, error %lu\n", GetLastError() ); - flush_events();
hr = IDirectInputDevice8_SetCooperativeLevel( device, child, DISCL_FOREGROUND ); ok( hr == DIERR_INVALIDPARAM, "SetCooperativeLevel returned %#lx\n", hr ); @@ -1966,27 +1964,6 @@ static void test_sys_mouse( DWORD version ) hr = IDirectInputDevice8_Acquire( device ); ok( hr == DI_NOEFFECT, "Acquire returned %#lx\n", hr );
- - tmp_hwnd = CreateWindowW( L"static", L"static", WS_POPUP | WS_VISIBLE, - 50, 250, 200, 200, NULL, NULL, NULL, NULL ); - ok( !!tmp_hwnd, "CreateWindowW failed, error %lu\n", GetLastError() ); - flush_events(); - - hr = IDirectInputDevice8_GetDeviceState( device, sizeof(state), &state ); - ok( hr == DIERR_NOTACQUIRED, "GetDeviceState returned %#lx\n", hr ); - - hr = IDirectInputDevice8_Acquire( device ); - ok( hr == DIERR_OTHERAPPHASPRIO, "Acquire returned %#lx\n", hr ); - - SetActiveWindow( hwnd ); - flush_events(); - - hr = IDirectInputDevice8_SetProperty( device, DIPROP_BUFFERSIZE, (LPCDIPROPHEADER)&prop_dword ); - ok( hr == DI_OK, "SetProperty returned %#lx\n", hr ); - - hr = IDirectInputDevice8_Acquire( device ); - ok( hr == DI_OK, "Acquire returned %#lx\n", hr ); - mouse_event( MOUSEEVENTF_MOVE, 10, 10, 0, 0 ); res = WaitForSingleObject( event, 100 ); if (res == WAIT_TIMEOUT) /* Acquire is asynchronous */ @@ -2058,8 +2035,23 @@ static void test_sys_mouse( DWORD version ) ok( hr == DI_OK, "GetDeviceData returned %#lx\n", hr ); ok( count == 1, "got count %lu\n", count );
+ hr = IDirectInputDevice8_Unacquire( device ); + ok( hr == DI_OK, "Unacquire returned %#lx\n", hr ); + + + tmp_hwnd = CreateWindowW( L"static", L"static", WS_POPUP | WS_VISIBLE, + 50, 250, 200, 200, NULL, NULL, NULL, NULL ); + ok( !!tmp_hwnd, "CreateWindowW failed, error %lu\n", GetLastError() ); + + hr = IDirectInputDevice8_GetDeviceState( device, sizeof(state), &state ); + ok( hr == DIERR_NOTACQUIRED, "GetDeviceState returned %#lx\n", hr ); + + hr = IDirectInputDevice8_Acquire( device ); + ok( hr == DIERR_OTHERAPPHASPRIO, "Acquire returned %#lx\n", hr ); + DestroyWindow( tmp_hwnd );
+ CloseHandle( event ); DestroyWindow( hwnd );
@@ -2554,7 +2546,6 @@ static void test_sys_keyboard( DWORD version ) hwnd = CreateWindowW( L"static", L"static", WS_POPUP | WS_VISIBLE, 50, 50, 200, 200, NULL, NULL, NULL, NULL ); ok( !!hwnd, "CreateWindowW failed, error %lu\n", GetLastError() ); - flush_events();
hr = IDirectInputDevice8_SetCooperativeLevel( device, NULL, DISCL_FOREGROUND ); ok( hr == DIERR_INVALIDPARAM, "SetCooperativeLevel returned %#lx\n", hr ); @@ -2589,7 +2580,6 @@ static void test_sys_keyboard( DWORD version ) child = CreateWindowW( L"static", L"static", WS_CHILD | WS_VISIBLE, 10, 10, 50, 50, hwnd, NULL, NULL, NULL ); ok( !!child, "CreateWindowW failed, error %lu\n", GetLastError() ); - flush_events();
hr = IDirectInputDevice8_SetCooperativeLevel( device, child, DISCL_FOREGROUND ); ok( hr == DIERR_INVALIDPARAM, "SetCooperativeLevel returned %#lx\n", hr );
From: Rémi Bernon rbernon@codeweavers.com
Because the async operation holds a reference on the invoker and the param, it may keep the effect alive until the worker thread releases its reference on the async operation. We have no way to synchronize on that.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53199 Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/dinput/tests/force_feedback.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-)
diff --git a/dlls/dinput/tests/force_feedback.c b/dlls/dinput/tests/force_feedback.c index 1bcd56d685a..8fb15e38f13 100644 --- a/dlls/dinput/tests/force_feedback.c +++ b/dlls/dinput/tests/force_feedback.c @@ -5673,7 +5673,6 @@ static void test_windows_gaming_input(void) UINT32 size; HRESULT hr; DWORD ret; - LONG ref;
if (!load_combase_functions()) return;
@@ -6053,8 +6052,7 @@ static void test_windows_gaming_input(void) todo_wine ok( hr == 0x86854003, "TryUnloadEffectAsync returned %#lx\n", hr );
- ref = IForceFeedbackEffect_Release( effect ); - ok( ref == 0, "Release returned %lu\n", ref ); + IForceFeedbackEffect_Release( effect );
hr = IPeriodicForceEffectFactory_CreateInstance( periodic_factory, PeriodicForceEffectKind_SineWave, &effect ); @@ -6127,8 +6125,7 @@ static void test_windows_gaming_input(void) IAsyncOperation_boolean_Release( bool_async ); set_hid_expect( file, NULL, 0 );
- ref = IForceFeedbackEffect_Release( effect ); - ok( ref == 0, "Release returned %lu\n", ref ); + IForceFeedbackEffect_Release( effect );
IPeriodicForceEffectFactory_Release( periodic_factory );
@@ -6220,8 +6217,7 @@ static void test_windows_gaming_input(void) IAsyncOperation_boolean_Release( bool_async ); set_hid_expect( file, NULL, 0 );
- ref = IForceFeedbackEffect_Release( effect ); - ok( ref == 0, "Release returned %lu\n", ref ); + IForceFeedbackEffect_Release( effect );
IConditionForceEffectFactory_Release( condition_factory );
@@ -6313,8 +6309,7 @@ static void test_windows_gaming_input(void) IAsyncOperation_boolean_Release( bool_async ); set_hid_expect( file, NULL, 0 );
- ref = IForceFeedbackEffect_Release( effect ); - ok( ref == 0, "Release returned %lu\n", ref ); + IForceFeedbackEffect_Release( effect );
hr = pWindowsCreateString( ramp_effect_class_name, wcslen( ramp_effect_class_name ), &str ); @@ -6387,8 +6382,7 @@ static void test_windows_gaming_input(void) IAsyncOperation_boolean_Release( bool_async ); set_hid_expect( file, NULL, 0 );
- ref = IForceFeedbackEffect_Release( effect ); - ok( ref == 0, "Release returned %lu\n", ref ); + IForceFeedbackEffect_Release( effect );
IForceFeedbackMotor_Release( motor );