+//-----------------------------------------------------------------------------
+// "key_press_event"
+//-----------------------------------------------------------------------------
+
+extern "C" {
+static gint
+gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxListBox *listbox )
+{
+ if (g_isIdle)
+ wxapp_install_idle_handler();
+
+ if (g_blockEventsOnDrag)
+ return FALSE;
+
+ bool ret = FALSE;
+
+ if ((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab))
+ {
+ wxNavigationKeyEvent new_event;
+ /* GDK reports GDK_ISO_Left_Tab for SHIFT-TAB */
+ new_event.SetDirection( (gdk_event->keyval == GDK_Tab) );
+ /* CTRL-TAB changes the (parent) window, i.e. switch notebook page */
+ new_event.SetWindowChange( (gdk_event->state & GDK_CONTROL_MASK) );
+ new_event.SetCurrentFocus( listbox );
+ ret = listbox->GetEventHandler()->ProcessEvent( new_event );
+ }
+
+ if ((gdk_event->keyval == GDK_Return) && (!ret))
+ {
+ // eat return in all modes
+ ret = TRUE;
+ }
+
+#if wxUSE_CHECKLISTBOX
+ if ((gdk_event->keyval == ' ') && (listbox->m_hasCheckBoxes) && (!ret))
+ {
+ int sel = listbox->GtkGetIndex( widget );
+
+ wxCheckListBox *clb = (wxCheckListBox *)listbox;
+
+ clb->Check( sel, !clb->IsChecked(sel) );
+
+ wxCommandEvent new_event( wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, listbox->GetId() );
+ new_event.SetEventObject( listbox );
+ new_event.SetInt( sel );
+ ret = listbox->GetEventHandler()->ProcessEvent( new_event );
+ }
+#endif // wxUSE_CHECKLISTBOX
+
+ // Check or uncheck item with SPACE
+ if ((gdk_event->keyval == ' ') && (!ret) &&
+ (((listbox->GetWindowStyleFlag() & wxLB_MULTIPLE) != 0) ||
+ ((listbox->GetWindowStyleFlag() & wxLB_EXTENDED) != 0)) )
+ {
+ int sel = listbox->GtkGetIndex( widget );
+
+ if (sel != -1)
+ {
+ ret = TRUE;
+
+ if (listbox->IsSelected( sel ))
+ gtk_list_unselect_item( listbox->m_list, sel );
+ else
+ gtk_list_select_item( listbox->m_list, sel );
+
+ wxCommandEvent new_event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() );
+ new_event.SetEventObject( listbox );
+ wxArrayInt aSelections;
+ int n, count = listbox->GetSelections(aSelections);
+ if ( count > 0 )
+ {
+ n = aSelections[0];
+ if ( listbox->HasClientObjectData() )
+ new_event.SetClientObject( listbox->GetClientObject(n) );
+ else if ( listbox->HasClientUntypedData() )
+ new_event.SetClientData( listbox->GetClientData(n) );
+ new_event.SetString( listbox->GetString(n) );
+ }
+ else
+ {
+ n = -1;
+ }
+ new_event.SetInt(n);
+ listbox->GetEventHandler()->ProcessEvent( new_event );
+ }
+ }
+
+ if (ret)
+ {
+ g_signal_stop_emission_by_name (widget, "key_press_event");
+ return TRUE;
+ }
+
+ return FALSE;
+}
+}
+
+//-----------------------------------------------------------------------------
+// "select" and "deselect"
+//-----------------------------------------------------------------------------
+
+static void gtk_listitem_select_cb( GtkWidget *widget,
+ wxListBox *listbox,
+ bool is_selection )
+{
+ if (g_isIdle) wxapp_install_idle_handler();
+
+ 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 );
+
+ // indicate whether this is a selection or a deselection
+ event.SetExtraLong( is_selection );
+
+ if ((listbox->GetWindowStyleFlag() & wxLB_SINGLE) != 0)
+ {
+ int sel = listbox->GtkGetIndex( widget );
+
+ if (listbox->m_prevSelection != sel)
+ gtk_list_unselect_item( listbox->m_list, listbox->m_prevSelection );
+
+ listbox->m_prevSelection = sel;
+ }
+
+ wxArrayInt aSelections;
+ int n, count = listbox->GetSelections(aSelections);
+ if ( count > 0 )
+ {
+ n = aSelections[0];
+ if ( listbox->HasClientObjectData() )
+ event.SetClientObject( listbox->GetClientObject(n) );
+ else if ( listbox->HasClientUntypedData() )
+ event.SetClientData( listbox->GetClientData(n) );
+ event.SetString( listbox->GetString(n) );
+ }
+ else
+ {
+ n = -1;
+ }
+
+ event.SetInt(n);
+
+// No longer required with new code in wxLB_SINGLE
+// listbox->GetEventHandler()->AddPendingEvent( event );
+ listbox->GetEventHandler()->ProcessEvent( event );
+}
+
+extern "C" {
+static void gtk_listitem_select_callback( GtkWidget *widget, wxListBox *listbox )
+{
+ gtk_listitem_select_cb( widget, listbox, TRUE );
+}
+}
+
+extern "C" {
+static void gtk_listitem_deselect_callback( GtkWidget *widget, wxListBox *listbox )
+{
+ gtk_listitem_select_cb( widget, listbox, FALSE );
+}
+}
+
+//-----------------------------------------------------------------------------
+// wxListBox
+//-----------------------------------------------------------------------------
+
+extern "C" {
+static gint
+gtk_listbox_realized_callback( GtkWidget *m_widget, wxListBox *win )
+{
+ if (g_isIdle)
+ wxapp_install_idle_handler();
+
+ GList *child = win->m_list->children;
+ for (child = win->m_list->children; child != NULL; child = child->next)
+ gtk_widget_show( GTK_WIDGET(child->data) );
+
+ return false;
+}
+}
+
+//-----------------------------------------------------------------------------
+// wxListBox