extern "C" {
static void
-gtk_mdi_page_change_callback( GtkNotebook *WXUNUSED(widget),
- GtkNotebookPage *page,
- gint WXUNUSED(page_num),
- wxMDIParentFrame *parent )
+switch_page(GtkNotebook* widget, GtkNotebookPage*, guint page_num, wxMDIParentFrame* parent)
{
// send deactivate event to old child
return;
child = NULL;
+ GtkWidget* page = gtk_notebook_get_nth_page(widget, page_num);
wxWindowList::compatibility_iterator node = client_window->GetChildren().GetFirst();
while ( node )
// child_frame can be NULL when this is called from dtor, probably
// because g_signal_connect (m_widget, "switch_page", (see below)
// isn't deleted early enough
- if ( child_frame && child_frame->m_page == page )
+ if (child_frame && child_frame->m_widget == page)
{
child = child_frame;
break;
if (m_justInserted)
{
GtkNotebook *notebook = GTK_NOTEBOOK(m_clientWindow->m_widget);
- gtk_notebook_set_current_page( notebook, g_list_length( notebook->children ) - 1 );
+ gtk_notebook_set_current_page(notebook, -1);
/* need to set the menubar of the child */
wxMDIChildFrame *active_child_frame = GetActiveChild();
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;
{
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;
}
{
if (menu_bar->Show(false))
{
- menu_bar->UnsetInvokingWindow( child_frame );
+ menu_bar->Detach();
}
}
}
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 );
}
}
}
gint i = gtk_notebook_get_current_page( notebook );
if (i < 0) return NULL;
- GtkNotebookPage* page = (GtkNotebookPage*) (g_list_nth(notebook->children,i)->data);
+ GtkWidget* page = gtk_notebook_get_nth_page(notebook, i);
if (!page) return NULL;
wxWindowList::compatibility_iterator node = m_clientWindow->GetChildren().GetFirst();
if (!child_frame)
return NULL;
- if (child_frame->m_page == page)
+ if (child_frame->m_widget == page)
return child_frame;
node = node->GetNext();
void wxMDIChildFrame::Init()
{
m_menuBar = NULL;
- m_page = NULL;
}
bool wxMDIChildFrame::Create(wxMDIParentFrame *parent,
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, (void*)switch_page, GetParent());
+}
+
bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style)
{
if ( !PreCreation( parent, wxDefaultPosition, wxDefaultSize ) ||
m_widget = gtk_notebook_new();
g_object_ref(m_widget);
- g_signal_connect (m_widget, "switch_page",
- G_CALLBACK (gtk_mdi_page_change_callback), parent);
+ g_signal_connect(m_widget, "switch_page", G_CALLBACK(switch_page), parent);
gtk_notebook_set_scrollable( GTK_NOTEBOOK(m_widget), 1 );
gtk_notebook_append_page( notebook, child->m_widget, label_widget );
- child_frame->m_page = (GtkNotebookPage*) (g_list_last(notebook->children)->data);
-
wxMDIParentFrame* parent_frame = static_cast<wxMDIParentFrame*>(GetParent());
parent_frame->m_justInserted = true;
}