Module: wine Branch: master Commit: bc3d767fda4f1cfa2763556f106915fd39858329 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bc3d767fda4f1cfa2763556f10...
Author: Henri Verbeet hverbeet@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;