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