From 0478301c1e8013703d2c87a7a3b2cc45bae1d72d Mon Sep 17 00:00:00 2001 From: "sl1nk3.s" Date: Sat, 4 Apr 2009 00:45:50 +0000 Subject: [PATCH] Fixed a little out-of-fullscreen black screen weirdness on windows, trying to port fullscreen changes to DX, needs more work. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2863 8ced0084-cf51-0410-be5f-012b33b47a6e --- .../Plugins/Plugin_VideoDX9/Src/EmuWindow.cpp | 325 ++++++++++-------- Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp | 2 +- .../Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp | 19 +- 3 files changed, 199 insertions(+), 147 deletions(-) diff --git a/Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.cpp b/Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.cpp index 4f36f675fb..ac6fbb97c8 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/EmuWindow.cpp @@ -9,161 +9,168 @@ namespace EmuWindow { - HWND m_hWnd = NULL; - HWND m_hParent = NULL; - HINSTANCE m_hInstance = NULL; - WNDCLASSEX wndClass; - const TCHAR m_szClassName[] = "DolphinEmuWnd"; - int g_winstyle; +HWND m_hWnd = NULL; +HWND m_hParent = NULL; +HINSTANCE m_hInstance = NULL; +WNDCLASSEX wndClass; +const TCHAR m_szClassName[] = "DolphinEmuWnd"; +int g_winstyle; - HWND GetWnd() - { - return m_hWnd; - } +HWND GetWnd() +{ + return m_hWnd; +} - HWND GetParentWnd() - { - return m_hParent; - } +HWND GetParentWnd() +{ + return m_hParent; +} - LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) +LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) +{ + HDC hdc; + PAINTSTRUCT ps; + switch( iMsg ) { - HDC hdc; - PAINTSTRUCT ps; - switch( iMsg ) + case WM_PAINT: + hdc = BeginPaint( hWnd, &ps ); + EndPaint( hWnd, &ps ); + return 0; + + case WM_KEYDOWN: + switch( LOWORD( wParam )) { - case WM_PAINT: - hdc = BeginPaint( hWnd, &ps ); - EndPaint( hWnd, &ps ); - return 0; + case VK_ESCAPE: // Pressing Esc switch FullScreen/Windowed + if (g_Config.bFullscreen) + { + DestroyWindow(hWnd); + PostQuitMessage(0); + ExitProcess(0); + /* Get out of fullscreen + g_Config.bFullscreen = false; - case WM_KEYDOWN: - switch( LOWORD( wParam )) - { - case VK_ESCAPE: /* Pressing esc quits */ - //DestroyWindow(hWnd); - //PostQuitMessage(0); - break; + // FullScreen - > Desktop + ChangeDisplaySettings(NULL, 0); + + // Re-Enable the cursor + ShowCursor(TRUE); + + RECT rcdesktop; + RECT rc = {0, 0, 640, 480}; + GetWindowRect(GetDesktopWindow(), &rcdesktop); + + int X = (rcdesktop.right-rcdesktop.left)/2 - (rc.right-rc.left)/2; + int Y = (rcdesktop.bottom-rcdesktop.top)/2 - (rc.bottom-rc.top)/2; + // SetWindowPos to the center of the screen + SetWindowPos(hWnd, NULL, X, Y, 640, 480, SWP_NOREPOSITION | SWP_NOZORDER); + + // Set new window style FS -> Windowed + SetWindowLong(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW); + + // Eventually show the window! + EmuWindow::Show();*/ + } /* - case MY_KEYS: - hypotheticalScene->sendMessage(KEYDOWN...); - */ - } - g_VideoInitialize.pKeyPress(LOWORD(wParam), GetAsyncKeyState(VK_SHIFT) != 0, GetAsyncKeyState(VK_CONTROL) != 0); - break; + else + { + // Get into fullscreen + g_Config.bFullscreen = true; + DEVMODE dmScreenSettings; + memset(&dmScreenSettings, 0, sizeof(dmScreenSettings)); + RECT rcdesktop; + GetWindowRect(GetDesktopWindow(), &rcdesktop); - case WM_CLOSE: - Fifo_ExitLoopNonBlocking(); - Shutdown(); - // Simple hack to easily exit without stopping. Hope to fix the stopping errors soon. - ExitProcess(0); + // Desktop -> FullScreen + dmScreenSettings.dmSize = sizeof(dmScreenSettings); + dmScreenSettings.dmPelsWidth = rcdesktop.right; + dmScreenSettings.dmPelsHeight = rcdesktop.bottom; + dmScreenSettings.dmBitsPerPel = 32; + dmScreenSettings.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; + if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + return 0; + // Disable the cursor + ShowCursor(FALSE); + + // SetWindowPos to the upper-left corner of the screen + SetWindowPos(hWnd, NULL, 0, 0, rcdesktop.right, rcdesktop.bottom, SWP_NOREPOSITION | SWP_NOZORDER); + + // Set new window style -> PopUp + SetWindowLong(hWnd, GWL_STYLE, WS_POPUP); + + // Eventually show the window! + EmuWindow::Show(); + }*/ + break; + } + g_VideoInitialize.pKeyPress(LOWORD(wParam), GetAsyncKeyState(VK_SHIFT) != 0, GetAsyncKeyState(VK_CONTROL) != 0); + break; + + case WM_CLOSE: + Fifo_ExitLoopNonBlocking(); + Shutdown(); + // Simple hack to easily exit without stopping. Hope to fix the stopping errors soon. + ExitProcess(0); + return 0; + + case WM_DESTROY: + //Shutdown(); + //PostQuitMessage( 0 ); + break; + + case WM_SIZE: + // Reset the D3D Device here + // Also make damn sure that this is not called from inside rendering a frame :P + break; + + case WM_SYSCOMMAND: + switch (wParam) + { + case SC_SCREENSAVE: + case SC_MONITORPOWER: return 0; - - case WM_DESTROY: - //Shutdown(); - //PostQuitMessage( 0 ); - break; - - case WM_SIZE: - // Reset the D3D Device here - // Also make damn sure that this is not called from inside rendering a frame :P - break; - - case WM_SYSCOMMAND: - switch (wParam) - { - case SC_SCREENSAVE: - case SC_MONITORPOWER: - return 0; - } - break; } - - return DefWindowProc(hWnd, iMsg, wParam, lParam); + break; } + return DefWindowProc(hWnd, iMsg, wParam, lParam); +} - HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const TCHAR *title) + +HWND OpenWindow(HWND parent, HINSTANCE hInstance, int width, int height, const TCHAR *title) +{ + wndClass.cbSize = sizeof( wndClass ); + wndClass.style = CS_HREDRAW | CS_VREDRAW; + wndClass.lpfnWndProc = WndProc; + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = 0; + wndClass.hInstance = hInstance; + wndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); + wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); + wndClass.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH ); + wndClass.lpszMenuName = NULL; + wndClass.lpszClassName = m_szClassName; + wndClass.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); + + m_hInstance = hInstance; + RegisterClassEx( &wndClass ); + + if (parent) { - wndClass.cbSize = sizeof( wndClass ); - wndClass.style = CS_HREDRAW | CS_VREDRAW; - wndClass.lpfnWndProc = WndProc; - wndClass.cbClsExtra = 0; - wndClass.cbWndExtra = 0; - wndClass.hInstance = hInstance; - wndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); - wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); - wndClass.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH ); - wndClass.lpszMenuName = NULL; - wndClass.lpszClassName = m_szClassName; - wndClass.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); + m_hWnd = CreateWindow(m_szClassName, title, + WS_CHILD, + CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT, + parent, NULL, hInstance, NULL ); - m_hInstance = hInstance; - RegisterClassEx( &wndClass ); + m_hParent = parent; - if (parent) - { - m_hWnd = CreateWindow(m_szClassName, title, - WS_CHILD, - CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT, - parent, NULL, hInstance, NULL ); - - m_hParent = parent; - - ShowWindow(m_hWnd, SW_SHOWMAXIMIZED); - } - else - { - DWORD style = g_Config.bFullscreen ? WS_POPUP : WS_OVERLAPPEDWINDOW; - - RECT rc = {0, 0, width, height}; - AdjustWindowRect(&rc, style, false); - - int w = rc.right - rc.left; - int h = rc.bottom - rc.top; - - rc.left = (1280 - w)/2; - rc.right = rc.left + w; - rc.top = (1024 - h)/2; - rc.bottom = rc.top + h; - - - m_hWnd = CreateWindow(m_szClassName, title, - style, - rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, - parent, NULL, hInstance, NULL ); - - g_winstyle = GetWindowLong( m_hWnd, GWL_STYLE ); - g_winstyle &= ~WS_MAXIMIZE & ~WS_MINIMIZE; // remove minimize/maximize style - - } - - return m_hWnd; + ShowWindow(m_hWnd, SW_SHOWMAXIMIZED); } - - void Show() + else { - ShowWindow(m_hWnd, SW_SHOW); - BringWindowToTop(m_hWnd); - UpdateWindow(m_hWnd); - } + DWORD style = g_Config.bFullscreen ? WS_POPUP : WS_OVERLAPPEDWINDOW; - HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title) - { - return OpenWindow(hParent, hInstance, 640, 480, title); - } - - void Close() - { - DestroyWindow(m_hWnd); - UnregisterClass(m_szClassName, m_hInstance); - } - - - void SetSize(int width, int height) - { RECT rc = {0, 0, width, height}; - AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, false); + AdjustWindowRect(&rc, style, false); int w = rc.right - rc.left; int h = rc.bottom - rc.top; @@ -172,6 +179,52 @@ namespace EmuWindow rc.right = rc.left + w; rc.top = (1024 - h)/2; rc.bottom = rc.top + h; - ::MoveWindow(m_hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, TRUE); + + + m_hWnd = CreateWindow(m_szClassName, title, + style, + rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, + parent, NULL, hInstance, NULL ); + + g_winstyle = GetWindowLong( m_hWnd, GWL_STYLE ); + g_winstyle &= ~WS_MAXIMIZE & ~WS_MINIMIZE; // remove minimize/maximize style + } + + return m_hWnd; +} + +void Show() +{ + ShowWindow(m_hWnd, SW_SHOW); + BringWindowToTop(m_hWnd); + UpdateWindow(m_hWnd); +} + +HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title) +{ + return OpenWindow(hParent, hInstance, 640, 480, title); +} + +void Close() +{ + DestroyWindow(m_hWnd); + UnregisterClass(m_szClassName, m_hInstance); +} + + +void SetSize(int width, int height) +{ + RECT rc = {0, 0, width, height}; + AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, false); + + int w = rc.right - rc.left; + int h = rc.bottom - rc.top; + + rc.left = (1280 - w)/2; + rc.right = rc.left + w; + rc.top = (1024 - h)/2; + rc.bottom = rc.top + h; + ::MoveWindow(m_hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, TRUE); +} } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp index 4c0771744e..de8369dd22 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/GLUtil.cpp @@ -293,7 +293,7 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight if (g_Config.bFullscreen) // We put the window at the upper left corner of the screen, so x = y = 0 SetWindowPos(EmuWindow::GetWnd(), NULL, 0, 0, rc.right-rc.left, rc.bottom-rc.top, SWP_NOREPOSITION | SWP_NOZORDER); - else + else SetWindowPos(EmuWindow::GetWnd(), NULL, X, Y, rc.right-rc.left, rc.bottom-rc.top, SWP_NOREPOSITION | SWP_NOZORDER); PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be diff --git a/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp b/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp index 47e758be4c..d7046f7465 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/OS/Win32.cpp @@ -168,25 +168,24 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) if (strlen(g_Config.iWindowedRes) > 1) sscanf(g_Config.iWindowedRes, "%dx%d", &w_fs, &h_fs); - - // FullScreen - > Desktop - ChangeDisplaySettings(NULL, 0); - - // Set new window style FS -> Windowed - SetWindowLong(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW); - - // Re-Enable the cursor - ShowCursor(TRUE); - RECT rcdesktop; RECT rc = {0, 0, w_fs, h_fs}; GetWindowRect(GetDesktopWindow(), &rcdesktop); + // FullScreen -> Desktop + ChangeDisplaySettings(NULL, 0); + + // Re-Enable the cursor + ShowCursor(TRUE); + int X = (rcdesktop.right-rcdesktop.left)/2 - (rc.right-rc.left)/2; int Y = (rcdesktop.bottom-rcdesktop.top)/2 - (rc.bottom-rc.top)/2; // SetWindowPos to the center of the screen SetWindowPos(hWnd, NULL, X, Y, w_fs, h_fs, SWP_NOREPOSITION | SWP_NOZORDER); + // Set new window style FS -> Windowed + SetWindowLong(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW); + // Eventually show the window! EmuWindow::Show(); }