[PATCH 3/5] ddraw/tests: RestoreDisplayMode uses the registry mode.

Stefan Dösinger stefan at codeweavers.com
Fri Oct 24 04:28:55 CDT 2014


---
 dlls/ddraw/tests/ddraw1.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++
 dlls/ddraw/tests/ddraw2.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++
 dlls/ddraw/tests/ddraw4.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++
 dlls/ddraw/tests/ddraw7.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 464 insertions(+)

diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 742d82c..6577216 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -5632,6 +5632,121 @@ static void test_surface_desc_lock(void)
     DestroyWindow(window);
 }
 
+struct restore_mode_param
+{
+    DEVMODEW registry_mode;
+    DWORD width1, height1, width2, height2;
+};
+
+static HRESULT CALLBACK test_restore_display_mode_cb(DDSURFACEDESC *surface_desc, void *context)
+{
+    struct restore_mode_param *param = context;
+
+    if (U1(surface_desc->ddpfPixelFormat).dwRGBBitCount != param->registry_mode.dmBitsPerPel)
+        return DDENUMRET_OK;
+    if (surface_desc->dwWidth == param->registry_mode.dmPelsWidth
+            && surface_desc->dwHeight == param->registry_mode.dmPelsHeight)
+        return DDENUMRET_OK;
+
+    if (!param->width1)
+    {
+        param->width1 = surface_desc->dwWidth;
+        param->height1 = surface_desc->dwHeight;
+        return DDENUMRET_OK;
+    }
+    if (surface_desc->dwWidth == param->width1 && surface_desc->dwHeight == param->height1)
+        return DDENUMRET_OK;
+
+    param->width2 = surface_desc->dwWidth;
+    param->height2 = surface_desc->dwHeight;
+    return DDENUMRET_CANCEL;
+}
+
+static void test_restore_display_mode(void)
+{
+    IDirectDraw *ddraw;
+    ULONG refcount;
+    HWND window;
+    HRESULT hr;
+    DEVMODEW devmode;
+    BOOL ret;
+    LONG change_ret;
+    struct restore_mode_param param;
+
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+
+    memset(&param, 0, sizeof(param));
+    param.registry_mode.dmSize = sizeof(param.registry_mode);
+    ret = EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &param.registry_mode);
+    ok(ret, "Failed to get display mode.\n");
+    hr = IDirectDraw_EnumDisplayModes(ddraw, 0, NULL, &param, test_restore_display_mode_cb);
+    ok(SUCCEEDED(hr), "Failed to enumerate display mode, hr %#x.\n", hr);
+    refcount = IDirectDraw_Release(ddraw);
+    ok(!refcount, "Got unexpected refcount %u.\n", refcount);
+
+    if (!param.width2)
+    {
+        skip("Fewer than 3 different modes supported, skipping mode restore test.\n");
+        return;
+    }
+
+    memset(&devmode, 0, sizeof(devmode));
+    devmode.dmSize = sizeof(devmode);
+    devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
+    devmode.dmPelsWidth = param.width1;
+    devmode.dmPelsHeight = param.height1;
+    change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN);
+    ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", ret);
+
+    window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+    hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+    hr = set_display_mode(ddraw, param.width2, param.height2);
+    ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr);
+    hr = IDirectDraw_RestoreDisplayMode(ddraw);
+    ok(SUCCEEDED(hr), "Failed to restore display mode, hr %#x.\n", hr);
+
+    ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode);
+    ok(ret, "Failed to get display mode.\n");
+    todo_wine ok(devmode.dmPelsWidth == param.registry_mode.dmPelsWidth, "Got unexpect width %u, expected %u.\n",
+            devmode.dmPelsWidth, param.registry_mode.dmPelsWidth);
+    todo_wine ok(devmode.dmPelsHeight == param.registry_mode.dmPelsHeight, "Got unexpect height %u, expected %u.\n",
+            devmode.dmPelsHeight, param.registry_mode.dmPelsHeight);
+
+    refcount = IDirectDraw_Release(ddraw);
+    ok(!refcount, "Got unexpected refcount %u.\n", refcount);
+
+    devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
+    devmode.dmPelsWidth = param.width1;
+    devmode.dmPelsHeight = param.height1;
+    change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN);
+    ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", ret);
+
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+    hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+    hr = set_display_mode(ddraw, param.width2, param.height2);
+    ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr);
+    refcount = IDirectDraw_Release(ddraw);
+    ok(!refcount, "Got unexpected refcount %u.\n", refcount);
+
+    ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode);
+    ok(ret, "Failed to get display mode.\n");
+    todo_wine ok(devmode.dmPelsWidth == param.registry_mode.dmPelsWidth, "Got unexpect width %u, expected %u.\n",
+            devmode.dmPelsWidth, param.registry_mode.dmPelsWidth);
+    todo_wine ok(devmode.dmPelsHeight == param.registry_mode.dmPelsHeight, "Got unexpect height %u, expected %u.\n",
+            devmode.dmPelsHeight, param.registry_mode.dmPelsHeight);
+
+    DestroyWindow(window);
+    change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN);
+    ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", ret);
+}
+
 START_TEST(ddraw1)
 {
     IDirectDraw *ddraw;
@@ -5684,4 +5799,5 @@ START_TEST(ddraw1)
     test_palette_alpha();
     test_lost_device();
     test_surface_desc_lock();
+    test_restore_display_mode();
 }
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index c5a8393..cd0ff84 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -6708,6 +6708,121 @@ static void test_surface_desc_lock(void)
     DestroyWindow(window);
 }
 
