From 02b1952cd964abe4b394f1564366d660a23d06d9 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Mon, 23 Oct 2000 11:32:30 +0000 Subject: [PATCH] Added support for wxListBox::SetFirstItem() directly after creating the listbox. If you now call this and delete the listbox directly afterwards, you'll get problems since the code waits for idle time. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_2_BRANCH@8623 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/gtk/listbox.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/gtk1/listbox.cpp | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/src/gtk/listbox.cpp b/src/gtk/listbox.cpp index 9cb860b8aa..941cecd17d 100644 --- a/src/gtk/listbox.cpp +++ b/src/gtk/listbox.cpp @@ -81,6 +81,32 @@ extern wxCursor g_globalCursor; static bool g_hasDoubleClicked = FALSE; +//----------------------------------------------------------------------------- +// idle callback for SetFirstItem +//----------------------------------------------------------------------------- + +struct wxlistbox_idle_struct +{ + wxListBox *m_listbox; + int m_item; + gint m_tag; +}; + +static gint wxlistbox_idle_callback( wxlistbox_idle_struct *data ) +{ + gdk_threads_enter(); + + gtk_idle_remove( data->m_tag ); + + data->m_listbox->SetFirstItem( data->m_item ); + + delete data; + + gdk_threads_leave(); + + return TRUE; +} + //----------------------------------------------------------------------------- // "button_release_event" //----------------------------------------------------------------------------- @@ -819,6 +845,16 @@ void wxListBox::DoSetFirstItem( int n ) GtkWidget *item = GTK_WIDGET(target->data); wxCHECK_RET( item, wxT("invalid listbox code") ); + if (item->allocation.y == -1) + { + wxlistbox_idle_struct* data = new wxlistbox_idle_struct; + data->m_listbox = this; + data->m_item = n; + data->m_tag = gtk_idle_add_priority( 800, wxlistbox_idle_callback, (gpointer) data ); + + return; + } + float y = item->allocation.y; if (y > adjustment->upper - adjustment->page_size) y = adjustment->upper - adjustment->page_size; diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index 9cb860b8aa..941cecd17d 100644 --- a/src/gtk1/listbox.cpp +++ b/src/gtk1/listbox.cpp @@ -81,6 +81,32 @@ extern wxCursor g_globalCursor; static bool g_hasDoubleClicked = FALSE; +//----------------------------------------------------------------------------- +// idle callback for SetFirstItem +//----------------------------------------------------------------------------- + +struct wxlistbox_idle_struct +{ + wxListBox *m_listbox; + int m_item; + gint m_tag; +}; + +static gint wxlistbox_idle_callback( wxlistbox_idle_struct *data ) +{ + gdk_threads_enter(); + + gtk_idle_remove( data->m_tag ); + + data->m_listbox->SetFirstItem( data->m_item ); + + delete data; + + gdk_threads_leave(); + + return TRUE; +} + //----------------------------------------------------------------------------- // "button_release_event" //----------------------------------------------------------------------------- @@ -819,6 +845,16 @@ void wxListBox::DoSetFirstItem( int n ) GtkWidget *item = GTK_WIDGET(target->data); wxCHECK_RET( item, wxT("invalid listbox code") ); + if (item->allocation.y == -1) + { + wxlistbox_idle_struct* data = new wxlistbox_idle_struct; + data->m_listbox = this; + data->m_item = n; + data->m_tag = gtk_idle_add_priority( 800, wxlistbox_idle_callback, (gpointer) data ); + + return; + } + float y = item->allocation.y; if (y > adjustment->upper - adjustment->page_size) y = adjustment->upper - adjustment->page_size;