vcl/android/androidinst.cxx     |    3 +--
 vcl/headless/headlessinst.cxx   |    6 ++----
 vcl/headless/svpinst.cxx        |    4 ++--
 vcl/inc/headless/svpinst.hxx    |    2 +-
 vcl/inc/salinst.hxx             |    3 ++-
 vcl/inc/unx/geninst.h           |    7 +++++--
 vcl/inc/win/saldata.hxx         |    2 +-
 vcl/inc/win/salinst.h           |    2 +-
 vcl/ios/iosinst.cxx             |    7 ++-----
 vcl/osx/saldata.cxx             |    2 --
 vcl/osx/salinst.cxx             |    7 +++----
 vcl/qt5/QtData.cxx              |   16 ----------------
 vcl/qt5/QtInstance.cxx          |   15 ++++++++++++---
 vcl/source/app/salplug.cxx      |    4 +---
 vcl/source/app/salvtables.cxx   |    3 ++-
 vcl/source/app/svmain.cxx       |    1 +
 vcl/unx/generic/app/gendata.cxx |    2 +-
 vcl/unx/generic/app/salinst.cxx |   14 ++++----------
 vcl/unx/gtk3/gtkinst.cxx        |    6 +-----
 vcl/unx/kf5/KFSalInstance.cxx   |    2 --
 vcl/win/app/salinst.cxx         |   10 ++++------
 vcl/win/app/salshl.cxx          |    5 +++--
 22 files changed, 49 insertions(+), 74 deletions(-)

New commits:
commit 2814a652fcac57d6acf22883b59fcf62513f87b2
Author:     Michael Weghorn <[email protected]>
AuthorDate: Wed Feb 25 15:31:59 2026 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Fri Feb 27 08:20:34 2026 +0100

    qt: Move setting ImplSVNWFData from QtData to QtInstance
    
    Do it directly in the QtInstance ctor instead of the
    QtData ctor (which is called from the QtInstance
    ctor).
    
    This is in preparation of dropping QtData altogether.
    
    Change-Id: If0a3cf2dc65982fd232669506f2029778b7f2ade
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200347
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <[email protected]>

diff --git a/vcl/qt5/QtData.cxx b/vcl/qt5/QtData.cxx
index 3570dae95209..3a05b38625e1 100644
--- a/vcl/qt5/QtData.cxx
+++ b/vcl/qt5/QtData.cxx
@@ -19,25 +19,9 @@
 
 #include <QtData.hxx>
 
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QStyle>
-
 QtData::QtData()
     : GenericUnixSalData()
 {
-    ImplSVData* pSVData = ImplGetSVData();
-
-    pSVData->maNWFData.mbDockingAreaSeparateTB = true;
-    pSVData->maNWFData.mbFlatMenu = true;
-    pSVData->maNWFData.mbRolloverMenubar = true;
-    pSVData->maNWFData.mbNoFocusRects = true;
-    pSVData->maNWFData.mbNoFocusRectsForFlatButtons = true;
-
-    QStyle* style = QApplication::style();
-    pSVData->maNWFData.mnMenuFormatBorderX = 
style->pixelMetric(QStyle::PM_MenuPanelWidth)
-                                             + 
style->pixelMetric(QStyle::PM_MenuHMargin);
-    pSVData->maNWFData.mnMenuFormatBorderY = 
style->pixelMetric(QStyle::PM_MenuPanelWidth)
-                                             + 
style->pixelMetric(QStyle::PM_MenuVMargin);
 }
 
 // outline dtor b/c of FreetypeManager incomplete type
diff --git a/vcl/qt5/QtInstance.cxx b/vcl/qt5/QtInstance.cxx
index c0a4c27264f1..6afddbc06685 100644
--- a/vcl/qt5/QtInstance.cxx
+++ b/vcl/qt5/QtInstance.cxx
@@ -285,6 +285,17 @@ QtInstance::QtInstance(std::unique_ptr<QApplication>& 
pQApp)
     const OUString sToolkit = "qt" + OUString::number(QT_VERSION_MAJOR);
     pSVData->maAppData.mxToolkitName = constructToolkitID(sToolkit);
 
