+ wxCHECK_RET( m_list, wxT("invalid listbox") );
+
+ if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (m_list))
+ return;
+
+ // terribly efficient
+ const gchar *vadjustment_key = "gtk-vadjustment";
+ guint vadjustment_key_id = g_quark_from_static_string (vadjustment_key);
+
+ GtkAdjustment *adjustment =
+ (GtkAdjustment*) gtk_object_get_data_by_id (GTK_OBJECT (m_list), vadjustment_key_id);
+ wxCHECK_RET( adjustment, wxT("invalid listbox code") );
+
+ GList *target = g_list_nth( m_list->children, n );
+ wxCHECK_RET( target, wxT("invalid listbox index") );
+
+ 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;
+ gtk_adjustment_set_value( adjustment, y );