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_; |
} |