Henri Verbeet : ddraw: When restoring the display mode, use the mode set before the first mode change on any ddraw object.

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


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

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

ddraw: When restoring the display mode, use the mode set before the first mode change on any ddraw object.

---

 dlls/ddraw/ddraw.c         |   25 +++++++++++--------------
 dlls/ddraw/ddraw_private.h |    1 -
 2 files changed, 11 insertions(+), 15 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 003306c..2998742 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -27,7 +27,9 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
 
+static struct wined3d_display_mode original_mode;
 static const struct ddraw *exclusive_ddraw;
+static BOOL restore_mode;
 
 /* Device identifier. Don't relay it to WineD3D */
 static const DDDEVICEIDENTIFIER2 deviceidentifier =
@@ -1064,8 +1066,8 @@ 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)))
+    if (!restore_mode && FAILED(hr = wined3d_get_adapter_display_mode(ddraw->wined3d,
+            WINED3DADAPTER_DEFAULT, &original_mode, NULL)))
         ERR("Failed to get current display mode, hr %#x.\n", hr);
 
     switch (bpp)
@@ -1088,7 +1090,10 @@ static HRESULT WINAPI ddraw7_SetDisplayMode(IDirectDraw7 *iface, DWORD width, DW
      * can't be changed if a surface is locked or some drawing is in progress. */
     /* TODO: Lose the primary surface. */
     if (SUCCEEDED(hr = wined3d_set_adapter_display_mode(ddraw->wined3d, WINED3DADAPTER_DEFAULT, &mode)))
+    {
         ddraw->restore_mode = TRUE;
+        restore_mode = TRUE;
+    }
 
     wined3d_mutex_unlock();
 
@@ -1135,17 +1140,6 @@ static HRESULT WINAPI ddraw1_SetDisplayMode(IDirectDraw *iface, DWORD width, DWO
  *
  * Restores the display mode to what it was at creation time. Basically.
  *
- * A problem arises when there are 2 DirectDraw objects using the same hwnd:
- *  -> DD_1 finds the screen at 1400x1050x32 when created, sets it to 640x480x16
- *  -> DD_2 is created, finds the screen at 640x480x16, sets it to 1024x768x32
- *  -> DD_1 is released. The screen should be left at 1024x768x32.
- *  -> DD_2 is released. The screen should be set to 1400x1050x32
- * This case is unhandled right now, but Empire Earth does it this way.
- * (But perhaps there is something in SetCooperativeLevel to prevent this)
- *
- * The msdn says that this method resets the display mode to what it was before
- * SetDisplayMode was called. What if SetDisplayModes is called 2 times??
- *
  * Returns
  *  DD_OK on success
  *  DDERR_NOEXCLUSIVE mode if the device isn't in fullscreen mode
@@ -1172,8 +1166,11 @@ static HRESULT WINAPI ddraw7_RestoreDisplayMode(IDirectDraw7 *iface)
         return DDERR_NOEXCLUSIVEMODE;
     }
 
-    if (SUCCEEDED(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, &original_mode)))
+    {
         ddraw->restore_mode = FALSE;
+        restore_mode = FALSE;
+    }
 
     wined3d_mutex_unlock();
 
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index b092428..f1a2a2a 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -79,7 +79,6 @@ struct ddraw
 
     /* DirectDraw things, which are not handled by WineD3D */
     DWORD                   cooperative_level;
-    struct wined3d_display_mode original_mode;
 
     /* D3D things */
     HWND                    d3d_window;




More information about the wine-cvs mailing list