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();
    }
};