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