From ca0169340c94adc791061e3fb098fa656f22a8c5 Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Sat, 21 Sep 2013 18:01:36 +0200 Subject: sfx2: fix sfx2::sidebar::Theme lifecycle It's a horrible idea to have global VCL Images, since that will inevitably crash on shutdown when the static dtor runs after DeInitVCL, which breaks ~every JunitTest now. 0x00002af6750d2d51 in rtl::Reference::~Reference (this=0x2af6756ceb28 , __in_chrg=) Try to fix that by moving the global sidebar::Theme instance to SfxApplication where it can hopefully be deleted before shutdown. Change-Id: Ia78f1e458699335b53a741b6463ce48af69584a7 --- include/sfx2/app.hxx | 6 ++++++ include/sfx2/sidebar/Theme.hxx | 6 +++--- sfx2/source/appl/app.cxx | 11 +++++++++++ sfx2/source/appl/appdata.cxx | 1 + sfx2/source/inc/appdata.hxx | 6 +++++- sfx2/source/sidebar/Theme.cxx | 19 ++++--------------- 6 files changed, 30 insertions(+), 19 deletions(-) diff --git a/include/sfx2/app.hxx b/include/sfx2/app.hxx index f8361f249e0b..d24b40abf53d 100644 --- a/include/sfx2/app.hxx +++ b/include/sfx2/app.hxx @@ -94,6 +94,9 @@ typedef ::std::vector< SfxMedium* > SfxMediumList; namespace sfx2 { class SvLinkSource; + namespace sidebar { + class Theme; + } } //==================================================================== @@ -260,6 +263,9 @@ public: /** loads the application logo as used in the impress slideshow pause screen */ static BitmapEx GetApplicationLogo(long nWidth); + + /** this Theme contains Images so must be deleted before DeInitVCL */ + sfx2::sidebar::Theme & GetSidebarTheme(); }; #define SFX_APP() SfxGetpApp() diff --git a/include/sfx2/sidebar/Theme.hxx b/include/sfx2/sidebar/Theme.hxx index ae1e6a6fdcc4..098b63d7ed0c 100644 --- a/include/sfx2/sidebar/Theme.hxx +++ b/include/sfx2/sidebar/Theme.hxx @@ -154,6 +154,8 @@ public: static void HandleDataChange (void); + void InitializeTheme(); + Theme (void); virtual ~Theme (void); @@ -208,8 +210,7 @@ public: throw(cssu::RuntimeException); private: - static ::rtl::Reference mpInstance; - static Theme& GetCurrentTheme (void); + static Theme& GetCurrentTheme(); ::std::vector maImages; ::std::vector maColors; @@ -246,7 +247,6 @@ private: }; void SetupPropertyMaps (void); - void InitializeTheme (void); void UpdateTheme (void); static PropertyType GetPropertyType (const ThemeItem eItem); static cssu::Type GetCppuType (const PropertyType eType); diff --git a/sfx2/source/appl/app.cxx b/sfx2/source/appl/app.cxx index c66884246d9c..fb84391c9841 100644 --- a/sfx2/source/appl/app.cxx +++ b/sfx2/source/appl/app.cxx @@ -88,6 +88,7 @@ #include #include "imestatuswindow.hxx" #include "workwin.hxx" +#include #include #include #include "sfx2/stbitem.hxx" @@ -636,4 +637,14 @@ ErrCode SfxApplication::CallBasic( const OUString& rCode, BasicManager* pMgr, Sb #endif } +sfx2::sidebar::Theme & SfxApplication::GetSidebarTheme() +{ + if (!pAppData_Impl->m_pSidebarTheme.is()) + { + pAppData_Impl->m_pSidebarTheme.set(new sfx2::sidebar::Theme); + pAppData_Impl->m_pSidebarTheme->InitializeTheme(); + } + return *pAppData_Impl->m_pSidebarTheme; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/source/appl/appdata.cxx b/sfx2/source/appl/appdata.cxx index a2c79ca4e5c5..d031fbcfe70c 100644 --- a/sfx2/source/appl/appdata.cxx +++ b/sfx2/source/appl/appdata.cxx @@ -38,6 +38,7 @@ #include #include #include +#include #include "referers.hxx" #include "app.hrc" #include "sfx2/sfxresid.hxx" diff --git a/sfx2/source/inc/appdata.hxx b/sfx2/source/inc/appdata.hxx index 00bf7b44e9dd..cdd66809ae18 100644 --- a/sfx2/source/inc/appdata.hxx +++ b/sfx2/source/inc/appdata.hxx @@ -62,7 +62,10 @@ class BasicManager; class SfxBasicManagerHolder; class SfxBasicManagerCreationListener; -namespace sfx2 { namespace appl { class ImeStatusWindow; } } +namespace sfx2 { + namespace appl { class ImeStatusWindow; } + namespace sidebar { class Theme; } +} typedef Link* LinkPtr; @@ -130,6 +133,7 @@ public: SfxSlotPool* pSlotPool; SfxDispatcher* pAppDispat; // Dispatcher if no document SfxInterface** pInterfaces; + ::rtl::Reference m_pSidebarTheme; sal_uInt16 nDocNo; // current Doc-Number (AutoName) sal_uInt16 nInterfaces; diff --git a/sfx2/source/sidebar/Theme.cxx b/sfx2/source/sidebar/Theme.cxx index d6d95d78833e..bd191bbf4db9 100644 --- a/sfx2/source/sidebar/Theme.cxx +++ b/sfx2/source/sidebar/Theme.cxx @@ -20,6 +20,7 @@ #include "Paint.hxx" #include "SidebarResource.hxx" #include "sfx2/sidebar/Tools.hxx" +#include #include #include @@ -31,25 +32,13 @@ using namespace cssu; namespace sfx2 { namespace sidebar { -::rtl::Reference Theme::mpInstance; - - - -Theme& Theme::GetCurrentTheme (void) +Theme& Theme::GetCurrentTheme() { - if ( ! mpInstance.is()) - { - mpInstance.set(new Theme()); - mpInstance->InitializeTheme(); - } - return *mpInstance; + return SFX_APP()->GetSidebarTheme(); } - - - -Theme::Theme (void) +Theme::Theme() : ThemeInterfaceBase(m_aMutex), maImages(), maColors(), -- cgit