Henri Verbeet : ddraw: Only restore the display mode if we changed it.

Alexandre Julliard julliard at winehq.org
Wed Oct 17 14:32:26 CDT 2012


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Oct 16 22:43:11 2012 +0200

ddraw: Only restore the display mode if we changed it.

---

 dlls/ddraw/ddraw.c         |   24 ++++++++++++++----------
 dlls/ddraw/ddraw_private.h |    3 ++-
 2 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 8a554f3..003306c 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -1064,6 +1064,10 @@ static HRESULT WINAPI ddraw7_SetDisplayMode(IDirectDraw7 *iface, DWORD width, DW
         return DD_OK;
     }
 
+    if (!ddraw->restore_mode && FAILED(hr = wined3d_get_adapter_display_mode(ddraw->wined3d,
+            WINED3DADAPTER_DEFAULT, &ddraw->original_mode, NULL)))
+        ERR("Failed to get current display mode, hr %#x.\n", hr);
+
     switch (bpp)
     {
         case 8:  format = WINED3DFMT_P8_UINT;        break;
@@ -1083,7 +1087,8 @@ static HRESULT WINAPI ddraw7_SetDisplayMode(IDirectDraw7 *iface, DWORD width, DW
     /* TODO: The possible return values from msdn suggest that the screen mode
      * can't be changed if a surface is locked or some drawing is in progress. */
     /* TODO: Lose the primary surface. */
-    hr = wined3d_set_adapter_display_mode(ddraw->wined3d, WINED3DADAPTER_DEFAULT, &mode);
+    if (SUCCEEDED(hr = wined3d_set_adapter_display_mode(ddraw->wined3d, WINED3DADAPTER_DEFAULT, &mode)))
+        ddraw->restore_mode = TRUE;
 
     wined3d_mutex_unlock();
 
@@ -1155,13 +1160,20 @@ static HRESULT WINAPI ddraw7_RestoreDisplayMode(IDirectDraw7 *iface)
 
     wined3d_mutex_lock();
 
+    if (!ddraw->restore_mode)
+    {
+        wined3d_mutex_unlock();
+        return DD_OK;
+    }
+
     if (exclusive_ddraw && exclusive_ddraw != ddraw)
     {
         wined3d_mutex_unlock();
         return DDERR_NOEXCLUSIVEMODE;
     }
 
-    hr = wined3d_set_adapter_display_mode(ddraw->wined3d, WINED3DADAPTER_DEFAULT, &ddraw->original_mode);
+    if (SUCCEEDED(hr = wined3d_set_adapter_display_mode(ddraw->wined3d, WINED3DADAPTER_DEFAULT, &ddraw->original_mode)))
+        ddraw->restore_mode = FALSE;
 
     wined3d_mutex_unlock();
 
@@ -5371,14 +5383,6 @@ HRESULT ddraw_init(struct ddraw *ddraw, enum wined3d_device_type device_type)
         return E_OUTOFMEMORY;
     }
 
-    if (FAILED(hr = wined3d_get_adapter_display_mode(ddraw->wined3d,
-            WINED3DADAPTER_DEFAULT, &ddraw->original_mode, NULL)))
-    {
-        ERR("Failed to get display mode, hr %#x.\n", hr);
-        wined3d_decref(ddraw->wined3d);
-        return hr;
-    }
-
     hr = wined3d_device_create(ddraw->wined3d, WINED3DADAPTER_DEFAULT, device_type,
             NULL, 0, 8, &ddraw->device_parent, &ddraw->wined3d_device);
     if (FAILED(hr))
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 0d15727..b092428 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -68,7 +68,8 @@ struct ddraw
 
     struct wined3d *wined3d;
     struct wined3d_device *wined3d_device;
-    BOOL                    d3d_initialized;
+    BOOL d3d_initialized;
+    BOOL restore_mode;
 
     struct ddraw_surface *primary;
     RECT primary_lock;




More information about the wine-cvs mailing list