Resolves: tdf#157849 gtk_spin_button_update callback can delete widget

so later GtkInstanceEditable::signal_activate is on deleted widget

Change-Id: I9bb9848b4554792db11fc7b0e2d3491a94975b3f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158167
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 5eb5b15..d39c37a 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -17313,6 +17313,12 @@ IMPL_LINK_NOARG(GtkInstanceIconView, async_signal_selection_changed, void*, void

namespace {

void signalDestroyFlag(GtkWidget*, gpointer destroyed)
{
    bool* pDestroyed = static_cast<bool*>(destroyed);
    *pDestroyed = true;
}

class GtkInstanceSpinButton : public GtkInstanceEditable, public virtual weld::SpinButton
{
private:
@@ -17367,7 +17373,12 @@ private:

    virtual void signal_activate() override
    {
        bool bActivateDestroy(false);
        gulong nDestroySignalId = g_signal_connect(m_pButton, "destroy", G_CALLBACK(signalDestroyFlag), &bActivateDestroy);
        gtk_spin_button_update(m_pButton);
        if (bActivateDestroy)
            return;
        g_signal_handler_disconnect(m_pButton, nDestroySignalId);
        GtkInstanceEditable::signal_activate();
    }