aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Gould <ted@canonical.com>2009-05-11 12:46:30 -0500
committerTed Gould <ted@canonical.com>2009-05-11 12:46:30 -0500
commit29457ef539de25ce80f8bdb1d6ca0796fc5f1122 (patch)
treeaea149e0d62b3946cce29c610e687424e35f083b
parent87fea6b9f16b49d3ad1b6801e53fd89f516b2973 (diff)
downloadlibdbusmenu-29457ef539de25ce80f8bdb1d6ca0796fc5f1122.tar.gz
libdbusmenu-29457ef539de25ce80f8bdb1d6ca0796fc5f1122.tar.bz2
libdbusmenu-29457ef539de25ce80f8bdb1d6ca0796fc5f1122.zip
Taking the children, and trying to reuse them if possible. Sometimes that doesn't work out and we have to put one down. It's always sad to loose one, but sometimes it has to happen.
-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;
}