Jacek Caban : win32u: Move NtUserMsgWaitForMultipleObjectsEx implementation from user32.
Alexandre Julliard
julliard at winehq.org
Fri Apr 1 16:04:28 CDT 2022
Module: wine
Branch: master
Commit: 2db1fea630887995ddef50bfe8bf1255188a8b76
URL: https://source.winehq.org/git/wine.git/?a=commit;h=2db1fea630887995ddef50bfe8bf1255188a8b76
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Apr 1 14:45:57 2022 +0200
win32u: Move NtUserMsgWaitForMultipleObjectsEx implementation from user32.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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 );
More information about the wine-cvs
mailing list