+    pSVData->maNWFData.mbDockingAreaSeparateTB = true;
+    pSVData->maNWFData.mbFlatMenu = true;
+    pSVData->maNWFData.mbRolloverMenubar = true;
+    pSVData->maNWFData.mbNoFocusRects = true;
+    pSVData->maNWFData.mbNoFocusRectsForFlatButtons = true;
+    QStyle* style = QApplication::style();
+    pSVData->maNWFData.mnMenuFormatBorderX = 
style->pixelMetric(QStyle::PM_MenuPanelWidth)
+                                             + 
style->pixelMetric(QStyle::PM_MenuHMargin);
+    pSVData->maNWFData.mnMenuFormatBorderY = 
style->pixelMetric(QStyle::PM_MenuPanelWidth)
+                                             + 
style->pixelMetric(QStyle::PM_MenuVMargin);
+
     // this one needs to be blocking, so that the handling in main thread
     // is processed before the thread emitting the signal continues
     connect(this, &QtInstance::ImplYieldSignal, this, &QtInstance::ImplYield,
commit d87eb890ce65298155ee6b763e2c6887546c116a
Author:     Michael Weghorn <[email protected]>
AuthorDate: Wed Feb 25 14:25:27 2026 +0100
Commit:     Michael Weghorn <[email protected]>
CommitDate: Fri Feb 27 08:20:23 2026 +0100

    vcl: Rework/Unify how SalData is set/unset
    
    For different platforms and VCL plugins, different
    SalData implementations exist.
    As documented in vcl/inc/unx/gendata.hxx:
    
        // SalData is a bit of a mess. For ImplSVData we need a SalData base 
class.
        // Windows, MacOS and iOS implement their own SalData class, so there 
is no
        // way to do inheritance from the "top" in all plugins. We also really 
don't
        // want to rename GenericUnixSalData and don't want to reinterpret_cast 
some
        // dummy pointer everywhere, so this seems the only sensible solution.
        class VCL_PLUGIN_PUBLIC SalData
    
    So far, both, the SalData and the SalInstance were created directly
    in the different create_SalInstance implementations.
    The SalData was created on the heap, without it being
    immediately obvious what that would do and when the
    object was deleted again.
    
    The different SalData ctors called SetSalData with `this`
    as the argument, i.e. ImplSVData::mpSalData was set
    to the SalData instance.
    
    Deletion then happens - at least for Unix - in DeInitVCL:
    
            // This only works on Linux. On Mac and Windows I get very
            // weird segment violations.
        #if defined LINUX
            delete pSVData->mpSalData;
        #endif
    
    Some of the SalData dtors also reset pSVData->mpSalData
    to null.
    
    Rework the logic to make it the responsibility of the
    SalInstance to create and set the SalData, by
    adding a SalData* param to the SalInstance base class
    and calling SetSalData from there, no longer in the
    SalData ctors.
    Set ImplSVData::mpSalData to null where/when it's
    deleted in DeInitVCL, no longer in the dtors.
    
    This unifies and deduplicates the handling for
    the different platforms/VCL plugins and makes
    the SalData lifecycle a bit more obvious.
    
    Slightly reorder/rearrange the code where further
    work was done with the the newly created SalData previously,
    to now either first create the SalInstance and then retrieve
    the SalData or to pass the SalData to the ctor.
    
    For Windows, add an optional SalData* param to
    ImplLoadSalIcon and use it to explicitly pass the newly
    created SalData for the call that happens before the
    WinSalInstance is created (i.e. before the SalData
    has been set using SetSalData, i.e. before it can
    be retrieved using GetSalData from within the
    function).
    
    Change-Id: Iec3ca05a3b39e10cdd8c01d8c363c2676811e75e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200334
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <[email protected]>

diff --git a/vcl/android/androidinst.cxx b/vcl/android/androidinst.cxx
index 1c6242dd0b8a..aa869f0d957b 100644
--- a/vcl/android/androidinst.cxx
+++ b/vcl/android/androidinst.cxx
@@ -42,7 +42,7 @@ AndroidSalInstance *AndroidSalInstance::getInstance()
 }
 
 AndroidSalInstance::AndroidSalInstance( std::unique_ptr<SalYieldMutex> pMutex )
