From 5f3565a2fb3d678b03cf8547f37e56b1efe786f5 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Sat, 18 Dec 2004 13:13:52 +0000 Subject: [PATCH] Fix for the fix for wxChoice selection. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31055 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/choice.h | 4 +++- include/wx/gtk1/choice.h | 4 +++- src/gtk/choice.cpp | 45 ++++++++++++++++++++-------------------- src/gtk1/choice.cpp | 45 ++++++++++++++++++++-------------------- 4 files changed, 52 insertions(+), 46 deletions(-) diff --git a/include/wx/gtk/choice.h b/include/wx/gtk/choice.h index 70fea3819b..a00f825872 100644 --- a/include/wx/gtk/choice.h +++ b/include/wx/gtk/choice.h @@ -104,10 +104,12 @@ private: // allocate it if it's needed (hence using pointer) wxSortedArrayString *m_strings; +public: // this circumvents a GTK+ 2.0 bug so that the selection is // invalidated properly int m_selection_hack; - + +private: DECLARE_DYNAMIC_CLASS(wxChoice) }; diff --git a/include/wx/gtk1/choice.h b/include/wx/gtk1/choice.h index 70fea3819b..a00f825872 100644 --- a/include/wx/gtk1/choice.h +++ b/include/wx/gtk1/choice.h @@ -104,10 +104,12 @@ private: // allocate it if it's needed (hence using pointer) wxSortedArrayString *m_strings; +public: // this circumvents a GTK+ 2.0 bug so that the selection is // invalidated properly int m_selection_hack; - + +private: DECLARE_DYNAMIC_CLASS(wxChoice) }; diff --git a/src/gtk/choice.cpp b/src/gtk/choice.cpp index 39c259f1e5..58aff17892 100644 --- a/src/gtk/choice.cpp +++ b/src/gtk/choice.cpp @@ -47,6 +47,29 @@ static void gtk_choice_clicked_callback( GtkWidget *WXUNUSED(widget), wxChoice * if (g_blockEventsOnDrag) return; + int selection = wxNOT_FOUND; + +#ifdef __WXGTK20__ + selection = gtk_option_menu_get_history( GTK_OPTION_MENU(choice->GetHandle()) ); +#else + GtkMenuShell *menu_shell = GTK_MENU_SHELL( gtk_option_menu_get_menu( GTK_OPTION_MENU(choice->GetHandle()) ) ); + int count = 0; + + GList *child = menu_shell->children; + while (child) + { + GtkBin *bin = GTK_BIN( child->data ); + if (!bin->child) + { + selection = count: + break; + } + child = child->next; + count++; + } +#endif + choice->m_selection_hack = selection; + wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, choice->GetId() ); int n = choice->GetSelection(); @@ -354,30 +377,8 @@ int wxChoice::GetSelection() const { wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid choice") ); - // this has the same (if not better) behaviour as the following commented code return m_selection_hack; - /* -#ifdef __WXGTK20__ - - return gtk_option_menu_get_history( GTK_OPTION_MENU(m_widget) ); - -#else - GtkMenuShell *menu_shell = GTK_MENU_SHELL( gtk_option_menu_get_menu( GTK_OPTION_MENU(m_widget) ) ); - int count = 0; - - GList *child = menu_shell->children; - while (child) - { - GtkBin *bin = GTK_BIN( child->data ); - if (!bin->child) return count; - child = child->next; - count++; - } - - return -1; -#endif - */ } void wxChoice::SetString( int n, const wxString& str ) diff --git a/src/gtk1/choice.cpp b/src/gtk1/choice.cpp index 39c259f1e5..58aff17892 100644 --- a/src/gtk1/choice.cpp +++ b/src/gtk1/choice.cpp @@ -47,6 +47,29 @@ static void gtk_choice_clicked_callback( GtkWidget *WXUNUSED(widget), wxChoice * if (g_blockEventsOnDrag) return; + int selection = wxNOT_FOUND; + +#ifdef __WXGTK20__ + selection = gtk_option_menu_get_history( GTK_OPTION_MENU(choice->GetHandle()) ); +#else + GtkMenuShell *menu_shell = GTK_MENU_SHELL( gtk_option_menu_get_menu( GTK_OPTION_MENU(choice->GetHandle()) ) ); + int count = 0; + + GList *child = menu_shell->children; + while (child) + { + GtkBin *bin = GTK_BIN( child->data ); + if (!bin->child) + { + selection = count: + break; + } + child = child->next; + count++; + } +#endif + choice->m_selection_hack = selection; + wxCommandEvent event(wxEVT_COMMAND_CHOICE_SELECTED, choice->GetId() ); int n = choice->GetSelection(); @@ -354,30 +377,8 @@ int wxChoice::GetSelection() const { wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid choice") ); - // this has the same (if not better) behaviour as the following commented code return m_selection_hack; - /* -#ifdef __WXGTK20__ - - return gtk_option_menu_get_history( GTK_OPTION_MENU(m_widget) ); - -#else - GtkMenuShell *menu_shell = GTK_MENU_SHELL( gtk_option_menu_get_menu( GTK_OPTION_MENU(m_widget) ) ); - int count = 0; - - GList *child = menu_shell->children; - while (child) - { - GtkBin *bin = GTK_BIN( child->data ); - if (!bin->child) return count; - child = child->next; - count++; - } - - return -1; -#endif - */ } void wxChoice::SetString( int n, const wxString& str ) -- 2.45.2