Module: wine Branch: master Commit: 2a833a1c862e7ec421978540ad83aadc16cdda8a URL: https://source.winehq.org/git/wine.git/?a=commit;h=2a833a1c862e7ec421978540a...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Apr 1 14:46:04 2022 +0200
win32u: Move NtUserWaitForInputIdle implementation from user32.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/message.c | 48 ++-------------------------------- dlls/user32/user_main.c | 1 - dlls/win32u/gdiobj.c | 1 + dlls/win32u/message.c | 61 +++++++++++++++++++++++++++++++++++++------- dlls/win32u/ntuser_private.h | 1 - dlls/win32u/win32u.spec | 2 +- dlls/win32u/win32u_private.h | 1 + dlls/win32u/wrappers.c | 6 +++++ 8 files changed, 63 insertions(+), 58 deletions(-)
diff --git a/dlls/user32/message.c b/dlls/user32/message.c index c5f55bf11c9..0df521a5a47 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -2974,53 +2974,9 @@ DWORD WINAPI MsgWaitForMultipleObjects( DWORD count, const HANDLE *handles, /*********************************************************************** * WaitForInputIdle (USER32.@) */ -DWORD WINAPI WaitForInputIdle( HANDLE hProcess, DWORD dwTimeOut ) +DWORD WINAPI WaitForInputIdle( HANDLE process, DWORD timeout ) { - DWORD start_time, elapsed, ret; - HANDLE handles[2]; - - handles[0] = hProcess; - SERVER_START_REQ( get_process_idle_event ) - { - req->handle = wine_server_obj_handle( hProcess ); - wine_server_call_err( req ); - handles[1] = wine_server_ptr_handle( reply->event ); - } - SERVER_END_REQ; - if (!handles[1]) return WAIT_FAILED; /* no event to wait on */ - - start_time = GetTickCount(); - elapsed = 0; - - TRACE("waiting for %p\n", handles[1] ); - do - { - ret = MsgWaitForMultipleObjects ( 2, handles, FALSE, dwTimeOut - elapsed, QS_SENDMESSAGE ); - switch (ret) - { - case WAIT_OBJECT_0: - return 0; - case WAIT_OBJECT_0+2: - process_sent_messages(); - break; - case WAIT_TIMEOUT: - case WAIT_FAILED: - TRACE("timeout or error\n"); - return ret; - default: - TRACE("finished\n"); - return 0; - } - if (dwTimeOut != INFINITE) - { - elapsed = GetTickCount() - start_time; - if (elapsed > dwTimeOut) - break; - } - } - while (1); - - return WAIT_TIMEOUT; + return NtUserWaitForInputIdle( process, timeout, FALSE ); }
diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index 599bc3f636f..8eb60232c2f 100644 --- a/dlls/user32/user_main.c +++ b/dlls/user32/user_main.c @@ -172,7 +172,6 @@ static const struct user_callbacks user_funcs = SendNotifyMessageW, SetSystemMenu, ShowCaret, - WaitForInputIdle, free_menu_items, free_win_ptr, MENU_IsMenuActive, diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c index ccab4beeaf4..5f3c7bdf7b1 100644 --- a/dlls/win32u/gdiobj.c +++ b/dlls/win32u/gdiobj.c @@ -1226,6 +1226,7 @@ static struct unix_funcs unix_funcs = NtUserUnregisterHotKey, NtUserUpdateLayeredWindow, NtUserVkKeyScanEx, + NtUserWaitForInputIdle, NtUserWindowFromPoint,
SetDIBits, diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 0a311f5a6ef..24813fac66f 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -481,15 +481,6 @@ LRESULT handle_internal_message( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpar } }
-/*********************************************************************** - * NtUserWaitForInputIdle (win32u.@) - */ -DWORD WINAPI NtUserWaitForInputIdle( HANDLE process, DWORD timeout, BOOL wow ) -{ - if (!user_callbacks) return 0; - return user_callbacks->pWaitForInputIdle( process, timeout ); -} - /********************************************************************** * NtUserGetGUIThreadInfo (win32u.@) */ @@ -980,6 +971,58 @@ DWORD WINAPI NtUserMsgWaitForMultipleObjectsEx( DWORD count, const HANDLE *handl (flags & MWMO_INPUTAVAILABLE) ? mask : 0, mask, flags ); }
+/*********************************************************************** + * NtUserWaitForInputIdle (win32u.@) + */ +DWORD WINAPI NtUserWaitForInputIdle( HANDLE process, DWORD timeout, BOOL wow ) +{ + DWORD start_time, elapsed, ret; + HANDLE handles[2]; + + handles[0] = process; + SERVER_START_REQ( get_process_idle_event ) + { + req->handle = wine_server_obj_handle( process ); + wine_server_call_err( req ); + handles[1] = wine_server_ptr_handle( reply->event ); + } + SERVER_END_REQ; + if (!handles[1]) return WAIT_FAILED; /* no event to wait on */ + + start_time = NtGetTickCount(); + elapsed = 0; + + TRACE("waiting for %p\n", handles[1] ); + + for (;;) + { + ret = NtUserMsgWaitForMultipleObjectsEx( 2, handles, timeout - elapsed, QS_SENDMESSAGE, 0 ); + switch (ret) + { + case WAIT_OBJECT_0: + return 0; + case WAIT_OBJECT_0+2: + process_sent_messages(); + break; + case WAIT_TIMEOUT: + case WAIT_FAILED: + TRACE("timeout or error\n"); + return ret; + default: + TRACE("finished\n"); + return 0; + } + if (timeout != INFINITE) + { + elapsed = NtGetTickCount() - start_time; + if (elapsed > timeout) + break; + } + } + + return WAIT_TIMEOUT; +} + /*********************************************************************** * NtUserPeekMessage (win32u.@) */ diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h index 3b6b6badfdc..4dade6c78a5 100644 --- a/dlls/win32u/ntuser_private.h +++ b/dlls/win32u/ntuser_private.h @@ -45,7 +45,6 @@ struct user_callbacks BOOL (WINAPI *pSendNotifyMessageW)( HWND, UINT, WPARAM, LPARAM ); BOOL (WINAPI *pSetSystemMenu)( HWND hwnd, HMENU menu ); BOOL (WINAPI *pShowCaret)( HWND hwnd ); - DWORD (WINAPI *pWaitForInputIdle)( HANDLE, DWORD ); void (CDECL *free_menu_items)( void *ptr ); void (CDECL *free_win_ptr)( struct tagWND *win ); HWND (CDECL *is_menu_active)(void); diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 47e2afb315f..3e4b3ab5e30 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -1305,7 +1305,7 @@ @ stdcall NtUserVkKeyScanEx(long long) @ stub NtUserWOWCleanup @ stub NtUserWaitAvailableMessageEx -@ stub NtUserWaitForInputIdle +@ stdcall NtUserWaitForInputIdle(long long long) @ stub NtUserWaitForMsgAndEvent @ stub NtUserWaitForRedirectionStartComplete @ stub NtUserWaitMessage diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 83fdecc9348..80cae3dad35 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -286,6 +286,7 @@ struct unix_funcs COLORREF key, const BLENDFUNCTION *blend, DWORD flags, const RECT *dirty ); WORD (WINAPI *pNtUserVkKeyScanEx)( WCHAR chr, HKL layout ); + DWORD (WINAPI *pNtUserWaitForInputIdle)( HANDLE process, DWORD timeout, BOOL wow ); HWND (WINAPI *pNtUserWindowFromPoint)( LONG x, LONG y );
/* Wine-specific functions */ diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c index 74677a969db..6348093e1fc 100644 --- a/dlls/win32u/wrappers.c +++ b/dlls/win32u/wrappers.c @@ -1184,6 +1184,12 @@ WORD WINAPI NtUserVkKeyScanEx( WCHAR chr, HKL layout ) return unix_funcs->pNtUserVkKeyScanEx( chr, layout ); }
+DWORD WINAPI NtUserWaitForInputIdle( HANDLE process, DWORD timeout, BOOL wow ) +{ + if (!unix_funcs) return 0; + return unix_funcs->pNtUserWaitForInputIdle( process, timeout, wow ); +} + HWND WINAPI NtUserWindowFromPoint( LONG x, LONG y ) { if (!unix_funcs) return 0;