diff options
| author | sl1nk3.s <sl1nk3.s@gmail.com> | 2009-12-30 15:08:18 +0000 |
|---|---|---|
| committer | sl1nk3.s <sl1nk3.s@gmail.com> | 2009-12-30 15:08:18 +0000 |
| commit | 18e951f97ac7e0fb7cbd3dad775577eee3a33396 (patch) | |
| tree | f6915877daf5f2ed6d136ec1fa5f16a012c23f2a /Source/Plugins | |
| parent | 151ff28ab7dd1fd0343587f194bf8620d5fc3620 (diff) | |
Fix a crash when closing DirectX's window, also apply a fix from j4ck.fr0st/BhaaL @ issue 1277 to prevent two possibles hang on stop.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4756 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Plugins')
| -rw-r--r-- | Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.cpp | 22 | ||||
| -rw-r--r-- | Source/Plugins/Plugin_VideoDX9/Src/main.cpp | 2 | ||||
| -rw-r--r-- | Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp | 18 | ||||
| -rw-r--r-- | Source/Plugins/Plugin_VideoOGL/Src/main.cpp | 5 |
4 files changed, 19 insertions, 28 deletions
diff --git a/Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.cpp b/Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.cpp index 1be8380df8..76c22340f9 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.cpp @@ -84,13 +84,14 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) } break; } + // Tell the hotkey function that this key was pressed g_VideoInitialize.pKeyPress(LOWORD(wParam), GetAsyncKeyState(VK_SHIFT) != 0, GetAsyncKeyState(VK_CONTROL) != 0); break; /* case WM_SYSKEYDOWN: switch( LOWORD( wParam )) { - case VK_RETURN: // Pressing Esc switch FullScreen/Windowed + case VK_RETURN: // Pressing Alt+Enter switch FullScreen/Windowed if (g_ActiveConfig.bFullscreen) { DestroyWindow(hWnd); @@ -112,26 +113,15 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) break; case WM_CLOSE: - Fifo_ExitLoopNonBlocking(); - //Shutdown(); - // Simple hack to easily exit without stopping. Hope to fix the stopping errors soon. - //ExitProcess(0); + // When the user closes the window, we post an event to the main window to call Stop() + // Which then handles all the necessary steps to Shutdown the core + the plugins + PostMessage( m_hMain, WM_USER, WM_USER_STOP, 0 ); return 0; - case WM_DESTROY: - //Shutdown(); - //PostQuitMessage( 0 ); - break; - case WM_USER: // if (wParam == TOGGLE_FULLSCREEN) // TODO : Insert some toggle fullscreen code here, kthx :d - break; - - case WM_SIZE: - // Reset the D3D Device here - // Also make damn sure that this is not called from inside rendering a frame :P - // Renderer::ReinitView(); + // see TODO ^ upper break; case WM_SYSCOMMAND: diff --git a/Source/Plugins/Plugin_VideoDX9/Src/main.cpp b/Source/Plugins/Plugin_VideoDX9/Src/main.cpp index b8f7d8d670..f9d85fb11d 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/main.cpp @@ -451,7 +451,7 @@ u32 Video_AccessEFB(EFBAccessType type, u32 x, u32 y) if (g_VideoInitialize.bOnThread) { - while (Common::AtomicLoadAcquire(s_efbAccessRequested)) + while (Common::AtomicLoadAcquire(s_efbAccessRequested) && s_initialized) Common::YieldCPU(); } else diff --git a/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp b/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp index ff9c5e3840..303abdcbbf 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp @@ -342,7 +342,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) OnKeyDown(lParam); FreeLookInput(wParam, lParam); } - if (wParam == TOGGLE_FULLSCREEN) + if (wParam == TOGGLE_FULLSCREEN && !g_Config.RenderToMainframe) ToggleFullscreen(m_hWnd); break; @@ -479,7 +479,7 @@ void ToggleFullscreen(HWND hParent) SetWindowPos(hParent, NULL, X, Y, w_fs, h_fs, SWP_NOREPOSITION | SWP_NOZORDER); // Set new window style FS -> Windowed - SetWindowLong(hParent, GWL_STYLE, WS_OVERLAPPEDWINDOW); + SetWindowLongPtr(hParent, GWL_STYLE, WS_OVERLAPPEDWINDOW); // Eventually show the window! EmuWindow::Show(); @@ -497,18 +497,18 @@ void ToggleFullscreen(HWND hParent) dmScreenSettings.dmSize = sizeof(dmScreenSettings); dmScreenSettings.dmPelsWidth = w_fs; dmScreenSettings.dmPelsHeight = h_fs; - dmScreenSettings.dmBitsPerPel = 32; - dmScreenSettings.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; - if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + dmScreenSettings.dmFields = DM_PELSWIDTH|DM_PELSHEIGHT; + if (ChangeDisplaySettings(&dmScreenSettings, 0) != DISP_CHANGE_SUCCESSFUL) return; // Set new window style -> PopUp - SetWindowLong(hParent, GWL_STYLE, WS_POPUP); - g_Config.bFullscreen = true; - ShowCursor(FALSE); + SetWindowLongPtr(hParent, GWL_STYLE, WS_POPUP); // SetWindowPos to the upper-left corner of the screen - SetWindowPos(hParent, NULL, 0, 0, w_fs, h_fs, SWP_NOREPOSITION | SWP_NOZORDER); + SetWindowPos(hParent, HWND_TOP, 0, 0, w_fs, h_fs, SWP_NOREPOSITION); + + g_Config.bFullscreen = true; + ShowCursor(FALSE); // Eventually show the window! EmuWindow::Show(); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp index 393ed3d438..2db8ea7d7e 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -410,6 +410,7 @@ void Video_Prepare(void) void Shutdown(void) { s_PluginInitialized = false; + ForceSwap = true; s_efbAccessRequested = FALSE; s_swapRequested = FALSE; @@ -516,7 +517,7 @@ void Video_BeginField(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) // Make sure previous swap request has made it to the screen if (g_VideoInitialize.bOnThread) { - while (Common::AtomicLoadAcquire(s_swapRequested)) + while (Common::AtomicLoadAcquire(s_swapRequested) && s_PluginInitialized) Common::YieldCPU(); } else @@ -569,7 +570,7 @@ u32 Video_AccessEFB(EFBAccessType type, u32 x, u32 y) if (g_VideoInitialize.bOnThread) { - while (Common::AtomicLoadAcquire(s_efbAccessRequested)) + while (Common::AtomicLoadAcquire(s_efbAccessRequested) && s_PluginInitialized) Common::YieldCPU(); } else |
