]> git.saurik.com Git - wxWidgets.git/commitdiff
fix crash caused by an wxMDIClientWindow's GTK signal handler being called when the...
authorFrancesco Montorsi <f18m_cpp217828@yahoo.it>
Sat, 14 Mar 2009 01:24:45 +0000 (01:24 +0000)
committerFrancesco Montorsi <f18m_cpp217828@yahoo.it>
Sat, 14 Mar 2009 01:24:45 +0000 (01:24 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59523 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/mdi.h
src/gtk/mdi.cpp

index 53d10e8e28ac70d25609f1b0b44e591089322e38..a10f42fb22294174eff429ad93aa6c67af2b2784 100644 (file)
@@ -140,6 +140,7 @@ class WXDLLIMPEXP_CORE wxMDIClientWindow : public wxMDIClientWindowBase
 {
 public:
     wxMDIClientWindow() { }
+    ~wxMDIClientWindow();
 
     virtual bool CreateClient(wxMDIParentFrame *parent,
                               long style = wxVSCROLL | wxHSCROLL);
index 9511b2e22ddba44abddbaf1d8559db0188412a83..8e4a1eb6e7ebb3eaa87aea8461f64ef3d769afd3 100644 (file)
@@ -377,6 +377,19 @@ void wxMDIChildFrame::SetTitle( const wxString &title )
 
 IMPLEMENT_DYNAMIC_CLASS(wxMDIClientWindow, wxWindow)
 
+wxMDIClientWindow::~wxMDIClientWindow()
+{
+    // disconnect our handler because our ~wxWindow (which is going to be called
+    // after this dtor) will call DestroyChildren(); in turns our children
+    // ~wxWindow dtors will call wxWindow::Show(false) and this will generate
+    // a call to gtk_mdi_page_change_callback with an invalid parent
+    // (because gtk_mdi_page_change_callback expects a wxMDIClientWindow but
+    //  at that point of the dtor chain we are a simple wxWindow!)
+    g_signal_handlers_disconnect_by_func(m_widget, 
+                                         (gpointer)gtk_mdi_page_change_callback,
+                                         GetParent());
+}
+
 bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style)
 {
     if ( !PreCreation( parent, wxDefaultPosition, wxDefaultSize ) ||