summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk/browser_actions_toolbar_gtk.cc
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-15 18:30:33 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-15 18:30:33 +0000
commitdd12eb8c067510fae31d76472a8874ef16bce2f3 (patch)
tree85d0230a1732bb801d5ca510447d368807ddadce /chrome/browser/gtk/browser_actions_toolbar_gtk.cc
parent9118e6bce4bf3b5643a7cc4a64e63d697f3ee05b (diff)
downloadchromium_src-dd12eb8c067510fae31d76472a8874ef16bce2f3.zip
chromium_src-dd12eb8c067510fae31d76472a8874ef16bce2f3.tar.gz
chromium_src-dd12eb8c067510fae31d76472a8874ef16bce2f3.tar.bz2
Extensions: Make badge drawing code cross platform so linux (and eventually mac) can use it.
I will switch Windows over to the common function in a follow-up patch. BUG=23882 TEST=gmail browser action sample extension Review URL: http://codereview.chromium.org/279008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29152 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk/browser_actions_toolbar_gtk.cc')
-rw-r--r--chrome/browser/gtk/browser_actions_toolbar_gtk.cc65
1 files changed, 46 insertions, 19 deletions
diff --git a/chrome/browser/gtk/browser_actions_toolbar_gtk.cc b/chrome/browser/gtk/browser_actions_toolbar_gtk.cc
index a5f8796..0e57a9a 100644
--- a/chrome/browser/gtk/browser_actions_toolbar_gtk.cc
+++ b/chrome/browser/gtk/browser_actions_toolbar_gtk.cc
@@ -7,15 +7,18 @@
#include <gtk/gtk.h>
#include <vector>
+#include "app/gfx/canvas_paint.h"
#include "app/gfx/gtk_util.h"
#include "chrome/browser/browser.h"
#include "chrome/browser/extensions/extension_browser_event_router.h"
#include "chrome/browser/extensions/extensions_service.h"
#include "chrome/browser/extensions/image_loading_tracker.h"
#include "chrome/browser/gtk/gtk_chrome_button.h"
+#include "chrome/browser/gtk/gtk_theme_provider.h"
#include "chrome/browser/profile.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/notification_details.h"
+#include "chrome/common/notification_service.h"
#include "chrome/common/notification_source.h"
#include "chrome/common/notification_type.h"
@@ -47,9 +50,15 @@ class BrowserActionButton : public NotificationObserver,
// We need to hook up extension popups here. http://crbug.com/23897
g_signal_connect(button_.get(), "clicked",
G_CALLBACK(OnButtonClicked), this);
+ g_signal_connect_after(button_.get(), "expose-event",
+ G_CALLBACK(OnExposeEvent), this);
registrar_.Add(this, NotificationType::EXTENSION_BROWSER_ACTION_UPDATED,
Source<ExtensionAction>(extension->browser_action()));
+ registrar_.Add(this, NotificationType::BROWSER_THEME_CHANGED,
+ NotificationService::AllSources());
+
+ OnThemeChanged();
}
~BrowserActionButton() {
@@ -64,12 +73,26 @@ class BrowserActionButton : public NotificationObserver,
GtkWidget* widget() { return button_.get(); }
- static void OnButtonClicked(GtkWidget* widget, BrowserActionButton* action) {
- ExtensionBrowserEventRouter::GetInstance()->BrowserActionExecuted(
- action->browser_->profile(), action->extension_->id(),
- action->browser_);
+ void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ if (type == NotificationType::EXTENSION_BROWSER_ACTION_UPDATED)
+ OnStateUpdated();
+ else if (type == NotificationType::BROWSER_THEME_CHANGED)
+ OnThemeChanged();
+ else
+ NOTREACHED();
}
+ // ImageLoadingTracker::Observer implementation.
+ void OnImageLoaded(SkBitmap* image, size_t index) {
+ SkBitmap empty;
+ SkBitmap* bitmap = image ? image : &empty;
+ browser_action_icons_[index] = gfx::GdkPixbufFromSkBitmap(bitmap);
+ OnStateUpdated();
+ }
+
+ private:
// Called when the tooltip has changed or an image has loaded.
void OnStateUpdated() {
gtk_widget_set_tooltip_text(button_.get(),
@@ -86,26 +109,30 @@ class BrowserActionButton : public NotificationObserver,
}
}
- // NotificationObserver implementation.
- void Observe(NotificationType type,
- const NotificationSource& source,
- const NotificationDetails& details) {
- OnStateUpdated();
+ void OnThemeChanged() {
+ gtk_chrome_button_set_use_gtk_rendering(GTK_CHROME_BUTTON(button_.get()),
+ GtkThemeProvider::GetFrom(browser_->profile())->UseGtkTheme());
}
- // ImageLoadingTracker::Observer implementation.
- void OnImageLoaded(SkBitmap* image, size_t index) {
- if (image) {
- browser_action_icons_[index] = gfx::GdkPixbufFromSkBitmap(image);
- } else {
- SkBitmap empty;
- browser_action_icons_[index] = gfx::GdkPixbufFromSkBitmap(&empty);
- }
+ static void OnButtonClicked(GtkWidget* widget, BrowserActionButton* action) {
+ ExtensionBrowserEventRouter::GetInstance()->BrowserActionExecuted(
+ action->browser_->profile(), action->extension_->id(),
+ action->browser_);
+ }
- OnStateUpdated();
+ static gboolean OnExposeEvent(GtkWidget* widget,
+ GdkEventExpose* event,
+ BrowserActionButton* action) {
+ if (action->extension_->browser_action_state()->badge_text().empty())
+ return FALSE;
+
+ gfx::CanvasPaint canvas(event, false);
+ gfx::Rect bounding_rect(widget->allocation);
+ action->extension_->browser_action_state()->PaintBadge(&canvas,
+ bounding_rect);
+ return FALSE;
}
- private:
// The Browser that executes a command when the button is pressed.
Browser* browser_;