From: Stefan Dösinger Subject: [PATCH 5/6] ddraw/tests: Test messages on focus loss (v2). Message-Id: <1416255445-25770-5-git-send-email-stefan@codeweavers.com> Date: Mon, 17 Nov 2014 21:17:24 +0100 Version 2: Do not restore the primary surface after restoring focus. This works around a crash in GetSurfaceDesc on the Windows 8 testbot. GetSurfaceDesc after a mode change seems to be unstable on the testbot and/or Windows 8 in general. I don't have a real Win8 machine to compare. If this causes more issues in further changes to the test we can move the surface size checks after mode changes into a separate test to make it easier to maintain a call sequence that doesn't hit the bug. --- dlls/ddraw/tests/ddraw1.c | 99 +++++++++++++++++++++++++++++++------------- dlls/ddraw/tests/ddraw2.c | 103 ++++++++++++++++++++++++++++++++-------------- dlls/ddraw/tests/ddraw4.c | 103 ++++++++++++++++++++++++++++++++-------------- dlls/ddraw/tests/ddraw7.c | 103 ++++++++++++++++++++++++++++++++-------------- 4 files changed, 286 insertions(+), 122 deletions(-) diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c index 0ae204c..98d56d4 100644 --- a/dlls/ddraw/tests/ddraw1.c +++ b/dlls/ddraw/tests/ddraw1.c @@ -428,12 +428,26 @@ static void destroy_material(IDirect3DMaterial *material) IDirect3DMaterial_Release(material); } -static const UINT *expect_messages; +struct message +{ + UINT message; + BOOL check_wparam; + WPARAM expect_wparam; +}; + +static const struct message *expect_messages; static LRESULT CALLBACK test_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { - if (expect_messages && message == *expect_messages) + if (expect_messages && message == expect_messages->message) + { + if (expect_messages->check_wparam) + ok (wparam == expect_messages->expect_wparam, + "Got unexpected wparam %lx for message %x, expected %lx.\n", + wparam, message, expect_messages->expect_wparam); + ++expect_messages; + } return DefWindowProcA(hwnd, message, wparam, lparam); } @@ -1878,15 +1892,15 @@ static void test_wndproc(void) HRESULT hr; ULONG ref; - static const UINT messages[] = + static struct message messages[] = { - WM_WINDOWPOSCHANGING, - WM_MOVE, - WM_SIZE, - WM_WINDOWPOSCHANGING, - WM_ACTIVATE, - WM_SETFOCUS, - 0, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_MOVE, FALSE, 0}, + {WM_SIZE, FALSE, 0}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_ACTIVATE, FALSE, 0}, + {WM_SETFOCUS, FALSE, 0}, + {0, FALSE, 0}, }; /* DDSCL_EXCLUSIVE replaces the window's window proc. */ @@ -1906,7 +1920,7 @@ static void test_wndproc(void) expect_messages = messages; hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; proc = GetWindowLongPtrA(window, GWLP_WNDPROC); ok(proc != (LONG_PTR)test_proc, "Expected wndproc != %#lx, got %#lx.\n", @@ -2147,19 +2161,34 @@ static void test_coop_level_mode_set(void) BOOL ret; LONG change_ret; - static const UINT exclusive_messages[] = + static const struct message exclusive_messages[] = { - WM_WINDOWPOSCHANGING, - WM_WINDOWPOSCHANGED, - WM_SIZE, - WM_DISPLAYCHANGE, - 0, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, FALSE, 0}, + {WM_DISPLAYCHANGE, FALSE, 0}, + {0, FALSE, 0}, + }; + static const struct message exclusive_focus_loss_messages[] = + { + {WM_ACTIVATE, TRUE, WA_INACTIVE}, + /*{WM_DISPLAYCHANGE, FALSE, 0}, Not yet implemented on Wine. */ + {WM_WINDOWPOSCHANGING, FALSE, 0}, + /* Like d3d8 and d3d9 ddraw seems to use SW_SHOWMINIMIZED instead of + * SW_MINIMIZED, causing a recursive window activation that does not + * produe the same result in Wine yet. Ignore the difference for now. + * {WM_ACTIVATE, TRUE, 0x200000 | WA_ACTIVE}, */ + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_MOVE, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_MINIMIZED}, + {WM_ACTIVATEAPP, TRUE, FALSE}, + {0, FALSE, 0}, }; - static const UINT normal_messages[] = + static const struct message normal_messages[] = { - WM_DISPLAYCHANGE, - 0, + {WM_DISPLAYCHANGE, FALSE, 0}, + {0, FALSE, 0}, }; ddraw = create_ddraw(); @@ -2234,7 +2263,7 @@ static void test_coop_level_mode_set(void) hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(screen_size.cx == param.ddraw_width && screen_size.cy == param.ddraw_height, "Expected screen size %ux%u, got %ux%u.\n", @@ -2280,7 +2309,7 @@ static void test_coop_level_mode_set(void) change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(screen_size.cx == param.user32_width && screen_size.cy == param.user32_height, "Expected screen size %ux%u, got %ux%u.\n", @@ -2291,6 +2320,18 @@ static void test_coop_level_mode_set(void) user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, r.left, r.top, r.right, r.bottom); + expect_messages = exclusive_focus_loss_messages; + SetForegroundWindow(GetDesktopWindow()); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + + ShowWindow(window, SW_RESTORE); + hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); + /* Normally the primary should be restored here. Unfortunately this causes the + * GetSurfaceDesc call after the next display mode change to crash on the Windows 8 + * testbot. Another Restore call would presumably avoid the crash, but it also moots + * the point of the GetSurfaceDesc call. */ + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); expect_messages = exclusive_messages; screen_size.cx = 0; @@ -2299,7 +2340,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw_RestoreDisplayMode(ddraw); ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); - todo_wine ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + todo_wine ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; todo_wine ok(screen_size.cx == registry_mode.dmPelsWidth && screen_size.cy == registry_mode.dmPelsHeight, @@ -2385,7 +2426,7 @@ static void test_coop_level_mode_set(void) change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2409,7 +2450,7 @@ static void test_coop_level_mode_set(void) } ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2453,7 +2494,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw_RestoreDisplayMode(ddraw); ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2548,7 +2589,7 @@ static void test_coop_level_mode_set(void) change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2565,7 +2606,7 @@ static void test_coop_level_mode_set(void) hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2609,7 +2650,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw_RestoreDisplayMode(ddraw); ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index 334d89e..537de81 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -361,12 +361,26 @@ static void destroy_material(IDirect3DMaterial2 *material) IDirect3DMaterial2_Release(material); } -static const UINT *expect_messages; +struct message +{ + UINT message; + BOOL check_wparam; + WPARAM expect_wparam; +}; + +static const struct message *expect_messages; static LRESULT CALLBACK test_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { - if (expect_messages && message == *expect_messages) + if (expect_messages && message == expect_messages->message) + { + if (expect_messages->check_wparam) + ok (wparam == expect_messages->expect_wparam, + "Got unexpected wparam %lx for message %x, expected %lx.\n", + wparam, message, expect_messages->expect_wparam); + ++expect_messages; + } return DefWindowProcA(hwnd, message, wparam, lparam); } @@ -2066,15 +2080,15 @@ static void test_wndproc(void) HRESULT hr; ULONG ref; - static const UINT messages[] = + static struct message messages[] = { - WM_WINDOWPOSCHANGING, - WM_MOVE, - WM_SIZE, - WM_WINDOWPOSCHANGING, - WM_ACTIVATE, - WM_SETFOCUS, - 0, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_MOVE, FALSE, 0}, + {WM_SIZE, FALSE, 0}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_ACTIVATE, FALSE, 0}, + {WM_SETFOCUS, FALSE, 0}, + {0, FALSE, 0}, }; /* DDSCL_EXCLUSIVE replaces the window's window proc. */ @@ -2094,7 +2108,7 @@ static void test_wndproc(void) expect_messages = messages; hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; proc = GetWindowLongPtrA(window, GWLP_WNDPROC); ok(proc != (LONG_PTR)test_proc, "Expected wndproc != %#lx, got %#lx.\n", @@ -2346,19 +2360,34 @@ static void test_coop_level_mode_set(void) BOOL ret; LONG change_ret; - static const UINT exclusive_messages[] = + static const struct message exclusive_messages[] = { - WM_WINDOWPOSCHANGING, - WM_WINDOWPOSCHANGED, - WM_SIZE, - WM_DISPLAYCHANGE, - 0, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, FALSE, 0}, + {WM_DISPLAYCHANGE, FALSE, 0}, + {0, FALSE, 0}, + }; + static const struct message exclusive_focus_loss_messages[] = + { + {WM_ACTIVATE, TRUE, WA_INACTIVE}, + /*{WM_DISPLAYCHANGE, FALSE, 0}, Not yet implemented on Wine. */ + {WM_WINDOWPOSCHANGING, FALSE, 0}, + /* Like d3d8 and d3d9 ddraw seems to use SW_SHOWMINIMIZED instead of + * SW_MINIMIZED, causing a recursive window activation that does not + * produe the same result in Wine yet. Ignore the difference for now. + * {WM_ACTIVATE, TRUE, 0x200000 | WA_ACTIVE}, */ + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_MOVE, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_MINIMIZED}, + {WM_ACTIVATEAPP, TRUE, FALSE}, + {0, FALSE, 0}, }; - static const UINT normal_messages[] = + static const struct message normal_messages[] = { - WM_DISPLAYCHANGE, - 0, + {WM_DISPLAYCHANGE, FALSE, 0}, + {0, FALSE, 0}, }; ddraw = create_ddraw(); @@ -2438,7 +2467,7 @@ static void test_coop_level_mode_set(void) hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(screen_size.cx == param.ddraw_width && screen_size.cy == param.ddraw_height, "Expected screen size %ux%u, got %ux%u.\n", @@ -2484,7 +2513,7 @@ static void test_coop_level_mode_set(void) change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(screen_size.cx == param.user32_width && screen_size.cy == param.user32_height, "Expected screen size %ux%u, got %ux%u.\n", @@ -2495,6 +2524,18 @@ static void test_coop_level_mode_set(void) user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, r.left, r.top, r.right, r.bottom); + expect_messages = exclusive_focus_loss_messages; + SetForegroundWindow(GetDesktopWindow()); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + + ShowWindow(window, SW_RESTORE); + hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); + /* Normally the primary should be restored here. Unfortunately this causes the + * GetSurfaceDesc call after the next display mode change to crash on the Windows 8 + * testbot. Another Restore call would presumably avoid the crash, but it also moots + * the point of the GetSurfaceDesc call. */ + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); expect_messages = exclusive_messages; screen_size.cx = 0; @@ -2503,7 +2544,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw2_RestoreDisplayMode(ddraw); ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); - todo_wine ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + todo_wine ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; todo_wine ok(screen_size.cx == registry_mode.dmPelsWidth && screen_size.cy == registry_mode.dmPelsHeight, @@ -2589,7 +2630,7 @@ static void test_coop_level_mode_set(void) change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2613,7 +2654,7 @@ static void test_coop_level_mode_set(void) } ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2657,7 +2698,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw_RestoreDisplayMode(ddraw); ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2752,7 +2793,7 @@ static void test_coop_level_mode_set(void) change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2769,7 +2810,7 @@ static void test_coop_level_mode_set(void) hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2813,7 +2854,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw2_RestoreDisplayMode(ddraw); ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2874,7 +2915,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL); ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(screen_size.cx == registry_mode.dmPelsWidth && screen_size.cy == registry_mode.dmPelsHeight, @@ -2945,7 +2986,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw2_SetCooperativeLevel(ddraw, window2, DDSCL_NORMAL); ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index f9b94a4..5bcda6b 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -391,12 +391,26 @@ static void destroy_material(IDirect3DMaterial3 *material) IDirect3DMaterial3_Release(material); } -static const UINT *expect_messages; +struct message +{ + UINT message; + BOOL check_wparam; + WPARAM expect_wparam; +}; + +static const struct message *expect_messages; static LRESULT CALLBACK test_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { - if (expect_messages && message == *expect_messages) + if (expect_messages && message == expect_messages->message) + { + if (expect_messages->check_wparam) + ok (wparam == expect_messages->expect_wparam, + "Got unexpected wparam %lx for message %x, expected %lx.\n", + wparam, message, expect_messages->expect_wparam); + ++expect_messages; + } return DefWindowProcA(hwnd, message, wparam, lparam); } @@ -2253,15 +2267,15 @@ static void test_wndproc(void) HRESULT hr; ULONG ref; - static const UINT messages[] = + static struct message messages[] = { - WM_WINDOWPOSCHANGING, - WM_MOVE, - WM_SIZE, - WM_WINDOWPOSCHANGING, - WM_ACTIVATE, - WM_SETFOCUS, - 0, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_MOVE, FALSE, 0}, + {WM_SIZE, FALSE, 0}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_ACTIVATE, FALSE, 0}, + {WM_SETFOCUS, FALSE, 0}, + {0, FALSE, 0}, }; /* DDSCL_EXCLUSIVE replaces the window's window proc. */ @@ -2281,7 +2295,7 @@ static void test_wndproc(void) expect_messages = messages; hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; proc = GetWindowLongPtrA(window, GWLP_WNDPROC); ok(proc != (LONG_PTR)test_proc, "Expected wndproc != %#lx, got %#lx.\n", @@ -2533,19 +2547,34 @@ static void test_coop_level_mode_set(void) BOOL ret; LONG change_ret; - static const UINT exclusive_messages[] = + static const struct message exclusive_messages[] = { - WM_WINDOWPOSCHANGING, - WM_WINDOWPOSCHANGED, - WM_SIZE, - WM_DISPLAYCHANGE, - 0, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, FALSE, 0}, + {WM_DISPLAYCHANGE, FALSE, 0}, + {0, FALSE, 0}, + }; + static const struct message exclusive_focus_loss_messages[] = + { + {WM_ACTIVATE, TRUE, WA_INACTIVE}, + /*{WM_DISPLAYCHANGE, FALSE, 0}, Not yet implemented on Wine. */ + {WM_WINDOWPOSCHANGING, FALSE, 0}, + /* Like d3d8 and d3d9 ddraw seems to use SW_SHOWMINIMIZED instead of + * SW_MINIMIZED, causing a recursive window activation that does not + * produe the same result in Wine yet. Ignore the difference for now. + * {WM_ACTIVATE, TRUE, 0x200000 | WA_ACTIVE}, */ + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_MOVE, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_MINIMIZED}, + {WM_ACTIVATEAPP, TRUE, FALSE}, + {0, FALSE, 0}, }; - static const UINT normal_messages[] = + static const struct message normal_messages[] = { - WM_DISPLAYCHANGE, - 0, + {WM_DISPLAYCHANGE, FALSE, 0}, + {0, FALSE, 0}, }; ddraw = create_ddraw(); @@ -2625,7 +2654,7 @@ static void test_coop_level_mode_set(void) hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(screen_size.cx == param.ddraw_width && screen_size.cy == param.ddraw_height, "Expected screen size %ux%u, got %ux%u.\n", @@ -2671,7 +2700,7 @@ static void test_coop_level_mode_set(void) change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(screen_size.cx == param.user32_width && screen_size.cy == param.user32_height, "Expected screen size %ux%u, got %ux%u.\n", @@ -2682,6 +2711,18 @@ static void test_coop_level_mode_set(void) user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, r.left, r.top, r.right, r.bottom); + expect_messages = exclusive_focus_loss_messages; + SetForegroundWindow(GetDesktopWindow()); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + + ShowWindow(window, SW_RESTORE); + hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); + /* Normally the primary should be restored here. Unfortunately this causes the + * GetSurfaceDesc call after the next display mode change to crash on the Windows 8 + * testbot. Another Restore call would presumably avoid the crash, but it also moots + * the point of the GetSurfaceDesc call. */ + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); expect_messages = exclusive_messages; screen_size.cx = 0; @@ -2690,7 +2731,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw4_RestoreDisplayMode(ddraw); ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); - todo_wine ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + todo_wine ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; todo_wine ok(screen_size.cx == registry_mode.dmPelsWidth && screen_size.cy == registry_mode.dmPelsHeight, @@ -2776,7 +2817,7 @@ static void test_coop_level_mode_set(void) change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2793,7 +2834,7 @@ static void test_coop_level_mode_set(void) hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2837,7 +2878,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw4_RestoreDisplayMode(ddraw); ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2932,7 +2973,7 @@ static void test_coop_level_mode_set(void) change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2949,7 +2990,7 @@ static void test_coop_level_mode_set(void) hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2993,7 +3034,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw4_RestoreDisplayMode(ddraw); ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -3054,7 +3095,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL); ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(screen_size.cx == registry_mode.dmPelsWidth && screen_size.cy == registry_mode.dmPelsHeight, @@ -3125,7 +3166,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw4_SetCooperativeLevel(ddraw, window2, DDSCL_NORMAL); ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index 9da588a..b5e11e9 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -324,12 +324,26 @@ static IDirect3DDevice7 *create_device(HWND window, DWORD coop_level) return device; } -static const UINT *expect_messages; +struct message +{ + UINT message; + BOOL check_wparam; + WPARAM expect_wparam; +}; + +static const struct message *expect_messages; static LRESULT CALLBACK test_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { - if (expect_messages && message == *expect_messages) + if (expect_messages && message == expect_messages->message) + { + if (expect_messages->check_wparam) + ok (wparam == expect_messages->expect_wparam, + "Got unexpected wparam %lx for message %x, expected %lx.\n", + wparam, message, expect_messages->expect_wparam); + ++expect_messages; + } return DefWindowProcA(hwnd, message, wparam, lparam); } @@ -1931,15 +1945,15 @@ static void test_wndproc(void) HRESULT hr; ULONG ref; - static const UINT messages[] = + static struct message messages[] = { - WM_WINDOWPOSCHANGING, - WM_MOVE, - WM_SIZE, - WM_WINDOWPOSCHANGING, - WM_ACTIVATE, - WM_SETFOCUS, - 0, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_MOVE, FALSE, 0}, + {WM_SIZE, FALSE, 0}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_ACTIVATE, FALSE, 0}, + {WM_SETFOCUS, FALSE, 0}, + {0, FALSE, 0}, }; /* DDSCL_EXCLUSIVE replaces the window's window proc. */ @@ -1959,7 +1973,7 @@ static void test_wndproc(void) expect_messages = messages; hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; proc = GetWindowLongPtrA(window, GWLP_WNDPROC); ok(proc != (LONG_PTR)test_proc, "Expected wndproc != %#lx, got %#lx.\n", @@ -2210,19 +2224,34 @@ static void test_coop_level_mode_set(void) BOOL ret; LONG change_ret; - static const UINT exclusive_messages[] = + static const struct message exclusive_messages[] = { - WM_WINDOWPOSCHANGING, - WM_WINDOWPOSCHANGED, - WM_SIZE, - WM_DISPLAYCHANGE, - 0, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, FALSE, 0}, + {WM_DISPLAYCHANGE, FALSE, 0}, + {0, FALSE, 0}, + }; + static const struct message exclusive_focus_loss_messages[] = + { + {WM_ACTIVATE, TRUE, WA_INACTIVE}, + /*{WM_DISPLAYCHANGE, FALSE, 0}, Not yet implemented on Wine. */ + {WM_WINDOWPOSCHANGING, FALSE, 0}, + /* Like d3d8 and d3d9 ddraw seems to use SW_SHOWMINIMIZED instead of + * SW_MINIMIZED, causing a recursive window activation that does not + * produe the same result in Wine yet. Ignore the difference for now. + * {WM_ACTIVATE, TRUE, 0x200000 | WA_ACTIVE}, */ + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_MOVE, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_MINIMIZED}, + {WM_ACTIVATEAPP, TRUE, FALSE}, + {0, FALSE, 0}, }; - static const UINT normal_messages[] = + static const struct message normal_messages[] = { - WM_DISPLAYCHANGE, - 0, + {WM_DISPLAYCHANGE, FALSE, 0}, + {0, FALSE, 0}, }; ddraw = create_ddraw(); @@ -2302,7 +2331,7 @@ static void test_coop_level_mode_set(void) hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(screen_size.cx == param.ddraw_width && screen_size.cy == param.ddraw_height, "Expected screen size %ux%u, got %ux%u.\n", @@ -2348,7 +2377,7 @@ static void test_coop_level_mode_set(void) change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(screen_size.cx == param.user32_width && screen_size.cy == param.user32_height, "Expected screen size %ux%u, got %ux%u.\n", @@ -2359,6 +2388,18 @@ static void test_coop_level_mode_set(void) user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, r.left, r.top, r.right, r.bottom); + expect_messages = exclusive_focus_loss_messages; + SetForegroundWindow(GetDesktopWindow()); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + + ShowWindow(window, SW_RESTORE); + hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); + /* Normally the primary should be restored here. Unfortunately this causes the + * GetSurfaceDesc call after the next display mode change to crash on the Windows 8 + * testbot. Another Restore call would presumably avoid the crash, but it also moots + * the point of the GetSurfaceDesc call. */ + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); expect_messages = exclusive_messages; screen_size.cx = 0; @@ -2367,7 +2408,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw7_RestoreDisplayMode(ddraw); ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); - todo_wine ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + todo_wine ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; todo_wine ok(screen_size.cx == registry_mode.dmPelsWidth && screen_size.cy == registry_mode.dmPelsHeight, @@ -2453,7 +2494,7 @@ static void test_coop_level_mode_set(void) change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2470,7 +2511,7 @@ static void test_coop_level_mode_set(void) hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2514,7 +2555,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw_RestoreDisplayMode(ddraw); ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2609,7 +2650,7 @@ static void test_coop_level_mode_set(void) change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2626,7 +2667,7 @@ static void test_coop_level_mode_set(void) hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2670,7 +2711,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw7_RestoreDisplayMode(ddraw); ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); @@ -2731,7 +2772,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL); ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(screen_size.cx == registry_mode.dmPelsWidth && screen_size.cy == registry_mode.dmPelsHeight, @@ -2802,7 +2843,7 @@ static void test_coop_level_mode_set(void) hr = IDirectDraw7_SetCooperativeLevel(ddraw, window2, DDSCL_NORMAL); ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); - ok(!*expect_messages, "Expected message %#x, but didn't receive it.\n", *expect_messages); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); expect_messages = NULL; ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); -- 2.0.4