diff --git a/src/dd.c b/src/dd.c index 73ebcf6..cc2d248 100644 --- a/src/dd.c +++ b/src/dd.c @@ -541,18 +541,20 @@ HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq) HRESULT dd_RestoreDisplayMode() { - if (g_ddraw.render.run) + if (!g_ddraw.render.run) { - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); + return DD_OK; + } - if (g_ddraw.render.thread) - { - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; - } + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); + + if (g_ddraw.render.thread) + { + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } if (!g_config.windowed) @@ -1431,7 +1433,32 @@ ULONG dd_Release() cfg_save(); } - dd_RestoreDisplayMode(); + if (g_ddraw.render.run) + { + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); + + if (g_ddraw.render.thread) + { + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; + } + } + + if (!g_config.windowed) + { + if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive) + { + if (!d3d9_reset(TRUE)) + d3d9_release(); + } + else + { + ChangeDisplaySettings(NULL, 0); + } + } if (g_ddraw.render.hdc) {