aboutsummaryrefslogtreecommitdiff
path: root/libdbusmenu-glib/client.c
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 /libdbusmenu-glib/client.c
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.
Diffstat (limited to 'libdbusmenu-glib/client.c')
-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;
}