[PATCH 2/4] d3d8/tests: Test mode change messages.

Stefan Dösinger stefan at codeweavers.com
Thu Oct 12 10:14:28 CDT 2017


Signed-off-by: Stefan Dösinger <stefan at codeweavers.com>
---
 dlls/d3d8/tests/device.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 93 insertions(+), 1 deletion(-)

diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c
index 2c0565ac5f..bb30d5a940 100644
--- a/dlls/d3d8/tests/device.c
+++ b/dlls/d3d8/tests/device.c
@@ -2428,6 +2428,7 @@ struct message
     enum message_window window;
     BOOL check_wparam;
     WPARAM expect_wparam;
+    WINDOWPOS *store_wp;
 };
 
 static const struct message *expect_messages;
@@ -2476,6 +2477,9 @@ static LRESULT CALLBACK test_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM
                         "Got unexpected wparam %lx for message %x, expected %lx.\n",
                         wparam, message, expect_messages->expect_wparam);
 
+            if (expect_messages->store_wp)
+                *expect_messages->store_wp = *(WINDOWPOS *)lparam;
+
             ++expect_messages;
         }
     }
@@ -2542,8 +2546,9 @@ static void test_wndproc(void)
     D3DDISPLAYMODE d3ddm;
     DWORD d3d_width = 0, d3d_height = 0, user32_width = 0, user32_height = 0;
     DEVMODEW devmode;
-    LONG change_ret;
+    LONG change_ret, device_style;
     BOOL ret;
+    WINDOWPOS windowpos, windowpos2;
 
     static const struct message create_messages[] =
     {
@@ -2642,6 +2647,31 @@ static void test_wndproc(void)
         {WM_SIZE,               FOCUS_WINDOW,   TRUE,   SIZE_MAXIMIZED},
         {0,                     0,              FALSE,  0},
     };
+    struct message mode_change_messages[] =
+    {
+        {WM_WINDOWPOSCHANGING,  DEVICE_WINDOW,  FALSE,  0, &windowpos},
+        {WM_WINDOWPOSCHANGED,   DEVICE_WINDOW,  FALSE,  0},
+        {WM_SIZE,               DEVICE_WINDOW,  FALSE,  0},
+        /* TODO: WM_DISPLAYCHANGE is sent to the focus window too, but the order is
+         * differs between Wine and Windows. */
+        /* TODO 2: Windows sends a second WM_WINDOWPOSCHANGING(SWP_NOMOVE | SWP_NOSIZE
+         * | SWP_NOACTIVATE) in this situation, suggesting a difference in their ShowWindow
+         * implementation. This SetWindowPos call could in theory affect the Z order. Wine's
+         * ShowWindow does not send such a message because the window is already visible. */
+        {0,                     0,              FALSE,  0},
+    };
+    struct message mode_change_messages_hidden[] =
+    {
+        {WM_WINDOWPOSCHANGING,  DEVICE_WINDOW,  FALSE,  0, &windowpos},
+        {WM_WINDOWPOSCHANGED,   DEVICE_WINDOW,  FALSE,  0},
+        {WM_SIZE,               DEVICE_WINDOW,  FALSE,  0},
+        {WM_SHOWWINDOW,         DEVICE_WINDOW,  FALSE,  0},
+        {WM_WINDOWPOSCHANGING,  DEVICE_WINDOW,  FALSE,  0, &windowpos2},
+        {WM_WINDOWPOSCHANGED,   DEVICE_WINDOW,  FALSE,  0},
+        /* TODO: WM_DISPLAYCHANGE is sent to the focus window too, but the order is
+         * differs between Wine and Windows. */
+        {0,                     0,              FALSE,  0},
+    };
 
     d3d8 = Direct3DCreate8(D3D_SDK_VERSION);
     ok(!!d3d8, "Failed to create a D3D object.\n");
@@ -3010,6 +3040,68 @@ static void test_wndproc(void)
         skip("Failed to create a D3D device, skipping tests.\n");
         goto done;
     }