+struct restore_mode_param
+{
+    DEVMODEW registry_mode;
+    DWORD width1, height1, width2, height2;
+};
+
+static HRESULT CALLBACK test_restore_display_mode_cb(DDSURFACEDESC *surface_desc, void *context)
+{
+    struct restore_mode_param *param = context;
+
+    if (U1(surface_desc->ddpfPixelFormat).dwRGBBitCount != param->registry_mode.dmBitsPerPel)
+        return DDENUMRET_OK;
+    if (surface_desc->dwWidth == param->registry_mode.dmPelsWidth
+            && surface_desc->dwHeight == param->registry_mode.dmPelsHeight)
+        return DDENUMRET_OK;
+
+    if (!param->width1)
+    {
+        param->width1 = surface_desc->dwWidth;
+        param->height1 = surface_desc->dwHeight;
+        return DDENUMRET_OK;
+    }
+    if (surface_desc->dwWidth == param->width1 && surface_desc->dwHeight == param->height1)
+        return DDENUMRET_OK;
+
+    param->width2 = surface_desc->dwWidth;
+    param->height2 = surface_desc->dwHeight;
+    return DDENUMRET_CANCEL;
+}
+
+static void test_restore_display_mode(void)
+{
+    IDirectDraw2 *ddraw;
+    ULONG refcount;
+    HWND window;
+    HRESULT hr;
+    DEVMODEW devmode;
+    BOOL ret;
+    LONG change_ret;
+    struct restore_mode_param param;
+
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+
+    memset(&param, 0, sizeof(param));
+    param.registry_mode.dmSize = sizeof(param.registry_mode);
+    ret = EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &param.registry_mode);
+    ok(ret, "Failed to get display mode.\n");
+    hr = IDirectDraw2_EnumDisplayModes(ddraw, 0, NULL, &param, test_restore_display_mode_cb);
+    ok(SUCCEEDED(hr), "Failed to enumerate display mode, hr %#x.\n", hr);
+    refcount = IDirectDraw2_Release(ddraw);
+    ok(!refcount, "Got unexpected refcount %u.\n", refcount);
+
+    if (!param.width2)
+    {
+        skip("Fewer than 3 different modes supported, skipping mode restore test.\n");
+        return;
+    }
+
+    memset(&devmode, 0, sizeof(devmode));
+    devmode.dmSize = sizeof(devmode);
+    devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
+    devmode.dmPelsWidth = param.width1;
+    devmode.dmPelsHeight = param.height1;
+    change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN);
+    ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", ret);
+
+    window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+    hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+    hr = set_display_mode(ddraw, param.width2, param.height2);
+    ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr);
+    hr = IDirectDraw2_RestoreDisplayMode(ddraw);
+    ok(SUCCEEDED(hr), "Failed to restore display mode, hr %#x.\n", hr);
+
+    ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode);
+    ok(ret, "Failed to get display mode.\n");
+    todo_wine ok(devmode.dmPelsWidth == param.registry_mode.dmPelsWidth, "Got unexpect width %u, expected %u.\n",
+            devmode.dmPelsWidth, param.registry_mode.dmPelsWidth);
+    todo_wine ok(devmode.dmPelsHeight == param.registry_mode.dmPelsHeight, "Got unexpect height %u, expected %u.\n",
+            devmode.dmPelsHeight, param.registry_mode.dmPelsHeight);
+
+    refcount = IDirectDraw2_Release(ddraw);
+    ok(!refcount, "Got unexpected refcount %u.\n", refcount);
+
+    devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
+    devmode.dmPelsWidth = param.width1;
+    devmode.dmPelsHeight = param.height1;
+    change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN);
+    ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", ret);
+
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+    hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+    hr = set_display_mode(ddraw, param.width2, param.height2);
+    ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr);
+    refcount = IDirectDraw2_Release(ddraw);
+    ok(!refcount, "Got unexpected refcount %u.\n", refcount);
+
+    ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode);
+    ok(ret, "Failed to get display mode.\n");
+    todo_wine ok(devmode.dmPelsWidth == param.registry_mode.dmPelsWidth, "Got unexpect width %u, expected %u.\n",
+            devmode.dmPelsWidth, param.registry_mode.dmPelsWidth);
+    todo_wine ok(devmode.dmPelsHeight == param.registry_mode.dmPelsHeight, "Got unexpect height %u, expected %u.\n",
+            devmode.dmPelsHeight, param.registry_mode.dmPelsHeight);
+
+    DestroyWindow(window);
+    change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN);
+    ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", ret);
+}
+
 START_TEST(ddraw2)
 {
     IDirectDraw2 *ddraw;
@@ -6766,4 +6881,5 @@ START_TEST(ddraw2)
     test_palette_alpha();
     test_lost_device();
     test_surface_desc_lock();
+    test_restore_display_mode();
 }
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 009ac6f..33d28c1 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -7783,6 +7783,121 @@ static void test_surface_desc_lock(void)
     DestroyWindow(window);
 }
 
