vcl/unx/gtk3/gtkinst.cxx | 11 +++++++++++ 1 file changed, 11 insertions(+)
New commits: commit 3eb06d4708c79726607ad1ec4554b8f7cd66bbb2 Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Fri Oct 20 14:38:29 2023 +0100 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Mon Oct 23 07:30:03 2023 +0200 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.gran...@collabora.co.uk> diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 5eb5b15d03ed..d39c37a5bd1b 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(); }