diff options
-rw-r--r-- | debian/changelog | 9 | ||||
-rw-r--r-- | libdbusmenu-glib/menuitem.c | 11 | ||||
-rw-r--r-- | libdbusmenu-glib/server.c | 10 |
3 files changed, 30 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog index 596124b..620ddd4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +libdbusmenu (0.2.9-0ubuntu1~ppa2~ordering1ubuntu1) UNRELEASED; urgency=low + + * Upstream Merge + * Don't allow setting children twice + * Ref children of a menuitem + * Return error when parent ID of getlayout can't be found + + -- Ted Gould <ted@ubuntu.com> Wed, 14 Apr 2010 17:06:34 -0500 + libdbusmenu (0.2.9-0ubuntu1~ppa2~ordering1) lucid; urgency=low * Upstream Merge diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index fce8ed5..93d32a1 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -449,6 +449,7 @@ take_children_signal (gpointer data, gpointer user_data) #ifdef MASSIVEDEBUGGING g_debug("Menuitem %d (%s) signalling child removed %d (%s)", ID(user_data), LABEL(user_data), ID(data), LABEL(data)); #endif + g_object_unref(G_OBJECT(data)); g_signal_emit(G_OBJECT(user_data), signals[CHILD_REMOVED], 0, DBUSMENU_MENUITEM(data), TRUE); return; } @@ -533,10 +534,13 @@ dbusmenu_menuitem_child_append (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) g_return_val_if_fail(DBUSMENU_IS_MENUITEM(child), FALSE); DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); + g_return_val_if_fail(g_list_find(priv->children, child), FALSE); + priv->children = g_list_append(priv->children, child); #ifdef MASSIVEDEBUGGING g_debug("Menuitem %d (%s) signalling child added %d (%s) at %d", ID(mi), LABEL(mi), ID(child), LABEL(child), g_list_length(priv->children) - 1); #endif + g_object_ref(G_OBJECT(child)); g_signal_emit(G_OBJECT(mi), signals[CHILD_ADDED], 0, child, g_list_length(priv->children) - 1, TRUE); return TRUE; } @@ -558,10 +562,13 @@ dbusmenu_menuitem_child_prepend (DbusmenuMenuitem * mi, DbusmenuMenuitem * child g_return_val_if_fail(DBUSMENU_IS_MENUITEM(child), FALSE); DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); + g_return_val_if_fail(g_list_find(priv->children, child), FALSE); + priv->children = g_list_prepend(priv->children, child); #ifdef MASSIVEDEBUGGING g_debug("Menuitem %d (%s) signalling child added %d (%s) at %d", ID(mi), LABEL(mi), ID(child), LABEL(child), 0); #endif + g_object_ref(G_OBJECT(child)); g_signal_emit(G_OBJECT(mi), signals[CHILD_ADDED], 0, child, 0, TRUE); return TRUE; } @@ -588,6 +595,7 @@ dbusmenu_menuitem_child_delete (DbusmenuMenuitem * mi, DbusmenuMenuitem * child) #ifdef MASSIVEDEBUGGING g_debug("Menuitem %d (%s) signalling child removed %d (%s)", ID(mi), LABEL(mi), ID(child), LABEL(child)); #endif + g_object_unref(G_OBJECT(child)); g_signal_emit(G_OBJECT(mi), signals[CHILD_REMOVED], 0, child, TRUE); return TRUE; } @@ -611,10 +619,13 @@ dbusmenu_menuitem_child_add_position (DbusmenuMenuitem * mi, DbusmenuMenuitem * g_return_val_if_fail(DBUSMENU_IS_MENUITEM(child), FALSE); DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi); + g_return_val_if_fail(g_list_find(priv->children, child), FALSE); + priv->children = g_list_insert(priv->children, child, position); #ifdef MASSIVEDEBUGGING g_debug("Menuitem %d (%s) signalling child added %d (%s) at %d", ID(mi), LABEL(mi), ID(child), LABEL(child), position); #endif + g_object_ref(G_OBJECT(child)); g_signal_emit(G_OBJECT(mi), signals[CHILD_ADDED], 0, child, position, TRUE); return TRUE; } diff --git a/libdbusmenu-glib/server.c b/libdbusmenu-glib/server.c index d87c024..02c9c57 100644 --- a/libdbusmenu-glib/server.c +++ b/libdbusmenu-glib/server.c @@ -404,6 +404,16 @@ _dbusmenu_server_get_layout (DbusmenuServer * server, gint parent, guint * revis } } else { DbusmenuMenuitem * item = dbusmenu_menuitem_find_id(priv->root, parent); + if (item == NULL) { + if (error != NULL) { + g_set_error(error, + error_quark(), + INVALID_MENUITEM_ID, + "The ID supplied %d does not refer to a menu item we have", + parent); + } + return FALSE; + } dbusmenu_menuitem_buildxml(item, xmlarray); } g_ptr_array_add(xmlarray, NULL); |