-    : SvpSalInstance( std::move(pMutex) )
+    : SvpSalInstance(std::move(pMutex), new GenericUnixSalData)
 {
     // FIXME: remove when uniPoll & runLoop is the only Android entry point.
     int res = (lo_get_javavm())->AttachCurrentThread(&m_pJNIEnv, NULL);
@@ -160,7 +160,6 @@ extern "C" SalInstance *create_SalInstance()
 {
     LOGI("Android: create_SalInstance!");
     AndroidSalInstance* pInstance = new AndroidSalInstance( 
std::make_unique<SvpSalYieldMutex>() );
-    new GenericUnixSalData();
     return pInstance;
 }
 
diff --git a/vcl/headless/headlessinst.cxx b/vcl/headless/headlessinst.cxx
index 8a745beda08b..674e3c014362 100644
--- a/vcl/headless/headlessinst.cxx
+++ b/vcl/headless/headlessinst.cxx
@@ -23,7 +23,7 @@ public:
 };
 
 HeadlessSalInstance::HeadlessSalInstance(std::unique_ptr<SalYieldMutex> pMutex)
-    : SvpSalInstance(std::move(pMutex))
+    : SvpSalInstance(std::move(pMutex), new GenericUnixSalData)
 {
 }
 
@@ -51,9 +51,7 @@ SalSystem *HeadlessSalInstance::CreateSalSystem()
 
 extern "C" SalInstance *create_SalInstance()
 {
-    HeadlessSalInstance* pInstance = new 
HeadlessSalInstance(std::make_unique<SvpSalYieldMutex>());
-    new GenericUnixSalData();
-    return pInstance;
+    return new HeadlessSalInstance(std::make_unique<SvpSalYieldMutex>());
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/headless/svpinst.cxx b/vcl/headless/svpinst.cxx
index 1d445953761e..9ad948207c40 100644
--- a/vcl/headless/svpinst.cxx
+++ b/vcl/headless/svpinst.cxx
@@ -87,8 +87,8 @@ static void atfork_child()
 
 #endif
 
-SvpSalInstance::SvpSalInstance( std::unique_ptr<SalYieldMutex> pMutex )
-    : SalGenericInstance( std::move(pMutex) )
+SvpSalInstance::SvpSalInstance( std::unique_ptr<SalYieldMutex> pMutex, 
SalData* pSalData)
+    : SalGenericInstance( std::move(pMutex), pSalData)
 {
     m_nTimeout = 0;
     m_nTimeoutMS = 0;
diff --git a/vcl/inc/headless/svpinst.hxx b/vcl/inc/headless/svpinst.hxx
index ded778fea213..78d6a9eca97f 100644
--- a/vcl/inc/headless/svpinst.hxx
+++ b/vcl/inc/headless/svpinst.hxx
@@ -103,7 +103,7 @@ class VCL_DLLPUBLIC SvpSalInstance : public 
SalGenericInstance, public SalUserEv
 public:
     static SvpSalInstance*  s_pDefaultInstance;
 
-    SvpSalInstance( std::unique_ptr<SalYieldMutex> pMutex );
+    SvpSalInstance(std::unique_ptr<SalYieldMutex> pMutex, SalData* pSalData);
     virtual void AfterAppInit() override;
     virtual ~SvpSalInstance() override;
 
diff --git a/vcl/inc/salinst.hxx b/vcl/inc/salinst.hxx
index 16d93245b6f1..ad77d8d5a8ab 100644
--- a/vcl/inc/salinst.hxx
+++ b/vcl/inc/salinst.hxx
@@ -55,6 +55,7 @@ struct SystemParentData;
 struct SalPrinterQueueInfo;
 class ImplJobSetup;
 class OpenGLContext;
+class SalData;
 class SalGraphics;
 class SalFrame;
 class SalObject;
@@ -94,7 +95,7 @@ protected:
 #endif
 
 public:
-    SalInstance(std::unique_ptr<comphelper::SolarMutex> pMutex);
+    SalInstance(std::unique_ptr<comphelper::SolarMutex> pMutex, SalData* 
pSalData);
     virtual ~SalInstance();
 
     bool supportsOpenGL() const { return m_bSupportsOpenGL; }
diff --git a/vcl/inc/unx/geninst.h b/vcl/inc/unx/geninst.h
index 423047ae2106..1c19fa1ab6c7 100644
--- a/vcl/inc/unx/geninst.h
+++ b/vcl/inc/unx/geninst.h
@@ -49,8 +49,11 @@ protected:
     bool           mbPrinterInit;
 
 public:
-    SalGenericInstance( std::unique_ptr<comphelper::SolarMutex> pMutex )
-        : SalInstance(std::move(pMutex)), mbPrinterInit(false) {}
+    SalGenericInstance(std::unique_ptr<comphelper::SolarMutex> pMutex, 
SalData* pSalData)
+        : SalInstance(std::move(pMutex), pSalData)
+        , mbPrinterInit(false)
+    {
+    }
     virtual ~SalGenericInstance() override;
 
     // Printing
diff --git a/vcl/inc/win/saldata.hxx b/vcl/inc/win/saldata.hxx
index e623e45ecd19..6b17a02f6796 100644
--- a/vcl/inc/win/saldata.hxx
+++ b/vcl/inc/win/saldata.hxx
@@ -149,7 +149,7 @@ void ImplReleaseTempFonts(SalData&);
 
 HCURSOR ImplLoadSalCursor( int nId );
 HBITMAP ImplLoadSalBitmap( int nId );
-bool ImplLoadSalIcon( int nId, HICON& rIcon, HICON& rSmallIcon );
+bool ImplLoadSalIcon(int nId, HICON& rIcon, HICON& rSmallIcon, SalData* 
pSalData = nullptr);
 
 void ImplInitSalGDI();
 void ImplFreeSalGDI();
diff --git a/vcl/inc/win/salinst.h b/vcl/inc/win/salinst.h
index 398efdc1888d..ddb2878627cd 100644
--- a/vcl/inc/win/salinst.h
+++ b/vcl/inc/win/salinst.h
@@ -40,7 +40,7 @@ public:
     unsigned            m_nNoYieldLock;
 
 public:
-    WinSalInstance();
+    WinSalInstance(SalData* pSalData);
     virtual ~WinSalInstance() override;
 
     virtual void AfterAppInit() override;
diff --git a/vcl/ios/iosinst.cxx b/vcl/ios/iosinst.cxx
index ab0308e3cea7..15d9b9b6fcb0 100644
--- a/vcl/ios/iosinst.cxx
+++ b/vcl/ios/iosinst.cxx
@@ -47,7 +47,7 @@ IosSalInstance *IosSalInstance::getInstance()
 }
 
 IosSalInstance::IosSalInstance( std::unique_ptr<SalYieldMutex> pMutex )
-    : SvpSalInstance( std::move(pMutex) )
+    : SvpSalInstance(std::move(pMutex), new GenericUnixSalData)
 {
 }
 
@@ -135,7 +135,6 @@ SalData::SalData() :
     mxRGBSpace( CGColorSpaceCreateDeviceRGB() ),
     mxGraySpace( CGColorSpaceCreateDeviceGray() )
 {
-    SetSalData(this);
 }
 
 SalData::~SalData()
@@ -146,9 +145,7 @@ SalData::~SalData()
 
 extern "C" SalInstance *create_SalInstance()
 {
-    IosSalInstance* pInstance = new IosSalInstance( 
std::make_unique<SvpSalYieldMutex>() );
-    new GenericUnixSalData();
-    return pInstance;
+    return new IosSalInstance(std::make_unique<SvpSalYieldMutex>());
 }
 
 int IosSalSystem::ShowNativeDialog( const OUString& rTitle,
diff --git a/vcl/osx/saldata.cxx b/vcl/osx/saldata.cxx
index 1f49d1ef1e14..5b06041a4c46 100644
--- a/vcl/osx/saldata.cxx
+++ b/vcl/osx/saldata.cxx
@@ -63,7 +63,6 @@ SalData::SalData()
     mnDPIX( 0 ),
     mnDPIY( 0 )
 {
-    SetSalData(this);
     maCursors.fill( INVALID_CURSOR_PTR );
     if( s_aAutoReleaseKey == nullptr )
         s_aAutoReleaseKey = osl_createThreadKey( releasePool );
@@ -101,7 +100,6 @@ SalData::~SalData()
         [mpStatusItem release];
         mpStatusItem = nil;
     }
-    SetSalData( nullptr );
 }
 
 void SalData::ensureThreadAutoreleasePool()
diff --git a/vcl/osx/salinst.cxx b/vcl/osx/salinst.cxx
index 9c0acd6449b1..4c1e554397f6 100644
--- a/vcl/osx/salinst.cxx
+++ b/vcl/osx/salinst.cxx
@@ -318,8 +318,6 @@ void ImplSalYieldMutexRelease()
 extern "C" {
 VCLPLUG_OSX_PUBLIC SalInstance* create_SalInstance()
 {
-    SalData* pSalData = new SalData;
-
     NSAutoreleasePool * pool = [ [ NSAutoreleasePool alloc ] init ];
     unlink([[NSString stringWithFormat:@"%@/Library/Saved Application 
State/%s.savedState/restorecount.plist", NSHomeDirectory(), 
MACOSX_BUNDLE_IDENTIFIER] UTF8String]);
     unlink([[NSString stringWithFormat:@"%@/Library/Saved Application 
State/%s.savedState/restorecount.txt", NSHomeDirectory(), 
MACOSX_BUNDLE_IDENTIFIER] UTF8String]);
@@ -336,8 +334,9 @@ VCLPLUG_OSX_PUBLIC SalInstance* create_SalInstance()
     // activate our delegate methods
     [NSApp setDelegate: NSApp];
 
-    SAL_WARN_IF( pSalData->mpInstance != nullptr, "vcl", "more than one 
instance created" );
     AquaSalInstance* pInst = new AquaSalInstance;
+    SalData* pSalData = GetSalData();
+    SAL_WARN_IF( pSalData->mpInstance != nullptr, "vcl", "more than one 
instance created" );
 
     // init instance (only one instance in this version !!!)
     pSalData->mpInstance = pInst;
@@ -354,7 +353,7 @@ VCLPLUG_OSX_PUBLIC SalInstance* create_SalInstance()
 }
 
 AquaSalInstance::AquaSalInstance()
-    : SalInstance(std::make_unique<SalYieldMutex>())
+    : SalInstance(std::make_unique<SalYieldMutex>(), new SalData)
     , mnActivePrintJobs( 0 )
     , mbNoYieldLock( false )
     , mbTimerProcessed( false )
diff --git a/vcl/qt5/QtInstance.cxx b/vcl/qt5/QtInstance.cxx
index afe23aa5afac..c0a4c27264f1 100644
--- a/vcl/qt5/QtInstance.cxx
+++ b/vcl/qt5/QtInstance.cxx
@@ -268,7 +268,7 @@ OUString QtInstance::constructToolkitID(std::u16string_view 
sTKname)
 }
 
 QtInstance::QtInstance(std::unique_ptr<QApplication>& pQApp)
-    : SalGenericInstance(std::make_unique<QtYieldMutex>())
+    : SalGenericInstance(std::make_unique<QtYieldMutex>(), new QtData)
     , m_bUseCairo(nullptr == getenv("SAL_VCL_QT_USE_QFONT"))
     , m_pTimer(nullptr)
     , m_bSleeping(false)
@@ -1041,8 +1041,6 @@ VCLPLUG_QT_PUBLIC SalInstance* create_SalInstance()
     QtInstance* pInstance = new QtInstance(pQApp);
     pInstance->MoveFakeCmdlineArgs(pFakeArgv, pFakeArgc, aFakeArgvFreeable);
 
-    new QtData();
-
     return pInstance;
 }
 }
diff --git a/vcl/source/app/salplug.cxx b/vcl/source/app/salplug.cxx
index 7077c2794186..1ba14728267a 100644
--- a/vcl/source/app/salplug.cxx
+++ b/vcl/source/app/salplug.cxx
@@ -84,9 +84,7 @@ namespace {
 #if ENABLE_HEADLESS
 SalInstance* svp_create_SalInstance()
 {
-    SvpSalInstance* pInstance = new 
SvpSalInstance(std::make_unique<SvpSalYieldMutex>());
-    new GenericUnixSalData();
-    return pInstance;
+    return new SvpSalInstance(std::make_unique<SvpSalYieldMutex>(), new 
GenericUnixSalData);
 }
 #endif
 
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 4a44d7ab1b08..40eef1de9aaf 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -136,9 +136,10 @@ OUString SalFrame::DumpSetPosSize(tools::Long nX, 
tools::Long nY, tools::Long nW
     return aBuffer.makeStringAndClear();
 }
 
-SalInstance::SalInstance(std::unique_ptr<comphelper::SolarMutex> pMutex)
+SalInstance::SalInstance(std::unique_ptr<comphelper::SolarMutex> pMutex, 
SalData* pSalData)
     : m_pYieldMutex(std::move(pMutex))
 {
+    SetSalData(pSalData);
 }
 
 SalInstance::~SalInstance() {}
diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx
index f7c3bc6ee894..adf0bd7c2995 100644
--- a/vcl/source/app/svmain.cxx
+++ b/vcl/source/app/svmain.cxx
@@ -603,6 +603,7 @@ void DeInitVCL()
     // weird segment violations.
 #if defined LINUX
     delete pSVData->mpSalData;
+    pSVData->mpSalData = nullptr;
 #endif
 
     if( pOwnSvApp )
diff --git a/vcl/unx/generic/app/gendata.cxx b/vcl/unx/generic/app/gendata.cxx
index 0fb41be2b2f4..af9cadbbcfff 100644
--- a/vcl/unx/generic/app/gendata.cxx
+++ b/vcl/unx/generic/app/gendata.cxx
@@ -30,7 +30,7 @@
 #include <unx/glyphcache.hxx>
 #include <printerinfomanager.hxx>
 
-SalData::SalData() { SetSalData(this); }
+SalData::SalData() {}
 
 SalData::~SalData() {}
 
diff --git a/vcl/unx/generic/app/salinst.cxx b/vcl/unx/generic/app/salinst.cxx
index 633866efce99..48d55e3b6fcb 100644
--- a/vcl/unx/generic/app/salinst.cxx
+++ b/vcl/unx/generic/app/salinst.cxx
@@ -56,21 +56,15 @@ extern "C"
         if( ! ( pNoXInitThreads && *pNoXInitThreads ) )
             XInitThreads();
 
-        X11SalInstance* pInstance = new X11SalInstance( 
std::make_unique<SalYieldMutex>() );
-
-        // initialize SalData
-        X11SalData *pSalData = new X11SalData();
-
-        pInstance->SetLib( pSalData->GetLib() );
-
-        return pInstance;
+        return new X11SalInstance(std::make_unique<SalYieldMutex>());
     }
 }
 
 X11SalInstance::X11SalInstance(std::unique_ptr<SalYieldMutex> pMutex)
