summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-03 00:17:35 +0000
committerevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-03 00:17:35 +0000
commitae5fc52d593caf53ead844625dac33423c971099 (patch)
treedca0dc214d4cc1bac87c1548c2c377d430c8e5e0 /chrome/browser
parent97e6660580388d2ac6e098e7e6ece3c0b6bf9641 (diff)
downloadchromium_src-ae5fc52d593caf53ead844625dac33423c971099.zip
chromium_src-ae5fc52d593caf53ead844625dac33423c971099.tar.gz
chromium_src-ae5fc52d593caf53ead844625dac33423c971099.tar.bz2
gtk: Implement status icons on linux.
BUG=37375 TEST=out/Debug/unit_tests --gtest_filter=StatusTrayGtkTest.* Patch from Thiago Farina <thiago.farina@gmail.com> Review URL: http://codereview.chromium.org/1421001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@43553 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/gtk/status_icons/status_icon_gtk.cc44
-rw-r--r--chrome/browser/gtk/status_icons/status_icon_gtk.h34
-rw-r--r--chrome/browser/gtk/status_icons/status_tray_gtk.cc21
-rw-r--r--chrome/browser/gtk/status_icons/status_tray_gtk.h23
-rw-r--r--chrome/browser/gtk/status_icons/status_tray_gtk_unittest.cc50
-rw-r--r--chrome/browser/status_icons/status_tray_manager.cc2
6 files changed, 173 insertions, 1 deletions
diff --git a/chrome/browser/gtk/status_icons/status_icon_gtk.cc b/chrome/browser/gtk/status_icons/status_icon_gtk.cc
new file mode 100644
index 0000000..c42b761
--- /dev/null
+++ b/chrome/browser/gtk/status_icons/status_icon_gtk.cc
@@ -0,0 +1,44 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/gtk/status_icons/status_icon_gtk.h"
+
+#include "base/string16.h"
+#include "base/logging.h"
+#include "base/utf_string_conversions.h"
+#include "gfx/gtk_util.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+
+StatusIconGtk::StatusIconGtk() {
+ icon_ = gtk_status_icon_new();
+ gtk_status_icon_set_visible(icon_, TRUE);
+
+ g_signal_connect(icon_, "activate",
+ G_CALLBACK(OnClick), this);
+}
+
+StatusIconGtk::~StatusIconGtk() {
+ g_object_unref(icon_);
+}
+
+void StatusIconGtk::SetImage(const SkBitmap& image) {
+ if (image.isNull())
+ return;
+
+ GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&image);
+ gtk_status_icon_set_from_pixbuf(icon_, pixbuf);
+}
+
+void StatusIconGtk::SetPressedImage(const SkBitmap& image) {
+ // Ignore pressed images, since the standard on Linux is to not highlight
+ // pressed status icons.
+}
+
+void StatusIconGtk::SetToolTip(const string16& tool_tip) {
+ gtk_status_icon_set_tooltip(icon_, UTF16ToUTF8(tool_tip).c_str());
+}
+
+void StatusIconGtk::OnClick(GtkWidget* widget, StatusIconGtk* status_icon) {
+ status_icon->DispatchClickEvent();
+}
diff --git a/chrome/browser/gtk/status_icons/status_icon_gtk.h b/chrome/browser/gtk/status_icons/status_icon_gtk.h
new file mode 100644
index 0000000..7ce1df2
--- /dev/null
+++ b/chrome/browser/gtk/status_icons/status_icon_gtk.h
@@ -0,0 +1,34 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_GTK_STATUS_ICONS_STATUS_ICON_GTK_H_
+#define CHROME_BROWSER_GTK_STATUS_ICONS_STATUS_ICON_GTK_H_
+
+#include <gtk/gtk.h>
+
+#include "chrome/browser/status_icons/status_icon.h"
+
+class SkBitmap;
+
+class StatusIconGtk : public StatusIcon {
+ public:
+ StatusIconGtk();
+ virtual ~StatusIconGtk();
+
+ // Overridden from StatusIcon:
+ virtual void SetImage(const SkBitmap& image);
+ virtual void SetPressedImage(const SkBitmap& image);
+ virtual void SetToolTip(const string16& tool_tip);
+
+ // Exposed for testing.
+ static void OnClick(GtkWidget* widget, StatusIconGtk* status_icon);
+
+ private:
+ // The currently-displayed icon for the window.
+ GtkStatusIcon* icon_;
+
+ DISALLOW_COPY_AND_ASSIGN(StatusIconGtk);
+};
+
+#endif // CHROME_BROWSER_GTK_STATUS_ICONS_STATUS_ICON_GTK_H_
diff --git a/chrome/browser/gtk/status_icons/status_tray_gtk.cc b/chrome/browser/gtk/status_icons/status_tray_gtk.cc
new file mode 100644
index 0000000..6b2764e
--- /dev/null
+++ b/chrome/browser/gtk/status_icons/status_tray_gtk.cc
@@ -0,0 +1,21 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/gtk/status_icons/status_tray_gtk.h"
+
+#include "chrome/browser/gtk/status_icons/status_icon_gtk.h"
+
+StatusTrayGtk::StatusTrayGtk() {
+}
+
+StatusTrayGtk::~StatusTrayGtk() {
+}
+
+StatusIcon* StatusTrayGtk::CreateStatusIcon() {
+ return new StatusIconGtk();
+}
+
+StatusTray* StatusTray::Create() {
+ return new StatusTrayGtk();
+}
diff --git a/chrome/browser/gtk/status_icons/status_tray_gtk.h b/chrome/browser/gtk/status_icons/status_tray_gtk.h
new file mode 100644
index 0000000..a41e5df0
--- /dev/null
+++ b/chrome/browser/gtk/status_icons/status_tray_gtk.h
@@ -0,0 +1,23 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_GTK_STATUS_ICONS_STATUS_TRAY_GTK_H_
+#define CHROME_BROWSER_GTK_STATUS_ICONS_STATUS_TRAY_GTK_H_
+
+#include "chrome/browser/status_icons/status_tray.h"
+
+class StatusTrayGtk : public StatusTray {
+ public:
+ StatusTrayGtk();
+ ~StatusTrayGtk();
+
+ protected:
+ // Overriden from StatusTray:
+ virtual StatusIcon* CreateStatusIcon();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(StatusTrayGtk);
+};
+
+#endif // CHROME_BROWSER_GTK_STATUS_ICONS_STATUS_TRAY_GTK_H_
diff --git a/chrome/browser/gtk/status_icons/status_tray_gtk_unittest.cc b/chrome/browser/gtk/status_icons/status_tray_gtk_unittest.cc
new file mode 100644
index 0000000..58b2616
--- /dev/null
+++ b/chrome/browser/gtk/status_icons/status_tray_gtk_unittest.cc
@@ -0,0 +1,50 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "app/resource_bundle.h"
+#include "base/string_util.h"
+#include "chrome/browser/gtk/status_icons/status_icon_gtk.h"
+#include "chrome/browser/gtk/status_icons/status_tray_gtk.h"
+#include "grit/browser_resources.h"
+#include "grit/theme_resources.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+class MockStatusIconObserver : public StatusIcon::Observer {
+ public:
+ MOCK_METHOD0(OnClicked, void());
+};
+
+TEST(StatusTrayGtkTest, CreateTray) {
+ // Just tests creation/destruction.
+ StatusTrayGtk tray;
+}
+
+TEST(StatusTrayGtkTest, CreateIcon) {
+ // Create an icon, set the images and tooltip, then shut it down.
+ StatusTrayGtk tray;
+ StatusIcon* icon = tray.GetStatusIcon(ASCIIToUTF16("test"));
+ SkBitmap* bitmap = ResourceBundle::GetSharedInstance().GetBitmapNamed(
+ IDR_STATUS_TRAY_ICON);
+ icon->SetImage(*bitmap);
+ icon->SetPressedImage(*bitmap);
+ icon->SetToolTip(ASCIIToUTF16("tool tip"));
+}
+
+TEST(StatusTrayGtkTest, ClickOnIcon) {
+ // Create an icon, send a fake click event, make sure observer is called.
+ StatusTrayGtk tray;
+ StatusIconGtk* icon = static_cast<StatusIconGtk*>(
+ tray.GetStatusIcon(ASCIIToUTF16("test")));
+ MockStatusIconObserver observer;
+ icon->AddObserver(&observer);
+ EXPECT_CALL(observer, OnClicked());
+ // Mimic a click.
+ icon->OnClick(NULL, icon);
+ icon->RemoveObserver(&observer);
+}
+
+} // namespace
diff --git a/chrome/browser/status_icons/status_tray_manager.cc b/chrome/browser/status_icons/status_tray_manager.cc
index b5465c3..4040a51 100644
--- a/chrome/browser/status_icons/status_tray_manager.cc
+++ b/chrome/browser/status_icons/status_tray_manager.cc
@@ -23,7 +23,7 @@ StatusTrayManager::~StatusTrayManager() {
}
void StatusTrayManager::Init(Profile* profile) {
-#if !defined(OS_LINUX)
+#if !defined(OS_CHROMEOS)
DCHECK(profile);
profile_ = profile;
status_tray_.reset(StatusTray::Create());