+/* TreeDragSource interface implementation */
+static gboolean
+gtk_tree_model_filter_row_draggable (GtkTreeDragSource *drag_source,
+ GtkTreePath *path)
+{
+ GtkTreeModelFilter *tree_model_filter = (GtkTreeModelFilter *)drag_source;
+ GtkTreePath *child_path;
+ gboolean draggable;
+
+ g_return_val_if_fail (GTK_IS_TREE_MODEL_FILTER (drag_source), FALSE);
+ g_return_val_if_fail (path != NULL, FALSE);
+
+ child_path = gtk_tree_model_filter_convert_path_to_child_path (tree_model_filter, path);
+ draggable = gtk_tree_drag_source_row_draggable (GTK_TREE_DRAG_SOURCE (tree_model_filter->priv->child_model), child_path);
+ gtk_tree_path_free (child_path);
+
+ return draggable;
+}
+
+static gboolean
+gtk_tree_model_filter_drag_data_get (GtkTreeDragSource *drag_source,
+ GtkTreePath *path,
+ GtkSelectionData *selection_data)
+{
+ GtkTreeModelFilter *tree_model_filter = (GtkTreeModelFilter *)drag_source;
+ GtkTreePath *child_path;
+ gboolean gotten;
+
+ g_return_val_if_fail (GTK_IS_TREE_MODEL_FILTER (drag_source), FALSE);
+ g_return_val_if_fail (path != NULL, FALSE);
+
+ child_path = gtk_tree_model_filter_convert_path_to_child_path (tree_model_filter, path);
+ gotten = gtk_tree_drag_source_drag_data_get (GTK_TREE_DRAG_SOURCE (tree_model_filter->priv->child_model), child_path, selection_data);
+ gtk_tree_path_free (child_path);
+
+ return gotten;
+}
+
+static gboolean
+gtk_tree_model_filter_drag_data_delete (GtkTreeDragSource *drag_source,
+ GtkTreePath *path)
+{
+ GtkTreeModelFilter *tree_model_filter = (GtkTreeModelFilter *)drag_source;
+ GtkTreePath *child_path;
+ gboolean deleted;
+
+ g_return_val_if_fail (GTK_IS_TREE_MODEL_FILTER (drag_source), FALSE);
+ g_return_val_if_fail (path != NULL, FALSE);
+
+ child_path = gtk_tree_model_filter_convert_path_to_child_path (tree_model_filter, path);
+ deleted = gtk_tree_drag_source_drag_data_delete (GTK_TREE_DRAG_SOURCE (tree_model_filter->priv->child_model), child_path);
+ gtk_tree_path_free (child_path);
+
+ return deleted;
+}
+