diff options
author | Jan-Marek Glogowski <glogow@fbihome.de> | 2022-06-13 10:26:18 +0200 |
---|---|---|
committer | Jan-Marek Glogowski <glogow@fbihome.de> | 2022-06-17 19:58:08 +0200 |
commit | 8b6000f6075725b2e17b8fa745251ea96d7185f1 (patch) | |
tree | fd0172695c9c324814d1ec667b5868f6dfedde47 | |
parent | 8c3e8af0e60865ec6d38e2117efdb4ed2f10a20c (diff) |
WIN drop window state redundancies
So on Windows a window's state is stored in:
- maGeometry, inherited from SalFrame
- maState, which is the same type then maGeometry
- mnWidth and mnHeight, which are just set, never read
- mbFullScreen, which can be encoded in the vcl::WindowState
IMHO we can get rid of mnWidth, mnHeight and mbFullScreen. Which
leaves the mystery of the extra maState. But at least it looks
like we can simply cache an vcl::WindowState instead.
And this is a little start to make WinSalFrame variable members
private; it'll be a long way...
And it also changes a SW_SHOWMAXIMIZED to SW_SHOWMINIMIZED in the
cleaned UpdateFrameState(), which looks like an error.
Change-Id: I5895313d87a6f81371e2b77af6c813d35f591725
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/135809
Tested-by: Jenkins
Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
-rw-r--r-- | vcl/inc/win/salframe.h | 10 | ||||
-rw-r--r-- | vcl/win/window/salframe.cxx | 201 |
2 files changed, 88 insertions, 123 deletions
diff --git a/vcl/inc/win/salframe.h b/vcl/inc/win/salframe.h index 0e3cbba81253..bbf3506a723f 100644 --- a/vcl/inc/win/salframe.h +++ b/vcl/inc/win/salframe.h @@ -33,6 +33,8 @@ class WinSalGraphics; class WinSalFrame final: public SalFrame { + vcl::WindowState m_eState; + public: HWND mhWnd; // Window handle HCURSOR mhCursor; // cursor handle @@ -43,10 +45,7 @@ public: HMENU mSelectedhMenu; // the menu where highlighting is currently going on HMENU mLastActivatedhMenu; // the menu that was most recently opened SystemEnvData maSysData; // system data - vcl::WindowData maState; ///< frame state int mnShowState; // show state - LONG mnWidth; // client width in pixeln - LONG mnHeight; // client height in pixeln int mnMinWidth; // min. client width in pixeln int mnMinHeight; // min. client height in pixeln int mnMaxWidth; // max. client width in pixeln @@ -64,7 +63,6 @@ public: bool mbSizeBorder; // has window a sizeable border bool mbNoIcon; // is a window without an icon bool mbFloatWin; // is a FloatingWindow - bool mbFullScreen; // TRUE: in full screen mode bool mbPresentation; // TRUE: Presentation Mode running bool mbInShow; // inside a show call bool mbRestoreMaximize; // Restore-Maximize @@ -141,6 +139,10 @@ public: virtual void BeginSetClipRegion( sal_uInt32 nRects ) override; virtual void UnionClipRegion( tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight ) override; virtual void EndSetClipRegion() override; + + constexpr vcl::WindowState state() const { return m_eState; } + void UpdateFrameState(); + constexpr bool isFullScreen() const { return bool(m_eState & vcl::WindowState::FullScreen); } }; void ImplSalGetWorkArea( HWND hWnd, RECT *pRect, const RECT *pParentRect ); diff --git a/vcl/win/window/salframe.cxx b/vcl/win/window/salframe.cxx index 2b2bd6cb7b72..567d95eec233 100644 --- a/vcl/win/window/salframe.cxx +++ b/vcl/win/window/salframe.cxx @@ -128,7 +128,7 @@ bool WinSalFrame::mbInReparent = false; // Macros for support of WM_UNICHAR & Keyman 6.0 #define Uni_SupplementaryPlanesStart 0x10000 -static void UpdateFrameGeometry( HWND hWnd, WinSalFrame* pFrame ); +static void UpdateFrameGeometry(WinSalFrame* pFrame); static void SetMaximizedFrameGeometry( HWND hWnd, WinSalFrame* pFrame, RECT* pParentRect = nullptr ); static void SetGeometrySize(vcl::WindowPosSize& rWinPosSize, const Size& rSize) @@ -137,57 +137,37 @@ static void SetGeometrySize(vcl::WindowPosSize& rWinPosSize, const Size& rSize) rWinPosSize.setHeight(rSize.Height() < 0 ? 0 : rSize.Height()); } -static void UpdateGeometry(WinSalFrame* pFrame, RECT& aRect) +// If called with UpdateFrameGeometry, it must be called after it, as UpdateFrameGeometry +// updates the geometry depending on the old state! +void WinSalFrame::UpdateFrameState() { - RECT aRect2 = aRect; - AdjustWindowRectEx(&aRect2, GetWindowStyle(pFrame->mhWnd), - FALSE, GetWindowExStyle(pFrame->mhWnd)); - tools::Long nTopDeco = abs(aRect.top - aRect2.top); - tools::Long nLeftDeco = abs(aRect.left - aRect2.left); - tools::Long nBottomDeco = abs(aRect.bottom - aRect2.bottom); - tools::Long nRightDeco = abs(aRect.right - aRect2.right); - - pFrame->maState.setPos({ aRect.left + nLeftDeco, aRect.top + nTopDeco }); - tools::Long nWidth(aRect.right - aRect.left - nLeftDeco - nRightDeco); - tools::Long nHeight(aRect.bottom - aRect.top - nTopDeco - nBottomDeco); - SetGeometrySize(pFrame->maState, { nWidth, nHeight }); -} + // don't overwrite restore state in fullscreen mode + if (isFullScreen()) + return; -static void ImplSaveFrameState( WinSalFrame* pFrame ) -{ - // save position, size and state for GetWindowState() - if ( !pFrame->mbFullScreen ) + const bool bVisible = (GetWindowStyle(mhWnd) & WS_VISIBLE); + if (IsIconic(mhWnd)) { - bool bVisible = (GetWindowStyle( pFrame->mhWnd ) & WS_VISIBLE) != 0; - if ( IsIconic( pFrame->mhWnd ) ) - { - pFrame->maState.rState() |= vcl::WindowState::Minimized; - if ( bVisible ) - pFrame->mnShowState = SW_SHOWMAXIMIZED; - } - else if ( IsZoomed( pFrame->mhWnd ) ) - { - pFrame->maState.rState() &= ~vcl::WindowState::Minimized; - pFrame->maState.rState() |= vcl::WindowState::Maximized; - if ( bVisible ) - pFrame->mnShowState = SW_SHOWMAXIMIZED; - pFrame->mbRestoreMaximize = true; - - WINDOWPLACEMENT aPlacement; - aPlacement.length = sizeof(aPlacement); - if( GetWindowPlacement( pFrame->mhWnd, &aPlacement ) ) - UpdateGeometry(pFrame, aPlacement.rcNormalPosition); - } - else - { - RECT aRect; - GetWindowRect( pFrame->mhWnd, &aRect ); - UpdateGeometry(pFrame, aRect); - pFrame->maState.rState() &= ~vcl::WindowState(vcl::WindowState::Minimized | vcl::WindowState::Maximized); - if ( bVisible ) - pFrame->mnShowState = SW_SHOWNORMAL; - pFrame->mbRestoreMaximize = false; - } + m_eState &= ~vcl::WindowState(vcl::WindowState::Normal | vcl::WindowState::Maximized); + m_eState |= vcl::WindowState::Minimized; + if (bVisible) + mnShowState = SW_SHOWMINIMIZED; + } + else if (IsZoomed(mhWnd)) + { + m_eState &= ~vcl::WindowState(vcl::WindowState::Minimized | vcl::WindowState::Normal); + m_eState |= vcl::WindowState::Maximized; + if (bVisible) + mnShowState = SW_SHOWMAXIMIZED; + mbRestoreMaximize = true; + } + else + { + m_eState &= ~vcl::WindowState(vcl::WindowState::Minimized | vcl::WindowState::Maximized); + m_eState |= vcl::WindowState::Normal; + if (bVisible) + mnShowState = SW_SHOWNORMAL; + mbRestoreMaximize = false; } } @@ -504,12 +484,10 @@ SalFrame* ImplSalCreateFrame( WinSalInstance* pInst, // determine output size and state RECT aRect; GetClientRect( hWnd, &aRect ); - pFrame->mnWidth = aRect.right; - pFrame->mnHeight = aRect.bottom; - ImplSaveFrameState( pFrame ); pFrame->mbDefPos = true; - UpdateFrameGeometry( hWnd, pFrame ); + UpdateFrameGeometry(pFrame); + pFrame->UpdateFrameState(); if( pFrame->mnShowState == SW_SHOWMAXIMIZED ) { @@ -854,9 +832,8 @@ WinSalFrame::WinSalFrame() mhDefIMEContext = nullptr; mpLocalGraphics = nullptr; mpThreadGraphics = nullptr; + m_eState = vcl::WindowState::Normal; mnShowState = SW_SHOWNORMAL; - mnWidth = 0; - mnHeight = 0; mnMinWidth = 0; mnMinHeight = 0; mnMaxWidth = SHRT_MAX; @@ -869,7 +846,6 @@ WinSalFrame::WinSalFrame() mbFixBorder = false; mbSizeBorder = false; mbFullScreenCaption = false; - mbFullScreen = false; mbPresentation = false; mbInShow = false; mbRestoreMaximize = false; @@ -1437,7 +1413,7 @@ void WinSalFrame::SetPosSize( tools::Long nX, tools::Long nY, tools::Long nWidth SetWindowPos( mhWnd, HWND_TOP, nX, nY, static_cast<int>(nWidth), static_cast<int>(nHeight), nPosFlags ); - UpdateFrameGeometry( mhWnd, this ); + UpdateFrameGeometry(this); // Notification -- really ??? if( nEvent != SalEvent::NONE ) @@ -1670,26 +1646,25 @@ void WinSalFrame::SetWindowState(const vcl::WindowData* pState) GetWindowPlacement( mhWnd, &aPlacement ); // set State - bool bVisible = (GetWindowStyle( mhWnd ) & WS_VISIBLE) != 0; + const bool bIsMinimized = IsIconic(mhWnd); + const bool bIsMaximized = IsZoomed(mhWnd); + const bool bVisible = (GetWindowStyle(mhWnd) & WS_VISIBLE); bool bUpdateHiddenFramePos = false; if ( !bVisible ) { aPlacement.showCmd = SW_HIDE; - if ( mbOverwriteState ) + if (mbOverwriteState && (pState->mask() & vcl::WindowDataMask::State)) { - if ( pState->mask() & vcl::WindowDataMask::State ) + if (pState->state() & vcl::WindowState::Minimized) + mnShowState = SW_SHOWMINIMIZED; + else if (pState->state() & vcl::WindowState::Maximized) { - if ( pState->state() & vcl::WindowState::Minimized ) - mnShowState = SW_SHOWMINIMIZED; - else if ( pState->state() & vcl::WindowState::Maximized ) - { - mnShowState = SW_SHOWMAXIMIZED; - bUpdateHiddenFramePos = true; - } - else if ( pState->state() & vcl::WindowState::Normal ) - mnShowState = SW_SHOWNORMAL; + mnShowState = SW_SHOWMAXIMIZED; + bUpdateHiddenFramePos = true; } + else if (pState->state() & vcl::WindowState::Normal) + mnShowState = SW_SHOWNORMAL; } } else @@ -1712,8 +1687,7 @@ void WinSalFrame::SetWindowState(const vcl::WindowData* pState) // if a window is neither minimized nor maximized or need not be // positioned visibly (that is in visible state), do not use // SetWindowPlacement since it calculates including the TaskBar - if ( !IsIconic( mhWnd ) && !IsZoomed( mhWnd ) && - (!bVisible || (aPlacement.showCmd == SW_RESTORE)) ) + if (!bIsMinimized && !bIsMaximized && (!bVisible || (aPlacement.showCmd == SW_RESTORE))) { if( bUpdateHiddenFramePos ) { @@ -1752,17 +1726,10 @@ void WinSalFrame::SetWindowState(const vcl::WindowData* pState) bool WinSalFrame::GetWindowState(vcl::WindowData* pState) { - if (maState.width() && maState.height()) - { - *pState = maState; - // #94144# allow Minimize again, should be masked out when read from configuration - // 91625 - Don't save minimize - if ( !(pState->state() & (vcl::WindowState::Minimized | vcl::WindowState::Maximized)) ) - pState->rState() |= vcl::WindowState::Normal; - return true; - } - - return false; + pState->setPosSize(maGeometry.posSize()); + pState->setState(m_eState); + pState->setMask(vcl::WindowDataMask::PosSizeState); + return true; } void WinSalFrame::SetScreenNumber( unsigned int nNewScreen ) @@ -1823,16 +1790,16 @@ void WinSalFrame::SetApplicationID( const OUString &rApplicationID ) } } -void WinSalFrame::ShowFullScreen( bool bFullScreen, sal_Int32 nDisplay ) +void WinSalFrame::ShowFullScreen(const bool bFullScreen, const sal_Int32 nDisplay) { - if ( (mbFullScreen == bFullScreen) && (!bFullScreen || (mnDisplay == nDisplay)) ) + if ((isFullScreen() == bFullScreen) && (!bFullScreen || (mnDisplay == nDisplay))) return; - mbFullScreen = bFullScreen; mnDisplay = nDisplay; if ( bFullScreen ) { + m_eState |= vcl::WindowState::FullScreen; // to hide the Windows taskbar DWORD nExStyle = GetWindowExStyle( mhWnd ); if ( nExStyle & WS_EX_TOOLWINDOW ) @@ -1863,6 +1830,7 @@ void WinSalFrame::ShowFullScreen( bool bFullScreen, sal_Int32 nDisplay ) } else { + m_eState &= ~vcl::WindowState::FullScreen; // when the ShowState has to be reset, hide the window first to // reduce flicker bool bVisible = (GetWindowStyle( mhWnd ) & WS_VISIBLE) != 0; @@ -3942,10 +3910,11 @@ static void SetMaximizedFrameGeometry( HWND hWnd, WinSalFrame* pFrame, RECT* pPa SetGeometrySize(pFrame->maGeometry, { aRect.right - aRect.left, aRect.bottom - aRect.top }); } -static void UpdateFrameGeometry( HWND hWnd, WinSalFrame* pFrame ) +static void UpdateFrameGeometry(WinSalFrame* pFrame) { if( !pFrame ) return; + const HWND hWnd = pFrame->mhWnd; RECT aRect; GetWindowRect( hWnd, &aRect ); @@ -4015,7 +3984,7 @@ static void ImplHandleMoveMsg( HWND hWnd ) WinSalFrame* pFrame = ProcessOrDeferMessage( hWnd, SAL_MSG_POSTMOVE ); if ( pFrame ) { - UpdateFrameGeometry( hWnd, pFrame ); + UpdateFrameGeometry(pFrame); if ( GetWindowStyle( hWnd ) & WS_VISIBLE ) pFrame->mbDefPos = false; @@ -4025,13 +3994,12 @@ static void ImplHandleMoveMsg( HWND hWnd ) { // adjust window again for FullScreenMode pFrame->mbInMoveMsg = true; - if ( pFrame->mbFullScreen ) + if (pFrame->isFullScreen()) ImplSalFrameFullScreenPos( pFrame ); pFrame->mbInMoveMsg = false; } - // save state - ImplSaveFrameState( pFrame ); + pFrame->UpdateFrameState(); // Call Hdl //#93851 if we call this handler, VCL floating windows are not updated correctly @@ -4046,38 +4014,33 @@ static void ImplCallSizeHdl( HWND hWnd ) // as Windows can send these messages also, we have to use // the Solar semaphore WinSalFrame* pFrame = ProcessOrDeferMessage( hWnd, SAL_MSG_POSTCALLSIZE ); - if ( pFrame ) - { - pFrame->CallCallback( SalEvent::Resize, nullptr ); - // to avoid double Paints by VCL and SAL - if ( IsWindowVisible( hWnd ) && !pFrame->mbInShow ) - UpdateWindow( hWnd ); + if (!pFrame) + return; - ImplSalYieldMutexRelease(); - } + pFrame->CallCallback(SalEvent::Resize, nullptr); + // to avoid double Paints by VCL and SAL + if (IsWindowVisible(hWnd) && !pFrame->mbInShow) + UpdateWindow(hWnd); + + ImplSalYieldMutexRelease(); } -static void ImplHandleSizeMsg( HWND hWnd, WPARAM wParam, LPARAM lParam ) +static void ImplHandleSizeMsg(HWND hWnd, WPARAM wParam, LPARAM) { - if ( (wParam != SIZE_MAXSHOW) && (wParam != SIZE_MAXHIDE) ) - { - WinSalFrame* pFrame = GetWindowPtr( hWnd ); - if ( pFrame ) - { - UpdateFrameGeometry( hWnd, pFrame ); + if ((wParam == SIZE_MAXSHOW) || (wParam == SIZE_MAXHIDE)) + return; - pFrame->mnWidth = static_cast<LONG>(LOWORD(lParam)); - pFrame->mnHeight = static_cast<LONG>(HIWORD(lParam)); - // save state - ImplSaveFrameState( pFrame ); - // Call Hdl - ImplCallSizeHdl( hWnd ); + WinSalFrame* pFrame = GetWindowPtr(hWnd); + if (!pFrame) + return; - WinSalTimer* pTimer = static_cast<WinSalTimer*>( ImplGetSVData()->maSchedCtx.mpSalTimer ); - if ( pTimer ) - pTimer->SetForceRealTimer( true ); - } - } + UpdateFrameGeometry(pFrame); + pFrame->UpdateFrameState(); + ImplCallSizeHdl(hWnd); + + WinSalTimer* pTimer = static_cast<WinSalTimer*>(ImplGetSVData()->maSchedCtx.mpSalTimer); + if (pTimer) + pTimer->SetForceRealTimer(true); } static void ImplHandleFocusMsg( HWND hWnd ) @@ -4169,7 +4132,7 @@ static void ImplHandleSettingsChangeMsg( HWND hWnd, UINT nMsg, { if ( (nMsg == WM_DISPLAYCHANGE) || (nMsg == WM_WININICHANGE) ) { - if ( pFrame->mbFullScreen ) + if (pFrame->isFullScreen()) ImplSalFrameFullScreenPos( pFrame ); } @@ -4370,7 +4333,7 @@ static bool ImplHandleMinMax( HWND hWnd, LPARAM lParam ) { MINMAXINFO* pMinMax = reinterpret_cast<MINMAXINFO*>(lParam); - if ( pFrame->mbFullScreen ) + if (pFrame->isFullScreen()) { int nX; int nY; @@ -4853,7 +4816,7 @@ static bool ImplHandleSysCommand( HWND hWnd, WPARAM wParam, LPARAM lParam ) WPARAM nCommand = wParam & 0xFFF0; - if ( pFrame->mbFullScreen ) + if (pFrame->isFullScreen()) { bool bMaximize = IsZoomed( pFrame->mhWnd ); bool bMinimize = IsIconic( pFrame->mhWnd ); |