From aa7d9a08ca3dd67858bf4ebfa7fd0dd7daadce0e Mon Sep 17 00:00:00 2001 From: Joseph Davies Date: Wed, 20 Jul 2011 23:07:46 -0700 Subject: [PATCH] Fix improperly calculated window size in initial Windowed mode. --- Sources/Plasma/Apps/plClient/plClient.cpp | 76 ++++++++++++----------- Sources/Plasma/Apps/plClient/plClient.h | 3 +- Sources/Plasma/Apps/plClient/winmain.cpp | 34 +--------- Sources/Plasma/CoreLibExe/hsExeError.cpp | 3 +- 4 files changed, 45 insertions(+), 71 deletions(-) diff --git a/Sources/Plasma/Apps/plClient/plClient.cpp b/Sources/Plasma/Apps/plClient/plClient.cpp index 0d531766..efe26c4e 100644 --- a/Sources/Plasma/Apps/plClient/plClient.cpp +++ b/Sources/Plasma/Apps/plClient/plClient.cpp @@ -751,7 +751,7 @@ hsBool plClient::MsgReceive(plMessage* msg) { ISetGraphicsDefaults(); ResetDisplayDevice(plPipeline::fDefaultPipeParams.Width, plPipeline::fDefaultPipeParams.Height, plPipeline::fDefaultPipeParams.ColorDepth, plPipeline::fDefaultPipeParams.Windowed, - plPipeline::fDefaultPipeParams.AntiAliasingAmount, plPipeline::fDefaultPipeParams.AnisotropicLevel, plPipeline::fDefaultPipeParams.VSync, true); + plPipeline::fDefaultPipeParams.AntiAliasingAmount, plPipeline::fDefaultPipeParams.AnisotropicLevel, plPipeline::fDefaultPipeParams.VSync); } break; @@ -2150,54 +2150,60 @@ hsG3DDeviceModeRecord plClient::ILoadDevMode(const char* devModeFile) return dmr; } -void plClient::ResetDisplayDevice(int Width, int Height, int ColorDepth, hsBool Windowed, int NumAASamples, int MaxAnisotropicSamples, hsBool VSync, hsBool windowOnly) +void plClient::ResetDisplayDevice(int Width, int Height, int ColorDepth, hsBool Windowed, int NumAASamples, int MaxAnisotropicSamples, hsBool VSync) { if(!fPipeline) return; - int BorderWidth = 0, BorderHeight = 0, CaptionHeight = 0; WindowActivate(false); - int ActualWidth; - int ActualHeight; - if( Windowed ) - { - BorderWidth = GetSystemMetrics( SM_CXSIZEFRAME ); - BorderHeight = GetSystemMetrics( SM_CYSIZEFRAME ); - CaptionHeight = GetSystemMetrics( SM_CYCAPTION ); - ActualWidth = Width + BorderWidth * 2; - ActualHeight = Height + BorderHeight * 2 + CaptionHeight; - SetWindowLong( fWindowHndl, GWL_STYLE, - WS_POPUP | WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE); - SetWindowLong(fWindowHndl, GWL_EXSTYLE, 0); - } - else - { - SetWindowLong(fWindowHndl, GWL_STYLE, - WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_MAXIMIZE | WS_VISIBLE); + ResizeDisplayDevice(Width, Height, Windowed); - SetWindowLong(fWindowHndl, GWL_EXSTYLE, WS_EX_APPWINDOW); - } + fPipeline->ResetDisplayDevice(Width, Height, ColorDepth, Windowed, NumAASamples, MaxAnisotropicSamples, VSync); + + WindowActivate(true); +} + +void plClient::ResizeDisplayDevice(int Width, int Height, hsBool Windowed) +{ - if(!windowOnly) - fPipeline->ResetDisplayDevice(Width, Height, ColorDepth, Windowed, NumAASamples, MaxAnisotropicSamples, VSync); + if (plMouseDevice::Instance()) + plMouseDevice::Instance()->SetDisplayResolution((float)Width, (float)Height); float aspectratio = (float)Width / (float)Height; - plMouseDevice::Instance()->SetDisplayResolution((float)Width, (float)Height); - pfGameGUIMgr::GetInstance()->SetAspectRatio( aspectratio ); + if (pfGameGUIMgr::GetInstance()) + pfGameGUIMgr::GetInstance()->SetAspectRatio( aspectratio ); - UINT flags = SWP_NOCOPYBITS | SWP_NOMOVE | SWP_SHOWWINDOW; - if(Windowed) - { - SetWindowPos( fWindowHndl, HWND_NOTOPMOST, 0, 0, ActualWidth, ActualHeight, flags ); - } - else + + UInt32 winStyle, winExStyle; + if( Windowed ) { - SetWindowPos( fWindowHndl, HWND_TOP, 0, 0, Width, Height, flags ); + winStyle = WS_OVERLAPPEDWINDOW; + winExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; + } else { + winStyle = WS_POPUP; + winExStyle = WS_EX_APPWINDOW; } + SetWindowLong(fWindowHndl, GWL_STYLE, winStyle); + SetWindowLong(fWindowHndl, GWL_EXSTYLE, winExStyle); - WindowActivate(true); -} + UInt32 flags = SWP_NOCOPYBITS | SWP_SHOWWINDOW | SWP_FRAMECHANGED; + UInt32 OutsideWidth, OutsideHeight; + HWND insertAfter; + if( Windowed ) + { + RECT winRect = { 0, 0, Width, Height }; + AdjustWindowRectEx(&winRect, winStyle, false, winExStyle); + OutsideWidth = winRect.right - winRect.left; + OutsideHeight = winRect.bottom - winRect.top; + insertAfter = HWND_NOTOPMOST; + } else { + OutsideWidth = Width; + OutsideHeight = Height; + insertAfter = HWND_TOP; + } + SetWindowPos( fWindowHndl, insertAfter, 0, 0, OutsideWidth, OutsideHeight, flags ); +} void WriteBool(hsStream *stream, char *name, hsBool on ) { diff --git a/Sources/Plasma/Apps/plClient/plClient.h b/Sources/Plasma/Apps/plClient/plClient.h index 3ac62f4c..5b1ae482 100644 --- a/Sources/Plasma/Apps/plClient/plClient.h +++ b/Sources/Plasma/Apps/plClient/plClient.h @@ -276,7 +276,8 @@ public: virtual hsBool WindowActive() const { return fWindowActive; } void SetMessagePumpProc( plMessagePumpProc proc ) { fMessagePumpProc = proc; } - void ResetDisplayDevice(int Width, int Height, int ColorDepth, hsBool Windowed, int NumAASamples, int MaxAnisotropicSamples, hsBool VSync = false, hsBool windowOnly = false); + void ResetDisplayDevice(int Width, int Height, int ColorDepth, hsBool Windowed, int NumAASamples, int MaxAnisotropicSamples, hsBool VSync = false); + void ResizeDisplayDevice(int Width, int Height, hsBool Windowed); void IDetectAudioVideoSettings(); void IWriteDefaultGraphicsSettings(const wchar* destFile); diff --git a/Sources/Plasma/Apps/plClient/winmain.cpp b/Sources/Plasma/Apps/plClient/winmain.cpp index 77c052f1..56dcbcdc 100644 --- a/Sources/Plasma/Apps/plClient/winmain.cpp +++ b/Sources/Plasma/Apps/plClient/winmain.cpp @@ -769,11 +769,6 @@ bool InitClient( HWND hWnd ) #ifdef DETACH_EXE hInstance = ((LPCREATESTRUCT) lParam)->hInstance; -#endif - // If in fullscreen mode, get rid of the window borders. Note: this won't take - // effect until the next SetWindowPos call - -#ifdef DETACH_EXE // This Function loads the EXE into Virtual memory...supposedly HRESULT hr = DetachFromMedium(hInstance, DMDFM_ALWAYS | DMDFM_ALLPAGES); @@ -783,34 +778,7 @@ bool InitClient( HWND hWnd ) gClient->SetDone(true); else { - if( gClient->GetPipeline()->IsFullScreen() ) - { - SetWindowLong(hWnd, GWL_STYLE, WS_POPUP); - SetWindowLong(hWnd, GWL_EXSTYLE, WS_EX_TOPMOST); - SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); - gWinBorderDX = gWinBorderDY = gWinMenuDY = 0; - } - else { - SetWindowLong(hWnd, GWL_STYLE, WS_OVERLAPPED | WS_CAPTION); - SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); - } - - int goodWidth = gClient->GetPipeline()->Width() + gWinBorderDX * 2; - int goodHeight = gClient->GetPipeline()->Height() + gWinBorderDY * 2 + gWinMenuDY; - - SetWindowPos( - hWnd, - nil, - 0, - 0, - goodWidth, - goodHeight, - SWP_NOCOPYBITS - | SWP_NOMOVE - | SWP_NOOWNERZORDER - | SWP_NOZORDER - | SWP_FRAMECHANGED - ); + gClient->ResizeDisplayDevice(gClient->GetPipeline()->Width(), gClient->GetPipeline()->Height(), !gClient->GetPipeline()->IsFullScreen()); } if( gPendingActivate ) diff --git a/Sources/Plasma/CoreLibExe/hsExeError.cpp b/Sources/Plasma/CoreLibExe/hsExeError.cpp index 4a6e6956..0707ecad 100644 --- a/Sources/Plasma/CoreLibExe/hsExeError.cpp +++ b/Sources/Plasma/CoreLibExe/hsExeError.cpp @@ -136,8 +136,7 @@ void ErrorMinimizeAppWindow () { // If the application's topmost window is a fullscreen // popup window, minimize it before displaying an error HWND appWindow = GetActiveWindow(); - if ( ((GetWindowLong(appWindow, GWL_STYLE) & WS_POPUP) != 0) && - ((GetWindowLong(appWindow, GWL_EXSTYLE) & WS_EX_TOPMOST) != 0) ) + if ( ((GetWindowLong(appWindow, GWL_STYLE) & WS_POPUP) != 0) ) SetWindowPos( appWindow, HWND_NOTOPMOST,