diff --git a/src/utils.c b/src/utils.c index c599efd..2282c26 100644 --- a/src/utils.c +++ b/src/utils.c @@ -371,6 +371,17 @@ void util_toggle_fullscreen() } else { + if (g_ddraw->render.thread) + { + EnterCriticalSection(&g_ddraw->cs); + g_ddraw->render.run = FALSE; + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw->cs); + + WaitForSingleObject(g_ddraw->render.thread, INFINITE); + g_ddraw->render.thread = NULL; + } + ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); } diff --git a/src/wndproc.c b/src/wndproc.c index 1e7634d..122baa5 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -487,7 +487,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam " hwndInsertAfter=%p, x=%d, y=%d, cx=%d, cy=%d\n", pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy); */ - + /* workaround for a bug where sometimes a background window steals the focus */ if (g_mouse_locked) { @@ -529,6 +529,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (g_ddraw->renderer != d3d9_render_main || g_ddraw->nonexclusive) { + if (g_ddraw->renderer == d3d9_render_main) /* Needed for Windows 7 */ + real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); + ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); mouse_lock();