diff options
author | Ashod Nakashian <ashod.nakashian@collabora.co.uk> | 2019-05-29 23:33:25 -0400 |
---|---|---|
committer | Ashod Nakashian <ashnakash@gmail.com> | 2019-12-11 20:52:12 +0100 |
commit | cde58f1726f8da36968eb8faba76aee83a9d3448 (patch) | |
tree | af37f180de247154d5471ef9f6d0cb997e5600eb /vcl/source/app/svdata.cxx | |
parent | 85f3f8de19e63f41e9c304427e9f7a840480f21c (diff) |
vcl: sfx2: LOK: Support per-view popup windows
While we do support multiple views, there is only
one state for popup/floating windows, that also
includes the dialogs open and related windows/data.
This adds support to allow each view to have its own
popups and state, thus allowing multiple users to
interact with the dialogs independently of one
another.
(cherry picked from commit b50c341a53911f1d725947a4d8d3d2f782c94079)
Change-Id: I3786a561ca6ca113ad12425bdb491e5a30bd1a28
Reviewed-on: https://gerrit.libreoffice.org/82440
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Ashod Nakashian <ashnakash@gmail.com>
Diffstat (limited to 'vcl/source/app/svdata.cxx')
-rw-r--r-- | vcl/source/app/svdata.cxx | 62 |
1 files changed, 55 insertions, 7 deletions
diff --git a/vcl/source/app/svdata.cxx b/vcl/source/app/svdata.cxx index 84f268d77015..daa7a20e71aa 100644 --- a/vcl/source/app/svdata.cxx +++ b/vcl/source/app/svdata.cxx @@ -76,6 +76,10 @@ namespace struct private_aImplSVHelpData : public rtl::Static<ImplSVHelpData, private_aImplSVHelpData> {}; + /// Default instance ensures that ImplSVData::mpWinData is never null. + struct private_aImplSVWinData : + public rtl::Static<ImplSVWinData, private_aImplSVWinData> {}; + } ImplSVData* ImplGetSVData() { @@ -237,8 +241,8 @@ basegfx::SystemDependentDataManager& ImplGetSystemDependentDataManager() vcl::Window* ImplGetDefaultWindow() { ImplSVData* pSVData = ImplGetSVData(); - if ( pSVData->maWinData.mpAppWin ) - return pSVData->maWinData.mpAppWin; + if (pSVData->maFrameData.mpAppWin) + return pSVData->maFrameData.mpAppWin; else return ImplGetDefaultContextWindow(); } @@ -387,6 +391,54 @@ void LocaleConfigurationListener::ConfigurationChanged( utl::ConfigurationBroadc AllSettings::LocaleSettingsChanged( nHint ); } +ImplSVWinData* CreateSVWinData() +{ + if (!comphelper::LibreOfficeKit::isActive()) + return nullptr; + + ImplSVWinData* p = new ImplSVWinData(); + + ImplSVData* pSVData = ImplGetSVData(); + assert(pSVData && pSVData->mpWinData); + + p->mpFocusWin = pSVData->mpWinData->mpFocusWin; + return p; +} + +void DestroySVWinData(ImplSVWinData* pData) +{ + delete static_cast<ImplSVWinData*>(pData); +} + +void SetSVWinData(ImplSVWinData* pSVWinData) +{ + if (!comphelper::LibreOfficeKit::isActive()) + return; + + ImplSVData* pSVData = ImplGetSVData(); + assert(pSVData != nullptr); + + if (pSVData->mpWinData != pSVWinData) + { + // If current one is the static, clean it up to avoid having lingering references. + if (pSVData->mpWinData == &private_aImplSVWinData::get()) + { + pSVData->mpWinData->mpFocusWin.reset(); + } + + pSVData->mpWinData = pSVWinData; + if (pSVData->mpWinData == nullptr) + { + pSVData->mpWinData = &private_aImplSVWinData::get(); // Never leave it null. + } + } +} + +ImplSVData::ImplSVData() +{ + mpHelpData = &private_aImplSVHelpData::get(); + mpWinData = &private_aImplSVWinData::get(); +} ImplSVHelpData* CreateSVHelpData() { @@ -447,11 +499,6 @@ void SetSVHelpData(ImplSVHelpData* pSVHelpData) } } -ImplSVData::ImplSVData() -{ - mpHelpData = &private_aImplSVHelpData::get(); -} - ImplSVHelpData& ImplGetSVHelpData() { ImplSVData* pSVData = ImplGetSVData(); @@ -468,6 +515,7 @@ ImplSVHelpData& ImplGetSVHelpData() ImplSVData::~ImplSVData() {} ImplSVAppData::~ImplSVAppData() {} ImplSVGDIData::~ImplSVGDIData() {} +ImplSVFrameData::~ImplSVFrameData() {} ImplSVWinData::~ImplSVWinData() {} ImplSVHelpData::~ImplSVHelpData() {} |