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));
 }
 

Reply via email to