diff options
author | Caolán McNamara <caolanm@redhat.com> | 2022-07-28 15:49:32 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2022-07-29 21:36:13 +0200 |
commit | d6c6fee69c1457e029095ef93779d971bc89c39d (patch) | |
tree | f555902bd5d753c63e1c3bbdbadf6e6015108e8b /sfx2 | |
parent | 275e05cc232b1dc39645f9444ee98932fb3ded58 (diff) |
Resolves: tdf#147782 restore focus to launching frame asynchronously
Change-Id: I7ebde70e4e1aae861f6ac7d70a91741596cb2cc5
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137572
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sfx2')
-rw-r--r-- | sfx2/source/dialog/recfloat.cxx | 15 | ||||
-rw-r--r-- | sfx2/source/inc/recfloat.hxx | 4 |
2 files changed, 16 insertions, 3 deletions
diff --git a/sfx2/source/dialog/recfloat.cxx b/sfx2/source/dialog/recfloat.cxx index d835e7640bc5..1b674f602b71 100644 --- a/sfx2/source/dialog/recfloat.cxx +++ b/sfx2/source/dialog/recfloat.cxx @@ -101,6 +101,7 @@ SfxRecordingFloat_Impl::SfxRecordingFloat_Impl(SfxBindings* pBind, SfxChildWindo "FloatingRecord") , m_xToolbar(m_xBuilder->weld_toolbar("toolbar")) , m_xDispatcher(new ToolbarUnoDispatcher(*m_xToolbar, *m_xBuilder, pBind->GetActiveFrame())) + , mnPostUserEventId(nullptr) , m_bFirstActivate(true) { // start recording @@ -109,6 +110,14 @@ SfxRecordingFloat_Impl::SfxRecordingFloat_Impl(SfxBindings* pBind, SfxChildWindo SfxCallMode::SYNCHRON, { &aItem }); } +IMPL_LINK_NOARG(SfxRecordingFloat_Impl, PresentParentFrame, void*, void) +{ + mnPostUserEventId = nullptr; + css::uno::Reference<css::awt::XTopWindow> xTopWindow(m_xDispatcher->GetFrame()->getContainerWindow(), css::uno::UNO_QUERY); + if (xTopWindow.is()) + xTopWindow->toFront(); +} + void SfxRecordingFloat_Impl::Activate() { SfxModelessDialogController::Activate(); @@ -116,13 +125,13 @@ void SfxRecordingFloat_Impl::Activate() return; // tdf#147782 retain focus in launching frame on the first activate on automatically gaining focus on getting launched m_bFirstActivate = false; - css::uno::Reference<css::awt::XTopWindow> xTopWindow(m_xDispatcher->GetFrame()->getContainerWindow(), css::uno::UNO_QUERY); - if (xTopWindow.is()) - xTopWindow->toFront(); + mnPostUserEventId = Application::PostUserEvent(LINK(this, SfxRecordingFloat_Impl, PresentParentFrame)); } SfxRecordingFloat_Impl::~SfxRecordingFloat_Impl() { + if (mnPostUserEventId) + Application::RemoveUserEvent(mnPostUserEventId); m_xDispatcher->dispose(); } diff --git a/sfx2/source/inc/recfloat.hxx b/sfx2/source/inc/recfloat.hxx index b7a4882cd72e..e5720e155cd6 100644 --- a/sfx2/source/inc/recfloat.hxx +++ b/sfx2/source/inc/recfloat.hxx @@ -42,7 +42,11 @@ class SfxRecordingFloat_Impl final : public SfxModelessDialogController { std::unique_ptr<weld::Toolbar> m_xToolbar; std::unique_ptr<ToolbarUnoDispatcher> m_xDispatcher; + ImplSVEvent *mnPostUserEventId; bool m_bFirstActivate; + + DECL_LINK(PresentParentFrame, void*, void); + public: SfxRecordingFloat_Impl(SfxBindings* pBindings, SfxChildWindow* pChildWin, |