| Index: chrome/browser/gtk/go_button_gtk.cc
|
| diff --git a/chrome/browser/gtk/go_button_gtk.cc b/chrome/browser/gtk/go_button_gtk.cc
|
| index 6ea9369d352f9a5d3cf216056b86f8713ee5bd08..34455de2d60ed4c5a641806fede4a29019796b83 100644
|
| --- a/chrome/browser/gtk/go_button_gtk.cc
|
| +++ b/chrome/browser/gtk/go_button_gtk.cc
|
| @@ -9,9 +9,10 @@
|
| #include "base/message_loop.h"
|
| #include "chrome/app/chrome_dll_resource.h"
|
| #include "chrome/browser/browser.h"
|
| -#include "chrome/browser/gtk/location_bar_view_gtk.h"
|
| #include "chrome/browser/gtk/gtk_theme_provider.h"
|
| +#include "chrome/browser/gtk/location_bar_view_gtk.h"
|
| #include "chrome/browser/profile.h"
|
| +#include "chrome/common/notification_service.h"
|
| #include "grit/generated_resources.h"
|
| #include "grit/theme_resources.h"
|
|
|
| @@ -23,10 +24,10 @@ GoButtonGtk::GoButtonGtk(LocationBarViewGtk* location_bar, Browser* browser)
|
| intended_mode_(MODE_GO),
|
| visible_mode_(MODE_GO),
|
| state_(BS_NORMAL),
|
| - go_(browser ? GtkThemeProvider::GetFrom(browser->profile()) : NULL,
|
| - IDR_GO, IDR_GO_P, IDR_GO_H, 0),
|
| - stop_(browser ? GtkThemeProvider::GetFrom(browser->profile()) : NULL,
|
| - IDR_STOP, IDR_STOP_P, IDR_STOP_H, 0),
|
| + theme_provider_(browser ?
|
| + GtkThemeProvider::GetFrom(browser->profile()) : NULL),
|
| + go_(theme_provider_, IDR_GO, IDR_GO_P, IDR_GO_H, 0),
|
| + stop_(theme_provider_, IDR_STOP, IDR_STOP_P, IDR_STOP_H, 0),
|
| widget_(gtk_button_new()) {
|
| gtk_widget_set_size_request(widget_.get(),
|
| gdk_pixbuf_get_width(go_.pixbufs(0)),
|
| @@ -47,6 +48,13 @@ GoButtonGtk::GoButtonGtk(LocationBarViewGtk* location_bar, Browser* browser)
|
| GTK_WIDGET_UNSET_FLAGS(widget_.get(), GTK_CAN_FOCUS);
|
|
|
| SetTooltip();
|
| +
|
| + if (theme_provider_) {
|
| + theme_provider_->InitThemesFor(this);
|
| + registrar_.Add(this,
|
| + NotificationType::BROWSER_THEME_CHANGED,
|
| + NotificationService::AllSources());
|
| + }
|
| }
|
|
|
| GoButtonGtk::~GoButtonGtk() {
|
| @@ -65,9 +73,21 @@ void GoButtonGtk::ChangeMode(Mode mode, bool force) {
|
| gtk_widget_queue_draw(widget_.get());
|
| SetTooltip();
|
| visible_mode_ = mode;
|
| +
|
| + UpdateThemeButtons();
|
| }
|
| }
|
|
|
| +void GoButtonGtk::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_);
|
| + UpdateThemeButtons();
|
| +}
|
| +
|
| Task* GoButtonGtk::CreateButtonTimerTask() {
|
| return stop_timer_.NewRunnableMethod(&GoButtonGtk::OnButtonTimer);
|
| }
|
| @@ -81,10 +101,14 @@ void GoButtonGtk::OnButtonTimer() {
|
| gboolean GoButtonGtk::OnExpose(GtkWidget* widget,
|
| GdkEventExpose* e,
|
| GoButtonGtk* button) {
|
| - if (button->visible_mode_ == MODE_GO) {
|
| - return button->go_.OnExpose(widget, e);
|
| + if (button->theme_provider_->UseGtkTheme()) {
|
| + return FALSE;
|
| } else {
|
| - return button->stop_.OnExpose(widget, e);
|
| + if (button->visible_mode_ == MODE_GO) {
|
| + return button->go_.OnExpose(widget, e);
|
| + } else {
|
| + return button->stop_.OnExpose(widget, e);
|
| + }
|
| }
|
| }
|
|
|
| @@ -173,3 +197,31 @@ void GoButtonGtk::SetTooltip() {
|
| widget_.get(), l10n_util::GetStringUTF8(IDS_TOOLTIP_STOP).c_str());
|
| }
|
| }
|
| +
|
| +void GoButtonGtk::UpdateThemeButtons() {
|
| + if (theme_provider_->UseGtkTheme()) {
|
| + // TODO(erg): Waiting for Glen to make a version of these that don't have a
|
| + // button border on it.
|
| + if (intended_mode_ == MODE_GO) {
|
| + gtk_button_set_image(
|
| + GTK_BUTTON(widget_.get()),
|
| + gtk_image_new_from_stock(GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_BUTTON));
|
| + } else {
|
| + gtk_button_set_image(
|
| + GTK_BUTTON(widget_.get()),
|
| + gtk_image_new_from_stock(GTK_STOCK_STOP, GTK_ICON_SIZE_BUTTON));
|
| + }
|
| +
|
| + 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 {
|
| + gtk_widget_set_size_request(widget_.get(),
|
| + gdk_pixbuf_get_width(go_.pixbufs(0)),
|
| + gdk_pixbuf_get_height(go_.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);
|
| + }
|
| +}
|
|
|