+struct restore_mode_param
+{
+    DEVMODEW registry_mode;
+    DWORD width1, height1, width2, height2;
+};
+
+static HRESULT CALLBACK test_restore_display_mode_cb(DDSURFACEDESC2 *surface_desc, void *context)
+{
+    struct restore_mode_param *param = context;
+
+    if (U1(surface_desc->ddpfPixelFormat).dwRGBBitCount != param->registry_mode.dmBitsPerPel)
+        return DDENUMRET_OK;
+    if (surface_desc->dwWidth == param->registry_mode.dmPelsWidth
+            && surface_desc->dwHeight == param->registry_mode.dmPelsHeight)
+        return DDENUMRET_OK;
+
+    if (!param->width1)
+    {
+        param->width1 = surface_desc->dwWidth;
+        param->height1 = surface_desc->dwHeight;
+        return DDENUMRET_OK;
+    }
+    if (surface_desc->dwWidth == param->width1 && surface_desc->dwHeight == param->height1)
+        return DDENUMRET_OK;
+
+    param->width2 = surface_desc->dwWidth;
+    param->height2 = surface_desc->dwHeight;
+    return DDENUMRET_CANCEL;
+}
+
+static void test_restore_display_mode(void)
+{
+    IDirectDraw4 *ddraw;
+    ULONG refcount;
+    HWND window;
+    HRESULT hr;
+    DEVMODEW devmode;
+    BOOL ret;
+    LONG change_ret;
+    struct restore_mode_param param;
+
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+
+    memset(&param, 0, sizeof(param));
+    param.registry_mode.dmSize = sizeof(param.registry_mode);
+    ret = EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &param.registry_mode);
+    ok(ret, "Failed to get display mode.\n");
+    hr = IDirectDraw4_EnumDisplayModes(ddraw, 0, NULL, &param, test_restore_display_mode_cb);
+    ok(SUCCEEDED(hr), "Failed to enumerate display mode, hr %#x.\n", hr);
+    refcount = IDirectDraw4_Release(ddraw);
+    ok(!refcount, "Got unexpected refcount %u.\n", refcount);
+
+    if (!param.width2)
+    {
+        skip("Fewer than 3 different modes supported, skipping mode restore test.\n");
+        return;
+    }
+
+    memset(&devmode, 0, sizeof(devmode));
+    devmode.dmSize = sizeof(devmode);
+    devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
+    devmode.dmPelsWidth = param.width1;
+    devmode.dmPelsHeight = param.height1;
+    change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN);
+    ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", ret);
+
+    window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+    hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+    hr = set_display_mode(ddraw, param.width2, param.height2);
+    ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr);
+    hr = IDirectDraw4_RestoreDisplayMode(ddraw);
+    ok(SUCCEEDED(hr), "Failed to restore display mode, hr %#x.\n", hr);
+
+    ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode);
+    ok(ret, "Failed to get display mode.\n");
+    todo_wine ok(devmode.dmPelsWidth == param.registry_mode.dmPelsWidth, "Got unexpect width %u, expected %u.\n",
+            devmode.dmPelsWidth, param.registry_mode.dmPelsWidth);
+    todo_wine ok(devmode.dmPelsHeight == param.registry_mode.dmPelsHeight, "Got unexpect height %u, expected %u.\n",
+            devmode.dmPelsHeight, param.registry_mode.dmPelsHeight);
+
+    refcount = IDirectDraw4_Release(ddraw);
+    ok(!refcount, "Got unexpected refcount %u.\n", refcount);
+
+    devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
+    devmode.dmPelsWidth = param.width1;
+    devmode.dmPelsHeight = param.height1;
+    change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN);
+    ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", ret);
+
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+    hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+    hr = set_display_mode(ddraw, param.width2, param.height2);
+    ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr);
+    refcount = IDirectDraw4_Release(ddraw);
+    ok(!refcount, "Got unexpected refcount %u.\n", refcount);
+
+    ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode);
+    ok(ret, "Failed to get display mode.\n");
+    todo_wine ok(devmode.dmPelsWidth == param.registry_mode.dmPelsWidth, "Got unexpect width %u, expected %u.\n",
+            devmode.dmPelsWidth, param.registry_mode.dmPelsWidth);
+    todo_wine ok(devmode.dmPelsHeight == param.registry_mode.dmPelsHeight, "Got unexpect height %u, expected %u.\n",
+            devmode.dmPelsHeight, param.registry_mode.dmPelsHeight);
+
+    DestroyWindow(window);
+    change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN);
+    ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", ret);
+}
+
 START_TEST(ddraw4)
 {
     IDirectDraw4 *ddraw;
@@ -7848,4 +7963,5 @@ START_TEST(ddraw4)
     test_vb_writeonly();
     test_lost_device();
     test_surface_desc_lock();
+    test_restore_display_mode();
 }
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index ec50fb8..18e6636 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -7626,6 +7626,121 @@ static void test_surface_desc_lock(void)
     DestroyWindow(window);
 }
 
