Index: ash/wm/ash_activation_controller.cc |
diff --git a/ash/wm/ash_activation_controller.cc b/ash/wm/ash_activation_controller.cc |
index f9cc006b0fef9804fbdb0462a08ad4620ddbfa37..261bd628c3ed5242de71ee8d0a4bd870296892a7 100644 |
--- a/ash/wm/ash_activation_controller.cc |
+++ b/ash/wm/ash_activation_controller.cc |
@@ -4,13 +4,16 @@ |
#include "ash/wm/ash_activation_controller.h" |
+#include "ash/launcher/launcher.h" |
#include "ash/root_window_controller.h" |
#include "ash/shell.h" |
+#include "ash/shell_delegate.h" |
#include "ash/wm/activation_controller.h" |
#include "ash/wm/property_util.h" |
#include "ash/wm/window_util.h" |
#include "ash/wm/workspace_controller.h" |
#include "ui/views/corewm/window_modality_controller.h" |
+#include "ui/views/widget/widget.h" |
namespace ash { |
namespace internal { |
@@ -34,6 +37,10 @@ aura::Window* AshActivationController::WillActivateWindow( |
if (window_modal_transient) |
return window_modal_transient; |
+ // Fallback to launcher |
+ if (!window) |
+ window = PrepareToActivateLauncher(); |
+ |
// Make sure the workspace manager switches to the workspace for window. |
// Without this CanReceiveEvents() below returns false and activation never |
// changes. CanReceiveEvents() returns false if |window| isn't in the active |
@@ -77,5 +84,35 @@ aura::Window* AshActivationController::WillFocusWindow( |
return window; |
} |
+aura::Window* AshActivationController::PrepareToActivateLauncher() { |
+ // If workspace controller is not available, then it means that the root |
+ // window is being destroyed. We can't activate any window then. |
+ if (!GetRootWindowController( |
+ Shell::GetActiveRootWindow())->workspace_controller()) { |
+ return NULL; |
+ } |
+ // Fallback to a launcher only when Spoken feedback is enabled. |
+ if (!Shell::GetInstance()->delegate()->IsSpokenFeedbackEnabled()) |
+ return NULL; |
+ Launcher* launcher; |
+ if (Shell::IsLauncherPerDisplayEnabled()) { |
+ launcher = GetRootWindowController( |
+ Shell::GetActiveRootWindow())->launcher(); |
+ } else { |
+ launcher = Launcher::ForPrimaryDisplay(); |
+ } |
+ // Launcher is not always available, eg. not in the login screen. |
+ if (!launcher) |
+ return NULL; |
+ views::Widget* launcher_widget = launcher->widget(); |
+ // Launcher's window may be already destroyed in shutting down process. |
+ if (!launcher_widget) |
+ return NULL; |
+ aura::Window* launcher_window = launcher_widget->GetNativeWindow(); |
+ // Notify launcher to allow activation via CanActivate(). |
+ launcher->WillActivateAsFallback(); |
+ return launcher_window; |
+} |
+ |
} // namespace internal |
} // namespace ash |