+    filter_messages = NULL;
+    flush_events();
+
+    device_desc.width = user32_width;
+    device_desc.height = user32_height;
+    memset(&windowpos, 0, sizeof(windowpos));
+    memset(&windowpos2, 0, sizeof(windowpos2));
+
+    expect_messages = mode_change_messages;
+    filter_messages = focus_window;
+    hr = reset_device(device, &device_desc);
+    ok(SUCCEEDED(hr), "Failed to reset device, hr %#x.\n", hr);
+    filter_messages = NULL;
+
+    flush_events();
+    ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n",
+            expect_messages->message, expect_messages->window, i);
+
+    ok(windowpos.hwnd == device_window && !windowpos.hwndInsertAfter
+            && !windowpos.x && !windowpos.y
+            && windowpos.cx == device_desc.width && windowpos.cy == device_desc.height
+            && windowpos.flags == (SWP_NOACTIVATE | SWP_NOZORDER),
+            "Got unexpected WINDOWPOS hwnd=%p, insertAfter=%p, x=%d, y=%d, cx=%d, cy=%d, flags=%x\n",
+            windowpos.hwnd, windowpos.hwndInsertAfter, windowpos.x, windowpos.y, windowpos.cx,
+            windowpos.cy, windowpos.flags);
+
+    /* World of Warplanes hides the window by removing WS_VISIBLE and expects Reset() to show it again. */
+    device_style = GetWindowLongA(device_window, GWL_STYLE);
+    SetWindowLongA(device_window, GWL_STYLE, device_style & ~WS_VISIBLE);
+
+    flush_events();
+    device_desc.width = d3d_width;
+    device_desc.height = d3d_height;
+    memset(&windowpos, 0, sizeof(windowpos));
+    memset(&windowpos2, 0, sizeof(windowpos2));
+
+    expect_messages = mode_change_messages_hidden;
+    filter_messages = focus_window;
+    hr = reset_device(device, &device_desc);
+    ok(SUCCEEDED(hr), "Failed to reset device, hr %#x.\n", hr);
+    filter_messages = NULL;
+
+    flush_events();
+    ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it.\n",
+            expect_messages->message, expect_messages->window);
+
+    ok(windowpos.hwnd == device_window && !windowpos.hwndInsertAfter
+            && !windowpos.x && !windowpos.y
+            && windowpos.cx == device_desc.width && windowpos.cy == device_desc.height
+            && windowpos.flags == (SWP_NOACTIVATE | SWP_NOZORDER),
+            "Got unexpected WINDOWPOS hwnd=%p, insertAfter=%p, x=%d, y=%d, cx=%d, cy=%d, flags=%x\n",
+            windowpos.hwnd, windowpos.hwndInsertAfter, windowpos.x, windowpos.y, windowpos.cx,
+            windowpos.cy, windowpos.flags);
+    ok(windowpos2.hwnd == device_window && !windowpos2.hwndInsertAfter
+            && !windowpos2.x && !windowpos2.y && !windowpos2.cx && !windowpos2.cy
+            && windowpos2.flags == (SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE),
+            "Got unexpected WINDOWPOS hwnd=%p, insertAfter=%p, x=%d, y=%d, cx=%d, cy=%d, flags=%x\n",
+            windowpos2.hwnd, windowpos2.hwndInsertAfter, windowpos2.x, windowpos2.y, windowpos2.cx,
+            windowpos2.cy, windowpos2.flags);
+
+    device_style = GetWindowLongA(device_window, GWL_STYLE);
+    ok(device_style & WS_VISIBLE, "Expected the device window to be visible.\n");
 
     proc = SetWindowLongPtrA(focus_window, GWLP_WNDPROC, (LONG_PTR)DefWindowProcA);
     ok(proc != (LONG_PTR)test_proc, "Expected wndproc != %#lx.\n", (LONG_PTR)test_proc);
-- 
2.13.6




More information about the wine-patches mailing list