aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libdbusmenu-glib/menuitem.c32
-rw-r--r--libdbusmenu-glib/menuitem.h1
2 files changed, 33 insertions, 0 deletions
diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c
index 99cae09..2d50bc6 100644
--- a/libdbusmenu-glib/menuitem.c
+++ b/libdbusmenu-glib/menuitem.c
@@ -523,3 +523,35 @@ dbusmenu_menuitem_buildxml (DbusmenuMenuitem * mi, GPtrArray * array)
return;
}
+typedef struct {
+ void (*func) (DbusmenuMenuitem * mi, gpointer data);
+ gpointer data;
+} foreach_struct_t;
+
+static void
+foreach_helper (gpointer data, gpointer user_data)
+{
+ dbusmenu_menuitem_foreach(DBUSMENU_MENUITEM(data), ((foreach_struct_t *)user_data)->func, ((foreach_struct_t *)user_data)->data);
+ return;
+}
+
+/**
+ dbusmenu_menuitem_foreach:
+ @mi: The #DbusmenItem to start from
+ @func: Function to call on every node in the tree
+ @data: User data to pass to the function
+
+ This calls the function @func on this menu item and all
+ of the children of this item. And their children. And
+ their children. And... you get the point. It will get
+ called on the whole tree.
+*/
+void
+dbusmenu_menuitem_foreach (DbusmenuMenuitem * mi, void (*func) (DbusmenuMenuitem * mi, gpointer data), gpointer data)
+{
+ func(mi, data);
+ GList * children = dbusmenu_menuitem_get_children(mi);
+ foreach_struct_t foreach_data = {func: func, data: data};
+ g_list_foreach(children, foreach_helper, &foreach_data);
+ return;
+}
diff --git a/libdbusmenu-glib/menuitem.h b/libdbusmenu-glib/menuitem.h
index 59af4a8..5b71ea6 100644
--- a/libdbusmenu-glib/menuitem.h
+++ b/libdbusmenu-glib/menuitem.h
@@ -110,6 +110,7 @@ const gchar * dbusmenu_menuitem_property_get (DbusmenuMenuitem * mi, const gchar
gboolean dbusmenu_menuitem_property_exist (DbusmenuMenuitem * mi, const gchar * property);
void dbusmenu_menuitem_buildxml (DbusmenuMenuitem * mi, GPtrArray * array);
+void dbusmenu_menuitem_foreach (DbusmenuMenuitem * mi, void (*func) (DbusmenuMenuitem * mi, gpointer data), gpointer data);
/**
SECTION:menuitem