]> git.saurik.com Git - wxWidgets.git/commitdiff
fix Gtk-CRITICAL errors when deleting wxDirButton
authorPaul Cornett <paulcor@bullseye.com>
Fri, 2 Aug 2013 17:01:03 +0000 (17:01 +0000)
committerPaul Cornett <paulcor@bullseye.com>
Fri, 2 Aug 2013 17:01:03 +0000 (17:01 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74619 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/gtk/filepicker.cpp

index afa3058e1b435b4f63c4c61e64fcac0548e6d1d9..3f99ce13f792c53bb988eed4e8649d73b699c710 100644 (file)
@@ -104,14 +104,13 @@ wxFileButton::~wxFileButton()
 {
     if ( m_dialog )
     {
-        // We need to delete the C++ dialog object here but we shouldn't delete
-        // its widget which is used by our GtkFileChooserButton and will be
-        // deleted by it when it is itself destroyed in our base class dtor. So
-        // take the widget ownership away from the dialog to avoid GTK+ errors
-        // that would happen if GtkFileChooserButton tried to access the
-        // already destroyed dialog widget.
-        g_object_unref(m_dialog->m_widget);
-        m_dialog->m_widget = NULL;
+        // when m_dialog is deleted, it will destroy the widget it is sharing
+        // with GtkFileChooserButton, which results in a bunch of Gtk-CRITICAL
+        // errors from GtkFileChooserButton. To avoid this, call gtk_widget_destroy()
+        // on GtkFileChooserButton first (our base dtor will do it again, but
+        // that does no harm). m_dialog holds a reference to the shared widget,
+        // so it won't go away until m_dialog base dtor unrefs it.
+        gtk_widget_destroy(m_widget);
         delete m_dialog;
     }
 }
@@ -269,7 +268,12 @@ bool wxDirButton::Create( wxWindow *parent, wxWindowID id,
 
 wxDirButton::~wxDirButton()
 {
-    delete m_dialog;
+    if (m_dialog)
+    {
+        // see ~wxFileButton() comment
+        gtk_widget_destroy(m_widget);
+        delete m_dialog;
+    }
 }
 
 void wxDirButton::GTKUpdatePath(const char *gtkpath)