Signed-off-by: Brendan Shanks bshanks@codeweavers.com --- dlls/dinput/dinput_main.c | 15 ++++++++++++--- dlls/dinput8/tests/device.c | 3 --- 2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c index 0855cb41cd..d70e9c86f2 100644 --- a/dlls/dinput/dinput_main.c +++ b/dlls/dinput/dinput_main.c @@ -1717,10 +1717,11 @@ static DWORD WINAPI hook_thread_proc(void *param) if (msg.message == WM_USER+0x10) { IDirectInputImpl *dinput; + HANDLE finished_event = (HANDLE)msg.lParam;
- TRACE( "Processing hook change notification lp:%ld\n", msg.lParam ); + TRACE( "Processing hook change notification wp:%ld lp:%#lx\n", msg.wParam, msg.lParam );
- if (!msg.wParam && !msg.lParam) + if (!msg.wParam) { if (kbd_hook) UnhookWindowsHookEx( kbd_hook ); if (mouse_hook) UnhookWindowsHookEx( mouse_hook ); @@ -1765,6 +1766,9 @@ static DWORD WINAPI hook_thread_proc(void *param) UnhookWindowsHookEx( mouse_hook ); mouse_hook = NULL; } + + if (finished_event) + SetEvent(finished_event); } TranslateMessage(&msg); DispatchMessageW(&msg); @@ -1824,6 +1828,7 @@ void check_dinput_hooks(LPDIRECTINPUTDEVICE8W iface, BOOL acquired) static HHOOK callwndproc_hook; static ULONG foreground_cnt; IDirectInputDeviceImpl *dev = impl_from_IDirectInputDevice8W(iface); + HANDLE hook_change_finished_event;
EnterCriticalSection(&dinput_hook_crit);
@@ -1851,9 +1856,13 @@ void check_dinput_hooks(LPDIRECTINPUTDEVICE8W iface, BOOL acquired) hook_thread_event = NULL; }
- PostThreadMessageW( hook_thread_id, WM_USER+0x10, 1, 0 ); + hook_change_finished_event = CreateEventW( NULL, FALSE, FALSE, NULL ); + PostThreadMessageW( hook_thread_id, WM_USER+0x10, 1, (LPARAM)hook_change_finished_event );
LeaveCriticalSection(&dinput_hook_crit); + + WaitForSingleObject(hook_change_finished_event, INFINITE); + CloseHandle(hook_change_finished_event); }
void check_dinput_events(void) diff --git a/dlls/dinput8/tests/device.c b/dlls/dinput8/tests/device.c index a621a46229..cf748c55d9 100644 --- a/dlls/dinput8/tests/device.c +++ b/dlls/dinput8/tests/device.c @@ -797,12 +797,10 @@ static void test_keyboard_events(void) data_size = ARRAY_SIZE(obj_data); hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), obj_data, &data_size, 0); ok(SUCCEEDED(hr), "Failed to get data hr=%08x\n", hr); - todo_wine ok(data_size == 1, "Expected 1 element, received %d\n", data_size);
hr = IDirectInputDevice8_GetDeviceState(di_keyboard, sizeof(kbdata), kbdata); ok(SUCCEEDED(hr), "IDirectInputDevice8_GetDeviceState failed: %08x\n", hr); - todo_wine ok(kbdata[DIK_SPACE], "Expected DIK_SPACE key state down\n");
keybd_event(VK_SPACE, DIK_SPACE, KEYEVENTF_KEYUP, 0); @@ -811,7 +809,6 @@ static void test_keyboard_events(void) data_size = ARRAY_SIZE(obj_data); hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), obj_data, &data_size, 0); ok(SUCCEEDED(hr), "Failed to get data hr=%08x\n", hr); - todo_wine ok(data_size == 1, "Expected 1 element, received %d\n", data_size);
/* Test injecting keyboard events with scancode=0.