From: Robert Roebling Date: Mon, 7 Jan 2008 13:02:51 +0000 (+0000) Subject: [ 1865141 ] wxNotebook::DeletePage can result in invalid page selection X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/a27555e45337d55328bc130ef442e8dc65775db3 [ 1865141 ] wxNotebook::DeletePage can result in invalid page selection git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51073 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/gtk/notebook.cpp b/src/gtk/notebook.cpp index c063436f1f..ee0dec46a7 100644 --- a/src/gtk/notebook.cpp +++ b/src/gtk/notebook.cpp @@ -465,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; @@ -474,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; }