Module: wine Branch: master Commit: 2db1fea630887995ddef50bfe8bf1255188a8b76 URL: https://source.winehq.org/git/wine.git/?a=commit;h=2db1fea630887995ddef50bfe...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Apr 1 14:45:57 2022 +0200
win32u: Move NtUserMsgWaitForMultipleObjectsEx 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 | 66 ++------------------------------------------ dlls/user32/user32.spec | 2 +- dlls/win32u/gdiobj.c | 1 + dlls/win32u/message.c | 23 +++++++++++++++ dlls/win32u/win32u.spec | 2 +- dlls/win32u/win32u_private.h | 2 ++ dlls/win32u/wrappers.c | 7 +++++ include/ntuser.h | 2 ++ 8 files changed, 40 insertions(+), 65 deletions(-)
diff --git a/dlls/user32/message.c b/dlls/user32/message.c index 045ec5bd01d..c5f55bf11c9 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -1962,42 +1962,6 @@ static void wait_message_reply( UINT flags ) }
-/*********************************************************************** - * wait_objects - * - * Wait for multiple objects including the server queue, with specific queue masks. - */ -static DWORD wait_objects( DWORD count, const HANDLE *handles, DWORD timeout, - DWORD wake_mask, DWORD changed_mask, DWORD flags ) -{ - struct user_thread_info *thread_info = get_user_thread_info(); - DWORD ret; - - assert( count ); /* we must have at least the server queue */ - - flush_window_surfaces( TRUE ); - - if (thread_info->wake_mask != wake_mask || thread_info->changed_mask != changed_mask) - { - SERVER_START_REQ( set_queue_mask ) - { - req->wake_mask = wake_mask; - req->changed_mask = changed_mask; - req->skip_wait = 0; - wine_server_call( req ); - } - SERVER_END_REQ; - thread_info->wake_mask = wake_mask; - thread_info->changed_mask = changed_mask; - } - - ret = wow_handlers.wait_message( count, handles, timeout, changed_mask, flags ); - - if (ret != WAIT_TIMEOUT) thread_info->wake_mask = thread_info->changed_mask = 0; - return ret; -} - - /*********************************************************************** * put_message_in_queue * @@ -2992,31 +2956,7 @@ BOOL WINAPI GetCurrentInputMessageSource( INPUT_MESSAGE_SOURCE *source ) */ BOOL WINAPI WaitMessage(void) { - return (MsgWaitForMultipleObjectsEx( 0, NULL, INFINITE, QS_ALLINPUT, 0 ) != WAIT_FAILED); -} - - -/*********************************************************************** - * MsgWaitForMultipleObjectsEx (USER32.@) - */ -DWORD WINAPI MsgWaitForMultipleObjectsEx( DWORD count, const HANDLE *pHandles, - DWORD timeout, DWORD mask, DWORD flags ) -{ - HANDLE handles[MAXIMUM_WAIT_OBJECTS]; - DWORD i; - - if (count > MAXIMUM_WAIT_OBJECTS-1) - { - SetLastError( ERROR_INVALID_PARAMETER ); - return WAIT_FAILED; - } - - /* add the queue to the handle list */ - for (i = 0; i < count; i++) handles[i] = pHandles[i]; - handles[count] = get_server_queue_handle(); - - return wait_objects( count+1, handles, timeout, - (flags & MWMO_INPUTAVAILABLE) ? mask : 0, mask, flags ); + return NtUserMsgWaitForMultipleObjectsEx( 0, NULL, INFINITE, QS_ALLINPUT, 0 ) != WAIT_FAILED; }
@@ -3026,8 +2966,8 @@ DWORD WINAPI MsgWaitForMultipleObjectsEx( DWORD count, const HANDLE *pHandles, DWORD WINAPI MsgWaitForMultipleObjects( DWORD count, const HANDLE *handles, BOOL wait_all, DWORD timeout, DWORD mask ) { - return MsgWaitForMultipleObjectsEx( count, handles, timeout, mask, - wait_all ? MWMO_WAITALL : 0 ); + return NtUserMsgWaitForMultipleObjectsEx( count, handles, timeout, mask, + wait_all ? MWMO_WAITALL : 0 ); }
diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec index 5d0c6746a51..00a73a6d04d 100644 --- a/dlls/user32/user32.spec +++ b/dlls/user32/user32.spec @@ -544,7 +544,7 @@ @ stdcall MonitorFromWindow(long long) @ stdcall MoveWindow(long long long long long long) NtUserMoveWindow @ stdcall MsgWaitForMultipleObjects(long ptr long long long) -@ stdcall MsgWaitForMultipleObjectsEx(long ptr long long long) +@ stdcall MsgWaitForMultipleObjectsEx(long ptr long long long) NtUserMsgWaitForMultipleObjectsEx @ stdcall NotifyWinEvent(long long long long) NtUserNotifyWinEvent @ stdcall OemKeyScan(long) @ stdcall OemToCharA(str ptr) diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c index 24e1bbece2e..ccab4beeaf4 100644 --- a/dlls/win32u/gdiobj.c +++ b/dlls/win32u/gdiobj.c @@ -1191,6 +1191,7 @@ static struct unix_funcs unix_funcs = NtUserMapVirtualKeyEx, NtUserMessageCall, NtUserMoveWindow, + NtUserMsgWaitForMultipleObjectsEx, NtUserPeekMessage, NtUserRedrawWindow, NtUserRegisterClassExWOW, diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 7202745a94d..0a311f5a6ef 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -957,6 +957,29 @@ static DWORD wait_objects( DWORD count, const HANDLE *handles, DWORD timeout, return ret; }
+/*********************************************************************** + * NtUserMsgWaitForMultipleObjectsEx (win32u.@) + */ +DWORD WINAPI NtUserMsgWaitForMultipleObjectsEx( DWORD count, const HANDLE *handles, + DWORD timeout, DWORD mask, DWORD flags ) +{ + HANDLE wait_handles[MAXIMUM_WAIT_OBJECTS]; + DWORD i; + + if (count > MAXIMUM_WAIT_OBJECTS-1) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return WAIT_FAILED; + } + + /* add the queue to the handle list */ + for (i = 0; i < count; i++) wait_handles[i] = handles[i]; + wait_handles[count] = get_server_queue_handle(); + + return wait_objects( count+1, wait_handles, timeout, + (flags & MWMO_INPUTAVAILABLE) ? mask : 0, mask, flags ); +} + /*********************************************************************** * NtUserPeekMessage (win32u.@) */ diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 6d290085942..47e2afb315f 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -1085,7 +1085,7 @@ @ stub NtUserModifyUserStartupInfoFlags @ stub NtUserModifyWindowTouchCapability @ stdcall NtUserMoveWindow(long long long long long long) -@ stub NtUserMsgWaitForMultipleObjectsEx +@ stdcall NtUserMsgWaitForMultipleObjectsEx(long ptr long long long) @ stub NtUserNavigateFocus @ stub NtUserNotifyIMEStatus @ stub NtUserNotifyProcessCreate diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 9ff475f493e..83fdecc9348 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -239,6 +239,8 @@ struct unix_funcs BOOL (WINAPI *pNtUserMessageCall)( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, ULONG_PTR result_info, DWORD type, BOOL ansi ); BOOL (WINAPI *pNtUserMoveWindow)( HWND hwnd, INT x, INT y, INT cx, INT cy, BOOL repaint ); + DWORD (WINAPI *pNtUserMsgWaitForMultipleObjectsEx)( DWORD count, const HANDLE *handles, + DWORD timeout, DWORD mask, DWORD flags ); BOOL (WINAPI *pNtUserPeekMessage)( MSG *msg_out, HWND hwnd, UINT first, UINT last, UINT flags ); BOOL (WINAPI *pNtUserRedrawWindow)( HWND hwnd, const RECT *rect, HRGN hrgn, UINT flags ); ATOM (WINAPI *pNtUserRegisterClassExWOW)( const WNDCLASSEXW *wc, UNICODE_STRING *name, diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c index 0a1d45f1eb8..74677a969db 100644 --- a/dlls/win32u/wrappers.c +++ b/dlls/win32u/wrappers.c @@ -964,6 +964,13 @@ BOOL WINAPI NtUserMessageCall( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam return unix_funcs->pNtUserMessageCall( hwnd, msg, wparam, lparam, result_info, type, ansi ); }
+DWORD WINAPI NtUserMsgWaitForMultipleObjectsEx( DWORD count, const HANDLE *handles, + DWORD timeout, DWORD mask, DWORD flags ) +{ + if (!unix_funcs) return 0; + return unix_funcs->pNtUserMsgWaitForMultipleObjectsEx( count, handles, timeout, mask, flags ); +} + BOOL WINAPI NtUserPeekMessage( MSG *msg_out, HWND hwnd, UINT first, UINT last, UINT flags ) { if (!unix_funcs) return FALSE; diff --git a/include/ntuser.h b/include/ntuser.h index 7afc930438e..df1766afac6 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -586,6 +586,8 @@ UINT WINAPI NtUserMapVirtualKeyEx( UINT code, UINT type, HKL layout ); BOOL WINAPI NtUserMessageCall( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, ULONG_PTR result_info, DWORD type, BOOL ansi ); BOOL WINAPI NtUserMoveWindow( HWND hwnd, INT x, INT y, INT cx, INT cy, BOOL repaint ); +DWORD WINAPI NtUserMsgWaitForMultipleObjectsEx( DWORD count, const HANDLE *handles, + DWORD timeout, DWORD mask, DWORD flags ); void WINAPI NtUserNotifyWinEvent( DWORD event, HWND hwnd, LONG object_id, LONG child_id ); HWINSTA WINAPI NtUserOpenWindowStation( OBJECT_ATTRIBUTES *attr, ACCESS_MASK access ); BOOL WINAPI NtUserSetObjectInformation( HANDLE handle, INT index, void *info, DWORD len );