diff options
author | Noel Grandin <noel@peralex.com> | 2016-04-18 11:21:44 +0200 |
---|---|---|
committer | Noel Grandin <noelgrandin@gmail.com> | 2016-04-18 10:51:54 +0000 |
commit | 67d333c608a662621c1069aacdec75e45e33a183 (patch) | |
tree | 9b2715c5d159acc881627fe461c501fd4db91abf | |
parent | 0c1e6136ca84ec3bd2c0bb96689c0235b8585b25 (diff) |
tdf#99352 - Some VclPtrs leak past DeInitVCL
Change-Id: I74b27b1d8b662a644df580ae128643b8495355f8
Reviewed-on: https://gerrit.libreoffice.org/24204
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noelgrandin@gmail.com>
-rw-r--r-- | compilerplugins/clang/badstatics.cxx | 8 | ||||
-rw-r--r-- | sdext/source/pdfimport/wrapper/wrapper.cxx | 11 | ||||
-rw-r--r-- | sw/inc/viewsh.hxx | 5 | ||||
-rw-r--r-- | sw/source/core/inc/fntcache.hxx | 1 | ||||
-rw-r--r-- | sw/source/core/txtnode/fntcache.cxx | 7 | ||||
-rw-r--r-- | sw/source/core/view/viewsh.cxx | 4 | ||||
-rw-r--r-- | vcl/source/window/winproc.cxx | 12 |
7 files changed, 24 insertions, 24 deletions
diff --git a/compilerplugins/clang/badstatics.cxx b/compilerplugins/clang/badstatics.cxx index ecc930093a3a..d3fc83127fde 100644 --- a/compilerplugins/clang/badstatics.cxx +++ b/compilerplugins/clang/badstatics.cxx @@ -146,13 +146,9 @@ public: { return true; } - // TODO: check these VclPtr<> static fields - if ( name == "xPreviousWindow" // vcl/source/window/winproc.cxx - || name == "vDev" // sdext/source/pdfimport/wrapper/wrapper.cxx - || name == "s_xEmptyController" // svx/source/fmcomp/gridcell.cxx + // these two are fairly harmless because they're both empty objects + if ( name == "s_xEmptyController" // svx/source/fmcomp/gridcell.cxx || name == "xCell" // svx/source/table/svdotable.cxx - || name == "pPixOut" // sw/source/core/txtnode/fntcache.cxx - || name == "mpCareWindow" // sw/source/core/view/viewsh.cxx ) { return true; diff --git a/sdext/source/pdfimport/wrapper/wrapper.cxx b/sdext/source/pdfimport/wrapper/wrapper.cxx index 06a97635bee3..48e3924ef90d 100644 --- a/sdext/source/pdfimport/wrapper/wrapper.cxx +++ b/sdext/source/pdfimport/wrapper/wrapper.cxx @@ -59,6 +59,7 @@ #include <vcl/metric.hxx> #include <vcl/font.hxx> #include <vcl/virdev.hxx> +#include <vcl/lazydelete.hxx> #include <memory> #include <unordered_map> @@ -662,13 +663,13 @@ void Parser::readFont() } - static VclPtr<VirtualDevice> vDev; - if (!vDev) - vDev = VclPtr<VirtualDevice>::Create(); + static vcl::DeleteOnDeinit< VclPtr<VirtualDevice> > vDev( new VclPtr<VirtualDevice> ); + if (!vDev.get()->get()) + (*vDev.get()) = VclPtr<VirtualDevice>::Create(); vcl::Font font(aResult.familyName, Size(0, 1000)); - vDev->SetFont(font); - FontMetric metric(vDev->GetFontMetric()); + (*vDev.get())->SetFont(font); + FontMetric metric((*vDev.get())->GetFontMetric()); aResult.ascent = metric.GetAscent() / 1000.0; m_aFontMap[nFontID] = aResult; diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx index e4ee7d609ef6..3df2cd89ee93 100644 --- a/sw/inc/viewsh.hxx +++ b/sw/inc/viewsh.hxx @@ -30,6 +30,7 @@ #include <vcl/mapmod.hxx> #include <vcl/print.hxx> #include <vcl/vclptr.hxx> +#include <vcl/lazydelete.hxx> #include <LibreOfficeKit/LibreOfficeKitTypes.h> @@ -180,7 +181,7 @@ class SW_DLLPUBLIC SwViewShell : public sw::Ring<SwViewShell> protected: static ShellResource* mpShellRes; ///< Resources for the Shell. - static VclPtr<vcl::Window> mpCareWindow; ///< Avoid this window. + static vcl::DeleteOnDeinit< VclPtr<vcl::Window> > mpCareWindow; ///< Avoid this window. SwRect maVisArea; ///< The modern version of VisArea. SwDoc *mpDoc; ///< The document; never 0. @@ -436,7 +437,7 @@ public: static void SetCareWin( vcl::Window* pNew ); static vcl::Window* GetCareWin(SwViewShell& rVSh) - { return mpCareWindow ? mpCareWindow.get() : CareChildWin(rVSh); } + { return (*mpCareWindow.get()) ? mpCareWindow.get()->get() : CareChildWin(rVSh); } static vcl::Window* CareChildWin(SwViewShell& rVSh); inline SfxViewShell *GetSfxViewShell() const { return mpSfxViewShell; } diff --git a/sw/source/core/inc/fntcache.hxx b/sw/source/core/inc/fntcache.hxx index 7d5dc0aa16e9..b0117a000fae 100644 --- a/sw/source/core/inc/fntcache.hxx +++ b/sw/source/core/inc/fntcache.hxx @@ -78,7 +78,6 @@ class SwFntObj : public SwCacheObj static long nPixWidth; static MapMode *pPixMap; - static VclPtr<OutputDevice> pPixOut; public: DECL_FIXEDMEMPOOL_NEWDEL(SwFntObj) diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx index b612985c731d..989d6d69c46b 100644 --- a/sw/source/core/txtnode/fntcache.cxx +++ b/sw/source/core/txtnode/fntcache.cxx @@ -28,6 +28,7 @@ #include <vcl/metric.hxx> #include <vcl/window.hxx> #include <vcl/svapp.hxx> +#include <vcl/lazydelete.hxx> #include <com/sun/star/i18n/CharacterIteratorMode.hpp> #include <com/sun/star/i18n/WordType.hpp> #include <breakit.hxx> @@ -68,7 +69,7 @@ Color *pWaveCol = nullptr; long SwFntObj::nPixWidth; MapMode* SwFntObj::pPixMap = nullptr; -VclPtr<OutputDevice> SwFntObj::pPixOut; +static vcl::DeleteOnDeinit< VclPtr<OutputDevice> > s_pFntObjPixOut( new VclPtr<OutputDevice> ); namespace { @@ -889,10 +890,10 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf ) Point aTextOriginPos( rInf.GetPos() ); if( !bPrt ) { - if( rInf.GetpOut() != pPixOut || rInf.GetOut().GetMapMode() != *pPixMap ) + if( rInf.GetpOut() != *s_pFntObjPixOut.get() || rInf.GetOut().GetMapMode() != *pPixMap ) { *pPixMap = rInf.GetOut().GetMapMode(); - pPixOut = rInf.GetpOut(); + (*s_pFntObjPixOut.get()) = rInf.GetpOut(); Size aTmp( 1, 1 ); nPixWidth = rInf.GetOut().PixelToLogic( aTmp ).Width(); } diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx index bf4152661553..769cd930c369 100644 --- a/sw/source/core/view/viewsh.cxx +++ b/sw/source/core/view/viewsh.cxx @@ -88,7 +88,7 @@ bool SwViewShell::mbLstAct = false; ShellResource *SwViewShell::mpShellRes = nullptr; -VclPtr<vcl::Window> SwViewShell::mpCareWindow = nullptr; +vcl::DeleteOnDeinit< VclPtr<vcl::Window> > SwViewShell::mpCareWindow(new VclPtr<vcl::Window>); bool bInSizeNotify = false; @@ -2418,7 +2418,7 @@ ShellResource* SwViewShell::GetShellRes() void SwViewShell::SetCareWin( vcl::Window* pNew ) { - mpCareWindow = pNew; + (*mpCareWindow.get()) = pNew; } sal_uInt16 SwViewShell::GetPageCount() const diff --git a/vcl/source/window/winproc.cxx b/vcl/source/window/winproc.cxx index 062136e363de..fe5286de3a99 100644 --- a/vcl/source/window/winproc.cxx +++ b/vcl/source/window/winproc.cxx @@ -36,6 +36,7 @@ #include <vcl/dockwin.hxx> #include <vcl/menu.hxx> #include <vcl/virdev.hxx> +#include <vcl/lazydelete.hxx> #include <touch/touch.h> #include <svdata.hxx> @@ -1473,7 +1474,7 @@ public: bool HandleWheelEvent::HandleEvent(const SalWheelMouseEvent& rEvt) { static SalWheelMouseEvent aPreviousEvent; - static VclPtr<vcl::Window> xPreviousWindow; + static vcl::DeleteOnDeinit< VclPtr<vcl::Window> > xPreviousWindow( new VclPtr<vcl::Window> ); if (!Setup()) return false; @@ -1483,16 +1484,17 @@ bool HandleWheelEvent::HandleEvent(const SalWheelMouseEvent& rEvt) // avoid the problem that scrolling via wheel to this point brings a widget // under the mouse that also accepts wheel commands, so stick with the old // widget if the time gap is very small - if (shouldReusePreviousMouseWindow(aPreviousEvent, rEvt) && acceptableWheelScrollTarget(xPreviousWindow)) + VclPtr<vcl::Window> tmp = *xPreviousWindow.get(); + if (shouldReusePreviousMouseWindow(aPreviousEvent, rEvt) && acceptableWheelScrollTarget(tmp)) { - xMouseWindow = xPreviousWindow.get(); + xMouseWindow = tmp; } aPreviousEvent = rEvt; - xPreviousWindow = Dispatch(xMouseWindow); + (*xPreviousWindow.get()) = Dispatch(xMouseWindow); - return xPreviousWindow; + return *xPreviousWindow.get(); } class HandleGestureEvent : public HandleGestureEventBase |