Alexandre Julliard : user32: Don' t check for driver events before normal messages in PeekMessage.

Alexandre Julliard julliard at winehq.org
Wed Nov 21 14:45:16 CST 2012


Module: wine
Branch: master
Commit: 841214ddb4d4dc620e6b51dfe6655b585d423edc
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=841214ddb4d4dc620e6b51dfe6655b585d423edc

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Nov 21 19:20:27 2012 +0100

user32: Don't check for driver events before normal messages in PeekMessage.

---

 dlls/user32/message.c   |   15 ++++++++++-----
 dlls/user32/tests/msg.c |    1 +
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index 2ffbf6e..ba37a3a 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -3681,14 +3681,19 @@ BOOL WINAPI DECLSPEC_HOTPATCH PeekMessageW( MSG *msg_out, HWND hwnd, UINT first,
 
     USER_CheckNotLock();
 
-    /* check for graphics events */
-    USER_Driver->pMsgWaitForMultipleObjectsEx( 0, NULL, 0, QS_ALLINPUT, 0 );
-
     if (!peek_message( &msg, hwnd, first, last, flags, 0 ))
     {
+        DWORD ret;
+
         flush_window_surfaces( !(flags & PM_NOYIELD) );
-        if (!(flags & PM_NOYIELD)) wow_handlers.wait_message( 0, NULL, 0, 0, 0 );
-        return FALSE;
+
+        if (flags & PM_NOYIELD)
+            ret = USER_Driver->pMsgWaitForMultipleObjectsEx( 0, NULL, 0, QS_ALLINPUT, 0 );
+        else
+            ret = wow_handlers.wait_message( 0, NULL, 0, 0, 0 );
+
+        /* if we received driver events, check again for a pending message */
+        if (ret == WAIT_TIMEOUT || !peek_message( &msg, hwnd, first, last, flags, 0 )) return FALSE;
     }
 
     /* copy back our internal safe copy of message data to msg_out.
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index bfc3830..9816f13 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -6795,6 +6795,7 @@ static void test_interthread_messages(void)
     wnd_event.hwnd = CreateWindowExA(0, "TestParentClass", "Test parent", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                               100, 100, 200, 200, 0, 0, 0, NULL);
     ok (wnd_event.hwnd != 0, "Failed to create parent window\n");
+    flush_events();
     flush_sequence();
     log_all_parent_messages++;
     wnd_event.start_event = CreateEventA( NULL, TRUE, FALSE, NULL );




More information about the wine-cvs mailing list