OLD | NEW |
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 "views/controls/menu/native_menu_gtk.h" | 5 #include "views/controls/menu/native_menu_gtk.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <map> | 8 #include <map> |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 case ui::MenuModel::TYPE_COMMAND: { | 386 case ui::MenuModel::TYPE_COMMAND: { |
387 SkBitmap icon; | 387 SkBitmap icon; |
388 // Create menu item with icon if icon exists. | 388 // Create menu item with icon if icon exists. |
389 if (model_->HasIcons() && model_->GetIconAt(index, &icon)) { | 389 if (model_->HasIcons() && model_->GetIconAt(index, &icon)) { |
390 menu_item = gtk_image_menu_item_new_with_mnemonic(label.c_str()); | 390 menu_item = gtk_image_menu_item_new_with_mnemonic(label.c_str()); |
391 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&icon); | 391 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&icon); |
392 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), | 392 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), |
393 gtk_image_new_from_pixbuf(pixbuf)); | 393 gtk_image_new_from_pixbuf(pixbuf)); |
394 g_object_unref(pixbuf); | 394 g_object_unref(pixbuf); |
395 | 395 |
396 #if GTK_CHECK_VERSION(2,16,0) | |
397 // Show the image even if the "gtk-menu-images" setting is turned off. | 396 // Show the image even if the "gtk-menu-images" setting is turned off. |
398 gtk_image_menu_item_set_always_show_image( | 397 gtk_image_menu_item_set_always_show_image( |
399 GTK_IMAGE_MENU_ITEM(menu_item), TRUE); | 398 GTK_IMAGE_MENU_ITEM(menu_item), TRUE); |
400 #endif | |
401 } else { | 399 } else { |
402 menu_item = gtk_menu_item_new_with_mnemonic(label.c_str()); | 400 menu_item = gtk_menu_item_new_with_mnemonic(label.c_str()); |
403 } | 401 } |
404 break; | 402 break; |
405 } | 403 } |
406 default: | 404 default: |
407 NOTREACHED(); | 405 NOTREACHED(); |
408 break; | 406 break; |
409 } | 407 } |
410 | 408 |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menu_item)); | 597 submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menu_item)); |
600 } | 598 } |
601 | 599 |
602 // Figure out the item index and total number of items. | 600 // Figure out the item index and total number of items. |
603 GList* items = gtk_container_get_children(GTK_CONTAINER(menu)); | 601 GList* items = gtk_container_get_children(GTK_CONTAINER(menu)); |
604 guint count = g_list_length(items); | 602 guint count = g_list_length(items); |
605 int index = g_list_index(items, static_cast<gconstpointer>(menu_item)); | 603 int index = g_list_index(items, static_cast<gconstpointer>(menu_item)); |
606 | 604 |
607 // Get the menu item's label. | 605 // Get the menu item's label. |
608 std::string name; | 606 std::string name; |
609 #if GTK_CHECK_VERSION(2, 16, 0) | |
610 name = gtk_menu_item_get_label(GTK_MENU_ITEM(menu_item)); | 607 name = gtk_menu_item_get_label(GTK_MENU_ITEM(menu_item)); |
611 #else | |
612 GList* children = gtk_container_get_children(GTK_CONTAINER(menu_item)); | |
613 for (GList* l = g_list_first(children); l != NULL; l = g_list_next(l)) { | |
614 GtkWidget* child = static_cast<GtkWidget*>(l->data); | |
615 if (GTK_IS_LABEL(child)) { | |
616 name = gtk_label_get_label(GTK_LABEL(child)); | |
617 break; | |
618 } | |
619 } | |
620 #endif | |
621 | 608 |
622 if (ViewsDelegate::views_delegate) { | 609 if (ViewsDelegate::views_delegate) { |
623 ViewsDelegate::views_delegate->NotifyMenuItemFocused( | 610 ViewsDelegate::views_delegate->NotifyMenuItemFocused( |
624 L"", | 611 L"", |
625 UTF8ToWide(name), | 612 UTF8ToWide(name), |
626 index, | 613 index, |
627 count, | 614 count, |
628 submenu != NULL); | 615 submenu != NULL); |
629 } | 616 } |
630 } | 617 } |
631 | 618 |
632 // static | 619 // static |
633 void NativeMenuGtk::MenuDestroyed(GtkWidget* widget, Menu2* menu2) { | 620 void NativeMenuGtk::MenuDestroyed(GtkWidget* widget, Menu2* menu2) { |
634 NativeMenuGtk* native_menu = | 621 NativeMenuGtk* native_menu = |
635 static_cast<NativeMenuGtk*>(menu2->wrapper_.get()); | 622 static_cast<NativeMenuGtk*>(menu2->wrapper_.get()); |
636 // The native gtk widget has already been destroyed. | 623 // The native gtk widget has already been destroyed. |
637 native_menu->menu_ = NULL; | 624 native_menu->menu_ = NULL; |
638 delete menu2; | 625 delete menu2; |
639 } | 626 } |
640 | 627 |
641 //////////////////////////////////////////////////////////////////////////////// | 628 //////////////////////////////////////////////////////////////////////////////// |
642 // MenuWrapper, public: | 629 // MenuWrapper, public: |
643 | 630 |
644 // static | 631 // static |
645 MenuWrapper* MenuWrapper::CreateWrapper(Menu2* menu) { | 632 MenuWrapper* MenuWrapper::CreateWrapper(Menu2* menu) { |
646 return new NativeMenuGtk(menu); | 633 return new NativeMenuGtk(menu); |
647 } | 634 } |
648 | 635 |
649 } // namespace views | 636 } // namespace views |
OLD | NEW |