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

Unified Diff: chrome/browser/ui/libgtk2ui/app_indicator_icon.cc

Issue 306063003: Reland: Fall back to X11 system tray icons if libappindicator is not available. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/libgtk2ui/app_indicator_icon.cc
diff --git a/chrome/browser/ui/libgtk2ui/app_indicator_icon.cc b/chrome/browser/ui/libgtk2ui/app_indicator_icon.cc
index 7ef1c4087680f67ad14768846e9ff816480741bd..757052e1d0e064dbfc02a242f1cd20ac497dc6a3 100644
--- a/chrome/browser/ui/libgtk2ui/app_indicator_icon.cc
+++ b/chrome/browser/ui/libgtk2ui/app_indicator_icon.cc
@@ -13,9 +13,10 @@
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/threading/sequenced_worker_pool.h"
-#include "chrome/browser/ui/libgtk2ui/menu_util.h"
+#include "chrome/browser/ui/libgtk2ui/app_indicator_icon_menu.h"
#include "content/public/browser/browser_thread.h"
#include "ui/base/models/menu_model.h"
+#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_skia.h"
namespace {
@@ -167,10 +168,8 @@ AppIndicatorIcon::AppIndicatorIcon(std::string id,
const base::string16& tool_tip)
: id_(id),
icon_(NULL),
- gtk_menu_(NULL),
menu_model_(NULL),
icon_change_count_(0),
- block_activation_(false),
weak_factory_(this) {
EnsureMethodsLoaded();
tool_tip_ = base::UTF16ToUTF8(tool_tip);
@@ -179,8 +178,6 @@ AppIndicatorIcon::AppIndicatorIcon(std::string id,
AppIndicatorIcon::~AppIndicatorIcon() {
if (icon_) {
app_indicator_set_status(icon_, APP_INDICATOR_STATUS_PASSIVE);
- if (gtk_menu_)
- DestroyMenu();
g_object_unref(icon_);
content::BrowserThread::GetBlockingPool()->PostTask(
FROM_HERE,
@@ -224,30 +221,13 @@ void AppIndicatorIcon::SetPressedImage(const gfx::ImageSkia& image) {
void AppIndicatorIcon::SetToolTip(const base::string16& tool_tip) {
DCHECK(!tool_tip_.empty());
tool_tip_ = base::UTF16ToUTF8(tool_tip);
-
- // We can set the click action label only if the icon exists. Also we only
- // need to update the label if it is shown and it's only shown if we are sure
- // that there is a click action or if there is no menu.
- if (icon_ && (delegate()->HasClickAction() || menu_model_ == NULL)) {
- GList* children = gtk_container_get_children(GTK_CONTAINER(gtk_menu_));
- for (GList* child = children; child; child = g_list_next(child))
- if (g_object_get_data(G_OBJECT(child->data), "click-action-item") !=
- NULL) {
- gtk_menu_item_set_label(GTK_MENU_ITEM(child->data),
- tool_tip_.c_str());
- break;
- }
- g_list_free(children);
- }
+ UpdateClickActionReplacementMenuItem();
}
void AppIndicatorIcon::UpdatePlatformContextMenu(ui::MenuModel* model) {
if (!g_opened)
return;
- if (gtk_menu_) {
- DestroyMenu();
- }
menu_model_ = model;
// The icon is created asynchronously so it might not exist when the menu is
@@ -257,8 +237,7 @@ void AppIndicatorIcon::UpdatePlatformContextMenu(ui::MenuModel* model) {
}
void AppIndicatorIcon::RefreshPlatformContextMenu() {
- gtk_container_foreach(
- GTK_CONTAINER(gtk_menu_), SetMenuItemInfo, &block_activation_);
+ menu_->Refresh();
}
void AppIndicatorIcon::SetImageFromFile(const base::FilePath& icon_file_path) {
@@ -294,78 +273,29 @@ void AppIndicatorIcon::SetImageFromFile(const base::FilePath& icon_file_path) {
}
void AppIndicatorIcon::SetMenu() {
- gtk_menu_ = gtk_menu_new();
-
- if (delegate()->HasClickAction() || menu_model_ == NULL) {
- CreateClickActionReplacement();
- if (menu_model_) {
- // Add separator before the other menu items.
- GtkWidget* menu_item = gtk_separator_menu_item_new();
- gtk_widget_show(menu_item);
- gtk_menu_shell_append(GTK_MENU_SHELL(gtk_menu_), menu_item);
- }
- }
- if (menu_model_) {
- BuildSubmenuFromModel(menu_model_,
- gtk_menu_,
- G_CALLBACK(OnMenuItemActivatedThunk),
- &block_activation_,
- this);
- RefreshPlatformContextMenu();
- }
- app_indicator_set_menu(icon_, GTK_MENU(gtk_menu_));
+ menu_.reset(new AppIndicatorIconMenu(menu_model_));
+ UpdateClickActionReplacementMenuItem();
+ app_indicator_set_menu(icon_, menu_->GetGtkMenu());
}
-void AppIndicatorIcon::CreateClickActionReplacement() {
- DCHECK(!tool_tip_.empty());
+void AppIndicatorIcon::UpdateClickActionReplacementMenuItem() {
+ // The menu may not have been created yet.
+ if (!menu_.get())
+ return;
- // Add "click replacement menu item".
- GtkWidget* menu_item = gtk_menu_item_new_with_mnemonic(tool_tip_.c_str());
- g_object_set_data(
- G_OBJECT(menu_item), "click-action-item", GINT_TO_POINTER(1));
- g_signal_connect(menu_item, "activate", G_CALLBACK(OnClickThunk), this);
- gtk_widget_show(menu_item);
- gtk_menu_shell_prepend(GTK_MENU_SHELL(gtk_menu_), menu_item);
-}
+ if (!delegate()->HasClickAction() && menu_model_)
+ return;
-void AppIndicatorIcon::DestroyMenu() {
- gtk_widget_destroy(gtk_menu_);
- gtk_menu_ = NULL;
- menu_model_ = NULL;
+ DCHECK(!tool_tip_.empty());
+ menu_->UpdateClickActionReplacementMenuItem(
+ tool_tip_.c_str(),
+ base::Bind(&AppIndicatorIcon::OnClickActionReplacementMenuItemActivated,
+ base::Unretained(this)));
}
-void AppIndicatorIcon::OnClick(GtkWidget* menu_item) {
+void AppIndicatorIcon::OnClickActionReplacementMenuItemActivated() {
if (delegate())
delegate()->OnClick();
}
-void AppIndicatorIcon::OnMenuItemActivated(GtkWidget* menu_item) {
- if (block_activation_)
- return;
-
- ui::MenuModel* model = ModelForMenuItem(GTK_MENU_ITEM(menu_item));
- if (!model) {
- // There won't be a model for "native" submenus like the "Input Methods"
- // context menu. We don't need to handle activation messages for submenus
- // anyway, so we can just return here.
- DCHECK(gtk_menu_item_get_submenu(GTK_MENU_ITEM(menu_item)));
- return;
- }
-
- // The activate signal is sent to radio items as they get deselected;
- // ignore it in this case.
- if (GTK_IS_RADIO_MENU_ITEM(menu_item) &&
- !gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_item))) {
- return;
- }
-
- int id;
- if (!GetMenuItemID(menu_item, &id))
- return;
-
- // The menu item can still be activated by hotkeys even if it is disabled.
- if (menu_model_->IsEnabledAt(id))
- ExecuteCommand(model, id);
-}
-
} // namespace libgtk2ui

Powered by Google App Engine
This is Rietveld 408576698