Index: chrome/browser/gtk/menu_gtk.cc |
diff --git a/chrome/browser/gtk/menu_gtk.cc b/chrome/browser/gtk/menu_gtk.cc |
index 80c20c461ae406f6a7f29d77aba671f3dcf5a1f8..129623e9fcf23f3f8d55ba630b31262ea93a589c 100644 |
--- a/chrome/browser/gtk/menu_gtk.cc |
+++ b/chrome/browser/gtk/menu_gtk.cc |
@@ -214,22 +214,31 @@ GtkWidget* MenuGtk::AppendSeparator() { |
} |
GtkWidget* MenuGtk::AppendMenuItem(int command_id, GtkWidget* menu_item) { |
- return AppendMenuItemToMenu(command_id, menu_item, menu_, true); |
+ return AppendMenuItemToMenu(command_id, NULL, menu_item, menu_, true); |
} |
-GtkWidget* MenuGtk::AppendMenuItemToMenu(int command_id, |
+GtkWidget* MenuGtk::AppendMenuItemToMenu(int index, |
+ menus::MenuModel* model, |
GtkWidget* menu_item, |
GtkWidget* menu, |
bool connect_to_activate) { |
// Native menu items do their own thing, so only selectively listen for the |
// activate signal. |
if (connect_to_activate) { |
- SetMenuItemID(menu_item, command_id); |
+ SetMenuItemID(menu_item, index); |
g_signal_connect(menu_item, "activate", |
G_CALLBACK(OnMenuItemActivated), this); |
} |
- gtk_widget_show(menu_item); |
+ // AppendMenuItemToMenu is used both internally when we control menu creation |
+ // from a model (where the model can choose to hide certain menu items), and |
+ // with immediate commands which don't provide the option. |
+ if (model) { |
+ if (model->IsVisibleAt(index)) |
+ gtk_widget_show(menu_item); |
+ } else { |
+ gtk_widget_show(menu_item); |
+ } |
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); |
return menu_item; |
} |
@@ -361,7 +370,7 @@ void MenuGtk::BuildSubmenuFromModel(menus::MenuModel* model, GtkWidget* menu) { |
} |
g_object_set_data(G_OBJECT(menu_item), "model", model); |
- AppendMenuItemToMenu(i, menu_item, menu, connect_to_activate); |
+ AppendMenuItemToMenu(i, model, menu_item, menu, connect_to_activate); |
if (model->IsLabelDynamicAt(i)) { |
g_signal_connect(menu, "show", G_CALLBACK(OnSubmenuShow), |
@@ -603,6 +612,11 @@ void MenuGtk::SetMenuItemInfo(GtkWidget* widget, gpointer userdata) { |
if (GTK_IS_MENU_ITEM(widget)) { |
gtk_widget_set_sensitive(widget, model->IsEnabledAt(id)); |
+ if (model->IsVisibleAt(id)) |
+ gtk_widget_show(widget); |
+ else |
+ gtk_widget_hide(widget); |
+ |
GtkWidget* submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(widget)); |
if (submenu) { |
gtk_container_foreach(GTK_CONTAINER(submenu), &SetMenuItemInfo, |