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 <caolanm@redhat.com>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx
index f26950f..b91ccb2 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 e8f5195..78148cd 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 b3dab5b..0fc8ffd 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();
}
};