Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: chrome/browser/ui/gtk/menu_gtk.cc

Issue 6732007: Native menu implementation for bug 5679. Followup to http://codereview.chromium.org/2928005/ Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: "Updates based on code review." Created 9 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/gtk/menu_gtk.h" 5 #include "chrome/browser/ui/gtk/menu_gtk.h"
6 6
7 #include <map> 7 #include <map>
8 8
9 #include "base/i18n/rtl.h" 9 #include "base/i18n/rtl.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 MenuGtk::MenuGtk(MenuGtk::Delegate* delegate, 277 MenuGtk::MenuGtk(MenuGtk::Delegate* delegate,
278 ui::MenuModel* model) 278 ui::MenuModel* model)
279 : delegate_(delegate), 279 : delegate_(delegate),
280 model_(model), 280 model_(model),
281 dummy_accel_group_(gtk_accel_group_new()), 281 dummy_accel_group_(gtk_accel_group_new()),
282 menu_(gtk_custom_menu_new()), 282 menu_(gtk_custom_menu_new()),
283 factory_(this) { 283 factory_(this) {
284 DCHECK(model); 284 DCHECK(model);
285 g_object_ref_sink(menu_); 285 g_object_ref_sink(menu_);
286 ConnectSignalHandlers(); 286 ConnectSignalHandlers();
287 model_->SetMenuModelDelegate(this);
287 BuildMenuFromModel(); 288 BuildMenuFromModel();
288 } 289 }
289 290
290 MenuGtk::~MenuGtk() { 291 MenuGtk::~MenuGtk() {
291 Cancel(); 292 Cancel();
292 293
293 gtk_widget_destroy(menu_); 294 gtk_widget_destroy(menu_);
294 g_object_unref(menu_); 295 g_object_unref(menu_);
295 296
296 STLDeleteContainerPointers(submenus_we_own_.begin(), submenus_we_own_.end()); 297 STLDeleteContainerPointers(submenus_we_own_.begin(), submenus_we_own_.end());
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 394
394 void MenuGtk::PopupAsFromKeyEvent(GtkWidget* widget) { 395 void MenuGtk::PopupAsFromKeyEvent(GtkWidget* widget) {
395 PopupForWidget(widget, 0, gtk_get_current_event_time()); 396 PopupForWidget(widget, 0, gtk_get_current_event_time());
396 gtk_menu_shell_select_first(GTK_MENU_SHELL(menu_), FALSE); 397 gtk_menu_shell_select_first(GTK_MENU_SHELL(menu_), FALSE);
397 } 398 }
398 399
399 void MenuGtk::Cancel() { 400 void MenuGtk::Cancel() {
400 gtk_menu_popdown(GTK_MENU(menu_)); 401 gtk_menu_popdown(GTK_MENU(menu_));
401 } 402 }
402 403
404 void MenuGtk::OnIconChanged(int model_index) {
405 gtk_container_foreach(GTK_CONTAINER(menu_), UpdateMenuIcon, &model_index);
Evan Stade 2011/04/07 18:25:00 Try: GList* items = gtk_container_get_children(me
dill 2011/04/08 15:48:46 Thanks, much cleaner.
406 }
407
403 void MenuGtk::UpdateMenu() { 408 void MenuGtk::UpdateMenu() {
404 gtk_container_foreach(GTK_CONTAINER(menu_), SetMenuItemInfo, this); 409 gtk_container_foreach(GTK_CONTAINER(menu_), SetMenuItemInfo, this);
405 } 410 }
406 411
407 GtkWidget* MenuGtk::BuildMenuItemWithImage(const std::string& label, 412 GtkWidget* MenuGtk::BuildMenuItemWithImage(const std::string& label,
408 GtkWidget* image) { 413 GtkWidget* image) {
409 GtkWidget* menu_item = 414 GtkWidget* menu_item =
410 gtk_image_menu_item_new_with_mnemonic(label.c_str()); 415 gtk_image_menu_item_new_with_mnemonic(label.c_str());
411 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image); 416 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image);
412 return menu_item; 417 return menu_item;
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
716 if (event) 721 if (event)
717 gdk_event_free(event); 722 gdk_event_free(event);
718 } 723 }
719 724
720 void MenuGtk::OnMenuShow(GtkWidget* widget) { 725 void MenuGtk::OnMenuShow(GtkWidget* widget) {
721 MessageLoop::current()->PostTask(FROM_HERE, 726 MessageLoop::current()->PostTask(FROM_HERE,
722 factory_.NewRunnableMethod(&MenuGtk::UpdateMenu)); 727 factory_.NewRunnableMethod(&MenuGtk::UpdateMenu));
723 } 728 }
724 729
725 void MenuGtk::OnMenuHidden(GtkWidget* widget) { 730 void MenuGtk::OnMenuHidden(GtkWidget* widget) {
731 model_->SetMenuModelDelegate(NULL);
726 if (delegate_) 732 if (delegate_)
727 delegate_->StoppedShowing(); 733 delegate_->StoppedShowing();
728 model_->MenuClosed(); 734 model_->MenuClosed();
729 } 735 }
730 736
731 // static 737 // static
732 void MenuGtk::SetButtonItemInfo(GtkWidget* button, gpointer userdata) { 738 void MenuGtk::SetButtonItemInfo(GtkWidget* button, gpointer userdata) {
733 ui::ButtonMenuItemModel* model = 739 ui::ButtonMenuItemModel* model =
734 reinterpret_cast<ui::ButtonMenuItemModel*>( 740 reinterpret_cast<ui::ButtonMenuItemModel*>(
735 g_object_get_data(G_OBJECT(button), "button-model")); 741 g_object_get_data(G_OBJECT(button), "button-model"));
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
823 gtk_widget_hide(widget); 829 gtk_widget_hide(widget);
824 } 830 }
825 831
826 GtkWidget* submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(widget)); 832 GtkWidget* submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(widget));
827 if (submenu) { 833 if (submenu) {
828 gtk_container_foreach(GTK_CONTAINER(submenu), &SetMenuItemInfo, 834 gtk_container_foreach(GTK_CONTAINER(submenu), &SetMenuItemInfo,
829 userdata); 835 userdata);
830 } 836 }
831 } 837 }
832 } 838 }
839
840 // static
841 void MenuGtk::UpdateMenuIcon(GtkWidget* widget, gpointer userdata) {
842 if (GTK_IS_MENU_ITEM(widget)) {
843 int model_index = *static_cast<int*>(userdata);
844 int menu_id;
845 GetMenuItemID(widget, &menu_id);
846 if (menu_id != model_index) {
847 return;
848 }
849 SkBitmap icon;
850 ui::MenuModel* model = ModelForMenuItem(GTK_MENU_ITEM(widget));
851 if (model->GetIconAt(model_index, &icon)) {
852 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&icon);
853 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(widget),
854 gtk_image_new_from_pixbuf(pixbuf));
855 g_object_unref(pixbuf);
856 }
857 }
858 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698