From 5a0a15cf56c4bfde818e9d575fb662612e156c2f Mon Sep 17 00:00:00 2001 From: Francesco Montorsi Date: Sat, 14 Mar 2009 01:24:45 +0000 Subject: [PATCH] fix crash caused by an wxMDIClientWindow's GTK signal handler being called when the wxMDIClientWindow is already (partially) destroyed: easily reproducible (without this fix) in the 'mdi' and 'svg' samples git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59523 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/mdi.h | 1 + src/gtk/mdi.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/wx/gtk/mdi.h b/include/wx/gtk/mdi.h index 53d10e8e28..a10f42fb22 100644 --- a/include/wx/gtk/mdi.h +++ b/include/wx/gtk/mdi.h @@ -140,6 +140,7 @@ class WXDLLIMPEXP_CORE wxMDIClientWindow : public wxMDIClientWindowBase { public: wxMDIClientWindow() { } + ~wxMDIClientWindow(); virtual bool CreateClient(wxMDIParentFrame *parent, long style = wxVSCROLL | wxHSCROLL); diff --git a/src/gtk/mdi.cpp b/src/gtk/mdi.cpp index 9511b2e22d..8e4a1eb6e7 100644 --- a/src/gtk/mdi.cpp +++ b/src/gtk/mdi.cpp @@ -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 ) || -- 2.47.2