aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libdbusmenu-glib/client.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/libdbusmenu-glib/client.c b/libdbusmenu-glib/client.c
index c432f7d..1a35868 100644
--- a/libdbusmenu-glib/client.c
+++ b/libdbusmenu-glib/client.c
@@ -311,14 +311,34 @@ parse_layout_xml(xmlNodePtr node, DbusmenuMenuitem * item, DbusmenuMenuitem * pa
xmlNodePtr children;
guint position;
+ GList * oldchildren = dbusmenu_menuitem_take_children(item);
+
for (children = node->children, position = 0; children != NULL; children = children->next, position++) {
g_debug("Looking at child: %d", position);
guint childid = parse_node_get_id(children);
- DbusmenuMenuitem * childmi = dbusmenu_menuitem_child_find(item, childid);
+ DbusmenuMenuitem * childmi = NULL;
+
+ GList * childsearch = NULL;
+ for (childsearch = oldchildren; childsearch != NULL; childsearch = g_list_next(childsearch)) {
+ DbusmenuMenuitem * cs_mi = DBUSMENU_MENUITEM(childsearch->data);
+ if (childid == dbusmenu_menuitem_get_id(cs_mi)) {
+ oldchildren = g_list_remove(oldchildren, cs_mi);
+ childmi = cs_mi;
+ break;
+ }
+ }
+
childmi = parse_layout_xml(children, childmi, item);
dbusmenu_menuitem_child_add_position(item, childmi, position);
}
+ GList * oldchildleft = NULL;
+ for (oldchildleft = oldchildren; oldchildleft != NULL; oldchildleft = g_list_next(oldchildleft)) {
+ DbusmenuMenuitem * oldmi = DBUSMENU_MENUITEM(oldchildleft->data);
+ g_object_unref(G_OBJECT(oldmi));
+ }
+ g_list_free(oldchildren);
+
return item;
}