diff options
author | Ted Gould <ted@gould.cx> | 2011-01-31 15:45:33 -0600 |
---|---|---|
committer | Ted Gould <ted@gould.cx> | 2011-01-31 15:45:33 -0600 |
commit | 6c339510a684ba9a8f01fc57188bb4953be0e30b (patch) | |
tree | 91e10d62322eb3eb710dba0ab996744ded02092f /libdbusmenu-gtk/parser.c | |
parent | 2a91021522eb038b3aa18f2532ac289b921c9a48 (diff) | |
parent | cd7a287de9d00f258d720a745ebdb840d3b31b67 (diff) | |
download | libdbusmenu-6c339510a684ba9a8f01fc57188bb4953be0e30b.tar.gz libdbusmenu-6c339510a684ba9a8f01fc57188bb4953be0e30b.tar.bz2 libdbusmenu-6c339510a684ba9a8f01fc57188bb4953be0e30b.zip |
Import upstream version 0.3.95
Diffstat (limited to 'libdbusmenu-gtk/parser.c')
-rw-r--r-- | libdbusmenu-gtk/parser.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/libdbusmenu-gtk/parser.c b/libdbusmenu-gtk/parser.c index 5d71585..7e5e7e1 100644 --- a/libdbusmenu-gtk/parser.c +++ b/libdbusmenu-gtk/parser.c @@ -649,6 +649,37 @@ widget_notify_cb (GtkWidget *widget, } } } + else if (pspec->name == g_intern_static_string ("submenu")) + { + /* The underlying submenu got swapped out. Let's see what it is now. */ + /* First, delete any children that may exist currently. */ + DbusmenuMenuitem * item = DBUSMENU_MENUITEM(g_object_get_data(G_OBJECT(widget), CACHED_MENUITEM)); + if (item != NULL) + { + 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. */ + RecurseContext recurse = {0}; + recurse.toplevel = gtk_widget_get_toplevel(widget); + recurse.parent = item; + + 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)); + } + } } static gboolean |