+
+/* Drag and drop stuff */
+static void
+drag_data_get_cb (GtkWidget *widget,
+ GdkDragContext *context,
+ GtkSelectionData *selection_data,
+ guint info,
+ guint time,
+ gpointer data)
+{
+ GtkTreeSelection *selection;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GtkTreePath *source_row;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
+ gtk_tree_selection_get_selected (selection, &model, &iter);
+ source_row = gtk_tree_model_get_path (model, &iter);
+
+ gtk_tree_set_row_drag_data (selection_data,
+ model,
+ source_row);
+
+ gtk_tree_path_free (source_row);
+}
+
+/* Header view drag types */
+const GtkTargetEntry header_view_drag_types[] =
+{
+ { "GTK_TREE_MODEL_ROW", GTK_TARGET_SAME_APP, HEADER_ROW }
+};
+
+static void
+setup_drag_and_drop (GtkTreeView *self)
+{
+ gtk_drag_source_set (GTK_WIDGET (self),
+ GDK_BUTTON1_MASK,
+ header_view_drag_types,
+ G_N_ELEMENTS (header_view_drag_types),
+ GDK_ACTION_MOVE | GDK_ACTION_COPY);
+
+ gtk_signal_connect(GTK_OBJECT (self),
+ "drag_data_get",
+ GTK_SIGNAL_FUNC(drag_data_get_cb),
+ NULL);
+}