X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e2762ff06a5e84c82242d0883d24d21042e5a97e..5541d1fda4b73af86e42b2f43724f0c063a352d0:/src/gtk1/listbox.cpp diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index 449d4fbe01..56089bfd2c 100644 --- a/src/gtk1/listbox.cpp +++ b/src/gtk1/listbox.cpp @@ -84,7 +84,7 @@ struct wxlistbox_idle_struct gint m_tag; }; -static gint wxlistbox_idle_callback( gpointer gdata ) +extern "C" gint wxlistbox_idle_callback( gpointer gdata ) { wxlistbox_idle_struct* data = (wxlistbox_idle_struct*) gdata; gdk_threads_enter(); @@ -267,9 +267,12 @@ static void gtk_listitem_select_cb( GtkWidget *widget, wxListBox *listbox, bool if (!listbox->m_hasVMT) return; if (g_blockEventsOnDrag) return; + + if (listbox->m_blockEvent) return; wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() ); event.SetEventObject( listbox ); + // MSW doesn't do that either // event.SetExtraLong( (long) is_selection ); @@ -335,6 +338,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, m_acceptsFocus = TRUE; m_isListBox = TRUE; m_prevSelection = 0; // or -1 ?? + m_blockEvent = FALSE; if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, validator, name )) @@ -389,8 +393,6 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, gtk_widget_show( GTK_WIDGET(m_list) ); - SetBestSize( size ); - if ( style & wxLB_SORT ) { // this will change DoAppend() behaviour @@ -407,11 +409,15 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, DoAppend(choices[i]); } + // call it after appending the strings to the listbox, otherwise it doesn't + // work correctly + SetBestSize( size ); + m_parent->DoAddChild( this ); PostCreation(); - SetBackgroundColour( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_LISTBOX ) ); + SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX ) ); SetForegroundColour( parent->GetForegroundColour() ); SetFont( parent->GetFont() ); @@ -663,6 +669,12 @@ void wxListBox::Clear() wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); gtk_list_clear_items( m_list, 0, GetCount() ); + + if ( GTK_LIST(m_list)->last_focus_child != NULL ) + { + // This should be NULL, I think. + GTK_LIST(m_list)->last_focus_child = NULL; + } if ( HasClientObjectData() ) { @@ -856,7 +868,7 @@ void wxListBox::SetSelection( int n, bool select ) { wxCHECK_RET( m_list != NULL, wxT("invalid listbox") ); - GtkDisableEvents(); + m_blockEvent = TRUE; if (select) { @@ -868,7 +880,7 @@ void wxListBox::SetSelection( int n, bool select ) else gtk_list_unselect_item( m_list, n ); - GtkEnableEvents(); + m_blockEvent = FALSE; } void wxListBox::DoSetFirstItem( int n ) @@ -940,38 +952,6 @@ void wxListBox::ApplyToolTip( GtkTooltips *tips, const wxChar *tip ) } #endif // wxUSE_TOOLTIPS -void wxListBox::GtkDisableEvents() -{ - GList *child = m_list->children; - while (child) - { - gtk_signal_disconnect_by_func( GTK_OBJECT(child->data), - GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); - - if (HasFlag(wxLB_MULTIPLE) || HasFlag(wxLB_EXTENDED)) - gtk_signal_disconnect_by_func( GTK_OBJECT(child->data), - GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); - - child = child->next; - } -} - -void wxListBox::GtkEnableEvents() -{ - GList *child = m_list->children; - while (child) - { - gtk_signal_connect( GTK_OBJECT(child->data), "select", - GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); - - if (HasFlag(wxLB_MULTIPLE) || HasFlag(wxLB_EXTENDED)) - gtk_signal_connect( GTK_OBJECT(child->data), "deselect", - GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); - - child = child->next; - } -} - GtkWidget *wxListBox::GetConnectWidget() { return GTK_WIDGET(m_list); @@ -1066,7 +1046,7 @@ wxSize wxListBox::DoGetBestSize() const } // Add room for the scrollbar - lbWidth += wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X); + lbWidth += wxSystemSettings::GetMetric(wxSYS_VSCROLL_X); // And just a bit more int cx, cy;