Kaydet (Commit) c54bb4a9 authored tarafından Bjoern Michaelsen's avatar Bjoern Michaelsen Kaydeden (comit) Björn Michaelsen

tdf#99352: create editeng::SharedVclRessources

- instead of keeping vcl resources in a rtl::Static
- these are shared owned by all EditEngines
- they let go of them when disposed
- thus, this should prevent VclPtrs to leak beyond dispose()

Change-Id: Ic6198c19d0ff9c09ecdea377d07807f08711d6a0
Reviewed-on: https://gerrit.libreoffice.org/34986Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarBjörn Michaelsen <bjoern.michaelsen@canonical.com>
üst 1a044b25
......@@ -85,11 +85,8 @@ EditDLL& EditDLL::Get()
}
GlobalEditData::GlobalEditData() :
ppDefItems(nullptr),
mpVirDev(VclPtr<VirtualDevice>::Create())
{
mpVirDev->SetMapMode(MapUnit::MapTwip);
}
ppDefItems(nullptr)
{ }
GlobalEditData::~GlobalEditData()
{
......@@ -197,11 +194,6 @@ uno::Reference< linguistic2::XLanguageGuessing > const & GlobalEditData::GetLang
return xLanguageGuesser;
}
VclPtr<VirtualDevice> GlobalEditData::GetStdVirtualDevice()
{
return mpVirDev;
}
EditResId::EditResId(sal_uInt16 nId)
: ResId(nId, *EditDLL::GetResMgr())
{
......@@ -225,4 +217,26 @@ ResMgr* EditDLL::GetResMgr()
return pResMgr;
}
editeng::SharedVclResources::SharedVclResources()
: m_pVirDev(VclPtr<VirtualDevice>::Create())
{
m_pVirDev->SetMapMode(MapUnit::MapTwip);
}
editeng::SharedVclResources::~SharedVclResources()
{ m_pVirDev.disposeAndClear(); }
VclPtr<VirtualDevice> editeng::SharedVclResources::GetVirtualDevice()
{ return m_pVirDev; }
std::shared_ptr<editeng::SharedVclResources> EditDLL::GetSharedVclResources()
{
SolarMutexGuard g;
auto pLocked(pSharedVcl.lock());
if(!pLocked)
pSharedVcl = pLocked = std::shared_ptr<editeng::SharedVclResources>(new editeng::SharedVclResources());
return pLocked;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -27,6 +27,19 @@
class SfxPoolItem;
class VirtualDevice;
namespace editeng
{
class SharedVclResources
{
private:
VclPtr<VirtualDevice> m_pVirDev;
public:
SharedVclResources();
~SharedVclResources();
VclPtr<VirtualDevice> GetVirtualDevice();
};
}
class GlobalEditData
{
private:
......@@ -34,7 +47,6 @@ private:
std::vector<SfxPoolItem*>* ppDefItems;
rtl::Reference<SvxForbiddenCharactersTable> xForbiddenCharsTable;
VclPtr<VirtualDevice> mpVirDev;
public:
GlobalEditData();
......@@ -45,8 +57,6 @@ public:
rtl::Reference<SvxForbiddenCharactersTable> const & GetForbiddenCharsTable();
void SetForbiddenCharsTable( rtl::Reference<SvxForbiddenCharactersTable> const & xForbiddenChars ) { xForbiddenCharsTable = xForbiddenChars; }
css::uno::Reference< css::linguistic2::XLanguageGuessing > const & GetLanguageGuesser();
VclPtr<VirtualDevice> GetStdVirtualDevice();
};
#endif // INCLUDED_EDITENG_SOURCE_EDITENG_EERDLL2_HXX
......
......@@ -19,6 +19,7 @@
#ifndef INCLUDED_EDITENG_SOURCE_EDITENG_IMPEDIT_HXX
#define INCLUDED_EDITENG_SOURCE_EDITENG_IMPEDIT_HXX
#include <eerdll2.hxx>
#include <editdoc.hxx>
#include <editsel.hxx>
#include <editundo.hxx>
......@@ -397,6 +398,7 @@ class ImpEditEngine : public SfxListener
typedef EditEngine::ViewsType ViewsType;
private:
std::shared_ptr<editeng::SharedVclResources> pSharedVCL;
// Data ...
......
......@@ -84,6 +84,7 @@ static sal_uInt16 lcl_CalcExtraSpace( ParaPortion*, const SvxLineSpacingItem& rL
}
ImpEditEngine::ImpEditEngine( EditEngine* pEE, SfxItemPool* pItemPool ) :
pSharedVCL(EditDLL::Get().GetSharedVclResources()),
aPaperSize( 0x7FFFFFFF, 0x7FFFFFFF ),
aMinAutoPaperSize( 0x0, 0x0 ),
aMaxAutoPaperSize( 0x7FFFFFFF, 0x7FFFFFFF ),
......@@ -175,6 +176,7 @@ void ImpEditEngine::Dispose()
EndListening(*pApp);
pVirtDev.disposeAndClear();
mpOwnDev.disposeAndClear();
pSharedVCL.reset();
}
ImpEditEngine::~ImpEditEngine()
......@@ -204,7 +206,7 @@ void ImpEditEngine::SetRefDevice( OutputDevice* pRef )
if (pRef)
pRefDev = pRef;
else
pRefDev = EditDLL::Get().GetGlobalData()->GetStdVirtualDevice();
pRefDev = pSharedVCL->GetVirtualDevice();
nOnePixelInRef = (sal_uInt16)pRefDev->PixelToLogic( Size( 1, 0 ) ).Width();
......
......@@ -21,6 +21,10 @@
#define INCLUDED_EDITENG_EERDLL_HXX
class GlobalEditData;
namespace editeng
{
class SharedVclResources;
}
#include <tools/resid.hxx>
#include <editeng/editengdllapi.h>
......@@ -35,6 +39,7 @@ public:
class EditDLL
{
std::unique_ptr<GlobalEditData> pGlobalData;
std::weak_ptr<editeng::SharedVclResources> pSharedVcl;
public:
EditDLL();
......@@ -42,6 +47,7 @@ public:
static ResMgr* GetResMgr();
GlobalEditData* GetGlobalData() const { return pGlobalData.get(); }
std::shared_ptr<editeng::SharedVclResources> GetSharedVclResources();
static EditDLL& Get();
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment