diff -ruN a//debian/changelog b//debian/changelog --- a//debian/changelog 2010-10-24 14:35:22.000000000 +0500 +++ b//debian/changelog 2010-10-24 14:33:04.633848938 +0500 @@ -1,3 +1,9 @@ +appmenu-gtk (0.1.9-0ubuntu5) maverick-proposed; urgency=low + + * dont show duplicate menu items (LP: 655241) + + -- Omer Akram Sun, 24 Oct 2010 14:31:32 +0500 + appmenu-gtk (0.1.9-0ubuntu4) maverick; urgency=low * cherry-picked from upstream: diff -ruN a//debian/patches/lp_655241.patch b//debian/patches/lp_655241.patch --- a//debian/patches/lp_655241.patch 1970-01-01 05:00:00.000000000 +0500 +++ b//debian/patches/lp_655241.patch 2010-10-24 14:34:00.911773062 +0500 @@ -0,0 +1,128 @@ +=== modified file 'src/bridge.c' +--- src/bridge.c 2010-09-29 17:14:35 +0000 ++++ src/bridge.c 2010-10-06 16:52:47 +0000 +@@ -696,6 +696,33 @@ + } + } + ++/* ++ * We probably should have added a 'remove' method to the UbuntuMenuProxy early on, ++ * but it's late in the cycle now. ++ */ ++static void ++child_notify_cb (GtkWidget *widget, ++ GParamSpec *pspec, ++ DbusmenuMenuitem *mi) ++{ ++ if (pspec->name == g_intern_static_string ("parent")) ++ { ++ if (gtk_widget_get_parent (widget) == NULL) ++ { ++ g_signal_handlers_disconnect_by_func (widget, ++ G_CALLBACK (child_notify_cb), ++ mi); ++ ++ DbusmenuMenuitem *parent = g_object_get_data (G_OBJECT (mi), "dbusmenu-parent"); ++ ++ if (DBUSMENU_IS_MENUITEM (parent) && DBUSMENU_IS_MENUITEM (mi)) ++ { ++ dbusmenu_menuitem_child_delete (parent, mi); ++ } ++ } ++ } ++} ++ + static DbusmenuMenuitem * + construct_dbusmenu_for_widget (GtkWidget *widget, gboolean previous_separator) + { +@@ -718,6 +745,7 @@ + else + { + gboolean visible = FALSE; ++ gboolean sensitive = FALSE; + gboolean label_set = FALSE; + + g_signal_connect (widget, +@@ -776,16 +804,9 @@ + if (!g_object_get_data (G_OBJECT (widget), "gtk-empty-menu-item") && !GTK_IS_TEAROFF_MENU_ITEM (widget)) + { + visible = gtk_widget_get_visible (widget); ++ sensitive = gtk_widget_get_sensitive (widget); + } + +- dbusmenu_menuitem_property_set_bool (mi, +- DBUSMENU_MENUITEM_PROP_VISIBLE, +- visible); +- +- dbusmenu_menuitem_property_set_bool (mi, +- DBUSMENU_MENUITEM_PROP_ENABLED, +- gtk_widget_get_sensitive (widget)); +- + dbusmenu_menuitem_property_set_shortcut_menuitem (mi, GTK_MENU_ITEM (widget)); + + g_signal_connect (G_OBJECT (widget), +@@ -803,6 +824,9 @@ + + if (action) + { ++ visible = gtk_action_is_visible (action); ++ sensitive = gtk_action_is_sensitive (action); ++ + g_signal_connect_object (action, "notify", + G_CALLBACK (action_notify_cb), + mi, +@@ -811,11 +835,24 @@ + } + } + ++ dbusmenu_menuitem_property_set_bool (mi, ++ DBUSMENU_MENUITEM_PROP_VISIBLE, ++ visible); ++ ++ dbusmenu_menuitem_property_set_bool (mi, ++ DBUSMENU_MENUITEM_PROP_ENABLED, ++ sensitive); ++ + g_signal_connect (G_OBJECT (mi), + DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, + G_CALLBACK (item_activated), + widget); + } ++ ++ g_signal_connect (widget, ++ "notify", ++ G_CALLBACK (child_notify_cb), ++ mi); + } + + return mi; +@@ -947,6 +984,9 @@ + + if (!peek) + { ++ g_object_set_data (G_OBJECT (recurse->stack[recurse->count]), ++ "dbusmenu-parent", ++ recurse->stack[recurse->count - 1]); + dbusmenu_menuitem_child_append (recurse->stack[recurse->count - 1], + recurse->stack[recurse->count]); + } +@@ -967,6 +1007,10 @@ + + if (!peek) + { ++ g_object_set_data (G_OBJECT (recurse->stack[recurse->count]), ++ "dbusmenu-parent", ++ recurse->stack[recurse->count - 1]); ++ + dbusmenu_menuitem_child_append (item, recurse->stack[recurse->count]); + } + } +@@ -1290,6 +1334,7 @@ + { + DbusmenuMenuitem *child_dmi = construct_dbusmenu_for_widget (child, FALSE); + ++ g_object_set_data (G_OBJECT (child_dmi), "dbusmenu-parent", mi); + dbusmenu_menuitem_child_add_position (mi, + child_dmi, + position); +