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/+/158168
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
(cherry picked from commit e91027456807fab81e3ba1aeacc99ba0057673dd)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158279
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Michael Stahl <michael.stahl@allotropia.de>
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 38e56c8..9a470308 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -17240,6 +17240,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:
@@ -17294,7 +17300,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();
}