X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/03647350fc7cd141953c72e0284e928847d30f44..74a8f67d96591cec101def2a7d47c64072aff7fd:/src/gtk/mdi.cpp?ds=inline diff --git a/src/gtk/mdi.cpp b/src/gtk/mdi.cpp index 9778056ad3..760a4ac4ef 100644 --- a/src/gtk/mdi.cpp +++ b/src/gtk/mdi.cpp @@ -27,10 +27,7 @@ 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 @@ -49,6 +46,7 @@ gtk_mdi_page_change_callback( GtkNotebook *WXUNUSED(widget), return; child = NULL; + GtkWidget* page = gtk_notebook_get_nth_page(widget, page_num); wxWindowList::compatibility_iterator node = client_window->GetChildren().GetFirst(); while ( node ) @@ -58,7 +56,7 @@ gtk_mdi_page_change_callback( GtkNotebook *WXUNUSED(widget), // 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; @@ -114,7 +112,7 @@ void wxMDIParentFrame::OnInternalIdle() 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(); @@ -123,7 +121,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 +147,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 +161,7 @@ void wxMDIParentFrame::OnInternalIdle() { if (menu_bar->Show(false)) { - menu_bar->UnsetInvokingWindow( child_frame ); + menu_bar->Detach(); } } } @@ -173,12 +177,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 ); } } } @@ -214,7 +218,7 @@ wxMDIChildFrame *wxMDIParentFrame::GetActiveChild() const 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(); @@ -228,7 +232,7 @@ wxMDIChildFrame *wxMDIParentFrame::GetActiveChild() const if (!child_frame) return NULL; - if (child_frame->m_page == page) + if (child_frame->m_widget == page) return child_frame; node = node->GetNext(); @@ -263,7 +267,6 @@ END_EVENT_TABLE() void wxMDIChildFrame::Init() { m_menuBar = NULL; - m_page = NULL; } bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, @@ -385,9 +388,7 @@ wxMDIClientWindow::~wxMDIClientWindow() // 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()); + g_signal_handlers_disconnect_by_func(m_widget, (void*)switch_page, GetParent()); } bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style) @@ -403,8 +404,7 @@ bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style) 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 ); @@ -431,8 +431,6 @@ void wxMDIClientWindow::AddChildGTK(wxWindowGTK* child) 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(GetParent()); parent_frame->m_justInserted = true; }