+extern bool g_blockEventsOnDrag;
+extern bool g_blockEventsOnScroll;
+
+
+
+//-----------------------------------------------------------------------------
+// Macro to tell which row the strings are in (1 if native checklist, 0 if not)
+//-----------------------------------------------------------------------------
+
+#if wxUSE_CHECKLISTBOX
+# define WXLISTBOX_DATACOLUMN_ARG(x) (x->m_hasCheckBoxes ? 1 : 0)
+#else
+# define WXLISTBOX_DATACOLUMN_ARG(x) (0)
+#endif // wxUSE_CHECKLISTBOX
+
+#define WXLISTBOX_DATACOLUMN WXLISTBOX_DATACOLUMN_ARG(this)
+
+//-----------------------------------------------------------------------------
+// "row-activated"
+//-----------------------------------------------------------------------------
+
+extern "C" {
+static void
+gtk_listbox_row_activated_callback(GtkTreeView *treeview,
+ GtkTreePath *path,
+ GtkTreeViewColumn *col,
+ wxListBox *listbox)
+{
+ if (g_isIdle) wxapp_install_idle_handler();
+
+ if (g_blockEventsOnDrag) return;
+ if (g_blockEventsOnScroll) return;
+
+ // This is triggered by either a double-click or a space press
+
+ int sel = gtk_tree_path_get_indices(path)[0];
+
+ wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, listbox->GetId() );
+ event.SetEventObject( listbox );
+
+ if (listbox->IsSelected(sel))
+ {
+ GtkTreeEntry* entry = listbox->GtkGetEntry(sel);
+
+ if (entry)
+ {
+ event.SetInt(sel);
+ event.SetString(wxConvUTF8.cMB2WX(gtk_tree_entry_get_label(entry)));
+
+ if ( listbox->HasClientObjectData() )
+ event.SetClientObject( (wxClientData*) gtk_tree_entry_get_userdata(entry) );
+ else if ( listbox->HasClientUntypedData() )
+ event.SetClientData( gtk_tree_entry_get_userdata(entry) );
+
+ g_object_unref (entry);
+ }
+ else
+ {
+ wxLogSysError(wxT("Internal error - could not get entry for double-click"));
+ event.SetInt(-1);
+ }
+ }
+ else
+ {
+ event.SetInt(-1);
+ }
+
+ listbox->GetEventHandler()->ProcessEvent( event );
+}
+}
+
+//-----------------------------------------------------------------------------
+// "key_press_event"
+//-----------------------------------------------------------------------------
+
+extern "C" {
+static gint
+gtk_listbox_key_press_callback( GtkWidget *widget,
+ GdkEventKey *gdk_event,
+ wxListBox *listbox )
+{
+ if (g_blockEventsOnDrag) return 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 );
+ if (listbox->GetEventHandler()->ProcessEvent( new_event ))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+}