Merge pull request #961 from BeamNG/fix_opengl_fullscreen

Fix OpenGL fullscreen on win32
This commit is contained in:
LuisAntonRebollo 2014-11-30 02:24:19 +01:00
commit 7184e36928

View file

@ -64,6 +64,19 @@ static bool isScreenSaverRunning()
return sreensaver; 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), Win32Window::Win32Window(): mMouseLockPosition(0,0),
mShouldLockMouse(false), mShouldLockMouse(false),
mMouseLocked(false), mMouseLocked(false),
@ -125,9 +138,10 @@ const GFXVideoMode & Win32Window::getVideoMode()
void Win32Window::setVideoMode( const GFXVideoMode &mode ) 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"); Con::errorf("Win32Window::setVideoMode - invoking curtain");
mOwningManager->lowerCurtain(); mOwningManager->lowerCurtain();
@ -150,9 +164,32 @@ void Win32Window::setVideoMode( const GFXVideoMode &mode )
// Set our window to have the right style based on the mode // Set our window to have the right style based on the mode
if(mode.fullScreen && !Platform::getWebDeployment() && !mOffscreenRender) if(mode.fullScreen && !Platform::getWebDeployment() && !mOffscreenRender)
{ {
SetWindowLong( getHWND(), GWL_STYLE, WS_POPUP); WINDOWPLACEMENT wplacement = { sizeof(wplacement) };
SetWindowPos( getHWND(), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); 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.dmBitsPerPel = mode.bitDepth;
dv.dmDisplayFrequency = mode.refreshRate;
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) if(mDisplayWindow)
ShowWindow(getHWND(), SW_SHOWNORMAL); ShowWindow(getHWND(), SW_SHOWNORMAL);
@ -172,7 +209,12 @@ void Win32Window::setVideoMode( const GFXVideoMode &mode )
} }
else else
{ {
// Reset device *first*, so that when we call setSize() and let it 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 // access the monitor settings, it won't end up with our fullscreen
// geometry that is just about to change. // geometry that is just about to change.