Index: ash/wm/ash_focus_rules.cc |
=================================================================== |
--- ash/wm/ash_focus_rules.cc (revision 170971) |
+++ ash/wm/ash_focus_rules.cc (working copy) |
@@ -4,11 +4,45 @@ |
#include "ash/wm/ash_focus_rules.h" |
+#include "ash/shell.h" |
+#include "ash/shell_window_ids.h" |
+#include "ash/wm/window_util.h" |
#include "ui/aura/window.h" |
namespace ash { |
namespace wm { |
+namespace { |
+// These are the list of container ids of containers which may contain windows |
+// that need to be activated in the order that they should be activated. |
+const int kWindowContainerIds[] = { |
+ internal::kShellWindowId_LockSystemModalContainer, |
+ internal::kShellWindowId_SettingBubbleContainer, |
+ internal::kShellWindowId_LockScreenContainer, |
+ internal::kShellWindowId_SystemModalContainer, |
+ internal::kShellWindowId_AlwaysOnTopContainer, |
+ internal::kShellWindowId_AppListContainer, |
+ internal::kShellWindowId_DefaultContainer, |
+ |
+ // Panel, launcher and status are intentionally checked after other |
+ // containers even though these layers are higher. The user expects their |
+ // windows to be focused before these elements. |
+ internal::kShellWindowId_PanelContainer, |
+ internal::kShellWindowId_LauncherContainer, |
+ internal::kShellWindowId_StatusContainer, |
+}; |
+ |
+bool BelongsToContainerWithEqualOrGreaterId(const aura::Window* window, |
+ int container_id) { |
+ for (; window; window = window->parent()) { |
+ if (window->id() >= container_id) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+} // namespace |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// AshFocusRules, public: |
@@ -21,29 +55,45 @@ |
//////////////////////////////////////////////////////////////////////////////// |
// AshFocusRules, views::corewm::FocusRules: |
-bool AshFocusRules::CanActivateWindow(aura::Window* window) { |
- return window && !!window->parent(); |
-} |
+bool AshFocusRules::SupportsChildActivation(aura::Window* window) { |
+ if (window->id() == internal::kShellWindowId_WorkspaceContainer) |
+ return true; |
-bool AshFocusRules::CanFocusWindow(aura::Window* window) { |
- aura::Window* activatable = GetActivatableWindow(window); |
- return activatable->Contains(window) && window->CanFocus(); |
-} |
+ if (window->id() != internal::kShellWindowId_DefaultContainer) |
+ return false; |
-aura::Window* AshFocusRules::GetActivatableWindow(aura::Window* window) { |
- return window; |
+ for (size_t i = 0; i < arraysize(kWindowContainerIds); i++) { |
+ if (window->id() == kWindowContainerIds[i]) |
+ return true; |
+ } |
+ return false; |
} |
-aura::Window* AshFocusRules::GetFocusableWindow(aura::Window* window) { |
- return window; |
-} |
+bool AshFocusRules::IsWindowConsideredVisibleForActivation( |
+ aura::Window* window) { |
+ if (BaseFocusRules::IsWindowConsideredVisibleForActivation(window)) |
+ return true; |
-aura::Window* AshFocusRules::GetNextActivatableWindow(aura::Window* ignore) { |
- return NULL; |
+ // Minimized windows are hidden in their minimized state, but they can always |
+ // be activated. |
+ if (wm::IsWindowMinimized(window)) |
+ return true; |
+ |
+ return window->TargetVisibility() && (window->parent()->id() == |
+ internal::kShellWindowId_WorkspaceContainer || window->parent()->id() == |
+ internal::kShellWindowId_LockScreenContainer); |
} |
-aura::Window* AshFocusRules::GetNextFocusableWindow(aura::Window* ignore) { |
- return GetFocusableWindow(ignore->parent()); |
+bool AshFocusRules::CanActivateWindow(aura::Window* window) { |
+ if (!BaseFocusRules::CanActivateWindow(window)) |
+ return false; |
+ |
+ if (Shell::GetInstance()->IsSystemModalWindowOpen()) { |
+ return BelongsToContainerWithEqualOrGreaterId( |
+ window, internal::kShellWindowId_SystemModalContainer); |
+ } |
+ |
+ return true; |
} |
} // namespace wm |