diff options
Diffstat (limited to 'views')
-rw-r--r-- | views/controls/menu/native_menu_gtk.cc | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/views/controls/menu/native_menu_gtk.cc b/views/controls/menu/native_menu_gtk.cc index 31a8c3f..12f73da 100644 --- a/views/controls/menu/native_menu_gtk.cc +++ b/views/controls/menu/native_menu_gtk.cc @@ -47,6 +47,13 @@ bool MenuTypeCanExecute(menus::MenuModel::ItemType type) { type == menus::MenuModel::TYPE_RADIO; } +// A callback to gtk_container_foreach to remove all children. +// See |NativeMenuGtk::ResetMenu| for the usage. +void RemoveChildWidget(GtkWidget* widget, gpointer data) { + GtkWidget* parent = gtk_widget_get_parent(widget); + gtk_container_remove(GTK_CONTAINER(parent), widget); +} + } // namespace namespace views { @@ -371,15 +378,15 @@ GtkWidget* NativeMenuGtk::AddMenuItemAt(int index, } void NativeMenuGtk::ResetMenu() { - if (menu_) { - g_signal_handler_disconnect(menu_, destroy_handler_id_); - gtk_widget_destroy(menu_); + if (!menu_) { + menu_ = gtk_menu_new(); + g_object_set_data( + G_OBJECT(GTK_MENU(menu_)->toplevel), kNativeMenuGtkString, this); + destroy_handler_id_ = g_signal_connect( + menu_, "destroy", G_CALLBACK(NativeMenuGtk::MenuDestroyed), host_menu_); + } else { + gtk_container_foreach(GTK_CONTAINER(menu_), RemoveChildWidget, NULL); } - menu_ = gtk_menu_new(); - g_object_set_data( - G_OBJECT(GTK_MENU(menu_)->toplevel), kNativeMenuGtkString, this); - destroy_handler_id_ = g_signal_connect( - menu_, "destroy", G_CALLBACK(NativeMenuGtk::MenuDestroyed), host_menu_); } void NativeMenuGtk::UpdateMenuItemState(GtkWidget* menu_item) { |