[PATCH] user32: Also show dialogs right after a WM_TIMER message.

Henri Verbeet hverbeet at codeweavers.com
Tue Mar 2 04:51:52 CST 2010


If we get a WM_TIMER message the queue is practically empty, but new messages
may be generated in response to the message, which in turn may take long
enough to handle for the timer to expire again. The test shows dialogs are
shown after the first WM_TIMER message is handled, but before any messages
that are a result of handling that message are received.
---
 dlls/user32/dialog.c       |    6 +++++
 dlls/user32/tests/dialog.c |   50 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 0 deletions(-)

diff --git a/dlls/user32/dialog.c b/dlls/user32/dialog.c
index 325d6e2..79f5182 100644
--- a/dlls/user32/dialog.c
+++ b/dlls/user32/dialog.c
@@ -815,6 +815,12 @@ INT DIALOG_DoDialogBox( HWND hwnd, HWND owner )
                 DispatchMessageW( &msg );
             }
             if (dlgInfo->flags & DF_END) break;
+
+            if (bFirstEmpty && msg.message == WM_TIMER)
+            {
+                ShowWindow( hwnd, SW_SHOWNORMAL );
+                bFirstEmpty = FALSE;
+            }
         }
     }
     if (dlgInfo->flags & DF_OWNERENABLED) DIALOG_EnableOwner( owner );
diff --git a/dlls/user32/tests/dialog.c b/dlls/user32/tests/dialog.c
index ef4d5dc..1b36c53 100644
--- a/dlls/user32/tests/dialog.c
+++ b/dlls/user32/tests/dialog.c
@@ -1157,6 +1157,55 @@ static void test_SaveRestoreFocus(void)
     DestroyWindow(hDlg);
 }
 
+static INT_PTR CALLBACK timer_message_dlg_proc(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
+{
+    static int count;
+    BOOL visible;
+
+    switch (msg)
+    {
+        case WM_INITDIALOG:
+            visible = GetWindowLong(wnd, GWL_STYLE) & WS_VISIBLE;
+            ok(!visible, "Dialog should not be visible.\n");
+            SetTimer(wnd, 1, 100, NULL);
+            Sleep(200);
+            return FALSE;
+
+        case WM_COMMAND:
+            if (LOWORD(wparam) != IDCANCEL) return FALSE;
+            EndDialog(wnd, LOWORD(wparam));
+            return TRUE;
+
+        case WM_TIMER:
+            if (wparam != 1) return FALSE;
+            visible = GetWindowLong(wnd, GWL_STYLE) & WS_VISIBLE;
+            if (!count++)
+            {
+                ok(!visible, "Dialog should not be visible.\n");
+                PostMessage(wnd, WM_USER, 0, 0);
+            }
+            else
+            {
+                ok(visible, "Dialog should be visible.\n");
+                PostMessage(wnd, WM_COMMAND, IDCANCEL, 0);
+            }
+            return TRUE;
+
+        case WM_USER:
+            visible = GetWindowLong(wnd, GWL_STYLE) & WS_VISIBLE;
+            ok(visible, "Dialog should be visible.\n");
+            return TRUE;
+
+        default:
+            return FALSE;
+    }
+}
+
+static void test_timer_message(void)
+{
+    DialogBoxA(g_hinst, "RADIO_TEST_DIALOG", NULL, timer_message_dlg_proc);
+}
+
 START_TEST(dialog)
 {
     g_hinst = GetModuleHandleA (0);
@@ -1172,4 +1221,5 @@ START_TEST(dialog)
     test_DisabledDialogTest();
     test_MessageBoxFontTest();
     test_SaveRestoreFocus();
+    test_timer_message();
 }
-- 
1.6.4.4




More information about the wine-patches mailing list