+/**
+ * gtk_tree_model_rows_reordered:
+ * @tree_model: A #GtkTreeModel
+ * @path: A #GtkTreePath pointing to the tree node whose children have been reordered
+ * @iter: A valid #GtkTreeIter pointing to the node whose children have been reordered
+ * @new_order: an array of integers containing the new indices of the children,
+ * i.e. the former child <literal>n</literal> is now at position
+ * @new_order<literal>[n]</literal>.
+ *
+ * Emits the "rows_reordered" signal on @tree_model. This should be called by
+ * models when their rows have been reordered.
+ **/
+void
+gtk_tree_model_rows_reordered (GtkTreeModel *tree_model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gint *new_order)
+{
+ g_return_if_fail (GTK_IS_TREE_MODEL (tree_model));
+ g_return_if_fail (new_order != NULL);
+
+ g_signal_emit (tree_model, tree_model_signals[ROWS_REORDERED], 0, path, iter, new_order);
+}
+
+
+static gboolean
+gtk_tree_model_foreach_helper (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ GtkTreePath *path,
+ GtkTreeModelForeachFunc func,
+ gpointer user_data)
+{
+ do
+ {
+ GtkTreeIter child;
+
+ if ((* func) (model, path, iter, user_data))
+ return TRUE;
+
+ if (gtk_tree_model_iter_children (model, &child, iter))
+ {
+ gtk_tree_path_down (path);
+ if (gtk_tree_model_foreach_helper (model, &child, path, func, user_data))
+ return TRUE;
+ gtk_tree_path_up (path);
+ }
+
+ gtk_tree_path_next (path);
+ }
+ while (gtk_tree_model_iter_next (model, iter));
+
+ return FALSE;
+}