diff options
-rw-r--r-- | framework/source/loadenv/loadenv.cxx | 8 | ||||
-rw-r--r-- | include/vcl/ctrl.hxx | 2 | ||||
-rw-r--r-- | include/vcl/window.hxx | 4 | ||||
-rw-r--r-- | vcl/inc/brdwin.hxx | 2 | ||||
-rw-r--r-- | vcl/source/window/brdwin.cxx | 12 | ||||
-rw-r--r-- | vcl/source/window/stacking.cxx | 4 | ||||
-rw-r--r-- | vcl/source/window/window.cxx | 18 | ||||
-rw-r--r-- | vcl/source/window/window3.cxx | 9 |
8 files changed, 31 insertions, 28 deletions
diff --git a/framework/source/loadenv/loadenv.cxx b/framework/source/loadenv/loadenv.cxx index 40b9917064ee..299b0fcd5ba4 100644 --- a/framework/source/loadenv/loadenv.cxx +++ b/framework/source/loadenv/loadenv.cxx @@ -1596,11 +1596,11 @@ void LoadEnv::impl_reactForLoadingState() css::uno::Reference< css::awt::XWindow > xWindow = m_xTargetFrame->getContainerWindow(); bool bHidden = m_lMediaDescriptor.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_HIDDEN, false); bool bMinimized = m_lMediaDescriptor.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_MINIMIZED, false); + VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow(xWindow); if (bMinimized) { SolarMutexGuard aSolarGuard; - VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow(xWindow); // check for system window is necessary to guarantee correct pointer cast! if (pWindow && pWindow->IsSystemWindow()) static_cast<WorkWindow*>(pWindow.get())->Minimize(); @@ -1612,6 +1612,9 @@ void LoadEnv::impl_reactForLoadingState() impl_makeFrameWindowVisible(xWindow, !m_bFocusedAndToFront && shouldFocusAndToFront()); } + if (pWindow) + pWindow->FlashWindow(); + // Note: Only if an existing property "FrameName" is given by this media descriptor, // it should be used. Otherwise we should do nothing. May be the outside code has already // set a frame name on the target! @@ -1700,8 +1703,7 @@ bool LoadEnv::shouldFocusAndToFront() const { bool const preview( m_lMediaDescriptor.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_PREVIEW, false)); - return !preview - && officecfg::Office::Common::View::NewDocumentHandling::ForceFocusAndToFront::get(); + return !preview; } // static diff --git a/include/vcl/ctrl.hxx b/include/vcl/ctrl.hxx index 3f838aba1a70..4e61822abf7a 100644 --- a/include/vcl/ctrl.hxx +++ b/include/vcl/ctrl.hxx @@ -230,6 +230,8 @@ public: /// Notify the LOK client about an invalidated area. virtual void LogicInvalidate( const tools::Rectangle* pRectangle ) override; + + virtual void FlashWindow() const override {}; }; #endif // INCLUDED_VCL_CTRL_HXX diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx index c71c0891c572..c78c214a5b60 100644 --- a/include/vcl/window.hxx +++ b/include/vcl/window.hxx @@ -694,7 +694,7 @@ private: // retrieves the list of owner draw decorated windows for this window hierarchy SAL_DLLPRIVATE ::std::vector<VclPtr<vcl::Window> >& ImplGetOwnerDrawList(); - SAL_DLLPRIVATE vcl::Window* ImplGetTopmostFrameWindow(); + SAL_DLLPRIVATE vcl::Window* ImplGetTopmostFrameWindow() const; SAL_DLLPRIVATE bool ImplStopDnd(); SAL_DLLPRIVATE void ImplStartDnd(); @@ -1119,7 +1119,7 @@ public: /// Dumps itself and potentially its children to a property tree, to be written easily to JSON. virtual void DumpAsPropertyTree(tools::JsonWriter&); - + /// Use OS specific way to bring user attention to current window virtual void FlashWindow() const; /** @name Accessibility diff --git a/vcl/inc/brdwin.hxx b/vcl/inc/brdwin.hxx index dbaa52ed02b2..f9c8a8edb894 100644 --- a/vcl/inc/brdwin.hxx +++ b/vcl/inc/brdwin.hxx @@ -169,8 +169,6 @@ public: tools::Rectangle GetMenuRect() const; virtual Size GetOptimalSize() const override; - - virtual void FlashWindow() const override; }; struct ImplBorderFrameData diff --git a/vcl/source/window/brdwin.cxx b/vcl/source/window/brdwin.cxx index 677da2047d1b..fb7c3a1b2db4 100644 --- a/vcl/source/window/brdwin.cxx +++ b/vcl/source/window/brdwin.cxx @@ -2001,16 +2001,4 @@ void ImplBorderWindow::queue_resize(StateChangedType eReason) vcl::Window::queue_resize(eReason); } -void ImplBorderWindow::FlashWindow() const -{ - // We are showing top level window without focus received. Let's flash it - // Use OS features to bring user attention to this window: find topmost one and FlashWindow - vcl::Window* pMyParent = mpWindowImpl->mpParent; - while (pMyParent && pMyParent->mpWindowImpl && pMyParent->mpWindowImpl->mpParent) - pMyParent = pMyParent->mpWindowImpl->mpParent; - - if (pMyParent && pMyParent->mpWindowImpl) - pMyParent->mpWindowImpl->mpFrame->FlashWindow(); -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/window/stacking.cxx b/vcl/source/window/stacking.cxx index d3c73916425a..84b4efadc27b 100644 --- a/vcl/source/window/stacking.cxx +++ b/vcl/source/window/stacking.cxx @@ -47,9 +47,9 @@ struct ImplCalcToTopData namespace vcl { -vcl::Window* Window::ImplGetTopmostFrameWindow() +vcl::Window* Window::ImplGetTopmostFrameWindow() const { - vcl::Window *pTopmostParent = this; + const vcl::Window *pTopmostParent = this; while( pTopmostParent->ImplGetParent() ) pTopmostParent = pTopmostParent->ImplGetParent(); return pTopmostParent->mpWindowImpl->mpFrameWindow; diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index 3cb43a8a4a05..8411888fe9ee 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -2316,14 +2316,20 @@ void Window::Show(bool bVisible, ShowFlags nFlags) // If it is a SystemWindow it automatically pops up on top of // all other windows if needed. - if ( ImplIsOverlapWindow() && !(nFlags & ShowFlags::NoActivate) ) + if (ImplIsOverlapWindow()) { - ImplStartToTop(( nFlags & ShowFlags::ForegroundTask ) ? ToTopFlags::ForegroundTask : ToTopFlags::NONE ); - ImplFocusToTop( ToTopFlags::NONE, false ); - } + if (!(nFlags & ShowFlags::NoActivate)) + { + ImplStartToTop((nFlags & ShowFlags::ForegroundTask) ? ToTopFlags::ForegroundTask + : ToTopFlags::NONE); + ImplFocusToTop(ToTopFlags::NONE, false); - if (!HasFocus() && GetParent()) { - GetParent()->FlashWindow(); + if (!(nFlags & ShowFlags::ForegroundTask)) + { + // Inform user about window if we did not popup it at foreground + FlashWindow(); + } + } } // adjust mpWindowImpl->mbReallyVisible diff --git a/vcl/source/window/window3.cxx b/vcl/source/window/window3.cxx index 44b3d4642850..002c892f592c 100644 --- a/vcl/source/window/window3.cxx +++ b/vcl/source/window/window3.cxx @@ -20,6 +20,7 @@ #include <vcl/window.hxx> #include <window.h> #include <vcl/cursor.hxx> +#include <salframe.hxx> namespace vcl { @@ -215,7 +216,13 @@ Color Window::GetBackgroundColor() const { return GetOutDev()->GetBackgroundColo void Window::EnableRTL(bool bEnable) { GetOutDev()->EnableRTL(bEnable); } -void Window::FlashWindow() const {} +void Window::FlashWindow() const +{ + vcl::Window* pMyParent = ImplGetTopmostFrameWindow(); + + if (pMyParent && pMyParent->mpWindowImpl) + pMyParent->mpWindowImpl->mpFrame->FlashWindow(); +} } /* namespace vcl */ |