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