| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/gtk/reload_button_gtk.h" | 5 #include "chrome/browser/gtk/reload_button_gtk.h" |
| 6 | 6 |
| 7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "chrome/app/chrome_dll_resource.h" | 9 #include "chrome/app/chrome_dll_resource.h" |
| 10 #include "chrome/browser/browser.h" | 10 #include "chrome/browser/browser.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 browser_(browser), | 27 browser_(browser), |
| 28 button_delay_(0), | 28 button_delay_(0), |
| 29 pretend_timer_is_running_for_unittest_(false), | 29 pretend_timer_is_running_for_unittest_(false), |
| 30 intended_mode_(MODE_RELOAD), | 30 intended_mode_(MODE_RELOAD), |
| 31 visible_mode_(MODE_RELOAD), | 31 visible_mode_(MODE_RELOAD), |
| 32 theme_provider_(browser ? | 32 theme_provider_(browser ? |
| 33 GtkThemeProvider::GetFrom(browser->profile()) : NULL), | 33 GtkThemeProvider::GetFrom(browser->profile()) : NULL), |
| 34 reload_(theme_provider_, IDR_RELOAD, IDR_RELOAD_P, IDR_RELOAD_H, 0), | 34 reload_(theme_provider_, IDR_RELOAD, IDR_RELOAD_P, IDR_RELOAD_H, 0), |
| 35 stop_(theme_provider_, IDR_STOP, IDR_STOP_P, IDR_STOP_H, 0), | 35 stop_(theme_provider_, IDR_STOP, IDR_STOP_P, IDR_STOP_H, 0), |
| 36 widget_(gtk_chrome_button_new()) { | 36 widget_(gtk_chrome_button_new()) { |
| 37 gtk_widget_set_size_request(widget_.get(), reload_.Width(), reload_.Height()); | 37 gtk_widget_set_size_request(widget(), reload_.Width(), reload_.Height()); |
| 38 | 38 |
| 39 gtk_widget_set_app_paintable(widget_.get(), TRUE); | 39 gtk_widget_set_app_paintable(widget(), TRUE); |
| 40 | 40 |
| 41 g_signal_connect(widget_.get(), "clicked", | 41 g_signal_connect(widget(), "clicked", G_CALLBACK(OnClickedThunk), this); |
| 42 G_CALLBACK(OnClickedThunk), this); | 42 g_signal_connect(widget(), "expose-event", G_CALLBACK(OnExposeThunk), this); |
| 43 g_signal_connect(widget_.get(), "expose-event", | 43 g_signal_connect(widget(), "leave-notify-event", |
| 44 G_CALLBACK(OnExposeThunk), this); | |
| 45 g_signal_connect(widget_.get(), "leave-notify-event", | |
| 46 G_CALLBACK(OnLeaveNotifyThunk), this); | 44 G_CALLBACK(OnLeaveNotifyThunk), this); |
| 47 GTK_WIDGET_UNSET_FLAGS(widget_.get(), GTK_CAN_FOCUS); | 45 GTK_WIDGET_UNSET_FLAGS(widget(), GTK_CAN_FOCUS); |
| 48 | 46 |
| 49 gtk_widget_set_has_tooltip(widget_.get(), TRUE); | 47 gtk_widget_set_has_tooltip(widget(), TRUE); |
| 50 g_signal_connect(widget_.get(), "query-tooltip", | 48 g_signal_connect(widget(), "query-tooltip", G_CALLBACK(OnQueryTooltipThunk), |
| 51 G_CALLBACK(OnQueryTooltipThunk), this); | 49 this); |
| 52 | 50 |
| 53 hover_controller_.Init(widget()); | 51 hover_controller_.Init(widget()); |
| 54 gtk_util::SetButtonTriggersNavigation(widget()); | 52 gtk_util::SetButtonTriggersNavigation(widget()); |
| 55 | 53 |
| 56 if (theme_provider_) { | 54 if (theme_provider_) { |
| 57 theme_provider_->InitThemesFor(this); | 55 theme_provider_->InitThemesFor(this); |
| 58 registrar_.Add(this, | 56 registrar_.Add(this, |
| 59 NotificationType::BROWSER_THEME_CHANGED, | 57 NotificationType::BROWSER_THEME_CHANGED, |
| 60 Source<GtkThemeProvider>(theme_provider_)); | 58 Source<GtkThemeProvider>(theme_provider_)); |
| 61 } | 59 } |
| 62 } | 60 } |
| 63 | 61 |
| 64 ReloadButtonGtk::~ReloadButtonGtk() { | 62 ReloadButtonGtk::~ReloadButtonGtk() { |
| 65 widget_.Destroy(); | 63 widget_.Destroy(); |
| 66 } | 64 } |
| 67 | 65 |
| 68 void ReloadButtonGtk::ChangeMode(Mode mode, bool force) { | 66 void ReloadButtonGtk::ChangeMode(Mode mode, bool force) { |
| 69 intended_mode_ = mode; | 67 intended_mode_ = mode; |
| 70 | 68 |
| 71 // If the change is forced, or the user isn't hovering the icon, or it's safe | 69 // If the change is forced, or the user isn't hovering the icon, or it's safe |
| 72 // to change it to the other image type, make the change immediately; | 70 // to change it to the other image type, make the change immediately; |
| 73 // otherwise we'll let it happen later. | 71 // otherwise we'll let it happen later. |
| 74 if (force || GTK_WIDGET_STATE(widget()) == GTK_STATE_NORMAL || | 72 if (force || GTK_WIDGET_STATE(widget()) == GTK_STATE_NORMAL || |
| 75 ((mode == MODE_STOP) ? | 73 ((mode == MODE_STOP) ? |
| 76 !timer_running() : (visible_mode_ != MODE_STOP))) { | 74 !timer_running() : (visible_mode_ != MODE_STOP))) { |
| 77 timer_.Stop(); | 75 timer_.Stop(); |
| 78 visible_mode_ = mode; | 76 visible_mode_ = mode; |
| 79 | 77 |
| 80 UpdateThemeButtons(); | 78 UpdateThemeButtons(); |
| 81 gtk_widget_queue_draw(widget_.get()); | 79 gtk_widget_queue_draw(widget()); |
| 82 } | 80 } |
| 83 } | 81 } |
| 84 | 82 |
| 85 void ReloadButtonGtk::Observe(NotificationType type, | 83 void ReloadButtonGtk::Observe(NotificationType type, |
| 86 const NotificationSource& source, | 84 const NotificationSource& source, |
| 87 const NotificationDetails& details) { | 85 const NotificationDetails& details) { |
| 88 DCHECK(NotificationType::BROWSER_THEME_CHANGED == type); | 86 DCHECK(NotificationType::BROWSER_THEME_CHANGED == type); |
| 89 | 87 |
| 90 GtkThemeProvider* provider = static_cast<GtkThemeProvider*>( | 88 GtkThemeProvider* provider = static_cast<GtkThemeProvider*>( |
| 91 Source<GtkThemeProvider>(source).ptr()); | 89 Source<GtkThemeProvider>(source).ptr()); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 } | 178 } |
| 181 | 179 |
| 182 void ReloadButtonGtk::UpdateThemeButtons() { | 180 void ReloadButtonGtk::UpdateThemeButtons() { |
| 183 bool use_gtk = theme_provider_ && theme_provider_->UseGtkTheme(); | 181 bool use_gtk = theme_provider_ && theme_provider_->UseGtkTheme(); |
| 184 | 182 |
| 185 if (use_gtk) { | 183 if (use_gtk) { |
| 186 GdkPixbuf* pixbuf = gtk_widget_render_icon(widget(), | 184 GdkPixbuf* pixbuf = gtk_widget_render_icon(widget(), |
| 187 (intended_mode_ == MODE_RELOAD) ? GTK_STOCK_REFRESH : GTK_STOCK_STOP, | 185 (intended_mode_ == MODE_RELOAD) ? GTK_STOCK_REFRESH : GTK_STOCK_STOP, |
| 188 GTK_ICON_SIZE_SMALL_TOOLBAR, NULL); | 186 GTK_ICON_SIZE_SMALL_TOOLBAR, NULL); |
| 189 | 187 |
| 190 gtk_button_set_image(GTK_BUTTON(widget_.get()), | 188 gtk_button_set_image(GTK_BUTTON(widget()), |
| 191 gtk_image_new_from_pixbuf(pixbuf)); | 189 gtk_image_new_from_pixbuf(pixbuf)); |
| 192 g_object_unref(pixbuf); | 190 g_object_unref(pixbuf); |
| 193 | 191 |
| 194 gtk_widget_set_size_request(widget_.get(), -1, -1); | 192 gtk_widget_set_size_request(widget(), -1, -1); |
| 195 GtkRequisition req; | 193 GtkRequisition req; |
| 196 gtk_widget_size_request(widget(), &req); | 194 gtk_widget_size_request(widget(), &req); |
| 197 GtkButtonWidth = std::max(GtkButtonWidth, req.width); | 195 GtkButtonWidth = std::max(GtkButtonWidth, req.width); |
| 198 gtk_widget_set_size_request(widget_.get(), GtkButtonWidth, -1); | 196 gtk_widget_set_size_request(widget(), GtkButtonWidth, -1); |
| 199 | 197 |
| 200 gtk_widget_set_app_paintable(widget_.get(), FALSE); | 198 gtk_widget_set_app_paintable(widget(), FALSE); |
| 201 gtk_widget_set_double_buffered(widget_.get(), TRUE); | 199 gtk_widget_set_double_buffered(widget(), TRUE); |
| 202 } else { | 200 } else { |
| 203 gtk_button_set_image(GTK_BUTTON(widget()), NULL); | 201 gtk_button_set_image(GTK_BUTTON(widget()), NULL); |
| 204 | 202 |
| 205 gtk_widget_set_size_request(widget_.get(), reload_.Width(), | 203 gtk_widget_set_size_request(widget(), reload_.Width(), reload_.Height()); |
| 206 reload_.Height()); | |
| 207 | 204 |
| 208 gtk_widget_set_app_paintable(widget_.get(), TRUE); | 205 gtk_widget_set_app_paintable(widget(), TRUE); |
| 209 // We effectively double-buffer by virtue of having only one image... | 206 // We effectively double-buffer by virtue of having only one image... |
| 210 gtk_widget_set_double_buffered(widget_.get(), FALSE); | 207 gtk_widget_set_double_buffered(widget(), FALSE); |
| 211 } | 208 } |
| 212 | 209 |
| 213 gtk_chrome_button_set_use_gtk_rendering( | 210 gtk_chrome_button_set_use_gtk_rendering(GTK_CHROME_BUTTON(widget()), use_gtk); |
| 214 GTK_CHROME_BUTTON(widget_.get()), use_gtk); | |
| 215 } | 211 } |
| OLD | NEW |