From 9c3900e40d7709af9f7764c81334eb24d087290e Mon Sep 17 00:00:00 2001 From: Paul Cornett Date: Sat, 5 Nov 2016 17:27:57 -0700 Subject: [PATCH] Cleaner fix for using deleted widget in idle callback Use a slightly higher idle priority so callback runs before TLW is deleted, and ref the widget just to make sure it doesn't disappear. Avoids accessing de-allocated memory. --- src/gtk/toplevel.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index 53d59d6088..5c173ab8dd 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -1145,12 +1145,8 @@ void wxTopLevelWindowGTK::DoSetSize( int x, int y, int width, int height, int si extern "C" { static gboolean reset_size_request(void* data) { - if ( GTK_IS_WIDGET(data) ) - { - gtk_widget_set_size_request(GTK_WIDGET(data), -1, -1); - } - //else: the window has probably been deleted before the idle callback was - // invoked + gtk_widget_set_size_request(GTK_WIDGET(data), -1, -1); + g_object_unref(data); return false; } } @@ -1179,7 +1175,8 @@ void wxTopLevelWindowGTK::DoSetClientSize(int width, int height) { gtk_widget_set_size_request(m_wxwindow, m_clientWidth, m_clientHeight); // Cancel size request at next idle to allow resizing - g_idle_add_full(G_PRIORITY_LOW, reset_size_request, m_wxwindow, NULL); + g_idle_add_full(G_PRIORITY_LOW - 1, reset_size_request, m_wxwindow, NULL); + g_object_ref(m_wxwindow); } } }