summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2022-07-28 15:49:32 +0100
committerCaolán McNamara <caolanm@redhat.com>2022-07-29 21:36:13 +0200
commitd6c6fee69c1457e029095ef93779d971bc89c39d (patch)
treef555902bd5d753c63e1c3bbdbadf6e6015108e8b
parent275e05cc232b1dc39645f9444ee98932fb3ded58 (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>
-rw-r--r--sfx2/source/dialog/recfloat.cxx15
-rw-r--r--sfx2/source/inc/recfloat.hxx4
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,