-    : SalGenericInstance(std::move(pMutex))
-    , mpXLib(nullptr)
+    : SalGenericInstance(std::move(pMutex), new X11SalData)
 {
+    mpXLib = GetX11SalData()->GetLib();
+
     ImplSVData* pSVData = ImplGetSVData();
     // [-loplugin:ostr] if we use a literal here, we get use-after-free on 
shutdown
     pSVData->maAppData.mxToolkitName = OUString("x11");
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index c2c901ab2fb8..55fcf69f5a22 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -190,10 +190,6 @@ extern "C"
 
         GtkInstance* pInstance = new GtkInstance( std::move(pYieldMutex) );
         SAL_INFO("vcl.gtk", "creating GtkInstance " << pInstance);
-
-        // Create SalData, this does not leak
-        new GtkSalData();
-
         return pInstance;
     }
 }
@@ -234,7 +230,7 @@ static VclInputFlags categorizeEvent(const GdkEvent *pEvent)
 #endif
 
 GtkInstance::GtkInstance( std::unique_ptr<SalYieldMutex> pMutex )
-    : SvpSalInstance( std::move(pMutex) )
+    : SvpSalInstance(std::move(pMutex), new GtkSalData)
     , m_pTimer(nullptr)
     , bNeedsInit(true)
     , m_pLastCairoFontOptions(nullptr)
