X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d2824cdb7f6ac2371fefd3d44eff62bb48ebc0a3..708cc39462e4f113ab1a52b502b79d1e473059e7:/src/gtk/mdi.cpp diff --git a/src/gtk/mdi.cpp b/src/gtk/mdi.cpp index 9511b2e22d..1a3c3f570d 100644 --- a/src/gtk/mdi.cpp +++ b/src/gtk/mdi.cpp @@ -123,7 +123,7 @@ void wxMDIParentFrame::OnInternalIdle() wxMenuBar *menu_bar = active_child_frame->m_menuBar; if (menu_bar) { - menu_bar->SetInvokingWindow(active_child_frame); + menu_bar->Attach(active_child_frame); } } m_justInserted = false; @@ -149,7 +149,13 @@ void wxMDIParentFrame::OnInternalIdle() { if (menu_bar->Show(true)) { - menu_bar->SetInvokingWindow( child_frame ); + // Attach() asserts if we call it for an already + // attached menu bar so don't do it if we're already + // associated with this frame (it would be nice to get + // rid of this check and ensure that this doesn't + // happen...) + if ( menu_bar->GetFrame() != child_frame ) + menu_bar->Attach( child_frame ); } visible_child_menu = true; } @@ -157,7 +163,7 @@ void wxMDIParentFrame::OnInternalIdle() { if (menu_bar->Show(false)) { - menu_bar->UnsetInvokingWindow( child_frame ); + menu_bar->Detach(); } } } @@ -173,12 +179,12 @@ void wxMDIParentFrame::OnInternalIdle() if (visible_child_menu) { m_frameMenuBar->Show( false ); - m_frameMenuBar->UnsetInvokingWindow( this ); + m_frameMenuBar->Detach(); } else { m_frameMenuBar->Show( true ); - m_frameMenuBar->SetInvokingWindow( this ); + m_frameMenuBar->Attach( this ); } } } @@ -377,6 +383,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 ) ||