vcl/inc/salvtables.hxx | 2 ++ vcl/source/app/salvtables.cxx | 11 +++++++++-- vcl/unx/gtk3/gtkinst.cxx | 15 ++++++++++++--- 3 files changed, 23 insertions(+), 5 deletions(-)
New commits: commit f5137ed5453661d21e85ecb94a08cfccae899ca1 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Tue Nov 23 08:54:58 2021 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Tue Nov 23 17:35:26 2021 +0100 only call signal_closed from Popdown dtor if it is still open Change-Id: I251239a6ebbd3f55b68a0c2cb15b4bd6728e19c7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125703 Tested-by: Caolán McNamara <caol...@redhat.com> Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx index f26950fb42a6..b91ccb26cb7f 100644 --- a/vcl/inc/salvtables.hxx +++ b/vcl/inc/salvtables.hxx @@ -1898,6 +1898,8 @@ private: DECL_LINK(PopupModeEndHdl, FloatingWindow*, void); + void ImplPopDown(); + public: SalInstancePopover(DockingWindow* pPopover, SalInstanceBuilder* pBuilder, bool bTakeOwnership); diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index e8f51950b04f..78148cd10ea8 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -6696,7 +6696,12 @@ SalInstancePopover::SalInstancePopover(DockingWindow* pPopover, SalInstanceBuild { } -SalInstancePopover::~SalInstancePopover() { signal_closed(); } +SalInstancePopover::~SalInstancePopover() +{ + DockingManager* pDockingManager = vcl::Window::GetDockingManager(); + if (pDockingManager->IsInPopupMode(m_xPopover)) + ImplPopDown(); +} void SalInstancePopover::popup_at_rect(weld::Widget* pParent, const tools::Rectangle& rRect, weld::Placement ePlace) @@ -6726,13 +6731,15 @@ void SalInstancePopover::popup_at_rect(weld::Widget* pParent, const tools::Recta pDockingManager->StartPopupMode(m_xPopover, aRect, nFlags); } -void SalInstancePopover::popdown() +void SalInstancePopover::ImplPopDown() { vcl::Window::GetDockingManager()->EndPopupMode(m_xPopover); m_xPopover->EnableDocking(false); signal_closed(); } +void SalInstancePopover::popdown() { ImplPopDown(); } + IMPL_LINK_NOARG(SalInstancePopover, PopupModeEndHdl, FloatingWindow*, void) { signal_closed(); } SalInstanceBuilder::SalInstanceBuilder(vcl::Window* pParent, const OUString& rUIRoot, diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index b3dab5b14ef5..0fc8ffd9366c 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -22195,17 +22195,26 @@ public: gtk_popover_popdown(m_pPopover); } + void PopdownAndFlushClosedSignal() + { + if (get_visible()) + popdown(); + if (m_pClosedEvent) + { + Application::RemoveUserEvent(m_pClosedEvent); + async_signal_closed(nullptr); + } + } + virtual ~GtkInstancePopover() override { + PopdownAndFlushClosedSignal(); DisconnectMouseEvents(); #if !GTK_CHECK_VERSION(4, 0, 0) if (m_pMenuHack) gtk_widget_destroy(GTK_WIDGET(m_pMenuHack)); #endif - if (m_pClosedEvent) - Application::RemoveUserEvent(m_pClosedEvent); g_signal_handler_disconnect(m_pPopover, m_nSignalId); - signal_closed(); } };