include/vcl/outdev.hxx | 30 +++++++++++++++++++++++++++++- include/vcl/window.hxx | 19 ------------------- vcl/source/outdev/outdev.cxx | 19 +++++++++++++++++++ vcl/source/window/window.cxx | 17 +++-------------- 4 files changed, 51 insertions(+), 34 deletions(-)
New commits: commit a66896819678367f4e13c08a14b74cddccd13097 Author: Michael Meeks <michael.me...@collabora.com> Date: Sat Mar 14 22:16:11 2015 +0000 vclptr: move down impl. to OutputDevice Ultimately we will want to ref-count & VclPtr OutputDevice instances separately from Window - but for now merge. This helps fix the amazing lifecycle foo in toolkit/ Change-Id: If40ee9f645c87aff08815926205e908205bdd67a diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx index 23abb00..c94b76f 100644 --- a/include/vcl/outdev.hxx +++ b/include/vcl/outdev.hxx @@ -259,6 +259,26 @@ class VCL_DLLPUBLIC OutputDevice: private boost::noncopyable friend class vcl::PDFWriterImpl; friend void ImplHandleResize( vcl::Window* pWindow, long nNewWidth, long nNewHeight ); + // All of this will need to be replicated in Window + // or a shared base-class as/when we can break the + // OutputDevice -> Window inheritance. +private: + mutable int mnRefCnt; // reference count + + template<typename T> friend class ::rtl::Reference; + template<typename T> friend class ::VclPtr; + + inline void acquire() const + { + mnRefCnt++; + } + + inline void release() const + { + if (!--mnRefCnt) + delete const_cast<OutputDevice*>(this); + } + private: mutable SalGraphics* mpGraphics; ///< Graphics context to draw on mutable OutputDevice* mpPrevGraphics; ///< Previous output device in list @@ -345,6 +365,7 @@ private: mutable bool mbTextSpecial : 1; mutable bool mbRefPoint : 1; mutable bool mbEnableRTL : 1; + mutable bool mbDisposed : 1; /** @name Initialization and accessor functions */ @@ -352,10 +373,17 @@ private: protected: OutputDevice(); - public: virtual ~OutputDevice(); +protected: + /// release all references to other objects. + virtual void dispose(); + +public: + /// call the dispose() method if we have not already been disposed. + void disposeOnce(); + public: /** Get the graphic context that the output device uses to draw on. diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx index 67ebe60..5f0be55 100644 --- a/include/vcl/window.hxx +++ b/include/vcl/window.hxx @@ -405,8 +405,6 @@ private: // OutputDevice ::OutputDevice* mpOutputDevice; - mutable int mnRefCnt; // reference count - #ifdef DBG_UTIL friend const char* ::ImplDbgCheckWindow( const void* pObj ); #endif @@ -485,27 +483,10 @@ public: SAL_DLLPRIVATE static void ImplCalcSymbolRect( Rectangle& rRect ); -private: - template<typename T> friend class ::rtl::Reference; - template<typename T> friend class ::VclPtr; - - inline void acquire() const - { - mnRefCnt++; - } - - inline void release() const - { - if (!--mnRefCnt) - delete const_cast<Window*>(this); - } - protected: /** This is intended to be used to clear any locally held references to other Window-subclass objects */ virtual void dispose(); - /* call the dispose() method if we have not already been disposed */ - void disposeOnce(); SAL_DLLPRIVATE void ImplInit( vcl::Window* pParent, WinBits nStyle, SystemParentData* pSystemParentData ); diff --git a/vcl/source/outdev/outdev.cxx b/vcl/source/outdev/outdev.cxx index 82b80c3..7436b10 100644 --- a/vcl/source/outdev/outdev.cxx +++ b/vcl/source/outdev/outdev.cxx @@ -181,7 +181,26 @@ OutputDevice::OutputDevice() : OutputDevice::~OutputDevice() { + disposeOnce(); +} + +void OutputDevice::disposeOnce() +{ + if ( mbDisposed ) + return; + mbDisposed = true; + // catch badness where our OutputDevice sub-class was not + // wrapped safely in a VclPtr cosily. + assert( mnRefCnt > 0 ); + + // hold a ref in case something unusual happens during dispose. + VclPtr<OutputDevice> aRef(this); + dispose(); +} + +void OutputDevice::dispose() +{ if ( GetUnoGraphicsList() ) { UnoWrapperBase* pWrapper = Application::GetUnoWrapper( false ); diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index 423dd0e..3b6f3e7 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -137,23 +137,10 @@ bool Window::IsDisposed() const return !mpWindowImpl; } -void Window::disposeOnce() +void Window::dispose() { - if (!mpWindowImpl || mpWindowImpl->mbInDispose) - return; mpWindowImpl->mbInDispose = true; - // catch badness where our Window was not wrapped safely - // in a VclPtr cosily. - assert( mnRefCnt>0 ); - - // hold a ref in case something silly happens during dispose. - VclPtr<Window> aRef(this); - dispose(); -} - -void Window::dispose() -{ assert( mpWindowImpl && mpWindowImpl->mbInDispose ); // should only be called from disposeOnce() assert( !mpWindowImpl->mpParent || !mpWindowImpl->mpParent->IsDisposed() || @@ -585,6 +572,8 @@ void Window::dispose() // should be the last statements delete mpWindowImpl; mpWindowImpl = NULL; + + OutputDevice::dispose(); } Window::~Window() _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits