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

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: More code review updates. 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
« no previous file with comments | « chrome/browser/ui/gtk/menu_gtk.h ('k') | views/controls/menu/native_menu_win.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 GList* items = gtk_container_get_children(GTK_CONTAINER(menu_));
406 GtkWidget* menu_item = GTK_WIDGET(g_list_nth(items, model_index)->data);
407 g_list_free(items);
408 SkBitmap icon;
409 ui::MenuModel* model = ModelForMenuItem(GTK_MENU_ITEM(menu_item));
Evan Stade 2011/04/08 16:45:19 I'd just use model_
410 if (model->GetIconAt(model_index, &icon)) {
411 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&icon);
412 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),
413 gtk_image_new_from_pixbuf(pixbuf));
414 g_object_unref(pixbuf);
415 }
416 }
417
403 void MenuGtk::UpdateMenu() { 418 void MenuGtk::UpdateMenu() {
404 gtk_container_foreach(GTK_CONTAINER(menu_), SetMenuItemInfo, this); 419 gtk_container_foreach(GTK_CONTAINER(menu_), SetMenuItemInfo, this);
405 } 420 }
406 421
407 GtkWidget* MenuGtk::BuildMenuItemWithImage(const std::string& label, 422 GtkWidget* MenuGtk::BuildMenuItemWithImage(const std::string& label,
408 GtkWidget* image) { 423 GtkWidget* image) {
409 GtkWidget* menu_item = 424 GtkWidget* menu_item =
410 gtk_image_menu_item_new_with_mnemonic(label.c_str()); 425 gtk_image_menu_item_new_with_mnemonic(label.c_str());
411 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image); 426 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image);
412 return menu_item; 427 return menu_item;
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
716 if (event) 731 if (event)
717 gdk_event_free(event); 732 gdk_event_free(event);
718 } 733 }
719 734
720 void MenuGtk::OnMenuShow(GtkWidget* widget) { 735 void MenuGtk::OnMenuShow(GtkWidget* widget) {
721 MessageLoop::current()->PostTask(FROM_HERE, 736 MessageLoop::current()->PostTask(FROM_HERE,
722 factory_.NewRunnableMethod(&MenuGtk::UpdateMenu)); 737 factory_.NewRunnableMethod(&MenuGtk::UpdateMenu));
723 } 738 }
724 739
725 void MenuGtk::OnMenuHidden(GtkWidget* widget) { 740 void MenuGtk::OnMenuHidden(GtkWidget* widget) {
741 model_->SetMenuModelDelegate(NULL);
726 if (delegate_) 742 if (delegate_)
727 delegate_->StoppedShowing(); 743 delegate_->StoppedShowing();
728 model_->MenuClosed(); 744 model_->MenuClosed();
729 } 745 }
730 746
731 // static 747 // static
732 void MenuGtk::SetButtonItemInfo(GtkWidget* button, gpointer userdata) { 748 void MenuGtk::SetButtonItemInfo(GtkWidget* button, gpointer userdata) {
733 ui::ButtonMenuItemModel* model = 749 ui::ButtonMenuItemModel* model =
734 reinterpret_cast<ui::ButtonMenuItemModel*>( 750 reinterpret_cast<ui::ButtonMenuItemModel*>(
735 g_object_get_data(G_OBJECT(button), "button-model")); 751 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); 839 gtk_widget_hide(widget);
824 } 840 }
825 841
826 GtkWidget* submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(widget)); 842 GtkWidget* submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(widget));
827 if (submenu) { 843 if (submenu) {
828 gtk_container_foreach(GTK_CONTAINER(submenu), &SetMenuItemInfo, 844 gtk_container_foreach(GTK_CONTAINER(submenu), &SetMenuItemInfo,
829 userdata); 845 userdata);
830 } 846 }
831 } 847 }
832 } 848 }
849
OLDNEW
« no previous file with comments | « chrome/browser/ui/gtk/menu_gtk.h ('k') | views/controls/menu/native_menu_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698