diff options
author | Ted Gould <ted@canonical.com> | 2009-05-11 12:46:30 -0500 |
---|---|---|
committer | Ted Gould <ted@canonical.com> | 2009-05-11 12:46:30 -0500 |
commit | 29457ef539de25ce80f8bdb1d6ca0796fc5f1122 (patch) | |
tree | aea149e0d62b3946cce29c610e687424e35f083b | |
parent | 87fea6b9f16b49d3ad1b6801e53fd89f516b2973 (diff) | |
download | libdbusmenu-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.c | 22 |
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; } |