diff --git a/vcl/unx/kf5/KFSalInstance.cxx b/vcl/unx/kf5/KFSalInstance.cxx
index 955cfe519826..a52e48abbaa5 100644
--- a/vcl/unx/kf5/KFSalInstance.cxx
+++ b/vcl/unx/kf5/KFSalInstance.cxx
@@ -109,8 +109,6 @@ VCLPLUG_KF_PUBLIC SalInstance* create_SalInstance()
     KFSalInstance* pInstance = new KFSalInstance(pQApp);
     pInstance->MoveFakeCmdlineArgs(pFakeArgv, pFakeArgc, aFakeArgvFreeable);
 
-    new QtData();
-
     return pInstance;
 }
 }
diff --git a/vcl/win/app/salinst.cxx b/vcl/win/app/salinst.cxx
index e27e62419e3a..9746b910655d 100644
--- a/vcl/win/app/salinst.cxx
+++ b/vcl/win/app/salinst.cxx
@@ -283,7 +283,6 @@ SalData::SalData()
 
     initKeyCodeMap();
 
-    SetSalData( this );
     initNWF();
 
     static Gdiplus::GdiplusStartupInput gdiplusStartupInput;
@@ -293,7 +292,6 @@ SalData::SalData()
 SalData::~SalData()
 {
     deInitNWF();
-    SetSalData( nullptr );
 
     if (gdiplusToken)
         Gdiplus::GdiplusShutdown(gdiplusToken);
@@ -353,7 +351,7 @@ VCLPLUG_WIN_PUBLIC SalInstance* create_SalInstance()
     aWndClassEx.hbrBackground   = nullptr;
     aWndClassEx.lpszMenuName    = nullptr;
     aWndClassEx.lpszClassName   = SAL_FRAME_CLASSNAMEW;
-    ImplLoadSalIcon( SAL_RESID_ICON_DEFAULT, aWndClassEx.hIcon, 
aWndClassEx.hIconSm );
+    ImplLoadSalIcon(SAL_RESID_ICON_DEFAULT, aWndClassEx.hIcon, 
aWndClassEx.hIconSm, pSalData);
     if ( !RegisterClassExW( &aWndClassEx ) )
         return nullptr;
 
@@ -383,7 +381,7 @@ VCLPLUG_WIN_PUBLIC SalInstance* create_SalInstance()
     if ( !hComWnd )
         return nullptr;
 
-    WinSalInstance* pInst = new WinSalInstance;
+    WinSalInstance* pInst = new WinSalInstance(pSalData);
 
     // init instance (only one instance in this version !!!)
     pSalData->mpInstance   = pInst;
@@ -397,8 +395,8 @@ VCLPLUG_WIN_PUBLIC SalInstance* create_SalInstance()
 }
 }
 
