summaryrefslogtreecommitdiff
path: root/vcl/source/app
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/source/app')
-rw-r--r--vcl/source/app/help.cxx8
-rw-r--r--vcl/source/app/salvtables.cxx2
-rw-r--r--vcl/source/app/svapp.cxx44
-rw-r--r--vcl/source/app/svdata.cxx62
-rw-r--r--vcl/source/app/svmain.cxx26
5 files changed, 95 insertions, 47 deletions
diff --git a/vcl/source/app/help.cxx b/vcl/source/app/help.cxx
index 7abe54cdfac0..b7cf9f4d4b6b 100644
--- a/vcl/source/app/help.cxx
+++ b/vcl/source/app/help.cxx
@@ -118,8 +118,8 @@ bool Help::StartExtHelp()
aHelpData.mbExtHelpMode = true;
aHelpData.mbOldBalloonMode = aHelpData.mbBalloonHelp;
aHelpData.mbBalloonHelp = true;
- if ( pSVData->maWinData.mpAppWin )
- pSVData->maWinData.mpAppWin->ImplGenerateMouseMove();
+ if (pSVData->maFrameData.mpAppWin)
+ pSVData->maFrameData.mpAppWin->ImplGenerateMouseMove();
return true;
}
@@ -135,8 +135,8 @@ bool Help::EndExtHelp()
{
aHelpData.mbExtHelpMode = false;
aHelpData.mbBalloonHelp = aHelpData.mbOldBalloonMode;
- if ( pSVData->maWinData.mpAppWin )
- pSVData->maWinData.mpAppWin->ImplGenerateMouseMove();
+ if (pSVData->maFrameData.mpAppWin)
+ pSVData->maFrameData.mpAppWin->ImplGenerateMouseMove();
return true;
}
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 9b4ce8144916..856f6745b300 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -3741,7 +3741,7 @@ weld::Builder* Application::CreateInterimBuilder(weld::Widget* pParent, const OU
void SalInstanceWindow::help()
{
//show help for widget with keyboard focus
- vcl::Window* pWidget = ImplGetSVData()->maWinData.mpFocusWin;
+ vcl::Window* pWidget = ImplGetSVData()->mpWinData->mpFocusWin;
if (!pWidget)
pWidget = m_xWindow;
OString sHelpId = pWidget->GetHelpId();
diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx
index fed84899714c..b69941f316e1 100644
--- a/vcl/source/app/svapp.cxx
+++ b/vcl/source/app/svapp.cxx
@@ -186,7 +186,7 @@ int Application::Main()
bool Application::QueryExit()
{
- WorkWindow* pAppWin = ImplGetSVData()->maWinData.mpAppWin;
+ WorkWindow* pAppWin = ImplGetSVData()->maFrameData.mpAppWin;
// call the close handler of the application window
if ( pAppWin )
@@ -300,8 +300,8 @@ const vcl::KeyCode* Application::GetReservedKeyCode( sal_uLong i )
IMPL_STATIC_LINK_NOARG( ImplSVAppData, ImplEndAllPopupsMsg, void*, void )
{
ImplSVData* pSVData = ImplGetSVData();
- while (pSVData->maWinData.mpFirstFloat)
- pSVData->maWinData.mpFirstFloat->EndPopupMode(FloatWinPopupEndFlags::Cancel);
+ while (pSVData->mpWinData->mpFirstFloat)
+ pSVData->mpWinData->mpFirstFloat->EndPopupMode(FloatWinPopupEndFlags::Cancel);
}
IMPL_STATIC_LINK_NOARG( ImplSVAppData, ImplEndAllDialogsMsg, void*, void )
@@ -484,7 +484,7 @@ void Scheduler::ProcessEventsToIdle()
// events were processed at some point, but our check can't prevent further
// processing in the main thread, which may add new events, so skip it.
const ImplSVData* pSVData = ImplGetSVData();
- if (!pSVData->mpDefInst->IsMainThread())
+ if ( !pSVData->mpDefInst->IsMainThread() )
return;
for (int nTaskPriority = 0; nTaskPriority < PRIO_COUNT; ++nTaskPriority)
{
@@ -591,8 +591,8 @@ bool Application::IsUICaptured()
// If mouse was captured, or if in tracking- or in select-mode of a floatingwindow (e.g. menus
// or pulldown toolboxes) another window should be created
// D&D active !!!
- return pSVData->maWinData.mpCaptureWin || pSVData->maWinData.mpTrackWin ||
- pSVData->maWinData.mpFirstFloat || nImplSysDialog;
+ return pSVData->mpWinData->mpCaptureWin || pSVData->mpWinData->mpTrackWin
+ || pSVData->mpWinData->mpFirstFloat || nImplSysDialog;
}
void Application::OverrideSystemSettings( AllSettings& /*rSettings*/ )
@@ -601,7 +601,7 @@ void Application::OverrideSystemSettings( AllSettings& /*rSettings*/ )
void Application::MergeSystemSettings( AllSettings& rSettings )
{
- vcl::Window* pWindow = ImplGetSVData()->maWinData.mpFirstFrame;
+ vcl::Window* pWindow = ImplGetSVData()->maFrameData.mpFirstFrame;
if( ! pWindow )
pWindow = ImplGetDefaultWindow();
if( pWindow )
@@ -646,7 +646,7 @@ void Application::SetSettings( const AllSettings& rSettings )
ImplCallEventListenersApplicationDataChanged( &aDCEvt);
// Update all windows
- vcl::Window* pFirstFrame = pSVData->maWinData.mpFirstFrame;
+ vcl::Window* pFirstFrame = pSVData->maFrameData.mpFirstFrame;
// Reset data that needs to be re-calculated
long nOldDPIX = 0;
long nOldDPIY = 0;
@@ -681,7 +681,7 @@ void Application::SetSettings( const AllSettings& rSettings )
// if DPI resolution for screen output was changed set the new resolution for all
// screen compatible VirDev's
- pFirstFrame = pSVData->maWinData.mpFirstFrame;
+ pFirstFrame = pSVData->maFrameData.mpFirstFrame;
if ( pFirstFrame )
{
if ( (pFirstFrame->GetDPIX() != nOldDPIX) ||
@@ -742,7 +742,7 @@ void InitSettings(ImplSVData* pSVData)
void Application::NotifyAllWindows( DataChangedEvent& rDCEvt )
{
ImplSVData* pSVData = ImplGetSVData();
- vcl::Window* pFrame = pSVData->maWinData.mpFirstFrame;
+ vcl::Window* pFrame = pSVData->maFrameData.mpFirstFrame;
while ( pFrame )
{
pFrame->NotifyAllChildren( rDCEvt );
@@ -1053,12 +1053,12 @@ void Application::RemoveUserEvent( ImplSVEvent * nUserEvent )
WorkWindow* Application::GetAppWindow()
{
- return ImplGetSVData()->maWinData.mpAppWin;
+ return ImplGetSVData()->maFrameData.mpAppWin;
}
vcl::Window* Application::GetFocusWindow()
{
- return ImplGetSVData()->maWinData.mpFocusWin;
+ return ImplGetSVData()->mpWinData->mpFocusWin;
}
OutputDevice* Application::GetDefaultDevice()
@@ -1069,7 +1069,7 @@ OutputDevice* Application::GetDefaultDevice()
vcl::Window* Application::GetFirstTopLevelWindow()
{
ImplSVData* pSVData = ImplGetSVData();
- return pSVData->maWinData.mpFirstFrame;
+ return pSVData->maFrameData.mpFirstFrame;
}
vcl::Window* Application::GetNextTopLevelWindow( vcl::Window const * pWindow )
@@ -1081,7 +1081,7 @@ long Application::GetTopWindowCount()
{
long nRet = 0;
ImplSVData* pSVData = ImplGetSVData();
- vcl::Window *pWin = pSVData ? pSVData->maWinData.mpFirstFrame.get() : nullptr;
+ vcl::Window *pWin = pSVData ? pSVData->maFrameData.mpFirstFrame.get() : nullptr;
while( pWin )
{
if( pWin->ImplGetWindow()->IsTopWindow() )
@@ -1095,7 +1095,7 @@ vcl::Window* Application::GetTopWindow( long nIndex )
{
long nIdx = 0;
ImplSVData* pSVData = ImplGetSVData();
- vcl::Window *pWin = pSVData ? pSVData->maWinData.mpFirstFrame.get() : nullptr;
+ vcl::Window *pWin = pSVData ? pSVData->maFrameData.mpFirstFrame.get() : nullptr;
while( pWin )
{
if( pWin->ImplGetWindow()->IsTopWindow() )
@@ -1112,7 +1112,7 @@ vcl::Window* Application::GetTopWindow( long nIndex )
vcl::Window* Application::GetActiveTopWindow()
{
- vcl::Window *pWin = ImplGetSVData()->maWinData.mpFocusWin;
+ vcl::Window *pWin = ImplGetSVData()->mpWinData->mpFocusWin;
while( pWin )
{
if( pWin->IsTopWindow() )
@@ -1185,8 +1185,8 @@ OUString Application::GetDisplayName()
ImplSVData* pSVData = ImplGetSVData();
if ( pSVData->maAppData.mxDisplayName )
return *(pSVData->maAppData.mxDisplayName);
- else if ( pSVData->maWinData.mpAppWin )
- return pSVData->maWinData.mpAppWin->GetText();
+ else if (pSVData->maFrameData.mpAppWin)
+ return pSVData->maFrameData.mpAppWin->GetText();
else
return OUString();
}
@@ -1348,7 +1348,7 @@ vcl::Window* Application::GetDefDialogParent()
// as DefDialogParent
// current focus frame
- vcl::Window *pWin = pSVData->maWinData.mpFocusWin;
+ vcl::Window *pWin = pSVData->mpWinData->mpFocusWin;
if (pWin && !pWin->IsMenuFloatingWindow())
{
while (pWin->mpWindowImpl && pWin->mpWindowImpl->mpParent)
@@ -1358,7 +1358,7 @@ vcl::Window* Application::GetDefDialogParent()
if (!pWin->mpWindowImpl)
{
OSL_FAIL( "Window hierarchy corrupted!" );
- pSVData->maWinData.mpFocusWin = nullptr; // avoid further access
+ pSVData->mpWinData->mpFocusWin = nullptr; // avoid further access
return nullptr;
}
@@ -1369,14 +1369,14 @@ vcl::Window* Application::GetDefDialogParent()
}
// last active application frame
- pWin = pSVData->maWinData.mpActiveApplicationFrame;
+ pWin = pSVData->maFrameData.mpActiveApplicationFrame;
if (pWin)
{
return pWin->mpWindowImpl->mpFrameWindow->ImplGetWindow();
}
// first visible top window (may be totally wrong....)
- pWin = pSVData->maWinData.mpFirstFrame;
+ pWin = pSVData->maFrameData.mpFirstFrame;
while (pWin)
{
if( pWin->ImplGetWindow()->IsTopWindow() &&
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() {}
diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx
index 3fd6d86b1bc0..74b7fa6a0789 100644
--- a/vcl/source/app/svmain.cxx
+++ b/vcl/source/app/svmain.cxx
@@ -487,7 +487,7 @@ void DeInitVCL()
Scheduler::ImplDeInitScheduler();
- pSVData->maWinData.maMsgBoxImgList.clear();
+ pSVData->mpWinData->maMsgBoxImgList.clear();
pSVData->maCtrlData.maCheckImgList.clear();
pSVData->maCtrlData.maRadioImgList.clear();
pSVData->maCtrlData.mpDisclosurePlus.reset();
@@ -538,7 +538,7 @@ void DeInitVCL()
pSVData->maAppData.mpSettings.reset();
}
- if (pSVData->maAppData.mpAccelMgr)
+ if ( pSVData->maAppData.mpAccelMgr )
{
delete pSVData->maAppData.mpAccelMgr;
pSVData->maAppData.mpAccelMgr = nullptr;
@@ -569,17 +569,17 @@ void DeInitVCL()
pSVData->maGDIData.mpLastVirDev = nullptr;
pSVData->maGDIData.mpFirstPrinter = nullptr;
pSVData->maGDIData.mpLastPrinter = nullptr;
- pSVData->maWinData.mpFirstFrame = nullptr;
- pSVData->maWinData.mpAppWin = nullptr;
- pSVData->maWinData.mpActiveApplicationFrame = nullptr;
- pSVData->maWinData.mpCaptureWin = nullptr;
- pSVData->maWinData.mpLastDeacWin = nullptr;
- pSVData->maWinData.mpFirstFloat = nullptr;
- pSVData->maWinData.mpExecuteDialogs.clear();
- pSVData->maWinData.mpExtTextInputWin = nullptr;
- pSVData->maWinData.mpTrackWin = nullptr;
- pSVData->maWinData.mpAutoScrollWin = nullptr;
- pSVData->maWinData.mpLastWheelWindow = nullptr;
+ pSVData->maFrameData.mpFirstFrame = nullptr;
+ pSVData->maFrameData.mpAppWin = nullptr;
+ pSVData->maFrameData.mpActiveApplicationFrame = nullptr;
+ pSVData->mpWinData->mpCaptureWin = nullptr;
+ pSVData->mpWinData->mpLastDeacWin = nullptr;
+ pSVData->mpWinData->mpFirstFloat = nullptr;
+ pSVData->mpWinData->mpExecuteDialogs.clear();
+ pSVData->mpWinData->mpExtTextInputWin = nullptr;
+ pSVData->mpWinData->mpTrackWin = nullptr;
+ pSVData->mpWinData->mpAutoScrollWin = nullptr;
+ pSVData->mpWinData->mpLastWheelWindow = nullptr;
pSVData->maGDIData.mxScreenFontList.reset();
pSVData->maGDIData.mxScreenFontCache.reset();