From c98826242f849bc2ab888c33f547c59dcf8db2fa Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Sat, 4 Nov 2006 18:29:28 +0000 Subject: [PATCH] Reorder event things a little. Two callbacks for page change and page changing. use signal_connect_after() for page changed event, as everywhere else, this should also make it possible to select a different page in the event handler. GetSelection just uses native call. Don't use m_skipEvent flag, disconnect from events. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43051 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/notebook.h | 13 ++-- src/gtk/notebook.cpp | 130 +++++++++++++------------------------- 2 files changed, 48 insertions(+), 95 deletions(-) diff --git a/include/wx/gtk/notebook.h b/include/wx/gtk/notebook.h index d58bbdf345..402029af71 100644 --- a/include/wx/gtk/notebook.h +++ b/include/wx/gtk/notebook.h @@ -116,15 +116,10 @@ public: // the additional page data (the pages themselves are in m_pages array) wxGtkNotebookPagesList m_pagesData; - // for reasons explained in gtk/notebook.cpp we store the current - // selection internally instead of querying the notebook for it - int m_selection; - - // flag set to true while we're inside "switch_page" callback - bool m_inSwitchPage; - - // flag set to true when the switch-page signal has been programatically generated - bool m_skipNextPageChangeEvent; + // we need to store the old selection since there + // is no other way to know about it at the time + // of the change selection event + int m_oldSelection; protected: // set all page's attributes diff --git a/src/gtk/notebook.cpp b/src/gtk/notebook.cpp index 4bb1ee5a07..bf86abbf3b 100644 --- a/src/gtk/notebook.cpp +++ b/src/gtk/notebook.cpp @@ -81,53 +81,34 @@ WX_DEFINE_LIST(wxGtkNotebookPagesList) //----------------------------------------------------------------------------- extern "C" { -static void gtk_notebook_page_change_callback(GtkNotebook *WXUNUSED(widget), - GtkNotebookPage *WXUNUSED(gpage), - guint page, - wxNotebook *notebook ) +static void gtk_notebook_page_changing_callback( GtkNotebook *widget, + GtkNotebookPage *WXUNUSED(gpage), + guint page, + wxNotebook *notebook ) { - // are you trying to call SetSelection() from a notebook event handler? - // you shouldn't! - wxCHECK_RET( !notebook->m_inSwitchPage, - _T("gtk_notebook_page_change_callback reentered") ); + int old = gtk_notebook_get_current_page( widget ); - notebook->m_inSwitchPage = true; - if (g_isIdle) - wxapp_install_idle_handler(); - - int old = notebook->GetSelection(); - - - if (notebook->m_skipNextPageChangeEvent) + if ( !notebook->SendPageChangingEvent(page) ) { - // this event was programatically generated by ChangeSelection() and thus must - // be skipped - notebook->m_skipNextPageChangeEvent = false; - - // make wxNotebook::GetSelection() return the correct (i.e. consistent - // with wxNotebookEvent::GetSelection()) value even though the page is - // not really changed in GTK+ - notebook->m_selection = page; + // program doesn't allow the page change + g_signal_stop_emission_by_name(notebook->m_widget, "switch_page"); } else { - if ( !notebook->SendPageChangingEvent(page) ) - { - // program doesn't allow the page change - g_signal_stop_emission_by_name(notebook->m_widget, "switch_page"); - } - else // change allowed - { - // make wxNotebook::GetSelection() return the correct (i.e. consistent - // with wxNotebookEvent::GetSelection()) value even though the page is - // not really changed in GTK+ - notebook->m_selection = page; - - notebook->SendPageChangedEvent(old); - } + // the page change event also reports the old page + notebook->m_oldSelection = old; } +} +} - notebook->m_inSwitchPage = false; +extern "C" { +static void gtk_notebook_page_changed_callback( GtkNotebook *widget, + GtkNotebookPage *WXUNUSED(gpage), + guint page, + wxNotebook *notebook ) +{ + int old = notebook->m_oldSelection; + notebook->SendPageChangedEvent( old ); } } @@ -216,7 +197,6 @@ gtk_notebook_key_press_callback( GtkWidget *widget, return FALSE; } - // m_selection = page; gtk_notebook_set_current_page( GTK_NOTEBOOK(widget), page ); return TRUE; @@ -287,11 +267,9 @@ END_EVENT_TABLE() void wxNotebook::Init() { m_padding = 0; - m_inSwitchPage = false; - m_skipNextPageChangeEvent = false; m_imageList = (wxImageList *) NULL; - m_selection = -1; + m_oldSelection = -1; m_themeEnabled = true; } @@ -337,7 +315,10 @@ bool wxNotebook::Create(wxWindow *parent, wxWindowID id, gtk_notebook_set_scrollable( GTK_NOTEBOOK(m_widget), 1 ); g_signal_connect (m_widget, "switch_page", - G_CALLBACK (gtk_notebook_page_change_callback), this); + G_CALLBACK (gtk_notebook_page_changing_callback), this); + + g_signal_connect_after (m_widget, "switch_page", + G_CALLBACK (gtk_notebook_page_changed_callback), this); m_parent->DoAddChild( this ); @@ -363,24 +344,7 @@ int wxNotebook::GetSelection() const { wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid notebook") ); - if ( m_selection == -1 ) - { - GList *nb_pages = GTK_NOTEBOOK(m_widget)->children; - - if (g_list_length(nb_pages) != 0) - { - GtkNotebook *notebook = GTK_NOTEBOOK(m_widget); - - gpointer cur = notebook->cur_page; - if ( cur != NULL ) - { - wxConstCast(this, wxNotebook)->m_selection = - g_list_index( nb_pages, cur ); - } - } - } - - return m_selection; + return gtk_notebook_get_current_page( GTK_NOTEBOOK(m_widget) ); } wxString wxNotebook::GetPageText( size_t page ) const @@ -423,21 +387,28 @@ int wxNotebook::DoSetSelection( size_t page, int flags ) int selOld = GetSelection(); if ( !(flags & SetSelection_SendEvent) ) - m_skipNextPageChangeEvent = true; + { + g_signal_handlers_disconnect_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); + } - // cache the selection - m_selection = page; gtk_notebook_set_current_page( GTK_NOTEBOOK(m_widget), page ); -#ifdef __WXDEBUG__ if ( !(flags & SetSelection_SendEvent) ) { - // gtk_notebook_set_current_page will emit the switch-page signal which will be - // caught by our gtk_notebook_page_change_callback which should have reset the - // flag to false: - wxASSERT(!m_skipNextPageChangeEvent); + // reconnect to signals + + 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); } -#endif // __WXDEBUG__ wxNotebookPage *client = GetPage(page); if ( client ) @@ -592,12 +563,6 @@ bool wxNotebook::DeleteAllPages() wxNotebookPage *wxNotebook::DoRemovePage( size_t page ) { - if ( m_selection != -1 && (size_t)m_selection >= page ) - { - // the index will become invalid after the page is deleted - m_selection = -1; - } - wxNotebookPage *client = wxNotebookBase::DoRemovePage(page); if ( !client ) return NULL; @@ -638,11 +603,6 @@ bool wxNotebook::InsertPage( size_t position, // hand here. win->m_widget->parent = NULL; - // don't receive switch page during addition - g_signal_handlers_disconnect_by_func (m_widget, - (gpointer) gtk_notebook_page_change_callback, - this); - if (m_themeEnabled) win->SetThemeEnabled(true); @@ -698,14 +658,12 @@ bool wxNotebook::InsertPage( size_t position, /* show the label */ gtk_widget_show( GTK_WIDGET(nb_page->m_label) ); + if (select && (m_pagesData.GetCount() > 1)) { - SetSelection( position ); + SetSelection( position ); } - g_signal_connect (m_widget, "switch_page", - G_CALLBACK (gtk_notebook_page_change_callback), this); - InvalidateBestSize(); return true; } -- 2.45.2