Johan Gill : ddraw: Do not restore the display mode from inside SetCooperativeLevel.

Alexandre Julliard julliard at winehq.org
Mon Apr 19 11:51:24 CDT 2010


Module: wine
Branch: master
Commit: 7c90c1a0b5f049ff6bbca657b52c1132f6b74f7c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7c90c1a0b5f049ff6bbca657b52c1132f6b74f7c

Author: Johan Gill <johan.gill at gmail.com>
Date:   Fri Apr 16 23:04:41 2010 +0200

ddraw: Do not restore the display mode from inside SetCooperativeLevel.

---

 dlls/ddraw/ddraw.c            |    5 +---
 dlls/ddraw/tests/ddrawmodes.c |   44 ++++++++++++++++++++++++++++++++++++----
 2 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 0a6781c..a8dbafa 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -264,8 +264,8 @@ IDirectDrawImpl_AddRef(IDirectDraw7 *iface)
 void
 IDirectDrawImpl_Destroy(IDirectDrawImpl *This)
 {
-    /* Clear the cooplevel to restore window and display mode */
     IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)This, NULL, DDSCL_NORMAL);
+    IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)This);
 
     /* Destroy the device window if we created one */
     if(This->devicewindow != 0)
@@ -441,9 +441,6 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 *iface,
         /* Switching from fullscreen? */
         if(This->cooperative_level & DDSCL_FULLSCREEN)
         {
-            /* Restore the display mode */
-            IDirectDraw7_RestoreDisplayMode(iface);
-
             This->cooperative_level &= ~DDSCL_FULLSCREEN;
             This->cooperative_level &= ~DDSCL_EXCLUSIVE;
             This->cooperative_level &= ~DDSCL_ALLOWMODEX;
diff --git a/dlls/ddraw/tests/ddrawmodes.c b/dlls/ddraw/tests/ddrawmodes.c
index 59f668b..7818255 100644
--- a/dlls/ddraw/tests/ddrawmodes.c
+++ b/dlls/ddraw/tests/ddrawmodes.c
@@ -37,6 +37,8 @@ static HWND hwnd;
 static int modes_cnt;
 static int modes_size;
 static LPDDSURFACEDESC modes;
+static RECT rect_before_create;
+static RECT rect_after_delete;
 
 static HRESULT (WINAPI *pDirectDrawEnumerateA)(LPDDENUMCALLBACKA,LPVOID);
 static HRESULT (WINAPI *pDirectDrawEnumerateW)(LPDDENUMCALLBACKW,LPVOID);
@@ -83,6 +85,8 @@ static BOOL createdirectdraw(void)
 {
     HRESULT rc;
 
+    SetRect(&rect_before_create, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
+
     rc = DirectDrawCreate(NULL, &lpDD, NULL);
     ok(rc==DD_OK || rc==DDERR_NODIRECTDRAWSUPPORT, "DirectDrawCreateEx returned: %x\n", rc);
     if (!lpDD) {
@@ -95,11 +99,16 @@ static BOOL createdirectdraw(void)
 
 static void releasedirectdraw(void)
 {
-	if( lpDD != NULL )
-	{
-		IDirectDraw_Release(lpDD);
-		lpDD = NULL;
-	}
+    if( lpDD != NULL )
+    {
+        IDirectDraw_Release(lpDD);
+        lpDD = NULL;
+        SetRect(&rect_after_delete, 0, 0,
+                GetSystemMetrics(SM_CXSCREEN),
+                GetSystemMetrics(SM_CYSCREEN));
+        ok(EqualRect(&rect_before_create, &rect_after_delete) != 0,
+           "Original display mode was not restored\n");
+    }
 }
 
 static BOOL WINAPI crash_callbackA(GUID *lpGUID, LPSTR lpDriverDescription,
@@ -414,11 +423,36 @@ static void setdisplaymode(int i)
                       scrn.right, scrn.bottom, virt.left, virt.top, virt.right, virt.bottom);
                 if (!EqualRect(&scrn, &orig_rect))
                 {
+                    HRESULT rect_result;
+
                     /* Check that the client rect was resized */
                     rc = GetClientRect(hwnd, &test);
                     ok(rc!=0, "GetClientRect returned %x\n", rc);
                     rc = EqualRect(&scrn, &test);
                     todo_wine ok(rc!=0, "Fullscreen window has wrong size\n");
+
+                    /* Check that switching to normal cooperative level
+                       does not restore the display mode */
+                    rc = IDirectDraw_SetCooperativeLevel(lpDD, hwnd, DDSCL_NORMAL);
+                    ok(rc==DD_OK, "SetCooperativeLevel returned %x\n", rc);
+                    SetRect(&test, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
+                    rect_result = EqualRect(&scrn, &test);
+                    ok(rect_result!=0, "Setting cooperative level to DDSCL_NORMAL changed the display mode\n");
+
+                    /* Go back to fullscreen */
+                    rc = IDirectDraw_SetCooperativeLevel(lpDD,
+                        hwnd, DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
+                    ok(rc==DD_OK, "SetCooperativeLevel returned: %x\n",rc);
+
+                    /* If the display mode was changed, set the correct mode
+                       to avoid irrelevant failures */
+                    if (rect_result == 0)
+                    {
+                        rc = IDirectDraw_SetDisplayMode(lpDD,
+                            modes[i].dwWidth, modes[i].dwHeight,
+                            U1(modes[i].ddpfPixelFormat).dwRGBBitCount);
+                        ok(DD_OK==rc, "SetDisplayMode returned: %x\n",rc);
+                    }
                 }
                 ok(GetClipCursor(&r), "GetClipCursor() failed\n");
                 /* ddraw sets clip rect here to the screen size, even for




More information about the wine-cvs mailing list