]> git.saurik.com Git - wxWidgets.git/commitdiff
[ 1865141 ] wxNotebook::DeletePage can result in invalid page selection
authorRobert Roebling <robert@roebling.de>
Mon, 7 Jan 2008 13:02:51 +0000 (13:02 +0000)
committerRobert Roebling <robert@roebling.de>
Mon, 7 Jan 2008 13:02:51 +0000 (13:02 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51073 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/gtk/notebook.cpp

index c063436f1ff59603b58c3e50d871abf383851ddc..ee0dec46a74813e33941636d0251bc368afd2470 100644 (file)
@@ -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;
 }