From 2eb1238648520948e93b5d9588c0398b4dbc20d5 Mon Sep 17 00:00:00 2001 From: Anis Date: Wed, 26 Nov 2014 19:56:36 +0100 Subject: [PATCH 1/7] added fullscreen support for opengl (win32) --- .../windowManager/win32/win32Window.cpp | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/Engine/source/windowManager/win32/win32Window.cpp b/Engine/source/windowManager/win32/win32Window.cpp index 0bb7677df..cb26fec41 100644 --- a/Engine/source/windowManager/win32/win32Window.cpp +++ b/Engine/source/windowManager/win32/win32Window.cpp @@ -150,10 +150,29 @@ void Win32Window::setVideoMode( const GFXVideoMode &mode ) // Set our window to have the right style based on the mode if(mode.fullScreen && !Platform::getWebDeployment() && !mOffscreenRender) - { - SetWindowLong( getHWND(), GWL_STYLE, WS_POPUP); - SetWindowPos( getHWND(), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); - + { + WINDOWPLACEMENT wplacement = { sizeof(wplacement) }; + DWORD dwStyle = GetWindowLong(getHWND(), GWL_STYLE); + MONITORINFO mi = { sizeof(mi) }; + + if (GetWindowPlacement(getHWND(), &wplacement) && GetMonitorInfo(MonitorFromWindow(getHWND(), MONITOR_DEFAULTTOPRIMARY), &mi)) + { + DISPLAY_DEVICE dd = GetPrimaryDevice(); + DEVMODE dv; + ZeroMemory(&dv, sizeof(dv)); + dv.dmSize = sizeof(DEVMODE); + EnumDisplaySettings(dd.DeviceName, ENUM_CURRENT_SETTINGS, &dv); + dv.dmPelsWidth = mode.resolution.x; + dv.dmPelsHeight = mode.resolution.y; + dv.dmFields = (DM_PELSWIDTH | DM_PELSHEIGHT); + ChangeDisplaySettings(&dv, CDS_FULLSCREEN); + SetWindowLong(getHWND(), GWL_STYLE, dwStyle & ~WS_OVERLAPPEDWINDOW); + SetWindowPos(getHWND(), HWND_TOP, mi.rcMonitor.left, mi.rcMonitor.top, + mi.rcMonitor.right - mi.rcMonitor.left, + mi.rcMonitor.bottom - mi.rcMonitor.top, + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + } + if(mDisplayWindow) ShowWindow(getHWND(), SW_SHOWNORMAL); @@ -172,7 +191,9 @@ void Win32Window::setVideoMode( const GFXVideoMode &mode ) } else { - // Reset device *first*, so that when we call setSize() and let it + ChangeDisplaySettings(NULL, 0); + + // Reset device *first*, so that when we call setSize() and let it // access the monitor settings, it won't end up with our fullscreen // geometry that is just about to change. @@ -1166,4 +1187,4 @@ const UTF16 *Win32Window::getWindowClassName() const UTF16 *Win32Window::getCurtainWindowClassName() { return _CurtainWindowClassName; -} \ No newline at end of file +} From 6a89b2ab659e7aff4cec5f347b86d2d6b31cd790 Mon Sep 17 00:00:00 2001 From: Anis Date: Wed, 26 Nov 2014 20:15:43 +0100 Subject: [PATCH 2/7] Update win32Window.cpp --- Engine/source/windowManager/win32/win32Window.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Engine/source/windowManager/win32/win32Window.cpp b/Engine/source/windowManager/win32/win32Window.cpp index cb26fec41..e2f4485c2 100644 --- a/Engine/source/windowManager/win32/win32Window.cpp +++ b/Engine/source/windowManager/win32/win32Window.cpp @@ -64,6 +64,13 @@ static bool isScreenSaverRunning() return sreensaver; } +void SetDisplayDefaults() +{ + //changes the settings of the default display device + //to the default mode + ChangeDisplaySettings(NULL, 0); +} + Win32Window::Win32Window(): mMouseLockPosition(0,0), mShouldLockMouse(false), mMouseLocked(false), From 971a354ebe37b5bda6a5cf7cc37304ebdde7d700 Mon Sep 17 00:00:00 2001 From: Anis Date: Wed, 26 Nov 2014 20:17:28 +0100 Subject: [PATCH 3/7] forgot void SetDisplayDefaults() to make it compile! --- Engine/source/windowManager/win32/win32Window.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Engine/source/windowManager/win32/win32Window.cpp b/Engine/source/windowManager/win32/win32Window.cpp index e2f4485c2..461d55e0e 100644 --- a/Engine/source/windowManager/win32/win32Window.cpp +++ b/Engine/source/windowManager/win32/win32Window.cpp @@ -174,10 +174,12 @@ void Win32Window::setVideoMode( const GFXVideoMode &mode ) dv.dmFields = (DM_PELSWIDTH | DM_PELSHEIGHT); ChangeDisplaySettings(&dv, CDS_FULLSCREEN); SetWindowLong(getHWND(), GWL_STYLE, dwStyle & ~WS_OVERLAPPEDWINDOW); - SetWindowPos(getHWND(), HWND_TOP, mi.rcMonitor.left, mi.rcMonitor.top, - mi.rcMonitor.right - mi.rcMonitor.left, - mi.rcMonitor.bottom - mi.rcMonitor.top, - SWP_NOOWNERZORDER | SWP_FRAMECHANGED); + SetWindowPos(getHWND(), HWND_TOP, + mi.rcMonitor.left, + mi.rcMonitor.top, + mi.rcMonitor.right - mi.rcMonitor.left, + mi.rcMonitor.bottom - mi.rcMonitor.top, + SWP_NOOWNERZORDER | SWP_FRAMECHANGED); } if(mDisplayWindow) From f1fa36fe60bd017b10149e49828e9553b24835fa Mon Sep 17 00:00:00 2001 From: Anis Date: Wed, 26 Nov 2014 20:19:21 +0100 Subject: [PATCH 4/7] no need SetDisplayDefaults --- Engine/source/windowManager/win32/win32Window.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Engine/source/windowManager/win32/win32Window.cpp b/Engine/source/windowManager/win32/win32Window.cpp index 461d55e0e..86d003dc4 100644 --- a/Engine/source/windowManager/win32/win32Window.cpp +++ b/Engine/source/windowManager/win32/win32Window.cpp @@ -64,13 +64,6 @@ static bool isScreenSaverRunning() return sreensaver; } -void SetDisplayDefaults() -{ - //changes the settings of the default display device - //to the default mode - ChangeDisplaySettings(NULL, 0); -} - Win32Window::Win32Window(): mMouseLockPosition(0,0), mShouldLockMouse(false), mMouseLocked(false), From 3495bd56cae624b764e23c29ca849f363cb7c24d Mon Sep 17 00:00:00 2001 From: Anis Date: Wed, 26 Nov 2014 20:58:57 +0100 Subject: [PATCH 5/7] Update win32Window.cpp --- Engine/source/windowManager/win32/win32Window.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Engine/source/windowManager/win32/win32Window.cpp b/Engine/source/windowManager/win32/win32Window.cpp index 86d003dc4..5051e60e8 100644 --- a/Engine/source/windowManager/win32/win32Window.cpp +++ b/Engine/source/windowManager/win32/win32Window.cpp @@ -64,6 +64,19 @@ static bool isScreenSaverRunning() return sreensaver; } +DISPLAY_DEVICE GetPrimaryDevice() +{ + int index = 0; + DISPLAY_DEVICE dd; + dd.cb = sizeof(DISPLAY_DEVICE); + + while (EnumDisplayDevices(NULL, index++, &dd, 0)) + { + if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) return dd; + } + return dd; +} + Win32Window::Win32Window(): mMouseLockPosition(0,0), mShouldLockMouse(false), mMouseLocked(false), From 7a8719dfbcd626e053d43bd328c5d2a5520b0a95 Mon Sep 17 00:00:00 2001 From: Anis Date: Wed, 26 Nov 2014 21:03:10 +0100 Subject: [PATCH 6/7] Update win32Window.cpp --- Engine/source/windowManager/win32/win32Window.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Engine/source/windowManager/win32/win32Window.cpp b/Engine/source/windowManager/win32/win32Window.cpp index 5051e60e8..17afdc83d 100644 --- a/Engine/source/windowManager/win32/win32Window.cpp +++ b/Engine/source/windowManager/win32/win32Window.cpp @@ -177,6 +177,8 @@ void Win32Window::setVideoMode( const GFXVideoMode &mode ) EnumDisplaySettings(dd.DeviceName, ENUM_CURRENT_SETTINGS, &dv); dv.dmPelsWidth = mode.resolution.x; dv.dmPelsHeight = mode.resolution.y; + dv.dmBitsPerPel = mode.bitDepth; + dv.dmDisplayFrequency = mode.refreshRate; dv.dmFields = (DM_PELSWIDTH | DM_PELSHEIGHT); ChangeDisplaySettings(&dv, CDS_FULLSCREEN); SetWindowLong(getHWND(), GWL_STYLE, dwStyle & ~WS_OVERLAPPEDWINDOW); From 72c06401c0e78692a1cd81c3cfa8184bd959d4b1 Mon Sep 17 00:00:00 2001 From: Anis Date: Thu, 27 Nov 2014 17:52:05 +0100 Subject: [PATCH 7/7] black screen bug fix --- Engine/source/windowManager/win32/win32Window.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Engine/source/windowManager/win32/win32Window.cpp b/Engine/source/windowManager/win32/win32Window.cpp index 17afdc83d..576a0adc7 100644 --- a/Engine/source/windowManager/win32/win32Window.cpp +++ b/Engine/source/windowManager/win32/win32Window.cpp @@ -138,9 +138,10 @@ const GFXVideoMode & Win32Window::getVideoMode() void Win32Window::setVideoMode( const GFXVideoMode &mode ) { - bool needCurtain = (mVideoMode.fullScreen != mode.fullScreen); + bool needCurtain = (mVideoMode.fullScreen != mode.fullScreen); + static bool first_load = true; - if(needCurtain) + if(needCurtain) { Con::errorf("Win32Window::setVideoMode - invoking curtain"); mOwningManager->lowerCurtain(); @@ -208,7 +209,10 @@ void Win32Window::setVideoMode( const GFXVideoMode &mode ) } else { - ChangeDisplaySettings(NULL, 0); + if (!first_load) + ChangeDisplaySettings(NULL, 0); + + first_load = false; // Reset device *first*, so that when we call setSize() and let it // access the monitor settings, it won't end up with our fullscreen