Index: chrome/browser/gtk/browser_toolbar_gtk.cc |
diff --git a/chrome/browser/gtk/browser_toolbar_gtk.cc b/chrome/browser/gtk/browser_toolbar_gtk.cc |
index b88bcc2f2868f88b17e8ba1efc8c4c10930875a6..a8a6ed27c53e451901b107474d28bed36033e681 100644 |
--- a/chrome/browser/gtk/browser_toolbar_gtk.cc |
+++ b/chrome/browser/gtk/browser_toolbar_gtk.cc |
@@ -95,6 +95,7 @@ BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window) |
profile_(NULL), |
menu_bar_helper_(this), |
upgrade_reminder_animation_(this), |
+ upgrade_reminder_canceled_(false), |
collapsed_(false) { |
browser_->command_updater()->AddCommandObserver(IDC_BACK, this); |
browser_->command_updater()->AddCommandObserver(IDC_FORWARD, this); |
@@ -110,11 +111,13 @@ BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window) |
upgrade_reminder_animation_.SetThrobDuration(kThrobDuration); |
- if (Singleton<UpgradeDetector>::get()->notify_upgrade()) |
- ShowUpgradeReminder(); |
+ ActiveWindowWatcherX::AddObserver(this); |
+ MaybeShowUpgradeReminder(); |
} |
BrowserToolbarGtk::~BrowserToolbarGtk() { |
+ ActiveWindowWatcherX::RemoveObserver(this); |
+ |
browser_->command_updater()->RemoveCommandObserver(IDC_BACK, this); |
browser_->command_updater()->RemoveCommandObserver(IDC_FORWARD, this); |
browser_->command_updater()->RemoveCommandObserver(IDC_HOME, this); |
@@ -448,7 +451,7 @@ void BrowserToolbarGtk::Observe(NotificationType type, |
UpdateRoundedness(); |
} else if (type == NotificationType::UPGRADE_RECOMMENDED) { |
- ShowUpgradeReminder(); |
+ MaybeShowUpgradeReminder(); |
} else { |
NOTREACHED(); |
} |
@@ -745,8 +748,15 @@ void BrowserToolbarGtk::NotifyPrefChanged(const std::wstring* pref) { |
!home_page_is_new_tab_page_.IsManaged()); |
} |
-void BrowserToolbarGtk::ShowUpgradeReminder() { |
- upgrade_reminder_animation_.StartThrobbing(-1); |
+void BrowserToolbarGtk::MaybeShowUpgradeReminder() { |
+ // Only show the upgrade reminder animation for the currently active window. |
+ if (window_->IsActive() && |
+ Singleton<UpgradeDetector>::get()->notify_upgrade() && |
+ !upgrade_reminder_canceled_) { |
+ upgrade_reminder_animation_.StartThrobbing(-1); |
+ } else { |
+ upgrade_reminder_animation_.Reset(); |
+ } |
} |
bool BrowserToolbarGtk::ShouldOnlyShowLocation() const { |
@@ -779,20 +789,30 @@ void BrowserToolbarGtk::PopupForButtonNextTo(GtkWidget* button, |
} |
void BrowserToolbarGtk::AnimationEnded(const Animation* animation) { |
- AnimationProgressed(animation); |
+ DCHECK_EQ(animation, &upgrade_reminder_animation_); |
+ gtk_widget_queue_draw(app_menu_image_.get()); |
} |
void BrowserToolbarGtk::AnimationProgressed(const Animation* animation) { |
DCHECK_EQ(animation, &upgrade_reminder_animation_); |
- gtk_widget_queue_draw(app_menu_image_.get()); |
+ |
+ if (UpgradeAnimationIsFaded()) |
+ gtk_widget_queue_draw(app_menu_image_.get()); |
} |
void BrowserToolbarGtk::AnimationCanceled(const Animation* animation) { |
- AnimationProgressed(animation); |
+ AnimationEnded(animation); |
+} |
+ |
+void BrowserToolbarGtk::ActiveWindowChanged(GdkWindow* active_window) { |
+ MaybeShowUpgradeReminder(); |
} |
void BrowserToolbarGtk::OnAppMenuShow(GtkWidget* sender) { |
- upgrade_reminder_animation_.Reset(); |
+ if (upgrade_reminder_animation_.is_animating()) { |
+ upgrade_reminder_canceled_ = true; |
+ MaybeShowUpgradeReminder(); |
+ } |
} |
gboolean BrowserToolbarGtk::OnAppMenuImageExpose(GtkWidget* sender, |
@@ -801,10 +821,7 @@ gboolean BrowserToolbarGtk::OnAppMenuImageExpose(GtkWidget* sender, |
return FALSE; |
SkBitmap badge; |
- if (upgrade_reminder_animation_.cycles_remaining() > 0 && |
- // This funky looking math makes the badge throb for 2 seconds once |
- // every 8 seconds. |
- ((upgrade_reminder_animation_.cycles_remaining() - 1) / 2) % 4 == 0) { |
+ if (UpgradeAnimationIsFaded()) { |
badge = SkBitmapOperations::CreateBlendedBitmap( |
*theme_provider_->GetBitmapNamed(IDR_UPGRADE_DOT_ACTIVE), |
*theme_provider_->GetBitmapNamed(IDR_UPGRADE_DOT_INACTIVE), |
@@ -825,3 +842,10 @@ gboolean BrowserToolbarGtk::OnAppMenuImageExpose(GtkWidget* sender, |
return FALSE; |
} |
+ |
+bool BrowserToolbarGtk::UpgradeAnimationIsFaded() { |
+ return upgrade_reminder_animation_.cycles_remaining() > 0 && |
+ // This funky looking math makes the badge throb for 2 seconds once |
+ // every 8 seconds. |
+ ((upgrade_reminder_animation_.cycles_remaining() - 1) / 2) % 4 == 0; |
+} |