vcl/inc/win/saldata.hxx | 1 - vcl/inc/win/salinst.h | 3 +++ vcl/source/app/winscheduler.cxx | 2 +- vcl/win/app/salinst.cxx | 30 +++++++++++++----------------- vcl/win/app/saltimer.cxx | 14 +++++++------- vcl/win/gdi/salprn.cxx | 4 ++-- vcl/win/window/salframe.cxx | 22 ++++++++++------------ 7 files changed, 36 insertions(+), 40 deletions(-)
New commits: commit 12a18cc38029c0cc70ec6aa99430fb700c870c9c Author: Michael Weghorn <[email protected]> AuthorDate: Fri Feb 27 08:56:49 2026 +0000 Commit: Michael Weghorn <[email protected]> CommitDate: Sat Feb 28 09:07:46 2026 +0100 vcl Win: Don't store WinSalInstance also in SalData The SalInstance is already stored in ImplSVData, so retrieve it from there instead of having it in the Windows-specific SalData in addition. Add a GetWinSalData helper function that casts to WinSalInstance* and use that one. Change-Id: Ic39e985dd3a122bb775c75796525c05d6c357ec2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200571 Tested-by: Jenkins Reviewed-by: Michael Weghorn <[email protected]> diff --git a/vcl/inc/win/saldata.hxx b/vcl/inc/win/saldata.hxx index 111493de05f3..83798cf607e1 100644 --- a/vcl/inc/win/saldata.hxx +++ b/vcl/inc/win/saldata.hxx @@ -97,7 +97,6 @@ public: int mnCmdShow; // default frame show style HHOOK mhSalObjMsgHook; // hook to get interesting msg for SalObject HWND mhWantLeaveMsg; // window handle, that want a MOUSELEAVE message - WinSalInstance* mpInstance; // pointer of first instance WinSalFrame* mpFirstFrame; // pointer of first frame WinSalObject* mpFirstObject; // pointer of first object window WinSalVirtualDevice* mpFirstVD; // first VirDev diff --git a/vcl/inc/win/salinst.h b/vcl/inc/win/salinst.h index ddb2878627cd..731bf1fb49d0 100644 --- a/vcl/inc/win/salinst.h +++ b/vcl/inc/win/salinst.h @@ -24,6 +24,7 @@ #include <osl/conditn.hxx> #include <salinst.hxx> +#include <svdata.hxx> #include <win/salframe.h> class SalYieldMutex; @@ -98,6 +99,8 @@ private: LRESULT SendWndMessage_impl(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) const; }; +inline WinSalInstance* GetWinSalInstance() { return static_cast<WinSalInstance*>(GetSalInstance()); } + SalFrame* ImplSalCreateFrame( WinSalInstance* pInst, HWND hWndParent, SalFrameStyleFlags nSalFrameStyle ); SalObject* ImplSalCreateObject( WinSalInstance* pInst, WinSalFrame* pParent ); HWND ImplSalReCreateHWND( HWND hWndParent, HWND oldhWnd, bool bAsChild ); diff --git a/vcl/source/app/winscheduler.cxx b/vcl/source/app/winscheduler.cxx index 0398faaa49c8..305a88a0a515 100644 --- a/vcl/source/app/winscheduler.cxx +++ b/vcl/source/app/winscheduler.cxx @@ -32,7 +32,7 @@ namespace { void PostMessageToComWnd(UINT nMsg) { - bool const ret = PostMessageW(GetSalData()->mpInstance->mhComWnd, nMsg, 0, 0); + bool const ret = PostMessageW(GetWinSalInstance()->mhComWnd, nMsg, 0, 0); SAL_WARN_IF(!ret, "vcl.schedule", "ERROR: PostMessage() failed!"); } } diff --git a/vcl/win/app/salinst.cxx b/vcl/win/app/salinst.cxx index 5ec8e82d78bc..4df35127560f 100644 --- a/vcl/win/app/salinst.cxx +++ b/vcl/win/app/salinst.cxx @@ -113,7 +113,7 @@ void SalYieldMutex::BeforeReleaseHandler() /// this function to avoid deadlock void SalYieldMutex::doAcquire( sal_uInt32 nLockCount ) { - WinSalInstance* pInst = GetSalData()->mpInstance; + WinSalInstance* pInst = GetWinSalInstance(); if ( pInst && pInst->IsMainThread() ) { if ( pInst->m_nNoYieldLock ) @@ -153,7 +153,7 @@ void SalYieldMutex::doAcquire( sal_uInt32 nLockCount ) sal_uInt32 SalYieldMutex::doRelease( const bool bUnlockAll ) { - WinSalInstance* pInst = GetSalData()->mpInstance; + WinSalInstance* pInst = GetWinSalInstance(); if ( pInst && pInst->m_nNoYieldLock && pInst->IsMainThread() ) return 1; @@ -166,7 +166,7 @@ sal_uInt32 SalYieldMutex::doRelease( const bool bUnlockAll ) bool SalYieldMutex::tryToAcquire() { - WinSalInstance* pInst = GetSalData()->mpInstance; + WinSalInstance* pInst = GetWinSalInstance(); if ( pInst ) { if ( pInst->m_nNoYieldLock && pInst->IsMainThread() ) @@ -180,20 +180,20 @@ bool SalYieldMutex::tryToAcquire() void ImplSalYieldMutexAcquireWithWait( sal_uInt32 nCount ) { - WinSalInstance* pInst = GetSalData()->mpInstance; + WinSalInstance* pInst = GetWinSalInstance(); if ( pInst ) pInst->GetYieldMutex()->acquire( nCount ); } bool ImplSalYieldMutexTryToAcquire() { - WinSalInstance* pInst = GetSalData()->mpInstance; + WinSalInstance* pInst = GetWinSalInstance(); return pInst && pInst->GetYieldMutex()->tryToAcquire(); } void ImplSalYieldMutexRelease() { - WinSalInstance* pInst = GetSalData()->mpInstance; + WinSalInstance* pInst = GetWinSalInstance(); if ( pInst ) { GdiFlush(); @@ -203,10 +203,10 @@ void ImplSalYieldMutexRelease() bool SalYieldMutex::IsCurrentThread() const { - if ( !GetSalData()->mpInstance->m_nNoYieldLock ) + if (!GetWinSalInstance()->m_nNoYieldLock) return SolarMutex::IsCurrentThread(); else - return GetSalData()->mpInstance->IsMainThread(); + return GetWinSalInstance()->IsMainThread(); } void SalData::initKeyCodeMap() @@ -250,7 +250,6 @@ SalData::SalData() mnCmdShow = 0; mhSalObjMsgHook = nullptr; mhWantLeaveMsg = nullptr; - mpInstance = nullptr; mpFirstFrame = nullptr; mpFirstObject = nullptr; mpFirstVD = nullptr; @@ -381,9 +380,6 @@ VCLPLUG_WIN_PUBLIC SalInstance* create_SalInstance() return nullptr; WinSalInstance* pInst = new WinSalInstance(pSalData); - - // init instance (only one instance in this version !!!) - pSalData->mpInstance = pInst; pInst->mhInst = pSalData->mhInst; pInst->mhComWnd = hComWnd; @@ -440,7 +436,7 @@ bool ImplSalYield(const bool bWait, const bool bHandleAllCurrentEvents) static sal_uInt32 nLastTicks = 0; // we should never yield in m_nNoYieldLock mode! - const bool bNoYieldLock = (GetSalData()->mpInstance->m_nNoYieldLock > 0); + const bool bNoYieldLock = (GetWinSalInstance()->m_nNoYieldLock > 0); assert(!bNoYieldLock); if (bNoYieldLock) return false; @@ -546,7 +542,7 @@ namespace struct NoYieldLockGuard { NoYieldLockGuard() - : counter(InSendMessage() ? GetSalData()->mpInstance->m_nNoYieldLock : dummy()) + : counter(InSendMessage() ? GetWinSalInstance()->m_nNoYieldLock : dummy()) { ++counter; } @@ -605,7 +601,7 @@ LRESULT CALLBACK SalComWndProc( HWND, UINT nMsg, WPARAM wParam, LPARAM lParam, b { NoYieldLockGuard g; nRet = reinterpret_cast<LRESULT>( - ImplSalCreateFrame(GetSalData()->mpInstance, reinterpret_cast<HWND>(lParam), + ImplSalCreateFrame(GetWinSalInstance(), reinterpret_cast<HWND>(lParam), static_cast<SalFrameStyleFlags>(wParam))); } break; @@ -646,7 +642,7 @@ LRESULT CALLBACK SalComWndProc( HWND, UINT nMsg, WPARAM wParam, LPARAM lParam, b { NoYieldLockGuard g; nRet = reinterpret_cast<LRESULT>(ImplSalCreateObject( - GetSalData()->mpInstance, reinterpret_cast<WinSalFrame*>(lParam))); + GetWinSalInstance(), reinterpret_cast<WinSalFrame*>(lParam))); } break; case (SAL_MSG_DESTROYOBJECT): @@ -772,7 +768,7 @@ LRESULT WinSalInstance::SendWndMessage_impl(HWND hWnd, UINT Msg, WPARAM wParam, LRESULT WinSalInstance::SendWndMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { - return GetSalData()->mpInstance->SendWndMessage_impl(hWnd, Msg, wParam, lParam); + return GetWinSalInstance()->SendWndMessage_impl(hWnd, Msg, wParam, lParam); } LRESULT WinSalInstance::SendComWndMessage(UINT Msg, WPARAM wParam, LPARAM lParam) const diff --git a/vcl/win/app/saltimer.cxx b/vcl/win/app/saltimer.cxx index 834b183476e5..9b0f6be01644 100644 --- a/vcl/win/app/saltimer.cxx +++ b/vcl/win/app/saltimer.cxx @@ -39,7 +39,7 @@ void CALLBACK SalTimerProc(PVOID pParameter, BOOLEAN bTimerOrWaitFired); void WinSalTimer::ImplStop() { SalData *const pSalData = GetSalData(); - const WinSalInstance *pInst = pSalData->mpInstance; + const WinSalInstance *pInst = GetWinSalInstance(); assert( !pInst || pSalData->mnAppThreadId == GetCurrentThreadId() ); if ( m_bSetTimerRunning ) @@ -65,7 +65,7 @@ void WinSalTimer::ImplStart( sal_uInt64 nMS ) { #if !defined NDEBUG SalData* pSalData = GetSalData(); - assert( !pSalData->mpInstance || pSalData->mnAppThreadId == GetCurrentThreadId() ); + assert(!GetWinSalInstance() || pSalData->mnAppThreadId == GetCurrentThreadId()); #endif // DueTime parameter is a DWORD, which is always an unsigned 32bit @@ -87,7 +87,7 @@ void WinSalTimer::ImplStart( sal_uInt64 nMS ) { // so we don't block the nested message queue in move and resize // with posted 0ms SAL_MSG_TIMER_CALLBACK messages - SetTimer( GetSalData()->mpInstance->mhComWnd, m_aWmTimerId, + SetTimer(GetWinSalInstance()->mhComWnd, m_aWmTimerId, USER_TIMER_MINIMUM, nullptr ); m_bSetTimerRunning = true; } @@ -110,7 +110,7 @@ WinSalTimer::~WinSalTimer() void WinSalTimer::Start( sal_uInt64 nMS ) { - WinSalInstance *pInst = GetSalData()->mpInstance; + WinSalInstance *pInst = GetWinSalInstance(); if ( pInst && !pInst->IsMainThread() ) { bool const ret = PostMessageW(pInst->mhComWnd, @@ -123,7 +123,7 @@ void WinSalTimer::Start( sal_uInt64 nMS ) void WinSalTimer::Stop() { - WinSalInstance *pInst = GetSalData()->mpInstance; + WinSalInstance *pInst = GetWinSalInstance(); if ( pInst && !pInst->IsMainThread() ) { bool const ret = PostMessageW(pInst->mhComWnd, @@ -144,7 +144,7 @@ void CALLBACK SalTimerProc(PVOID data, BOOLEAN) { WinSalTimer *pTimer = static_cast<WinSalTimer*>( data ); bool const ret = PostMessageW( - GetSalData()->mpInstance->mhComWnd, SAL_MSG_TIMER_CALLBACK, + GetWinSalInstance()->mhComWnd, SAL_MSG_TIMER_CALLBACK, static_cast<WPARAM>(pTimer->GetNextEventVersion()), 0 ); #if OSL_DEBUG_LEVEL > 0 if (!ret) // SEH prevents using SAL_WARN here? @@ -197,7 +197,7 @@ void WinSalTimer::ImplHandle_WM_TIMER( const WPARAM aWPARAM ) return; m_bSetTimerRunning = false; - KillTimer( GetSalData()->mpInstance->mhComWnd, m_aWmTimerId ); + KillTimer(GetWinSalInstance()->mhComWnd, m_aWmTimerId); ImplHandleElapsedTimer(); } diff --git a/vcl/win/gdi/salprn.cxx b/vcl/win/gdi/salprn.cxx index bb6e3a068f8b..45cc7add34a7 100644 --- a/vcl/win/gdi/salprn.cxx +++ b/vcl/win/gdi/salprn.cxx @@ -380,7 +380,7 @@ static bool ImplUpdateSalJobSetup( WinSalInfoPrinter const * pPrinter, ImplJobSe // Release mutex, in the other case we don't get paints and so on sal_uInt32 nMutexCount = 0; - WinSalInstance* pInst = GetSalData()->mpInstance; + WinSalInstance* pInst = GetWinSalInstance(); if ( pInst && pVisibleDlgParent ) nMutexCount = pInst->ReleaseYieldMutex(true); @@ -1481,7 +1481,7 @@ bool WinSalPrinter::StartJob( const OUString* pFileName, // As the Telecom Balloon Fax driver tends to send messages repeatedly // we try to process first all, and then insert a dummy message for (int i = 0; Application::Reschedule( true ) && i <= 15; ++i); - bool const ret = PostMessageW(GetSalData()->mpInstance->mhComWnd, SAL_MSG_DUMMY, 0, 0); + bool const ret = PostMessageW(GetWinSalInstance()->mhComWnd, SAL_MSG_DUMMY, 0, 0); SAL_WARN_IF(!ret, "vcl", "ERROR: PostMessage() failed!"); // bring up a file chooser if printing to file port but no file name given diff --git a/vcl/win/window/salframe.cxx b/vcl/win/window/salframe.cxx index a551e4b09926..83703e7626e9 100644 --- a/vcl/win/window/salframe.cxx +++ b/vcl/win/window/salframe.cxx @@ -957,10 +957,10 @@ WinSalFrame::~WinSalFrame() { HDC hDC = mpGraphics->getHDC(); mpGraphics->setHDC(nullptr); - if (pSalData->mpInstance->IsMainThread()) + if (GetWinSalInstance()->IsMainThread()) ReleaseDC(mhWnd, hDC); else - pSalData->mpInstance->SendComWndMessage( + GetWinSalInstance()->SendComWndMessage( SAL_MSG_RELEASEDC, reinterpret_cast<WPARAM>(mhWnd), reinterpret_cast<LPARAM>(hDC)); delete mpGraphics; mpGraphics = nullptr; @@ -996,16 +996,14 @@ SalGraphics* WinSalFrame::AcquireGraphics() if (!mhWnd || mbGraphicsAcquired) return nullptr; - SalData* pSalData = GetSalData(); - if (!mpGraphics) { HDC hDC; - if (pSalData->mpInstance->IsMainThread()) + if (GetWinSalInstance()->IsMainThread()) hDC = GetDC(mhWnd); else hDC = reinterpret_cast<HDC>( - static_cast<sal_IntPtr>(pSalData->mpInstance->SendComWndMessage( + static_cast<sal_IntPtr>(GetWinSalInstance()->SendComWndMessage( SAL_MSG_GETCACHEDDC, reinterpret_cast<WPARAM>(mhWnd), 0))); if (!hDC) return nullptr; @@ -1451,17 +1449,17 @@ void WinSalFrame::ImplSetParentFrame( HWND hNewParentWnd, bool bAsChild ) bHadGraphics = true; HDC hDC = mpGraphics->getHDC(); mpGraphics->setHDC(nullptr); - if (pSalData->mpInstance->IsMainThread()) + if (GetWinSalInstance()->IsMainThread()) ReleaseDC(mhWnd, hDC); else - pSalData->mpInstance->SendComWndMessage(SAL_MSG_RELEASEDC, reinterpret_cast<WPARAM>(mhWnd), + GetWinSalInstance()->SendComWndMessage(SAL_MSG_RELEASEDC, reinterpret_cast<WPARAM>(mhWnd), reinterpret_cast<LPARAM>(hDC)); } // create a new hwnd with the same styles HWND hWndParent = hNewParentWnd; // forward to main thread - HWND hWnd = reinterpret_cast<HWND>(static_cast<sal_IntPtr>(pSalData->mpInstance->SendComWndMessage( + HWND hWnd = reinterpret_cast<HWND>(static_cast<sal_IntPtr>(GetWinSalInstance()->SendComWndMessage( bAsChild ? SAL_MSG_RECREATECHILDHWND : SAL_MSG_RECREATEHWND, reinterpret_cast<WPARAM>(hWndParent), reinterpret_cast<LPARAM>(mhWnd) ))); @@ -1473,11 +1471,11 @@ void WinSalFrame::ImplSetParentFrame( HWND hNewParentWnd, bool bAsChild ) { mpGraphics->setHWND( hWnd ); HDC hDC; - if (pSalData->mpInstance->IsMainThread()) + if (GetWinSalInstance()->IsMainThread()) hDC = GetDC( hWnd ); else hDC = reinterpret_cast<HDC>( - static_cast<sal_IntPtr>(pSalData->mpInstance->SendComWndMessage( + static_cast<sal_IntPtr>(GetWinSalInstance()->SendComWndMessage( SAL_MSG_GETCACHEDDC, reinterpret_cast<WPARAM>(hWnd), 0))); if (hDC) mpGraphics->setHDC( hDC ); @@ -1494,7 +1492,7 @@ void WinSalFrame::ImplSetParentFrame( HWND hNewParentWnd, bool bAsChild ) systemChildren.clear(); // Now destroy original HWND in the thread where it was created. - pSalData->mpInstance->SendComWndMessage( + GetWinSalInstance()->SendComWndMessage( SAL_MSG_DESTROYHWND, WPARAM(0), reinterpret_cast<LPARAM>(hWndOld)); }