-WinSalInstance::WinSalInstance()
-    : SalInstance(std::make_unique<SalYieldMutex>())
+WinSalInstance::WinSalInstance(SalData* pSalData)
+    : SalInstance(std::make_unique<SalYieldMutex>(), pSalData)
     , mhInst( nullptr )
     , mhComWnd( nullptr )
     , m_nNoYieldLock( 0 )
diff --git a/vcl/win/app/salshl.cxx b/vcl/win/app/salshl.cxx
index 5619ece1f057..7e3e4b9327d0 100644
--- a/vcl/win/app/salshl.cxx
+++ b/vcl/win/app/salshl.cxx
@@ -52,11 +52,12 @@ HBITMAP ImplLoadSalBitmap( int nId )
     return hBitmap;
 }
 
-bool ImplLoadSalIcon( int nId, HICON& rIcon, HICON& rSmallIcon )
+bool ImplLoadSalIcon(int nId, HICON& rIcon, HICON& rSmallIcon, SalData* 
pSalData)
 {
     SAL_WARN_IF( !aSalShlData.mhInst, "vcl", "no DLL instance handle" );
 
-    SalData* pSalData = GetSalData();
+    if (!pSalData)
+        pSalData = GetSalData();
 
     // check the cache first
     SalIcon *pSalIcon = pSalData->mpFirstIcon;

Reply via email to