aboutsummaryrefslogtreecommitdiff
path: root/libdbusmenu-gtk/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdbusmenu-gtk/parser.c')
-rw-r--r--libdbusmenu-gtk/parser.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c
index 5f42ed5..7e5e7e1 100644
--- a/libdbusmenu-gtk/parser.c
+++ b/libdbusmenu-gtk/parser.c
@@ -656,19 +656,29 @@ widget_notify_cb (GtkWidget *widget,
DbusmenuMenuitem * item = DBUSMENU_MENUITEM(g_object_get_data(G_OBJECT(widget), CACHED_MENUITEM));
if (item != NULL)
{
- GList * children = dbusmenu_menuitem_get_children (item);
- while (children != NULL) {
- dbusmenu_menuitem_child_delete (item, DBUSMENU_MENUITEM(children->data));
- children = children->next;
+ GList * children = dbusmenu_menuitem_take_children (item);
+ GList * child = children;
+ while (child != NULL) {
+ g_object_unref (G_OBJECT(child->data));
+ child = child->next;
}
+ g_list_free(children);
}
/* Now parse new submenu. */
- GtkWidget * menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget));
RecurseContext recurse = {0};
recurse.toplevel = gtk_widget_get_toplevel(widget);
recurse.parent = item;
- parse_menu_structure_helper(menu, &recurse);
+
+ if (item != NULL) {
+ GtkWidget * menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget));
+ parse_menu_structure_helper(menu, &recurse);
+ } else {
+ /* Note: it would be really odd that we wouldn't have a cached
+ item, but we should handle that appropriately. */
+ parse_menu_structure_helper(widget, &recurse);
+ g_object_unref(G_OBJECT(recurse.parent));
+ }
}
}