Chromium Code Reviews| Index: ash/launcher/launcher.cc |
| diff --git a/ash/launcher/launcher.cc b/ash/launcher/launcher.cc |
| index ca3fb39f240897a8dd168b76c1251b6f6c2f6ea4..846ac0a678d179f1128fc49ddf1e94bee02bff05 100644 |
| --- a/ash/launcher/launcher.cc |
| +++ b/ash/launcher/launcher.cc |
| @@ -19,6 +19,7 @@ |
| #include "ash/wm/shelf_layout_manager.h" |
| #include "ash/wm/window_properties.h" |
| #include "grit/ash_resources.h" |
| +#include "ui/aura/client/activation_client.h" |
| #include "ui/aura/root_window.h" |
| #include "ui/aura/window.h" |
| #include "ui/aura/window_observer.h" |
| @@ -68,9 +69,14 @@ class Launcher::DelegateView : public views::WidgetDelegate, |
| return View::GetWidget(); |
| } |
| virtual bool CanActivate() const OVERRIDE { |
| - // We don't want mouse clicks to activate us, but we need to allow |
| - // activation when the user is using the keyboard (FocusCycler). |
| - return focus_cycler_ && focus_cycler_->widget_activating() == GetWidget(); |
| + // Allow to activate as fallback. |
| + if (launcher_->activating_as_fallback_) |
| + return true; |
| + // Allow to activate from the focus cycler. |
| + if (focus_cycler_ && focus_cycler_->widget_activating() == GetWidget()) |
| + return true; |
| + // Disallow activating in other cases, especially when using mouse. |
| + return false; |
| } |
| // BackgroundAnimatorDelegate overrides: |
| @@ -206,7 +212,8 @@ Launcher::Launcher(aura::Window* window_container, |
| delegate_view_(new DelegateView(this)), |
| launcher_view_(NULL), |
| alignment_(SHELF_ALIGNMENT_BOTTOM), |
| - background_animator_(delegate_view_, 0, kLauncherBackgroundAlpha) { |
| + background_animator_(delegate_view_, 0, kLauncherBackgroundAlpha), |
| + activating_as_fallback_(false) { |
| model_.reset(new LauncherModel); |
| delegate_.reset( |
| Shell::GetInstance()->delegate()->CreateLauncherDelegate(model_.get())); |
| @@ -237,9 +244,12 @@ Launcher::Launcher(aura::Window* window_container, |
| gfx::Size pref = |
| static_cast<views::View*>(launcher_view_)->GetPreferredSize(); |
| widget_->SetBounds(gfx::Rect(pref)); |
| + |
| + widget_->AddObserver(this); |
| } |
| Launcher::~Launcher() { |
| + widget_->RemoveObserver(this); |
| } |
| // static |
| @@ -378,6 +388,15 @@ void Launcher::SetWidgetBounds(const gfx::Rect bounds) { |
| dimmer_->SetBounds(bounds); |
| } |
| +void Launcher::OnWidgetActivationChanged(views::Widget* widget, bool active) { |
|
sky
2012/12/10 15:37:51
This should be beneath GetLauncherViewForTest.
mtomasz
2012/12/11 05:03:32
Done.
|
| + activating_as_fallback_ = false; |
| + if (active) { |
| + delegate_view_->SetPaneFocusAndFocusDefault(); |
| + } else { |
| + delegate_view_->GetFocusManager()->ClearFocus(); |
| + } |
| +} |
| + |
| internal::LauncherView* Launcher::GetLauncherViewForTest() { |
| return launcher_view_; |
| } |