[PATCH 3/3] d3d8/tests: Test mode change messages (v2).
Stefan Dösinger
stefan at codeweavers.com
Mon Nov 6 12:03:41 CST 2017
Signed-off-by: Stefan Dösinger <stefan at codeweavers.com>
---
Version 2: Do not check the contents of the MoveWindow() WINDOWPOS
structure.
---
dlls/d3d8/tests/device.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 75 insertions(+), 1 deletion(-)
diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c
index 9cebd17e2d..90fac5061a 100644
--- a/dlls/d3d8/tests/device.c
+++ b/dlls/d3d8/tests/device.c
@@ -2435,6 +2435,7 @@ struct message
enum message_window window;
BOOL check_wparam;
WPARAM expect_wparam;
+ WINDOWPOS *store_wp;
};
static const struct message *expect_messages;
@@ -2483,6 +2484,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;
}
}
@@ -2549,8 +2553,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;
static const struct message create_messages[] =
{
@@ -2649,6 +2654,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},
+ {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},
+ {WM_WINDOWPOSCHANGED, DEVICE_WINDOW, FALSE, 0},
+ {WM_SIZE, DEVICE_WINDOW, FALSE, 0},
+ {WM_SHOWWINDOW, DEVICE_WINDOW, FALSE, 0},
+ {WM_WINDOWPOSCHANGING, DEVICE_WINDOW, FALSE, 0, &windowpos},
+ {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");
@@ -3017,6 +3047,50 @@ 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;
+
+ 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);
+
+ /* 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));
+
+ 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 && !windowpos.cy
+ && windowpos.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",
+ windowpos.hwnd, windowpos.hwndInsertAfter, windowpos.x, windowpos.y, windowpos.cx,
+ windowpos.cy, windowpos.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