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;
