diff options
Diffstat (limited to 'vcl/source/app')
-rw-r--r-- | vcl/source/app/help.cxx | 8 | ||||
-rw-r--r-- | vcl/source/app/salvtables.cxx | 2 | ||||
-rw-r--r-- | vcl/source/app/svapp.cxx | 44 | ||||
-rw-r--r-- | vcl/source/app/svdata.cxx | 62 | ||||
-rw-r--r-- | vcl/source/app/svmain.cxx | 26 |
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(); |