+struct restore_mode_param
+{
+    DEVMODEW registry_mode;
+    DWORD width1, height1, width2, height2;
+};
+
+static HRESULT CALLBACK test_restore_display_mode_cb(DDSURFACEDESC2 *surface_desc, void *context)
+{
+    struct restore_mode_param *param = context;
+
+    if (U1(surface_desc->ddpfPixelFormat).dwRGBBitCount != param->registry_mode.dmBitsPerPel)
+        return DDENUMRET_OK;
+    if (surface_desc->dwWidth == param->registry_mode.dmPelsWidth
+            && surface_desc->dwHeight == param->registry_mode.dmPelsHeight)
+        return DDENUMRET_OK;
+
+    if (!param->width1)
+    {
+        param->width1 = surface_desc->dwWidth;
+        param->height1 = surface_desc->dwHeight;
+        return DDENUMRET_OK;
+    }
+    if (surface_desc->dwWidth == param->width1 && surface_desc->dwHeight == param->height1)
+        return DDENUMRET_OK;
+
+    param->width2 = surface_desc->dwWidth;
+    param->height2 = surface_desc->dwHeight;
+    return DDENUMRET_CANCEL;
+}
+
+static void test_restore_display_mode(void)
+{
+    IDirectDraw7 *ddraw;
+    ULONG refcount;
+    HWND window;
+    HRESULT hr;
+    DEVMODEW devmode;
+    BOOL ret;
+    LONG change_ret;
+    struct restore_mode_param param;
+
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+
+    memset(&param, 0, sizeof(param));
+    param.registry_mode.dmSize = sizeof(param.registry_mode);
+    ret = EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &param.registry_mode);
+    ok(ret, "Failed to get display mode.\n");
+    hr = IDirectDraw7_EnumDisplayModes(ddraw, 0, NULL, &param, test_restore_display_mode_cb);
+    ok(SUCCEEDED(hr), "Failed to enumerate display mode, hr %#x.\n", hr);
+    refcount = IDirectDraw7_Release(ddraw);
+    ok(!refcount, "Got unexpected refcount %u.\n", refcount);
+
+    if (!param.width2)
+    {
+        skip("Fewer than 3 different modes supported, skipping mode restore test.\n");
+        return;
+    }
+
+    memset(&devmode, 0, sizeof(devmode));
+    devmode.dmSize = sizeof(devmode);
+    devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
+    devmode.dmPelsWidth = param.width1;
+    devmode.dmPelsHeight = param.height1;
+    change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN);
+    ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", ret);
+
+    window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
+            0, 0, 640, 480, 0, 0, 0, 0);
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+    hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+    hr = set_display_mode(ddraw, param.width2, param.height2);
+    ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr);
+    hr = IDirectDraw7_RestoreDisplayMode(ddraw);
+    ok(SUCCEEDED(hr), "Failed to restore display mode, hr %#x.\n", hr);
+
+    ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode);
+    ok(ret, "Failed to get display mode.\n");
+    todo_wine ok(devmode.dmPelsWidth == param.registry_mode.dmPelsWidth, "Got unexpect width %u, expected %u.\n",
+            devmode.dmPelsWidth, param.registry_mode.dmPelsWidth);
+    todo_wine ok(devmode.dmPelsHeight == param.registry_mode.dmPelsHeight, "Got unexpect height %u, expected %u.\n",
+            devmode.dmPelsHeight, param.registry_mode.dmPelsHeight);
+
+    refcount = IDirectDraw7_Release(ddraw);
+    ok(!refcount, "Got unexpected refcount %u.\n", refcount);
+
+    devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
+    devmode.dmPelsWidth = param.width1;
+    devmode.dmPelsHeight = param.height1;
+    change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN);
+    ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", ret);
+
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+    hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
+    hr = set_display_mode(ddraw, param.width2, param.height2);
+    ok(SUCCEEDED(hr), "Failed to set display mode, hr %#x.\n", hr);
+    refcount = IDirectDraw7_Release(ddraw);
+    ok(!refcount, "Got unexpected refcount %u.\n", refcount);
+
+    ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode);
+    ok(ret, "Failed to get display mode.\n");
+    todo_wine ok(devmode.dmPelsWidth == param.registry_mode.dmPelsWidth, "Got unexpect width %u, expected %u.\n",
+            devmode.dmPelsWidth, param.registry_mode.dmPelsWidth);
+    todo_wine ok(devmode.dmPelsHeight == param.registry_mode.dmPelsHeight, "Got unexpect height %u, expected %u.\n",
+            devmode.dmPelsHeight, param.registry_mode.dmPelsHeight);
+
+    DestroyWindow(window);
+    change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN);
+    ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", ret);
+}
+
 START_TEST(ddraw7)
 {
     HMODULE module = GetModuleHandleA("ddraw.dll");
@@ -7699,4 +7814,5 @@ START_TEST(ddraw7)
     test_lost_device();
     test_resource_priority();
     test_surface_desc_lock();
+    test_restore_display_mode();
 }
-- 
2.0.4




More information about the wine-patches mailing list