| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/wm/ash_focus_rules.h" | 5 #include "ash/wm/ash_focus_rules.h" |
| 6 | 6 |
| 7 #include "ash/common/shell_window_ids.h" | 7 #include "ash/common/shell_window_ids.h" |
| 8 #include "ash/common/wm/window_state.h" | 8 #include "ash/common/wm/window_state.h" |
| 9 #include "ash/shell.h" | 9 #include "ash/shell.h" |
| 10 #include "ash/shell_delegate.h" | 10 #include "ash/shell_delegate.h" |
| 11 #include "ash/wm/mru_window_tracker.h" | 11 #include "ash/wm/mru_window_tracker.h" |
| 12 #include "ash/wm/window_state_aura.h" | 12 #include "ash/wm/window_state_aura.h" |
| 13 #include "ui/aura/window.h" | 13 #include "ui/aura/window.h" |
| 14 | 14 |
| 15 namespace ash { | 15 namespace ash { |
| 16 namespace wm { | 16 namespace wm { |
| 17 namespace { | 17 namespace { |
| 18 | 18 |
| 19 // These are the list of container ids of containers which may contain windows | |
| 20 // that need to be activated in the order that they should be activated. | |
| 21 const int kWindowContainerIds[] = { | |
| 22 kShellWindowId_OverlayContainer, | |
| 23 kShellWindowId_LockSystemModalContainer, | |
| 24 kShellWindowId_SettingBubbleContainer, | |
| 25 kShellWindowId_LockScreenContainer, | |
| 26 kShellWindowId_SystemModalContainer, | |
| 27 kShellWindowId_AlwaysOnTopContainer, | |
| 28 kShellWindowId_AppListContainer, | |
| 29 kShellWindowId_DefaultContainer, | |
| 30 | |
| 31 // Docked, panel, launcher and status are intentionally checked after other | |
| 32 // containers even though these layers are higher. The user expects their | |
| 33 // windows to be focused before these elements. | |
| 34 kShellWindowId_DockedContainer, | |
| 35 kShellWindowId_PanelContainer, | |
| 36 kShellWindowId_ShelfContainer, | |
| 37 kShellWindowId_StatusContainer, }; | |
| 38 | |
| 39 bool BelongsToContainerWithEqualOrGreaterId(const aura::Window* window, | 19 bool BelongsToContainerWithEqualOrGreaterId(const aura::Window* window, |
| 40 int container_id) { | 20 int container_id) { |
| 41 for (; window; window = window->parent()) { | 21 for (; window; window = window->parent()) { |
| 42 if (window->id() >= container_id) | 22 if (window->id() >= container_id) |
| 43 return true; | 23 return true; |
| 44 } | 24 } |
| 45 return false; | 25 return false; |
| 46 } | 26 } |
| 47 | 27 |
| 48 } // namespace | 28 } // namespace |
| (...skipping 19 matching lines...) Expand all Loading... |
| 68 return true; | 48 return true; |
| 69 } | 49 } |
| 70 | 50 |
| 71 //////////////////////////////////////////////////////////////////////////////// | 51 //////////////////////////////////////////////////////////////////////////////// |
| 72 // AshFocusRules, ::wm::FocusRules: | 52 // AshFocusRules, ::wm::FocusRules: |
| 73 | 53 |
| 74 bool AshFocusRules::SupportsChildActivation(aura::Window* window) const { | 54 bool AshFocusRules::SupportsChildActivation(aura::Window* window) const { |
| 75 if (window->id() == kShellWindowId_DefaultContainer) | 55 if (window->id() == kShellWindowId_DefaultContainer) |
| 76 return true; | 56 return true; |
| 77 | 57 |
| 78 for (size_t i = 0; i < arraysize(kWindowContainerIds); i++) { | 58 for (size_t i = 0; i < kNumActivatableShellWindowIds; i++) { |
| 79 if (window->id() == kWindowContainerIds[i]) | 59 if (window->id() == kActivatableShellWindowIds[i]) |
| 80 return true; | 60 return true; |
| 81 } | 61 } |
| 82 return false; | 62 return false; |
| 83 } | 63 } |
| 84 | 64 |
| 85 bool AshFocusRules::IsWindowConsideredVisibleForActivation( | 65 bool AshFocusRules::IsWindowConsideredVisibleForActivation( |
| 86 aura::Window* window) const { | 66 aura::Window* window) const { |
| 87 // If the |window| doesn't belong to the current active user and also doesn't | 67 // If the |window| doesn't belong to the current active user and also doesn't |
| 88 // show for the current active user, then it should not be activated. | 68 // show for the current active user, then it should not be activated. |
| 89 if (!Shell::GetInstance()->delegate()->CanShowWindowForUser(window)) | 69 if (!Shell::GetInstance()->delegate()->CanShowWindowForUser(window)) |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 std::vector<aura::Window*> windows = mru->BuildMruWindowList(); | 109 std::vector<aura::Window*> windows = mru->BuildMruWindowList(); |
| 130 aura::Window* starting_window = windows.empty() ? ignore : windows[0]; | 110 aura::Window* starting_window = windows.empty() ? ignore : windows[0]; |
| 131 | 111 |
| 132 // Look for windows to focus in |starting_window|'s container. If none are | 112 // Look for windows to focus in |starting_window|'s container. If none are |
| 133 // found, we look in all the containers in front of |starting_window|'s | 113 // found, we look in all the containers in front of |starting_window|'s |
| 134 // container, then all behind. | 114 // container, then all behind. |
| 135 int starting_container_index = 0; | 115 int starting_container_index = 0; |
| 136 aura::Window* root = starting_window->GetRootWindow(); | 116 aura::Window* root = starting_window->GetRootWindow(); |
| 137 if (!root) | 117 if (!root) |
| 138 root = Shell::GetTargetRootWindow(); | 118 root = Shell::GetTargetRootWindow(); |
| 139 int container_count = static_cast<int>(arraysize(kWindowContainerIds)); | 119 int container_count = static_cast<int>(kNumActivatableShellWindowIds); |
| 140 for (int i = 0; i < container_count; i++) { | 120 for (int i = 0; i < container_count; i++) { |
| 141 aura::Window* container = Shell::GetContainer(root, kWindowContainerIds[i]); | 121 aura::Window* container = |
| 122 Shell::GetContainer(root, kActivatableShellWindowIds[i]); |
| 142 if (container && container->Contains(starting_window)) { | 123 if (container && container->Contains(starting_window)) { |
| 143 starting_container_index = i; | 124 starting_container_index = i; |
| 144 break; | 125 break; |
| 145 } | 126 } |
| 146 } | 127 } |
| 147 | 128 |
| 148 aura::Window* window = nullptr; | 129 aura::Window* window = nullptr; |
| 149 for (int i = starting_container_index; !window && i < container_count; i++) | 130 for (int i = starting_container_index; !window && i < container_count; i++) |
| 150 window = GetTopmostWindowToActivateForContainerIndex(i, ignore); | 131 window = GetTopmostWindowToActivateForContainerIndex(i, ignore); |
| 151 if (!window && starting_container_index > 0) { | 132 if (!window && starting_container_index > 0) { |
| 152 for (int i = starting_container_index - 1; !window && i >= 0; i--) | 133 for (int i = starting_container_index - 1; !window && i >= 0; i--) |
| 153 window = GetTopmostWindowToActivateForContainerIndex(i, ignore); | 134 window = GetTopmostWindowToActivateForContainerIndex(i, ignore); |
| 154 } | 135 } |
| 155 return window; | 136 return window; |
| 156 } | 137 } |
| 157 | 138 |
| 158 //////////////////////////////////////////////////////////////////////////////// | 139 //////////////////////////////////////////////////////////////////////////////// |
| 159 // AshFocusRules, private: | 140 // AshFocusRules, private: |
| 160 | 141 |
| 161 aura::Window* AshFocusRules::GetTopmostWindowToActivateForContainerIndex( | 142 aura::Window* AshFocusRules::GetTopmostWindowToActivateForContainerIndex( |
| 162 int index, | 143 int index, |
| 163 aura::Window* ignore) const { | 144 aura::Window* ignore) const { |
| 164 aura::Window* window = NULL; | 145 aura::Window* window = NULL; |
| 165 aura::Window* root = ignore ? ignore->GetRootWindow() : NULL; | 146 aura::Window* root = ignore ? ignore->GetRootWindow() : NULL; |
| 166 aura::Window::Windows containers = Shell::GetContainersFromAllRootWindows( | 147 aura::Window::Windows containers = Shell::GetContainersFromAllRootWindows( |
| 167 kWindowContainerIds[index], root); | 148 kActivatableShellWindowIds[index], root); |
| 168 for (aura::Window::Windows::const_iterator iter = containers.begin(); | 149 for (aura::Window::Windows::const_iterator iter = containers.begin(); |
| 169 iter != containers.end() && !window; ++iter) { | 150 iter != containers.end() && !window; ++iter) { |
| 170 window = GetTopmostWindowToActivateInContainer((*iter), ignore); | 151 window = GetTopmostWindowToActivateInContainer((*iter), ignore); |
| 171 } | 152 } |
| 172 return window; | 153 return window; |
| 173 } | 154 } |
| 174 | 155 |
| 175 aura::Window* AshFocusRules::GetTopmostWindowToActivateInContainer( | 156 aura::Window* AshFocusRules::GetTopmostWindowToActivateInContainer( |
| 176 aura::Window* container, | 157 aura::Window* container, |
| 177 aura::Window* ignore) const { | 158 aura::Window* ignore) const { |
| 178 for (aura::Window::Windows::const_reverse_iterator i = | 159 for (aura::Window::Windows::const_reverse_iterator i = |
| 179 container->children().rbegin(); | 160 container->children().rbegin(); |
| 180 i != container->children().rend(); | 161 i != container->children().rend(); |
| 181 ++i) { | 162 ++i) { |
| 182 WindowState* window_state = GetWindowState(*i); | 163 WindowState* window_state = GetWindowState(*i); |
| 183 if (*i != ignore && | 164 if (*i != ignore && |
| 184 window_state->CanActivate() && | 165 window_state->CanActivate() && |
| 185 !window_state->IsMinimized()) | 166 !window_state->IsMinimized()) |
| 186 return *i; | 167 return *i; |
| 187 } | 168 } |
| 188 return NULL; | 169 return NULL; |
| 189 } | 170 } |
| 190 | 171 |
| 191 } // namespace wm | 172 } // namespace wm |
| 192 } // namespace ash | 173 } // namespace ash |
| OLD | NEW |