Home | History | Annotate | Download | only in libgtk2ui
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/libgtk2ui/gtk2_status_icon.h"
      6 
      7 #include <gtk/gtk.h>
      8 
      9 #include "base/strings/utf_string_conversions.h"
     10 #include "chrome/browser/ui/libgtk2ui/app_indicator_icon_menu.h"
     11 #include "chrome/browser/ui/libgtk2ui/skia_utils_gtk2.h"
     12 #include "ui/base/models/menu_model.h"
     13 #include "ui/gfx/image/image_skia.h"
     14 
     15 namespace libgtk2ui {
     16 
     17 Gtk2StatusIcon::Gtk2StatusIcon(const gfx::ImageSkia& image,
     18                                const base::string16& tool_tip) {
     19   GdkPixbuf* pixbuf = GdkPixbufFromSkBitmap(*image.bitmap());
     20   gtk_status_icon_ = gtk_status_icon_new_from_pixbuf(pixbuf);
     21   g_object_unref(pixbuf);
     22 
     23   g_signal_connect(gtk_status_icon_, "activate", G_CALLBACK(OnClickThunk),
     24       this);
     25   g_signal_connect(gtk_status_icon_, "popup_menu",
     26       G_CALLBACK(OnContextMenuRequestedThunk), this);
     27   SetToolTip(tool_tip);
     28 }
     29 
     30 Gtk2StatusIcon::~Gtk2StatusIcon() {
     31   g_object_unref(gtk_status_icon_);
     32 }
     33 
     34 void Gtk2StatusIcon::SetImage(const gfx::ImageSkia& image) {
     35   GdkPixbuf* pixbuf = GdkPixbufFromSkBitmap(*image.bitmap());
     36   gtk_status_icon_set_from_pixbuf(gtk_status_icon_, pixbuf);
     37   g_object_unref(pixbuf);
     38 }
     39 
     40 void Gtk2StatusIcon::SetToolTip(const base::string16& tool_tip) {
     41   gtk_status_icon_set_tooltip_text(gtk_status_icon_,
     42                                    base::UTF16ToUTF8(tool_tip).c_str());
     43 }
     44 
     45 void Gtk2StatusIcon::UpdatePlatformContextMenu(ui::MenuModel* model) {
     46   menu_.reset();
     47   if (model)
     48     menu_.reset(new AppIndicatorIconMenu(model));
     49 }
     50 
     51 void Gtk2StatusIcon::RefreshPlatformContextMenu() {
     52   if (menu_.get())
     53     menu_->Refresh();
     54 }
     55 
     56 void Gtk2StatusIcon::OnClick(GtkStatusIcon* status_icon) {
     57   if (delegate())
     58     delegate()->OnClick();
     59 }
     60 
     61 void Gtk2StatusIcon::OnContextMenuRequested(GtkStatusIcon* status_icon,
     62                                             guint button,
     63                                             guint32 activate_time) {
     64   if (menu_.get()) {
     65     gtk_menu_popup(menu_->GetGtkMenu(),
     66                    NULL,
     67                    NULL,
     68                    gtk_status_icon_position_menu,
     69                    gtk_status_icon_,
     70                    button,
     71                    activate_time);
     72   }
     73 }
     74 
     75 }  // namespace libgtk2ui
     76