146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/gtk2_status_icon.h"
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <gtk/gtk.h>
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/app_indicator_icon_menu.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/skia_utils_gtk2.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/base/models/menu_model.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/gfx/image/image_skia.h"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace libgtk2ui {
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)Gtk2StatusIcon::Gtk2StatusIcon(const gfx::ImageSkia& image,
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                               const base::string16& tool_tip) {
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  GdkPixbuf* pixbuf = GdkPixbufFromSkBitmap(*image.bitmap());
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gtk_status_icon_ = gtk_status_icon_new_from_pixbuf(pixbuf);
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  g_object_unref(pixbuf);
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  g_signal_connect(gtk_status_icon_, "activate", G_CALLBACK(OnClickThunk),
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      this);
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  g_signal_connect(gtk_status_icon_, "popup_menu",
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      G_CALLBACK(OnContextMenuRequestedThunk), this);
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetToolTip(tool_tip);
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)Gtk2StatusIcon::~Gtk2StatusIcon() {
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  g_object_unref(gtk_status_icon_);
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void Gtk2StatusIcon::SetImage(const gfx::ImageSkia& image) {
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  GdkPixbuf* pixbuf = GdkPixbufFromSkBitmap(*image.bitmap());
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gtk_status_icon_set_from_pixbuf(gtk_status_icon_, pixbuf);
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  g_object_unref(pixbuf);
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void Gtk2StatusIcon::SetToolTip(const base::string16& tool_tip) {
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gtk_status_icon_set_tooltip_text(gtk_status_icon_,
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                   base::UTF16ToUTF8(tool_tip).c_str());
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void Gtk2StatusIcon::UpdatePlatformContextMenu(ui::MenuModel* model) {
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  menu_.reset();
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (model)
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    menu_.reset(new AppIndicatorIconMenu(model));
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void Gtk2StatusIcon::RefreshPlatformContextMenu() {
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (menu_.get())
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    menu_->Refresh();
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void Gtk2StatusIcon::OnClick(GtkStatusIcon* status_icon) {
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (delegate())
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    delegate()->OnClick();
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void Gtk2StatusIcon::OnContextMenuRequested(GtkStatusIcon* status_icon,
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                            guint button,
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                            guint32 activate_time) {
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (menu_.get()) {
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    gtk_menu_popup(menu_->GetGtkMenu(),
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   NULL,
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   NULL,
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   gtk_status_icon_position_menu,
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   gtk_status_icon_,
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   button,
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   activate_time);
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace libgtk2ui
76