172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/status_icons/status_icon_gtk.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string16.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h" 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/menu_gtk.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/skia/include/core/SkBitmap.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/gtk_util.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochStatusIconGtk::StatusIconGtk() { 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch icon_ = gtk_status_icon_new(); 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_status_icon_set_visible(icon_, TRUE); 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_signal_connect(icon_, "activate", 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch G_CALLBACK(OnClickThunk), this); 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick g_signal_connect(icon_, "popup-menu", 213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick G_CALLBACK(OnPopupMenuThunk), this); 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochStatusIconGtk::~StatusIconGtk() { 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_object_unref(icon_); 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid StatusIconGtk::SetImage(const SkBitmap& image) { 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (image.isNull()) 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&image); 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_status_icon_set_from_pixbuf(icon_, pixbuf); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_object_unref(pixbuf); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid StatusIconGtk::SetPressedImage(const SkBitmap& image) { 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Ignore pressed images, since the standard on Linux is to not highlight 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // pressed status icons. 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid StatusIconGtk::SetToolTip(const string16& tool_tip) { 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_status_icon_set_tooltip(icon_, UTF16ToUTF8(tool_tip).c_str()); 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid StatusIconGtk::DisplayBalloon(const string16& title, 47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const string16& contents) { 48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // TODO(atwilson): Figure out the right thing to do here. 49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // http://crbug.com/74970 50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid StatusIconGtk::OnClick(GtkWidget* widget) { 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DispatchClickEvent(); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid StatusIconGtk::UpdatePlatformContextMenu(ui::MenuModel* model) { 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!model) 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick menu_.reset(); 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick else 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick menu_.reset(new MenuGtk(NULL, model)); 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid StatusIconGtk::OnPopupMenu(GtkWidget* widget, guint button, guint time) { 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // If we have a menu - display it. 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (menu_.get()) 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick menu_->PopupAsContextForStatusIcon(time, button, icon_); 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 68