Index: ash/system/tray/system_tray.cc |
diff --git a/ash/system/tray/system_tray.cc b/ash/system/tray/system_tray.cc |
index 364fc555206560601521b3c1a6f9cb047427c496..e79e8206883ffc632fe1429d18b357769469e410 100644 |
--- a/ash/system/tray/system_tray.cc |
+++ b/ash/system/tray/system_tray.cc |
@@ -33,6 +33,7 @@ |
#include "base/i18n/rtl.h" |
#include "base/logging.h" |
#include "base/message_loop.h" |
+#include "base/message_pump_observer.h" |
#include "base/timer.h" |
#include "base/utf_string_conversions.h" |
#include "grit/ash_strings.h" |
@@ -308,78 +309,113 @@ class SystemTrayBackground : public views::Background { |
DISALLOW_COPY_AND_ASSIGN(SystemTrayBackground); |
}; |
-class SystemTrayBubble : public views::BubbleDelegateView { |
+class SystemTrayBubble; |
+ |
+class SystemTrayBubbleView : public views::BubbleDelegateView { |
+ public: |
+ SystemTrayBubbleView(views::View* anchor, |
+ SystemTrayBubble* host, |
+ bool can_activate); |
+ virtual ~SystemTrayBubbleView(); |
+ |
+ void SetBubbleBorder(views::BubbleBorder* border) { |
+ GetBubbleFrameView()->SetBubbleBorder(border); |
+ } |
+ |
+ // Called when the host is destroyed. |
+ void reset_host() { host_ = NULL; } |
+ |
+ private: |
+ // Overridden from views::BubbleDelegateView. |
+ virtual void Init() OVERRIDE; |
+ virtual gfx::Rect GetAnchorRect() OVERRIDE; |
+ // Overridden from views::View. |
+ virtual void ChildPreferredSizeChanged(View* child) OVERRIDE; |
+ virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; |
+ virtual bool CanActivate() const OVERRIDE; |
+ virtual gfx::Size GetPreferredSize() OVERRIDE; |
+ virtual void OnMouseEntered(const views::MouseEvent& event) OVERRIDE; |
+ virtual void OnMouseExited(const views::MouseEvent& event) OVERRIDE; |
+ |
+ SystemTrayBubble* host_; |
+ bool can_activate_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SystemTrayBubbleView); |
+}; |
+ |
+class SystemTrayBubble : public base::MessagePumpObserver, |
+ public views::Widget::Observer { |
public: |
SystemTrayBubble(ash::SystemTray* tray, |
- views::View* anchor, |
const std::vector<ash::SystemTrayItem*>& items, |
- bool detailed) |
- : views::BubbleDelegateView(anchor, views::BubbleBorder::BOTTOM_RIGHT), |
- tray_(tray), |
- items_(items), |
- detailed_(detailed), |
- can_activate_(true), |
- autoclose_delay_(0) { |
- set_margin(0); |
- set_parent_window(ash::Shell::GetInstance()->GetContainer( |
- ash::internal::kShellWindowId_SettingBubbleContainer)); |
- set_notify_enter_exit_on_child(true); |
- } |
+ bool detailed); |
+ virtual ~SystemTrayBubble(); |
- virtual ~SystemTrayBubble() { |
- for (std::vector<ash::SystemTrayItem*>::iterator it = items_.begin(); |
- it != items_.end(); |
- ++it) { |
- if (detailed_) |
- (*it)->DestroyDetailedView(); |
- else |
- (*it)->DestroyDefaultView(); |
- } |
- } |
+ // Creates |bubble_view_| and a child views for each member of |items_|. |
+ // Also creates |bubble_widget_| and sets up animations. |
+ void InitView(views::View* anchor, |
+ bool can_activate, |
+ ash::user::LoginStatus login_status); |
bool detailed() const { return detailed_; } |
- void set_can_activate(bool activate) { can_activate_ = activate; } |
- |
- void SetBubbleBorder(views::BubbleBorder* border) { |
- GetBubbleFrameView()->SetBubbleBorder(border); |
- } |
- void StartAutoCloseTimer(int seconds) { |
- autoclose_.Stop(); |
- autoclose_delay_ = seconds; |
- if (autoclose_delay_) { |
- autoclose_.Start(FROM_HERE, |
- base::TimeDelta::FromSeconds(autoclose_delay_), |
- this, &SystemTrayBubble::AutoClose); |
- } |
- } |
+ void DestroyItemViews(); |
+ views::Widget* GetTrayWidget() const; |
+ void StartAutoCloseTimer(int seconds); |
+ void StopAutoCloseTimer(); |
+ void RestartAutoCloseTimer(); |
+ void Close(); |
private: |
- void AutoClose() { |
- GetWidget()->Close(); |
- } |
+ // Overridden from base::MessagePumpObserver. |
+ virtual base::EventStatus WillProcessEvent( |
+ const base::NativeEvent& event) OVERRIDE; |
+ virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE; |
+ // Overridden from views::Widget::Observer. |
+ virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE; |
+ virtual void OnWidgetVisibilityChanged(views::Widget* widget, |
+ bool visible) OVERRIDE; |
- // Overridden from views::BubbleDelegateView. |
- virtual void Init() OVERRIDE { |
- SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, |
- 1, 1, 1)); |
- set_background(new SystemTrayBubbleBackground(this)); |
- |
- ash::SystemTrayDelegate* delegate = |
- ash::Shell::GetInstance()->tray_delegate(); |
- ash::user::LoginStatus login_status = delegate->GetUserLoginStatus(); |
- for (std::vector<ash::SystemTrayItem*>::iterator it = items_.begin(); |
- it != items_.end(); |
- ++it) { |
- views::View* view = detailed_ ? (*it)->CreateDetailedView(login_status) : |
- (*it)->CreateDefaultView(login_status); |
- if (view) |
- AddChildView(new TrayPopupItemContainer(view)); |
- } |
- } |
+ ash::SystemTray* tray_; |
+ SystemTrayBubbleView* bubble_view_; |
+ views::Widget* bubble_widget_; |
+ std::vector<ash::SystemTrayItem*> items_; |
+ bool detailed_; |
+ |
+ int autoclose_delay_; |
+ base::OneShotTimer<SystemTrayBubble> autoclose_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SystemTrayBubble); |
+}; |
+ |
+// SystemTrayBubbleView |
+ |
+SystemTrayBubbleView::SystemTrayBubbleView(views::View* anchor, |
+ SystemTrayBubble* host, |
+ bool can_activate) |
+ : views::BubbleDelegateView(anchor, views::BubbleBorder::BOTTOM_RIGHT), |
+ host_(host), |
+ can_activate_(can_activate) { |
+ set_margin(0); |
+ set_parent_window(ash::Shell::GetInstance()->GetContainer( |
+ ash::internal::kShellWindowId_SettingBubbleContainer)); |
+ set_notify_enter_exit_on_child(true); |
+} |
+ |
+SystemTrayBubbleView::~SystemTrayBubbleView() { |
+ // Inform host items (models) that their views are being destroyed. |
+ if (host_) |
+ host_->DestroyItemViews(); |
+} |
+ |
+void SystemTrayBubbleView::Init() { |
+ SetLayoutManager(new views::BoxLayout(views::BoxLayout::kVertical, 1, 1, 1)); |
+ set_background(new SystemTrayBubbleBackground(this)); |
+} |
- virtual gfx::Rect GetAnchorRect() OVERRIDE { |
- views::Widget* widget = tray_->GetWidget(); |
+gfx::Rect SystemTrayBubbleView::GetAnchorRect() OVERRIDE { |
+ if (host_) { |
+ views::Widget* widget = host_->GetTrayWidget(); |
if (widget->IsVisible()) { |
gfx::Rect rect = widget->GetWindowScreenBounds(); |
rect.Inset( |
@@ -388,61 +424,188 @@ class SystemTrayBubble : public views::BubbleDelegateView { |
kPaddingFromBottomOfScreen); |
return rect; |
} |
- gfx::Rect rect = gfx::Screen::GetPrimaryMonitor().bounds(); |
- return gfx::Rect(base::i18n::IsRTL() ? kPaddingFromRightEdgeOfScreen : |
- rect.width() - kPaddingFromRightEdgeOfScreen, |
- rect.height() - kPaddingFromBottomOfScreen, |
- 0, 0); |
} |
+ gfx::Rect rect = gfx::Screen::GetPrimaryMonitor().bounds(); |
+ return gfx::Rect(base::i18n::IsRTL() ? kPaddingFromRightEdgeOfScreen : |
+ rect.width() - kPaddingFromRightEdgeOfScreen, |
+ rect.height() - kPaddingFromBottomOfScreen, |
+ 0, 0); |
+} |
- // Overridden from views::View. |
- virtual void ChildPreferredSizeChanged(View* child) OVERRIDE { |
- SizeToContents(); |
+void SystemTrayBubbleView::ChildPreferredSizeChanged(View* child) { |
+ SizeToContents(); |
+} |
+ |
+void SystemTrayBubbleView::GetAccessibleState(ui::AccessibleViewState* state) { |
+ if (can_activate_) { |
+ state->role = ui::AccessibilityTypes::ROLE_WINDOW; |
+ state->name = l10n_util::GetStringUTF16( |
+ IDS_ASH_STATUS_TRAY_ACCESSIBLE_NAME); |
} |
+} |
- virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE { |
- if (can_activate_) { |
- state->role = ui::AccessibilityTypes::ROLE_WINDOW; |
- state->name = l10n_util::GetStringUTF16( |
- IDS_ASH_STATUS_TRAY_ACCESSIBLE_NAME); |
- } |
+bool SystemTrayBubbleView::CanActivate() const { |
+ return can_activate_; |
+} |
+ |
+gfx::Size SystemTrayBubbleView::GetPreferredSize() { |
+ gfx::Size size = views::BubbleDelegateView::GetPreferredSize(); |
+ return gfx::Size(kTrayPopupWidth, size.height()); |
+} |
+ |
+void SystemTrayBubbleView::OnMouseEntered(const views::MouseEvent& event) { |
+ if (host_) |
+ host_->StopAutoCloseTimer(); |
+} |
+ |
+void SystemTrayBubbleView::OnMouseExited(const views::MouseEvent& event) { |
+ if (host_) |
+ host_->RestartAutoCloseTimer(); |
+} |
+ |
+// SystemTrayBubble |
+ |
+SystemTrayBubble::SystemTrayBubble( |
+ ash::SystemTray* tray, |
+ const std::vector<ash::SystemTrayItem*>& items, |
+ bool detailed) |
+ : tray_(tray), |
+ bubble_view_(NULL), |
+ bubble_widget_(NULL), |
+ items_(items), |
+ detailed_(detailed), |
+ autoclose_delay_(0) { |
+ MessageLoopForUI::current()->AddObserver(this); |
+} |
+ |
+SystemTrayBubble::~SystemTrayBubble() { |
+ MessageLoopForUI::current()->RemoveObserver(this); |
+ DestroyItemViews(); |
+ // Reset the host pointer in bubble_view_ in case its destruction is deferred. |
+ if (bubble_view_) |
+ bubble_view_->reset_host(); |
+ if (bubble_widget_) { |
+ bubble_widget_->RemoveObserver(this); |
+ // This triggers the destruction of bubble_view_. |
+ bubble_widget_->Close(); |
} |
+} |
- virtual bool CanActivate() const OVERRIDE { |
- return can_activate_; |
+void SystemTrayBubble::InitView(views::View* anchor, |
+ bool can_activate, |
+ ash::user::LoginStatus login_status) { |
+ DCHECK(bubble_view_ == NULL); |
+ bubble_view_ = new SystemTrayBubbleView(anchor, this, can_activate); |
+ |
+ for (std::vector<ash::SystemTrayItem*>::iterator it = items_.begin(); |
+ it != items_.end(); |
+ ++it) { |
+ views::View* view = detailed_ ? |
+ (*it)->CreateDetailedView(login_status) : |
+ (*it)->CreateDefaultView(login_status); |
+ if (view) |
+ bubble_view_->AddChildView(new TrayPopupItemContainer(view)); |
} |
- virtual gfx::Size GetPreferredSize() OVERRIDE { |
- gfx::Size size = views::BubbleDelegateView::GetPreferredSize(); |
- return gfx::Size(kTrayPopupWidth, size.height()); |
+ DCHECK(bubble_widget_ == NULL); |
+ bubble_widget_ = views::BubbleDelegateView::CreateBubble(bubble_view_); |
+ |
+ |
+ // Must occur after call to CreateBubble() |
+ bubble_view_->SetAlignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE); |
+ bubble_widget_->non_client_view()->frame_view()->set_background(NULL); |
+ bubble_view_->SetBubbleBorder(new SystemTrayBubbleBorder(bubble_view_)); |
+ |
+ bubble_widget_->AddObserver(this); |
+ |
+ // Setup animation. |
+ ash::SetWindowVisibilityAnimationType( |
+ bubble_widget_->GetNativeWindow(), |
+ ash::WINDOW_VISIBILITY_ANIMATION_TYPE_FADE); |
+ ash::SetWindowVisibilityAnimationTransition( |
+ bubble_widget_->GetNativeWindow(), |
+ ash::ANIMATE_BOTH); |
+ ash::SetWindowVisibilityAnimationDuration( |
+ bubble_widget_->GetNativeWindow(), |
+ base::TimeDelta::FromMilliseconds(kAnimationDurationForPopupMS)); |
+ |
+ bubble_view_->Show(); |
+} |
+ |
+void SystemTrayBubble::DestroyItemViews() { |
+ for (std::vector<ash::SystemTrayItem*>::iterator it = items_.begin(); |
+ it != items_.end(); |
+ ++it) { |
+ if (detailed_) |
+ (*it)->DestroyDetailedView(); |
+ else |
+ (*it)->DestroyDefaultView(); |
} |
+} |
- virtual void OnMouseEntered(const views::MouseEvent& event) OVERRIDE { |
- autoclose_.Stop(); |
+views::Widget* SystemTrayBubble::GetTrayWidget() const { |
+ return tray_->GetWidget(); |
+} |
+ |
+void SystemTrayBubble::StartAutoCloseTimer(int seconds) { |
+ autoclose_.Stop(); |
+ autoclose_delay_ = seconds; |
+ if (autoclose_delay_) { |
+ autoclose_.Start(FROM_HERE, |
+ base::TimeDelta::FromSeconds(autoclose_delay_), |
+ this, &SystemTrayBubble::Close); |
} |
+} |
- virtual void OnMouseExited(const views::MouseEvent& event) OVERRIDE { |
- if (autoclose_delay_) { |
- autoclose_.Stop(); |
- autoclose_.Start(FROM_HERE, |
- base::TimeDelta::FromSeconds(autoclose_delay_), |
- this, &SystemTrayBubble::AutoClose); |
+void SystemTrayBubble::StopAutoCloseTimer() { |
+ autoclose_.Stop(); |
+} |
+ |
+void SystemTrayBubble::RestartAutoCloseTimer() { |
+ if (autoclose_delay_) |
+ StartAutoCloseTimer(autoclose_delay_); |
+} |
+ |
+void SystemTrayBubble::Close() { |
+ if (bubble_widget_) |
+ bubble_widget_->Close(); |
+} |
+ |
+base::EventStatus SystemTrayBubble::WillProcessEvent( |
+ const base::NativeEvent& event) { |
+ // Check if the user clicked outside of the bubble and close it if they did. |
+ if (ui::EventTypeFromNative(event) == ui::ET_MOUSE_PRESSED) { |
+ gfx::Point cursor_in_view = ui::EventLocationFromNative(event); |
+ views::View::ConvertPointFromScreen(bubble_view_, &cursor_in_view); |
+ if (!bubble_view_->HitTest(cursor_in_view)) { |
+ bubble_widget_->Close(); |
} |
} |
+ return base::EVENT_CONTINUE; |
+} |
- ash::SystemTray* tray_; |
- std::vector<ash::SystemTrayItem*> items_; |
- bool detailed_; |
- bool can_activate_; |
+void SystemTrayBubble::DidProcessEvent(const base::NativeEvent& event) { |
+} |
- int autoclose_delay_; |
- base::OneShotTimer<SystemTrayBubble> autoclose_; |
+void SystemTrayBubble::OnWidgetClosing(views::Widget* widget) { |
+ CHECK_EQ(bubble_widget_, widget); |
+ MessageLoopForUI::current()->RemoveObserver(this); |
+ bubble_widget_ = NULL; |
+ tray_->RemoveBubble(this); |
+} |
- DISALLOW_COPY_AND_ASSIGN(SystemTrayBubble); |
-}; |
+void SystemTrayBubble::OnWidgetVisibilityChanged(views::Widget* widget, |
+ bool visible) { |
+ if (!visible) |
+ MessageLoopForUI::current()->RemoveObserver(this); |
+ else |
+ MessageLoopForUI::current()->AddObserver(this); |
+} |
} // namespace internal |
+// From system_tray_delegate.h |
+ |
NetworkIconInfo::NetworkIconInfo() |
: highlight(false), |
tray_icon_visible(true) { |
@@ -472,6 +635,8 @@ IMEPropertyInfo::IMEPropertyInfo() |
IMEPropertyInfo::~IMEPropertyInfo() { |
} |
+// SystemTray |
+ |
SystemTray::SystemTray() |
: items_(), |
accessibility_observer_(NULL), |
@@ -486,8 +651,6 @@ SystemTray::SystemTray() |
update_observer_(NULL), |
user_observer_(NULL), |
widget_(NULL), |
- bubble_(NULL), |
- popup_(NULL), |
background_(new internal::SystemTrayBackground), |
should_show_launcher_(false), |
ALLOW_THIS_IN_INITIALIZER_LIST(hide_background_animator_(this, |
@@ -513,13 +676,12 @@ SystemTray::SystemTray() |
} |
SystemTray::~SystemTray() { |
+ bubble_.reset(); |
for (std::vector<SystemTrayItem*>::iterator it = items_.begin(); |
- it != items_.end(); |
- ++it) { |
+ it != items_.end(); |
+ ++it) { |
(*it)->DestroyTrayView(); |
} |
- if (popup_) |
- popup_->CloseNow(); |
} |
void SystemTray::CreateItems() { |
@@ -602,28 +764,12 @@ void SystemTray::RemoveTrayItem(SystemTrayItem* item) { |
} |
void SystemTray::ShowDefaultView() { |
- if (popup_) { |
- MessageLoopForUI::current()->RemoveObserver(this); |
- popup_->RemoveObserver(this); |
- popup_->Close(); |
- } |
- popup_ = NULL; |
- bubble_ = NULL; |
- |
ShowItems(items_.get(), false, true); |
} |
void SystemTray::ShowDetailedView(SystemTrayItem* item, |
int close_delay, |
bool activate) { |
- if (popup_) { |
- MessageLoopForUI::current()->RemoveObserver(this); |
- popup_->RemoveObserver(this); |
- popup_->Close(); |
- } |
- popup_ = NULL; |
- bubble_ = NULL; |
- |
std::vector<SystemTrayItem*> items; |
items.push_back(item); |
ShowItems(items, true, activate); |
@@ -631,13 +777,12 @@ void SystemTray::ShowDetailedView(SystemTrayItem* item, |
} |
void SystemTray::SetDetailedViewCloseDelay(int close_delay) { |
- if (bubble_ && bubble_->detailed()) |
+ if (bubble_.get() && bubble_->detailed()) |
bubble_->StartAutoCloseTimer(close_delay); |
} |
void SystemTray::UpdateAfterLoginStatusChange(user::LoginStatus login_status) { |
- if (popup_) |
- popup_->CloseNow(); |
+ bubble_.reset(); |
for (std::vector<SystemTrayItem*>::iterator it = items_.begin(); |
it != items_.end(); |
@@ -649,6 +794,21 @@ void SystemTray::UpdateAfterLoginStatusChange(user::LoginStatus login_status) { |
PreferredSizeChanged(); |
} |
+void SystemTray::RemoveBubble(internal::SystemTrayBubble* bubble) { |
+ CHECK_EQ(bubble_.get(), bubble); |
+ bubble_.reset(); |
+ |
+ if (should_show_launcher_) { |
+ // No need to show the launcher if the mouse isn't over the status area |
+ // anymore. |
+ aura::RootWindow* root = GetWidget()->GetNativeView()->GetRootWindow(); |
+ should_show_launcher_ = GetWidget()->GetWindowScreenBounds().Contains( |
+ root->last_mouse_location()); |
+ if (!should_show_launcher_) |
+ Shell::GetInstance()->shelf()->UpdateAutoHideState(); |
+ } |
+} |
+ |
void SystemTray::SetPaintsBackground( |
bool value, |
internal::BackgroundAnimator::ChangeType change_type) { |
@@ -657,38 +817,23 @@ void SystemTray::SetPaintsBackground( |
void SystemTray::ShowItems(const std::vector<SystemTrayItem*>& items, |
bool detailed, |
- bool activate) { |
- CHECK(!popup_); |
- CHECK(!bubble_); |
- bubble_ = new internal::SystemTrayBubble(this, container_, items, detailed); |
- bubble_->set_can_activate(activate); |
- popup_ = views::BubbleDelegateView::CreateBubble(bubble_); |
+ bool can_activate) { |
+ // Destroy any existing bubble and create a new one. |
+ bubble_.reset(new internal::SystemTrayBubble(this, items, detailed)); |
+ ash::SystemTrayDelegate* delegate = |
+ ash::Shell::GetInstance()->tray_delegate(); |
+ bubble_->InitView(container_, can_activate, delegate->GetUserLoginStatus()); |
// If we have focus the shelf should be visible and we need to continue |
// showing the shelf when the popup is shown. |
if (GetWidget()->IsActive()) |
should_show_launcher_ = true; |
- bubble_->SetAlignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE); |
- popup_->non_client_view()->frame_view()->set_background(NULL); |
- bubble_->SetBubbleBorder(new SystemTrayBubbleBorder(bubble_)); |
- MessageLoopForUI::current()->AddObserver(this); |
- popup_->AddObserver(this); |
- |
- // Setup animation. |
- ash::SetWindowVisibilityAnimationType(popup_->GetNativeWindow(), |
- ash::WINDOW_VISIBILITY_ANIMATION_TYPE_FADE); |
- ash::SetWindowVisibilityAnimationTransition(popup_->GetNativeWindow(), |
- ash::ANIMATE_BOTH); |
- ash::SetWindowVisibilityAnimationDuration(popup_->GetNativeWindow(), |
- base::TimeDelta::FromMilliseconds(kAnimationDurationForPopupMS)); |
- |
- bubble_->Show(); |
} |
bool SystemTray::PerformAction(const views::Event& event) { |
// If we're already showing the default view, hide it; otherwise, show it |
// (and hide any popup that's currently shown). |
- if (popup_ && bubble_ && !bubble_->detailed()) |
- popup_->Hide(); |
+ if (bubble_.get() && !bubble_->detailed()) |
+ bubble_->Close(); |
else |
ShowDefaultView(); |
return true; |
@@ -702,7 +847,7 @@ void SystemTray::OnMouseEntered(const views::MouseEvent& event) { |
void SystemTray::OnMouseExited(const views::MouseEvent& event) { |
// When the popup closes we'll update |should_show_launcher_|. |
- if (!popup_) |
+ if (!bubble_.get()) |
should_show_launcher_ = false; |
hover_background_animator_.SetPaintsBackground(false, |
internal::BackgroundAnimator::CHANGE_ANIMATE); |
@@ -728,48 +873,10 @@ void SystemTray::OnPaintFocusBorder(gfx::Canvas* canvas) { |
canvas->DrawFocusRect(container_->bounds()); |
} |
-void SystemTray::OnWidgetClosing(views::Widget* widget) { |
- CHECK_EQ(popup_, widget); |
- MessageLoopForUI::current()->RemoveObserver(this); |
- popup_ = NULL; |
- bubble_ = NULL; |
- if (should_show_launcher_) { |
- // No need to show the launcher if the mouse isn't over the status area |
- // anymore. |
- aura::RootWindow* root = GetWidget()->GetNativeView()->GetRootWindow(); |
- should_show_launcher_ = GetWidget()->GetWindowScreenBounds().Contains( |
- root->last_mouse_location()); |
- if (!should_show_launcher_) |
- Shell::GetInstance()->shelf()->UpdateAutoHideState(); |
- } |
-} |
- |
-void SystemTray::OnWidgetVisibilityChanged(views::Widget* widget, |
- bool visible) { |
- if (!visible) |
- MessageLoopForUI::current()->RemoveObserver(this); |
-} |
- |
void SystemTray::UpdateBackground(int alpha) { |
background_->set_alpha(hide_background_animator_.alpha() + |
hover_background_animator_.alpha()); |
SchedulePaint(); |
} |
-base::EventStatus SystemTray::WillProcessEvent(const base::NativeEvent& event) { |
- // Check if the user clicked outside of the system tray bubble and hide it |
- // if they did. |
- if (bubble_ && ui::EventTypeFromNative(event) == ui::ET_MOUSE_PRESSED) { |
- gfx::Point cursor_in_view = ui::EventLocationFromNative(event); |
- View::ConvertPointFromScreen(bubble_, &cursor_in_view); |
- if (!bubble_->HitTest(cursor_in_view)) { |
- popup_->Hide(); |
- } |
- } |
- return base::EVENT_CONTINUE; |
-} |
- |
-void SystemTray::DidProcessEvent(const base::NativeEvent& event) { |
-} |
- |
} // namespace ash |