| Index: ash/launcher/launcher.cc
|
| diff --git a/ash/launcher/launcher.cc b/ash/launcher/launcher.cc
|
| index 8668879cab979ec4a0d278d07ccd7b4454516ad5..a73f402ddd76a76439b7ef9afd58f150821587d8 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:
|
| @@ -209,7 +215,8 @@ Launcher::Launcher(LauncherModel* launcher_model,
|
| launcher_view_(NULL),
|
| alignment_(SHELF_ALIGNMENT_BOTTOM),
|
| delegate_(launcher_delegate),
|
| - background_animator_(delegate_view_, 0, kLauncherBackgroundAlpha) {
|
| + background_animator_(delegate_view_, 0, kLauncherBackgroundAlpha),
|
| + activating_as_fallback_(false) {
|
| widget_.reset(new views::Widget);
|
| views::Widget::InitParams params(
|
| views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
|
| @@ -236,9 +243,12 @@ Launcher::Launcher(LauncherModel* launcher_model,
|
| gfx::Size pref =
|
| static_cast<views::View*>(launcher_view_)->GetPreferredSize();
|
| widget_->SetBounds(gfx::Rect(pref));
|
| +
|
| + widget_->AddObserver(this);
|
| }
|
|
|
| Launcher::~Launcher() {
|
| + widget_->RemoveObserver(this);
|
| }
|
|
|
| // static
|
| @@ -406,6 +416,15 @@ void Launcher::SwitchToWindow(int window_index) {
|
| }
|
| }
|
|
|
| +void Launcher::OnWidgetActivationChanged(views::Widget* widget, bool active) {
|
| + activating_as_fallback_ = false;
|
| + if (active) {
|
| + delegate_view_->SetPaneFocusAndFocusDefault();
|
| + } else {
|
| + delegate_view_->GetFocusManager()->ClearFocus();
|
| + }
|
| +}
|
| +
|
| internal::LauncherView* Launcher::GetLauncherViewForTest() {
|
| return launcher_view_;
|
| }
|
|
|