And after a 1s timeout, so that the message window used for rawinput device registration stays alive for a while even when no devices are acquired. This is required for some of the tests to pass.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52263 Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/dinput/dinput_main.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c index 9903a02c42f..764eada6762 100644 --- a/dlls/dinput/dinput_main.c +++ b/dlls/dinput/dinput_main.c @@ -1264,6 +1264,7 @@ static DWORD WINAPI dinput_thread_proc( void *params ) HANDLE events[128], start_event = params; HHOOK kbd_hook = NULL, mouse_hook = NULL; struct dinput_device *impl, *next; + DWORD timeout = INFINITE; SIZE_T events_count = 0; HANDLE finished_event; HRESULT hr; @@ -1280,7 +1281,8 @@ static DWORD WINAPI dinput_thread_proc( void *params ) PeekMessageW( &msg, 0, 0, 0, PM_NOREMOVE ); SetEvent( start_event );
- while ((ret = MsgWaitForMultipleObjectsEx( events_count, events, INFINITE, QS_ALLINPUT, 0 )) <= events_count) + while ((ret = MsgWaitForMultipleObjectsEx( events_count, events, timeout, QS_ALLINPUT, 0 )) <= events_count || + ret == WAIT_TIMEOUT) { UINT kbd_cnt = 0, mice_cnt = 0;
@@ -1351,6 +1353,17 @@ static DWORD WINAPI dinput_thread_proc( void *params ) events[events_count++] = impl->read_event; }
+ if (!list_empty( &acquired_device_list ) || !list_empty( &acquired_rawmouse_list ) || + !list_empty( &acquired_mouse_list ) || !list_empty( &acquired_keyboard_list )) + timeout = INFINITE; + else if (ret == WAIT_TIMEOUT) + { + di_em_win = 0; + LeaveCriticalSection( &dinput_hook_crit ); + goto done; + } + else timeout = 1000; + LeaveCriticalSection( &dinput_hook_crit ); }