From a6f7b213af164036efa89cbe7f217a8df484d6a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Wed, 12 Nov 2014 00:18:04 +0100 Subject: [PATCH] ddraw/tests: Ddraw restores the mode settings from the registry. --- dlls/ddraw/tests/ddraw1.c | 152 ++++++++++++++++++++++++++++++++------ dlls/ddraw/tests/ddraw2.c | 152 ++++++++++++++++++++++++++++++++------ dlls/ddraw/tests/ddraw4.c | 152 ++++++++++++++++++++++++++++++++------ dlls/ddraw/tests/ddraw7.c | 152 ++++++++++++++++++++++++++++++++------ 4 files changed, 512 insertions(+), 96 deletions(-) diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c index ed18b47f396..0ae204caeae 100644 --- a/dlls/ddraw/tests/ddraw1.c +++ b/dlls/ddraw/tests/ddraw1.c @@ -2104,7 +2104,7 @@ static LRESULT CALLBACK mode_set_proc(HWND hwnd, UINT message, WPARAM wparam, LP struct test_coop_level_mode_set_enum_param { - DWORD ddraw_width, ddraw_height; + DWORD ddraw_width, ddraw_height, user32_width, user32_height; }; static HRESULT CALLBACK test_coop_level_mode_set_enum_cb(DDSURFACEDESC *surface_desc, void *context) @@ -2117,15 +2117,24 @@ static HRESULT CALLBACK test_coop_level_mode_set_enum_cb(DDSURFACEDESC *surface_ && surface_desc->dwHeight == registry_mode.dmPelsHeight) return DDENUMRET_OK; - param->ddraw_width = surface_desc->dwWidth; - param->ddraw_height = surface_desc->dwHeight; + if (!param->ddraw_width) + { + param->ddraw_width = surface_desc->dwWidth; + param->ddraw_height = surface_desc->dwHeight; + return DDENUMRET_OK; + } + if (surface_desc->dwWidth == param->ddraw_width && surface_desc->dwHeight == param->ddraw_height) + return DDENUMRET_OK; + + param->user32_width = surface_desc->dwWidth; + param->user32_height = surface_desc->dwHeight; return DDENUMRET_CANCEL; } static void test_coop_level_mode_set(void) { IDirectDrawSurface *primary; - RECT registry_rect, ddraw_rect, r; + RECT registry_rect, ddraw_rect, user32_rect, r; IDirectDraw *ddraw; DDSURFACEDESC ddsd; WNDCLASSA wc = {0}; @@ -2134,6 +2143,9 @@ static void test_coop_level_mode_set(void) ULONG ref; MSG msg; struct test_coop_level_mode_set_enum_param param; + DEVMODEW devmode; + BOOL ret; + LONG change_ret; static const UINT exclusive_messages[] = { @@ -2156,17 +2168,29 @@ static void test_coop_level_mode_set(void) memset(¶m, 0, sizeof(param)); hr = IDirectDraw_EnumDisplayModes(ddraw, 0, NULL, ¶m, test_coop_level_mode_set_enum_cb); ok(SUCCEEDED(hr), "Failed to enumerate display mode, hr %#x.\n", hr); + ref = IDirectDraw_Release(ddraw); + ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref); - if (!param.ddraw_width) + if (!param.user32_height) { - skip("Fewer than 2 different modes supported, skipping mode restore test.\n"); - ref = IDirectDraw_Release(ddraw); - ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref); + skip("Fewer than 3 different modes supported, skipping mode restore test.\n"); return; } SetRect(®istry_rect, 0, 0, registry_mode.dmPelsWidth, registry_mode.dmPelsHeight); SetRect(&ddraw_rect, 0, 0, param.ddraw_width, param.ddraw_height); + SetRect(&user32_rect, 0, 0, param.user32_width, param.user32_height); + + memset(&devmode, 0, sizeof(devmode)); + devmode.dmSize = sizeof(devmode); + devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + devmode.dmPelsWidth = param.user32_width; + devmode.dmPelsHeight = param.user32_height; + change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + + ddraw = create_ddraw(); + ok(!!ddraw, "Failed to create a ddraw object.\n"); wc.lpfnWndProc = mode_set_proc; wc.lpszClassName = "ddraw_test_wndproc_wc"; @@ -2179,8 +2203,8 @@ static void test_coop_level_mode_set(void) ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); GetWindowRect(window, &r); - ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", - registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + ok(EqualRect(&r, &user32_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, r.left, r.top, r.right, r.bottom); memset(&ddsd, 0, sizeof(ddsd)); @@ -2192,14 +2216,14 @@ static void test_coop_level_mode_set(void) ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n",hr); hr = IDirectDrawSurface_GetSurfaceDesc(primary, &ddsd); ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr); - ok(ddsd.dwWidth == registry_mode.dmPelsWidth, "Expected surface width %u, got %u.\n", - registry_mode.dmPelsWidth, ddsd.dwWidth); - ok(ddsd.dwHeight == registry_mode.dmPelsHeight, "Expected surface height %u, got %u.\n", - registry_mode.dmPelsHeight, ddsd.dwHeight); + ok(ddsd.dwWidth == param.user32_width, "Expected surface width %u, got %u.\n", + param.user32_width, ddsd.dwWidth); + ok(ddsd.dwHeight == param.user32_height, "Expected surface height %u, got %u.\n", + param.user32_height, ddsd.dwHeight); GetWindowRect(window, &r); - ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", - registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + ok(EqualRect(&r, &user32_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, r.left, r.top, r.right, r.bottom); PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); @@ -2223,10 +2247,10 @@ static void test_coop_level_mode_set(void) hr = IDirectDrawSurface_GetSurfaceDesc(primary, &ddsd); ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr); - ok(ddsd.dwWidth == registry_mode.dmPelsWidth, "Expected surface width %u, got %u.\n", - registry_mode.dmPelsWidth, ddsd.dwWidth); - ok(ddsd.dwHeight == registry_mode.dmPelsHeight, "Expected surface height %u, got %u.\n", - registry_mode.dmPelsHeight, ddsd.dwHeight); + ok(ddsd.dwWidth == param.user32_width, "Expected surface width %u, got %u.\n", + param.user32_width, ddsd.dwWidth); + ok(ddsd.dwHeight == param.user32_height, "Expected surface height %u, got %u.\n", + param.user32_height, ddsd.dwHeight); IDirectDrawSurface_Release(primary); memset(&ddsd, 0, sizeof(ddsd)); @@ -2253,18 +2277,37 @@ static void test_coop_level_mode_set(void) screen_size.cx = 0; screen_size.cy = 0; - hr = IDirectDraw_RestoreDisplayMode(ddraw); - ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); + 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); expect_messages = NULL; - ok(screen_size.cx == registry_mode.dmPelsWidth + ok(screen_size.cx == param.user32_width && screen_size.cy == param.user32_height, + "Expected screen size %ux%u, got %ux%u.\n", + param.user32_width, param.user32_height, screen_size.cx, screen_size.cy); + + GetWindowRect(window, &r); + ok(EqualRect(&r, &user32_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, + r.left, r.top, r.right, r.bottom); + + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + expect_messages = exclusive_messages; + screen_size.cx = 0; + screen_size.cy = 0; + + 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); + expect_messages = NULL; + todo_wine ok(screen_size.cx == registry_mode.dmPelsWidth && screen_size.cy == registry_mode.dmPelsHeight, "Expected screen size %ux%u, got %ux%u.\n", registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, screen_size.cx, screen_size.cy); GetWindowRect(window, &r); - ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + todo_wine ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, r.left, r.top, r.right, r.bottom); @@ -2276,6 +2319,10 @@ static void test_coop_level_mode_set(void) param.ddraw_height, ddsd.dwHeight); IDirectDrawSurface_Release(primary); + /* For Wine. */ + change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; @@ -2335,6 +2382,23 @@ static void test_coop_level_mode_set(void) screen_size.cx = 0; screen_size.cy = 0; + 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); + expect_messages = NULL; + ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); + + GetWindowRect(window, &r); + ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + r.left, r.top, r.right, r.bottom); + + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + expect_messages = normal_messages; + screen_size.cx = 0; + screen_size.cy = 0; + hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); if (hr == DDERR_NOEXCLUSIVEMODE /* NT4 testbot */) { @@ -2406,6 +2470,16 @@ static void test_coop_level_mode_set(void) param.ddraw_height, ddsd.dwHeight); IDirectDrawSurface_Release(primary); + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); + ok(ret, "Failed to get display mode.\n"); + todo_wine ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth + && devmode.dmPelsHeight == registry_mode.dmPelsHeight, + "Expected resolution %ux%u, got %ux%u.\n", + registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, + devmode.dmPelsWidth, devmode.dmPelsHeight); + change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; @@ -2468,6 +2542,26 @@ static void test_coop_level_mode_set(void) screen_size.cx = 0; screen_size.cy = 0; + devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + devmode.dmPelsWidth = param.user32_width; + devmode.dmPelsHeight = param.user32_height; + 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); + expect_messages = NULL; + ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); + + GetWindowRect(window, &r); + ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + r.left, r.top, r.right, r.bottom); + + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + expect_messages = normal_messages; + screen_size.cx = 0; + screen_size.cy = 0; + hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); @@ -2532,6 +2626,16 @@ static void test_coop_level_mode_set(void) param.ddraw_height, ddsd.dwHeight); IDirectDrawSurface_Release(primary); + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); + ok(ret, "Failed to get display mode.\n"); + todo_wine ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth + && devmode.dmPelsHeight == registry_mode.dmPelsHeight, + "Expected resolution %ux%u, got %ux%u.\n", + registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, + devmode.dmPelsWidth, devmode.dmPelsHeight); + change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index 4e10d268524..334d89e8595 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -2303,7 +2303,7 @@ static LRESULT CALLBACK mode_set_proc2(HWND hwnd, UINT message, WPARAM wparam, L struct test_coop_level_mode_set_enum_param { - DWORD ddraw_width, ddraw_height; + DWORD ddraw_width, ddraw_height, user32_width, user32_height; }; static HRESULT CALLBACK test_coop_level_mode_set_enum_cb(DDSURFACEDESC *surface_desc, void *context) @@ -2316,15 +2316,24 @@ static HRESULT CALLBACK test_coop_level_mode_set_enum_cb(DDSURFACEDESC *surface_ && surface_desc->dwHeight == registry_mode.dmPelsHeight) return DDENUMRET_OK; - param->ddraw_width = surface_desc->dwWidth; - param->ddraw_height = surface_desc->dwHeight; + if (!param->ddraw_width) + { + param->ddraw_width = surface_desc->dwWidth; + param->ddraw_height = surface_desc->dwHeight; + return DDENUMRET_OK; + } + if (surface_desc->dwWidth == param->ddraw_width && surface_desc->dwHeight == param->ddraw_height) + return DDENUMRET_OK; + + param->user32_width = surface_desc->dwWidth; + param->user32_height = surface_desc->dwHeight; return DDENUMRET_CANCEL; } static void test_coop_level_mode_set(void) { IDirectDrawSurface *primary; - RECT registry_rect, ddraw_rect, r; + RECT registry_rect, ddraw_rect, user32_rect, r; IDirectDraw2 *ddraw; DDSURFACEDESC ddsd; WNDCLASSA wc = {0}; @@ -2333,6 +2342,9 @@ static void test_coop_level_mode_set(void) ULONG ref; MSG msg; struct test_coop_level_mode_set_enum_param param; + DEVMODEW devmode; + BOOL ret; + LONG change_ret; static const UINT exclusive_messages[] = { @@ -2355,17 +2367,29 @@ static void test_coop_level_mode_set(void) memset(¶m, 0, sizeof(param)); hr = IDirectDraw2_EnumDisplayModes(ddraw, 0, NULL, ¶m, test_coop_level_mode_set_enum_cb); ok(SUCCEEDED(hr), "Failed to enumerate display mode, hr %#x.\n", hr); + ref = IDirectDraw2_Release(ddraw); + ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref); - if (!param.ddraw_width) + if (!param.user32_height) { - skip("Fewer than 2 different modes supported, skipping mode restore test.\n"); - ref = IDirectDraw2_Release(ddraw); - ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref); + skip("Fewer than 3 different modes supported, skipping mode restore test.\n"); return; } SetRect(®istry_rect, 0, 0, registry_mode.dmPelsWidth, registry_mode.dmPelsHeight); SetRect(&ddraw_rect, 0, 0, param.ddraw_width, param.ddraw_height); + SetRect(&user32_rect, 0, 0, param.user32_width, param.user32_height); + + memset(&devmode, 0, sizeof(devmode)); + devmode.dmSize = sizeof(devmode); + devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + devmode.dmPelsWidth = param.user32_width; + devmode.dmPelsHeight = param.user32_height; + change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + + ddraw = create_ddraw(); + ok(!!ddraw, "Failed to create a ddraw object.\n"); wc.lpfnWndProc = mode_set_proc; wc.lpszClassName = "ddraw_test_wndproc_wc"; @@ -2383,8 +2407,8 @@ static void test_coop_level_mode_set(void) ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); GetWindowRect(window, &r); - ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", - registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + ok(EqualRect(&r, &user32_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, r.left, r.top, r.right, r.bottom); memset(&ddsd, 0, sizeof(ddsd)); @@ -2396,14 +2420,14 @@ static void test_coop_level_mode_set(void) ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n",hr); hr = IDirectDrawSurface_GetSurfaceDesc(primary, &ddsd); ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr); - ok(ddsd.dwWidth == registry_mode.dmPelsWidth, "Expected surface width %u, got %u.\n", - registry_mode.dmPelsWidth, ddsd.dwWidth); - ok(ddsd.dwHeight == registry_mode.dmPelsHeight, "Expected surface height %u, got %u.\n", - registry_mode.dmPelsHeight, ddsd.dwHeight); + ok(ddsd.dwWidth == param.user32_width, "Expected surface width %u, got %u.\n", + param.user32_width, ddsd.dwWidth); + ok(ddsd.dwHeight == param.user32_height, "Expected surface height %u, got %u.\n", + param.user32_height, ddsd.dwHeight); GetWindowRect(window, &r); - ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", - registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + ok(EqualRect(&r, &user32_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, r.left, r.top, r.right, r.bottom); PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); @@ -2427,10 +2451,10 @@ static void test_coop_level_mode_set(void) hr = IDirectDrawSurface_GetSurfaceDesc(primary, &ddsd); ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr); - ok(ddsd.dwWidth == registry_mode.dmPelsWidth, "Expected surface width %u, got %u.\n", - registry_mode.dmPelsWidth, ddsd.dwWidth); - ok(ddsd.dwHeight == registry_mode.dmPelsHeight, "Expected surface height %u, got %u.\n", - registry_mode.dmPelsHeight, ddsd.dwHeight); + ok(ddsd.dwWidth == param.user32_width, "Expected surface width %u, got %u.\n", + param.user32_width, ddsd.dwWidth); + ok(ddsd.dwHeight == param.user32_height, "Expected surface height %u, got %u.\n", + param.user32_height, ddsd.dwHeight); IDirectDrawSurface_Release(primary); memset(&ddsd, 0, sizeof(ddsd)); @@ -2457,18 +2481,37 @@ static void test_coop_level_mode_set(void) screen_size.cx = 0; screen_size.cy = 0; - hr = IDirectDraw2_RestoreDisplayMode(ddraw); - ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); + 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); expect_messages = NULL; - ok(screen_size.cx == registry_mode.dmPelsWidth + ok(screen_size.cx == param.user32_width && screen_size.cy == param.user32_height, + "Expected screen size %ux%u, got %ux%u.\n", + param.user32_width, param.user32_height, screen_size.cx, screen_size.cy); + + GetWindowRect(window, &r); + ok(EqualRect(&r, &user32_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, + r.left, r.top, r.right, r.bottom); + + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + expect_messages = exclusive_messages; + screen_size.cx = 0; + screen_size.cy = 0; + + 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); + expect_messages = NULL; + todo_wine ok(screen_size.cx == registry_mode.dmPelsWidth && screen_size.cy == registry_mode.dmPelsHeight, "Expected screen size %ux%u, got %ux%u.\n", registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, screen_size.cx, screen_size.cy); GetWindowRect(window, &r); - ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + todo_wine ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, r.left, r.top, r.right, r.bottom); @@ -2480,6 +2523,10 @@ static void test_coop_level_mode_set(void) param.ddraw_height, ddsd.dwHeight); IDirectDrawSurface_Release(primary); + /* For Wine. */ + change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; @@ -2539,6 +2586,23 @@ static void test_coop_level_mode_set(void) screen_size.cx = 0; screen_size.cy = 0; + 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); + expect_messages = NULL; + ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); + + GetWindowRect(window, &r); + ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + r.left, r.top, r.right, r.bottom); + + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + expect_messages = normal_messages; + screen_size.cx = 0; + screen_size.cy = 0; + hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); if (hr == DDERR_NOEXCLUSIVEMODE /* NT4 testbot */) { @@ -2610,6 +2674,16 @@ static void test_coop_level_mode_set(void) param.ddraw_height, ddsd.dwHeight); IDirectDrawSurface_Release(primary); + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); + ok(ret, "Failed to get display mode.\n"); + todo_wine ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth + && devmode.dmPelsHeight == registry_mode.dmPelsHeight, + "Expected resolution %ux%u, got %ux%u.\n", + registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, + devmode.dmPelsWidth, devmode.dmPelsHeight); + change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; @@ -2672,6 +2746,26 @@ static void test_coop_level_mode_set(void) screen_size.cx = 0; screen_size.cy = 0; + devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + devmode.dmPelsWidth = param.user32_width; + devmode.dmPelsHeight = param.user32_height; + 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); + expect_messages = NULL; + ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); + + GetWindowRect(window, &r); + ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + r.left, r.top, r.right, r.bottom); + + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + expect_messages = normal_messages; + screen_size.cx = 0; + screen_size.cy = 0; + hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); @@ -2736,6 +2830,16 @@ static void test_coop_level_mode_set(void) param.ddraw_height, ddsd.dwHeight); IDirectDrawSurface_Release(primary); + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); + ok(ret, "Failed to get display mode.\n"); + todo_wine ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth + && devmode.dmPelsHeight == registry_mode.dmPelsHeight, + "Expected resolution %ux%u, got %ux%u.\n", + registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, + devmode.dmPelsWidth, devmode.dmPelsHeight); + change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index 5ebbc11840a..ab03f39d4e1 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -2490,7 +2490,7 @@ static LRESULT CALLBACK mode_set_proc2(HWND hwnd, UINT message, WPARAM wparam, L struct test_coop_level_mode_set_enum_param { - DWORD ddraw_width, ddraw_height; + DWORD ddraw_width, ddraw_height, user32_width, user32_height; }; static HRESULT CALLBACK test_coop_level_mode_set_enum_cb(DDSURFACEDESC2 *surface_desc, void *context) @@ -2503,15 +2503,24 @@ static HRESULT CALLBACK test_coop_level_mode_set_enum_cb(DDSURFACEDESC2 *surface && surface_desc->dwHeight == registry_mode.dmPelsHeight) return DDENUMRET_OK; - param->ddraw_width = surface_desc->dwWidth; - param->ddraw_height = surface_desc->dwHeight; + if (!param->ddraw_width) + { + param->ddraw_width = surface_desc->dwWidth; + param->ddraw_height = surface_desc->dwHeight; + return DDENUMRET_OK; + } + if (surface_desc->dwWidth == param->ddraw_width && surface_desc->dwHeight == param->ddraw_height) + return DDENUMRET_OK; + + param->user32_width = surface_desc->dwWidth; + param->user32_height = surface_desc->dwHeight; return DDENUMRET_CANCEL; } static void test_coop_level_mode_set(void) { IDirectDrawSurface4 *primary; - RECT registry_rect, ddraw_rect, r; + RECT registry_rect, ddraw_rect, user32_rect, r; IDirectDraw4 *ddraw; DDSURFACEDESC2 ddsd; WNDCLASSA wc = {0}; @@ -2520,6 +2529,9 @@ static void test_coop_level_mode_set(void) ULONG ref; MSG msg; struct test_coop_level_mode_set_enum_param param; + DEVMODEW devmode; + BOOL ret; + LONG change_ret; static const UINT exclusive_messages[] = { @@ -2542,17 +2554,29 @@ static void test_coop_level_mode_set(void) memset(¶m, 0, sizeof(param)); hr = IDirectDraw4_EnumDisplayModes(ddraw, 0, NULL, ¶m, test_coop_level_mode_set_enum_cb); ok(SUCCEEDED(hr), "Failed to enumerate display mode, hr %#x.\n", hr); + ref = IDirectDraw4_Release(ddraw); + ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref); - if (!param.ddraw_width) + if (!param.user32_height) { - skip("Fewer than 2 different modes supported, skipping mode restore test.\n"); - ref = IDirectDraw4_Release(ddraw); - ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref); + skip("Fewer than 3 different modes supported, skipping mode restore test.\n"); return; } SetRect(®istry_rect, 0, 0, registry_mode.dmPelsWidth, registry_mode.dmPelsHeight); SetRect(&ddraw_rect, 0, 0, param.ddraw_width, param.ddraw_height); + SetRect(&user32_rect, 0, 0, param.user32_width, param.user32_height); + + memset(&devmode, 0, sizeof(devmode)); + devmode.dmSize = sizeof(devmode); + devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + devmode.dmPelsWidth = param.user32_width; + devmode.dmPelsHeight = param.user32_height; + change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + + ddraw = create_ddraw(); + ok(!!ddraw, "Failed to create a ddraw object.\n"); wc.lpfnWndProc = mode_set_proc; wc.lpszClassName = "ddraw_test_wndproc_wc"; @@ -2570,8 +2594,8 @@ static void test_coop_level_mode_set(void) ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); GetWindowRect(window, &r); - ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", - registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + ok(EqualRect(&r, &user32_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, r.left, r.top, r.right, r.bottom); memset(&ddsd, 0, sizeof(ddsd)); @@ -2583,14 +2607,14 @@ static void test_coop_level_mode_set(void) ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n",hr); hr = IDirectDrawSurface4_GetSurfaceDesc(primary, &ddsd); ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr); - ok(ddsd.dwWidth == registry_mode.dmPelsWidth, "Expected surface width %u, got %u.\n", - registry_mode.dmPelsWidth, ddsd.dwWidth); - ok(ddsd.dwHeight == registry_mode.dmPelsHeight, "Expected surface height %u, got %u.\n", - registry_mode.dmPelsHeight, ddsd.dwHeight); + ok(ddsd.dwWidth == param.user32_width, "Expected surface width %u, got %u.\n", + param.user32_width, ddsd.dwWidth); + ok(ddsd.dwHeight == param.user32_height, "Expected surface height %u, got %u.\n", + param.user32_height, ddsd.dwHeight); GetWindowRect(window, &r); - ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", - registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + ok(EqualRect(&r, &user32_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, r.left, r.top, r.right, r.bottom); PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); @@ -2614,10 +2638,10 @@ static void test_coop_level_mode_set(void) hr = IDirectDrawSurface4_GetSurfaceDesc(primary, &ddsd); ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr); - ok(ddsd.dwWidth == registry_mode.dmPelsWidth, "Expected surface width %u, got %u.\n", - registry_mode.dmPelsWidth, ddsd.dwWidth); - ok(ddsd.dwHeight == registry_mode.dmPelsHeight, "Expected surface height %u, got %u.\n", - registry_mode.dmPelsHeight, ddsd.dwHeight); + ok(ddsd.dwWidth == param.user32_width, "Expected surface width %u, got %u.\n", + param.user32_width, ddsd.dwWidth); + ok(ddsd.dwHeight == param.user32_height, "Expected surface height %u, got %u.\n", + param.user32_height, ddsd.dwHeight); IDirectDrawSurface4_Release(primary); memset(&ddsd, 0, sizeof(ddsd)); @@ -2644,18 +2668,37 @@ static void test_coop_level_mode_set(void) screen_size.cx = 0; screen_size.cy = 0; - hr = IDirectDraw4_RestoreDisplayMode(ddraw); - ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); + 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); expect_messages = NULL; - ok(screen_size.cx == registry_mode.dmPelsWidth + ok(screen_size.cx == param.user32_width && screen_size.cy == param.user32_height, + "Expected screen size %ux%u, got %ux%u.\n", + param.user32_width, param.user32_height, screen_size.cx, screen_size.cy); + + GetWindowRect(window, &r); + ok(EqualRect(&r, &user32_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, + r.left, r.top, r.right, r.bottom); + + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + expect_messages = exclusive_messages; + screen_size.cx = 0; + screen_size.cy = 0; + + 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); + expect_messages = NULL; + todo_wine ok(screen_size.cx == registry_mode.dmPelsWidth && screen_size.cy == registry_mode.dmPelsHeight, "Expected screen size %ux%u, got %ux%u.\n", registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, screen_size.cx, screen_size.cy); GetWindowRect(window, &r); - ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + todo_wine ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, r.left, r.top, r.right, r.bottom); @@ -2667,6 +2710,10 @@ static void test_coop_level_mode_set(void) param.ddraw_height, ddsd.dwHeight); IDirectDrawSurface4_Release(primary); + /* For Wine. */ + change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; @@ -2726,6 +2773,23 @@ static void test_coop_level_mode_set(void) screen_size.cx = 0; screen_size.cy = 0; + 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); + expect_messages = NULL; + ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); + + GetWindowRect(window, &r); + ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + r.left, r.top, r.right, r.bottom); + + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + expect_messages = normal_messages; + screen_size.cx = 0; + screen_size.cy = 0; + hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); @@ -2790,6 +2854,16 @@ static void test_coop_level_mode_set(void) param.ddraw_height, ddsd.dwHeight); IDirectDrawSurface4_Release(primary); + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); + ok(ret, "Failed to get display mode.\n"); + todo_wine ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth + && devmode.dmPelsHeight == registry_mode.dmPelsHeight, + "Expected resolution %ux%u, got %ux%u.\n", + registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, + devmode.dmPelsWidth, devmode.dmPelsHeight); + change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; @@ -2852,6 +2926,26 @@ static void test_coop_level_mode_set(void) screen_size.cx = 0; screen_size.cy = 0; + devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + devmode.dmPelsWidth = param.user32_width; + devmode.dmPelsHeight = param.user32_height; + 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); + expect_messages = NULL; + ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); + + GetWindowRect(window, &r); + ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + r.left, r.top, r.right, r.bottom); + + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + expect_messages = normal_messages; + screen_size.cx = 0; + screen_size.cy = 0; + hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); @@ -2916,6 +3010,16 @@ static void test_coop_level_mode_set(void) param.ddraw_height, ddsd.dwHeight); IDirectDrawSurface4_Release(primary); + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); + ok(ret, "Failed to get display mode.\n"); + todo_wine ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth + && devmode.dmPelsHeight == registry_mode.dmPelsHeight, + "Expected resolution %ux%u, got %ux%u.\n", + registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, + devmode.dmPelsWidth, devmode.dmPelsHeight); + change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index 7850fb558a5..cbf6112bfae 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -2167,7 +2167,7 @@ static LRESULT CALLBACK mode_set_proc2(HWND hwnd, UINT message, WPARAM wparam, L struct test_coop_level_mode_set_enum_param { - DWORD ddraw_width, ddraw_height; + DWORD ddraw_width, ddraw_height, user32_width, user32_height; }; static HRESULT CALLBACK test_coop_level_mode_set_enum_cb(DDSURFACEDESC2 *surface_desc, void *context) @@ -2180,15 +2180,24 @@ static HRESULT CALLBACK test_coop_level_mode_set_enum_cb(DDSURFACEDESC2 *surface && surface_desc->dwHeight == registry_mode.dmPelsHeight) return DDENUMRET_OK; - param->ddraw_width = surface_desc->dwWidth; - param->ddraw_height = surface_desc->dwHeight; + if (!param->ddraw_width) + { + param->ddraw_width = surface_desc->dwWidth; + param->ddraw_height = surface_desc->dwHeight; + return DDENUMRET_OK; + } + if (surface_desc->dwWidth == param->ddraw_width && surface_desc->dwHeight == param->ddraw_height) + return DDENUMRET_OK; + + param->user32_width = surface_desc->dwWidth; + param->user32_height = surface_desc->dwHeight; return DDENUMRET_CANCEL; } static void test_coop_level_mode_set(void) { IDirectDrawSurface7 *primary; - RECT registry_rect, ddraw_rect, r; + RECT registry_rect, ddraw_rect, user32_rect, r; IDirectDraw7 *ddraw; DDSURFACEDESC2 ddsd; WNDCLASSA wc = {0}; @@ -2197,6 +2206,9 @@ static void test_coop_level_mode_set(void) ULONG ref; MSG msg; struct test_coop_level_mode_set_enum_param param; + DEVMODEW devmode; + BOOL ret; + LONG change_ret; static const UINT exclusive_messages[] = { @@ -2219,17 +2231,29 @@ static void test_coop_level_mode_set(void) memset(¶m, 0, sizeof(param)); hr = IDirectDraw7_EnumDisplayModes(ddraw, 0, NULL, ¶m, test_coop_level_mode_set_enum_cb); ok(SUCCEEDED(hr), "Failed to enumerate display mode, hr %#x.\n", hr); + ref = IDirectDraw7_Release(ddraw); + ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref); - if (!param.ddraw_width) + if (!param.user32_height) { - skip("Fewer than 2 different modes supported, skipping mode restore test.\n"); - ref = IDirectDraw7_Release(ddraw); - ok(ref == 0, "The ddraw object was not properly freed: refcount %u.\n", ref); + skip("Fewer than 3 different modes supported, skipping mode restore test.\n"); return; } SetRect(®istry_rect, 0, 0, registry_mode.dmPelsWidth, registry_mode.dmPelsHeight); SetRect(&ddraw_rect, 0, 0, param.ddraw_width, param.ddraw_height); + SetRect(&user32_rect, 0, 0, param.user32_width, param.user32_height); + + memset(&devmode, 0, sizeof(devmode)); + devmode.dmSize = sizeof(devmode); + devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + devmode.dmPelsWidth = param.user32_width; + devmode.dmPelsHeight = param.user32_height; + change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + + ddraw = create_ddraw(); + ok(!!ddraw, "Failed to create a ddraw object.\n"); wc.lpfnWndProc = mode_set_proc; wc.lpszClassName = "ddraw_test_wndproc_wc"; @@ -2247,8 +2271,8 @@ static void test_coop_level_mode_set(void) ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); GetWindowRect(window, &r); - ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", - registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + ok(EqualRect(&r, &user32_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, r.left, r.top, r.right, r.bottom); memset(&ddsd, 0, sizeof(ddsd)); @@ -2260,14 +2284,14 @@ static void test_coop_level_mode_set(void) ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n",hr); hr = IDirectDrawSurface7_GetSurfaceDesc(primary, &ddsd); ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr); - ok(ddsd.dwWidth == registry_mode.dmPelsWidth, "Expected surface width %u, got %u.\n", - registry_mode.dmPelsWidth, ddsd.dwWidth); - ok(ddsd.dwHeight == registry_mode.dmPelsHeight, "Expected surface height %u, got %u.\n", - registry_mode.dmPelsHeight, ddsd.dwHeight); + ok(ddsd.dwWidth == param.user32_width, "Expected surface width %u, got %u.\n", + param.user32_width, ddsd.dwWidth); + ok(ddsd.dwHeight == param.user32_height, "Expected surface height %u, got %u.\n", + param.user32_height, ddsd.dwHeight); GetWindowRect(window, &r); - ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", - registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + ok(EqualRect(&r, &user32_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, r.left, r.top, r.right, r.bottom); PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); @@ -2291,10 +2315,10 @@ static void test_coop_level_mode_set(void) hr = IDirectDrawSurface7_GetSurfaceDesc(primary, &ddsd); ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr); - ok(ddsd.dwWidth == registry_mode.dmPelsWidth, "Expected surface width %u, got %u.\n", - registry_mode.dmPelsWidth, ddsd.dwWidth); - ok(ddsd.dwHeight == registry_mode.dmPelsHeight, "Expected surface height %u, got %u.\n", - registry_mode.dmPelsHeight, ddsd.dwHeight); + ok(ddsd.dwWidth == param.user32_width, "Expected surface width %u, got %u.\n", + param.user32_width, ddsd.dwWidth); + ok(ddsd.dwHeight == param.user32_height, "Expected surface height %u, got %u.\n", + param.user32_height, ddsd.dwHeight); IDirectDrawSurface7_Release(primary); memset(&ddsd, 0, sizeof(ddsd)); @@ -2321,18 +2345,37 @@ static void test_coop_level_mode_set(void) screen_size.cx = 0; screen_size.cy = 0; - hr = IDirectDraw7_RestoreDisplayMode(ddraw); - ok(SUCCEEDED(hr), "RestoreDisplayMode failed, hr %#x.\n", hr); + 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); expect_messages = NULL; - ok(screen_size.cx == registry_mode.dmPelsWidth + ok(screen_size.cx == param.user32_width && screen_size.cy == param.user32_height, + "Expected screen size %ux%u, got %ux%u.\n", + param.user32_width, param.user32_height, screen_size.cx, screen_size.cy); + + GetWindowRect(window, &r); + ok(EqualRect(&r, &user32_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + user32_rect.left, user32_rect.top, user32_rect.right, user32_rect.bottom, + r.left, r.top, r.right, r.bottom); + + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + expect_messages = exclusive_messages; + screen_size.cx = 0; + screen_size.cy = 0; + + 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); + expect_messages = NULL; + todo_wine ok(screen_size.cx == registry_mode.dmPelsWidth && screen_size.cy == registry_mode.dmPelsHeight, "Expected screen size %ux%u, got %ux%u.\n", registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, screen_size.cx, screen_size.cy); GetWindowRect(window, &r); - ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + todo_wine ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, r.left, r.top, r.right, r.bottom); @@ -2344,6 +2387,10 @@ static void test_coop_level_mode_set(void) param.ddraw_height, ddsd.dwHeight); IDirectDrawSurface7_Release(primary); + /* For Wine. */ + change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; @@ -2403,6 +2450,23 @@ static void test_coop_level_mode_set(void) screen_size.cx = 0; screen_size.cy = 0; + 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); + expect_messages = NULL; + ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); + + GetWindowRect(window, &r); + ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + r.left, r.top, r.right, r.bottom); + + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + expect_messages = normal_messages; + screen_size.cx = 0; + screen_size.cy = 0; + hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); @@ -2467,6 +2531,16 @@ static void test_coop_level_mode_set(void) param.ddraw_height, ddsd.dwHeight); IDirectDrawSurface7_Release(primary); + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); + ok(ret, "Failed to get display mode.\n"); + todo_wine ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth + && devmode.dmPelsHeight == registry_mode.dmPelsHeight, + "Expected resolution %ux%u, got %ux%u.\n", + registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, + devmode.dmPelsWidth, devmode.dmPelsHeight); + change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; @@ -2529,6 +2603,26 @@ static void test_coop_level_mode_set(void) screen_size.cx = 0; screen_size.cy = 0; + devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + devmode.dmPelsWidth = param.user32_width; + devmode.dmPelsHeight = param.user32_height; + 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); + expect_messages = NULL; + ok(!screen_size.cx && !screen_size.cy, "Got unexpected screen size %ux%u.\n", screen_size.cx, screen_size.cy); + + GetWindowRect(window, &r); + ok(EqualRect(&r, ®istry_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + registry_rect.left, registry_rect.top, registry_rect.right, registry_rect.bottom, + r.left, r.top, r.right, r.bottom); + + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + expect_messages = normal_messages; + screen_size.cx = 0; + screen_size.cy = 0; + hr = set_display_mode(ddraw, param.ddraw_width, param.ddraw_height); ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr); @@ -2593,6 +2687,16 @@ static void test_coop_level_mode_set(void) param.ddraw_height, ddsd.dwHeight); IDirectDrawSurface7_Release(primary); + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); + ok(ret, "Failed to get display mode.\n"); + todo_wine ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth + && devmode.dmPelsHeight == registry_mode.dmPelsHeight, + "Expected resolution %ux%u, got %ux%u.\n", + registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, + devmode.dmPelsWidth, devmode.dmPelsHeight); + change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS;