X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a1abca322fd7a9a7abe6cc0b144987786faa0f05..601398b9b1e63109f44af34ff79bc558fe929b4d:/src/gtk/notebook.cpp?ds=inline diff --git a/src/gtk/notebook.cpp b/src/gtk/notebook.cpp index 4c9ef39535..ee0dec46a7 100644 --- a/src/gtk/notebook.cpp +++ b/src/gtk/notebook.cpp @@ -101,9 +101,9 @@ static void gtk_notebook_page_changing_callback( GtkNotebook *widget, } extern "C" { -static void gtk_notebook_page_changed_callback( GtkNotebook *widget, +static void gtk_notebook_page_changed_callback( GtkNotebook * WXUNUSED(widget), GtkNotebookPage *WXUNUSED(gpage), - guint page, + guint WXUNUSED(page), wxNotebook *notebook ) { int old = notebook->m_oldSelection; @@ -127,17 +127,6 @@ static void gtk_page_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* } win->SetSize( alloc->x, alloc->y, alloc->width, alloc->height ); - - /* GTK 1.2 up to version 1.2.5 is broken so that we have to call allocate - here in order to make repositioning after resizing to take effect. */ - if ((gtk_major_version == 1) && - (gtk_minor_version == 2) && - (gtk_micro_version < 6) && - (win->m_wxwindow) && - (GTK_WIDGET_REALIZED(win->m_wxwindow))) - { - gtk_widget_size_allocate( win->m_wxwindow, alloc ); - } } } @@ -159,7 +148,7 @@ gtk_notebook_realized_callback( GtkWidget * WXUNUSED(widget), wxWindow *win ) // InsertChild callback for wxNotebook //----------------------------------------------------------------------------- -static void wxInsertChildInNotebook( wxNotebook* parent, wxWindow* child ) +static void wxInsertChildInNotebook(wxWindow* parent, wxWindow* child) { // Hack Alert! (Part I): This sets the notebook as the parent of the child // widget, and takes care of some details such as updating the state and @@ -180,9 +169,9 @@ static void wxInsertChildInNotebook( wxNotebook* parent, wxWindow* child ) // wxNotebook //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxNotebook,wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxNotebook,wxBookCtrlBase) -BEGIN_EVENT_TABLE(wxNotebook, wxControl) +BEGIN_EVENT_TABLE(wxNotebook, wxBookCtrlBase) EVT_NAVIGATION_KEY(wxNotebook::OnNavigationKey) END_EVENT_TABLE() @@ -217,8 +206,7 @@ bool wxNotebook::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) { - m_needParent = true; - m_insertCallback = (wxInsertChildFunction)wxInsertChildInNotebook; + m_insertCallback = wxInsertChildInNotebook; if ( (style & wxBK_ALIGN_MASK) == wxBK_DEFAULT ) style |= wxBK_TOP; @@ -306,26 +294,22 @@ int wxNotebook::DoSetSelection( size_t page, int flags ) if ( !(flags & SetSelection_SendEvent) ) { - g_signal_handlers_disconnect_by_func (m_widget, - (gpointer) gtk_notebook_page_changing_callback, - this); + g_signal_handlers_block_by_func(m_widget, + (gpointer)gtk_notebook_page_changing_callback, this); - g_signal_handlers_disconnect_by_func (m_widget, - (gpointer) gtk_notebook_page_changed_callback, - this); + g_signal_handlers_block_by_func(m_widget, + (gpointer)gtk_notebook_page_changed_callback, this); } gtk_notebook_set_current_page( GTK_NOTEBOOK(m_widget), page ); if ( !(flags & SetSelection_SendEvent) ) { - // reconnect to signals + g_signal_handlers_unblock_by_func(m_widget, + (gpointer)gtk_notebook_page_changing_callback, this); - g_signal_connect (m_widget, "switch_page", - G_CALLBACK (gtk_notebook_page_changing_callback), this); - - g_signal_connect_after (m_widget, "switch_page", - G_CALLBACK (gtk_notebook_page_changed_callback), this); + g_signal_handlers_unblock_by_func(m_widget, + (gpointer)gtk_notebook_page_changed_callback, this); } wxNotebookPage *client = GetPage(page); @@ -481,7 +465,12 @@ bool wxNotebook::DeleteAllPages() wxNotebookPage *wxNotebook::DoRemovePage( size_t page ) { - wxNotebookPage *client = wxNotebookBase::DoRemovePage(page); + // We cannot remove the page yet, as GTK sends the "switch_page" + // signal before it has removed the notebook-page from its + // corresponding list. Thus, if we were to remove the page from + // m_pages at this point, the two lists of pages would be out + // of sync during the PAGE_CHANGING/PAGE_CHANGED events. + wxNotebookPage *client = GetPage(page); if ( !client ) return NULL; @@ -490,13 +479,16 @@ wxNotebookPage *wxNotebook::DoRemovePage( size_t page ) // we don't need to unparent the client->m_widget; GTK+ will do // that for us (and will throw a warning if we do it!) - gtk_notebook_remove_page( GTK_NOTEBOOK(m_widget), page ); + // It's safe to remove the page now. + wxASSERT_MSG(GetPage(page) == client, wxT("pages changed during delete")); + wxNotebookBase::DoRemovePage(page); + wxGtkNotebookPage* p = GetNotebookPage(page); m_pagesData.DeleteObject(p); delete p; - + return client; }