| Index: chrome/browser/gtk/toolbar_star_toggle_gtk.cc
|
| diff --git a/chrome/browser/gtk/toolbar_star_toggle_gtk.cc b/chrome/browser/gtk/toolbar_star_toggle_gtk.cc
|
| index 0fd10454521a81edf76779199c86bd027a960271..631ad2c0cf5facddd384c22b46554e61324c4acf 100644
|
| --- a/chrome/browser/gtk/toolbar_star_toggle_gtk.cc
|
| +++ b/chrome/browser/gtk/toolbar_star_toggle_gtk.cc
|
| @@ -10,16 +10,16 @@
|
| #include "chrome/browser/gtk/browser_toolbar_gtk.h"
|
| #include "chrome/browser/gtk/gtk_theme_provider.h"
|
| #include "chrome/browser/profile.h"
|
| +#include "chrome/common/notification_service.h"
|
| #include "grit/theme_resources.h"
|
|
|
| ToolbarStarToggleGtk::ToolbarStarToggleGtk(BrowserToolbarGtk* host)
|
| : host_(host),
|
| widget_(gtk_button_new()),
|
| is_starred_(false),
|
| - unstarred_(GtkThemeProvider::GetFrom(host->profile()),
|
| - IDR_STAR, IDR_STAR_P, IDR_STAR_H, IDR_STAR_D),
|
| - starred_(GtkThemeProvider::GetFrom(host->profile()),
|
| - IDR_STARRED, IDR_STARRED_P, IDR_STARRED_H, 0) {
|
| + theme_provider_(GtkThemeProvider::GetFrom(host->profile())),
|
| + unstarred_(theme_provider_, IDR_STAR, IDR_STAR_P, IDR_STAR_H, IDR_STAR_D),
|
| + starred_(theme_provider_, IDR_STARRED, IDR_STARRED_P, IDR_STARRED_H, 0) {
|
| gtk_widget_set_size_request(widget_.get(),
|
| gdk_pixbuf_get_width(unstarred_.pixbufs(0)),
|
| gdk_pixbuf_get_height(unstarred_.pixbufs(0)));
|
| @@ -27,15 +27,31 @@ ToolbarStarToggleGtk::ToolbarStarToggleGtk(BrowserToolbarGtk* host)
|
| gtk_widget_set_app_paintable(widget_.get(), TRUE);
|
| // We effectively double-buffer by virtue of having only one image...
|
| gtk_widget_set_double_buffered(widget_.get(), FALSE);
|
| +
|
| g_signal_connect(G_OBJECT(widget_.get()), "expose-event",
|
| G_CALLBACK(OnExpose), this);
|
| GTK_WIDGET_UNSET_FLAGS(widget_.get(), GTK_CAN_FOCUS);
|
| +
|
| + theme_provider_->InitThemesFor(this);
|
| + registrar_.Add(this,
|
| + NotificationType::BROWSER_THEME_CHANGED,
|
| + NotificationService::AllSources());
|
| }
|
|
|
| ToolbarStarToggleGtk::~ToolbarStarToggleGtk() {
|
| widget_.Destroy();
|
| }
|
|
|
| +void ToolbarStarToggleGtk::Observe(NotificationType type,
|
| + const NotificationSource& source, const NotificationDetails& details) {
|
| + DCHECK(NotificationType::BROWSER_THEME_CHANGED == type);
|
| +
|
| + GtkThemeProvider* provider = static_cast<GtkThemeProvider*>(
|
| + Source<GtkThemeProvider>(source).ptr());
|
| + DCHECK(provider == theme_provider_);
|
| + UpdateGTKButton();
|
| +}
|
| +
|
| void ToolbarStarToggleGtk::ShowStarBubble(const GURL& url,
|
| bool newly_bookmarked) {
|
| GtkWidget* widget = widget_.get();
|
| @@ -56,14 +72,46 @@ void ToolbarStarToggleGtk::ShowStarBubble(const GURL& url,
|
| void ToolbarStarToggleGtk::SetStarred(bool starred) {
|
| is_starred_ = starred;
|
| gtk_widget_queue_draw(widget_.get());
|
| + UpdateGTKButton();
|
| }
|
|
|
| // static
|
| gboolean ToolbarStarToggleGtk::OnExpose(GtkWidget* widget, GdkEventExpose* e,
|
| ToolbarStarToggleGtk* button) {
|
| - if (button->is_starred_) {
|
| - return button->starred_.OnExpose(widget, e);
|
| + if (button->theme_provider_->UseGtkTheme()) {
|
| + return FALSE;
|
| + } else {
|
| + if (button->is_starred_) {
|
| + return button->starred_.OnExpose(widget, e);
|
| + } else {
|
| + return button->unstarred_.OnExpose(widget, e);
|
| + }
|
| + }
|
| +}
|
| +
|
| +void ToolbarStarToggleGtk::UpdateGTKButton() {
|
| + if (theme_provider_->UseGtkTheme()) {
|
| + GdkPixbuf* pixbuf = NULL;
|
| + if (is_starred_) {
|
| + pixbuf = theme_provider_->GetPixbufNamed(IDR_STARRED_NOBORDER);
|
| + } else {
|
| + pixbuf = theme_provider_->GetPixbufNamed(IDR_STAR_NOBORDER);
|
| + }
|
| +
|
| + gtk_button_set_image(
|
| + GTK_BUTTON(widget_.get()),
|
| + gtk_image_new_from_pixbuf(pixbuf));
|
| +
|
| + gtk_widget_set_size_request(widget_.get(), -1, -1);
|
| + gtk_widget_set_app_paintable(widget_.get(), FALSE);
|
| + gtk_widget_set_double_buffered(widget_.get(), TRUE);
|
| } else {
|
| - return button->unstarred_.OnExpose(widget, e);
|
| + gtk_widget_set_size_request(widget_.get(),
|
| + gdk_pixbuf_get_width(unstarred_.pixbufs(0)),
|
| + gdk_pixbuf_get_height(unstarred_.pixbufs(0)));
|
| +
|
| + gtk_widget_set_app_paintable(widget_.get(), TRUE);
|
| + // We effectively double-buffer by virtue of having only one image...
|
| + gtk_widget_set_double_buffered(widget_.get(), FALSE);
|
| }
|
| }
|
|
|