Chromium Code Reviews| 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/window_cycle_controller.h" | 5 #include "ash/wm/window_cycle_controller.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "ash/shell_delegate.h" | 9 #include "ash/shell_delegate.h" |
| 10 #include "ash/shell_window_ids.h" | 10 #include "ash/shell_window_ids.h" |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 142 Step(direction); | 142 Step(direction); |
| 143 } | 143 } |
| 144 } else { | 144 } else { |
| 145 // This is a simple, single-step window cycle. | 145 // This is a simple, single-step window cycle. |
| 146 StartCycling(); | 146 StartCycling(); |
| 147 Step(direction); | 147 Step(direction); |
| 148 StopCycling(); | 148 StopCycling(); |
| 149 } | 149 } |
| 150 } | 150 } |
| 151 | 151 |
| 152 void WindowCycleController::HandleLinearCycleWindow() { | |
| 153 if (!CanCycle() || IsCycling()) | |
| 154 return; | |
| 155 | |
| 156 // Use the reversed list of windows to prevent a 2-cycle of the most recent | |
| 157 // windows occurring. | |
| 158 windows_.reset(new WindowCycleList(BuildWindowList(NULL, true))); | |
|
James Cook
2013/03/22 16:45:36
I would just make the WindowCycleList a local vari
| |
| 159 Step(FORWARD); | |
| 160 windows_.reset(); | |
| 161 } | |
| 162 | |
| 152 void WindowCycleController::AltKeyReleased() { | 163 void WindowCycleController::AltKeyReleased() { |
| 153 StopCycling(); | 164 StopCycling(); |
| 154 } | 165 } |
| 155 | 166 |
| 156 // static | 167 // static |
| 157 std::vector<aura::Window*> WindowCycleController::BuildWindowList( | 168 std::vector<aura::Window*> WindowCycleController::BuildWindowList( |
| 158 const std::list<aura::Window*>* mru_windows) { | 169 const std::list<aura::Window*>* mru_windows, |
| 170 bool reverse_order) { | |
|
James Cook
2013/03/22 16:45:36
I would either change the sense of this boolean to
| |
| 159 WindowCycleList::WindowList windows; | 171 WindowCycleList::WindowList windows; |
| 160 Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); | 172 Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); |
| 161 | 173 |
| 162 aura::RootWindow* active_root = Shell::GetActiveRootWindow(); | 174 aura::RootWindow* active_root = Shell::GetActiveRootWindow(); |
| 163 for (Shell::RootWindowList::const_iterator iter = root_windows.begin(); | 175 for (Shell::RootWindowList::const_iterator iter = root_windows.begin(); |
| 164 iter != root_windows.end(); ++iter) { | 176 iter != root_windows.end(); ++iter) { |
| 165 if (*iter == active_root) | 177 if (*iter == active_root) |
| 166 continue; | 178 continue; |
| 167 for (size_t i = 0; i < arraysize(kContainerIds); ++i) | 179 for (size_t i = 0; i < arraysize(kContainerIds); ++i) |
| 168 AddCycleWindows(*iter, kContainerIds[i], &windows); | 180 AddCycleWindows(*iter, kContainerIds[i], &windows); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 191 WindowCycleList::WindowList::iterator window = | 203 WindowCycleList::WindowList::iterator window = |
| 192 std::find(windows.begin(), windows.end(), *ix); | 204 std::find(windows.begin(), windows.end(), *ix); |
| 193 if (window != windows.end()) { | 205 if (window != windows.end()) { |
| 194 windows.erase(window); | 206 windows.erase(window); |
| 195 windows.push_back(*ix); | 207 windows.push_back(*ix); |
| 196 } | 208 } |
| 197 } | 209 } |
| 198 } | 210 } |
| 199 | 211 |
| 200 // Window cycling expects the topmost window at the front of the list. | 212 // Window cycling expects the topmost window at the front of the list. |
| 201 std::reverse(windows.begin(), windows.end()); | 213 if (!reverse_order) |
| 214 std::reverse(windows.begin(), windows.end()); | |
| 202 | 215 |
| 203 return windows; | 216 return windows; |
| 204 } | 217 } |
| 205 | 218 |
| 206 void WindowCycleController::OnRootWindowAdded(aura::RootWindow* root_window) { | 219 void WindowCycleController::OnRootWindowAdded(aura::RootWindow* root_window) { |
| 207 for (size_t i = 0; i < arraysize(kContainerIds); ++i) { | 220 for (size_t i = 0; i < arraysize(kContainerIds); ++i) { |
| 208 aura::Window* container = | 221 aura::Window* container = |
| 209 Shell::GetContainer(root_window, kContainerIds[i]); | 222 Shell::GetContainer(root_window, kContainerIds[i]); |
| 210 container->AddObserver(this); | 223 container->AddObserver(this); |
| 211 } | 224 } |
| 212 | 225 |
| 213 aura::Window* default_container = | 226 aura::Window* default_container = |
| 214 Shell::GetContainer(root_window, | 227 Shell::GetContainer(root_window, |
| 215 internal::kShellWindowId_DefaultContainer); | 228 internal::kShellWindowId_DefaultContainer); |
| 216 for (size_t i = 0; i < default_container->children().size(); ++i) { | 229 for (size_t i = 0; i < default_container->children().size(); ++i) { |
| 217 aura::Window* workspace_window = default_container->children()[i]; | 230 aura::Window* workspace_window = default_container->children()[i]; |
| 218 DCHECK_EQ(internal::kShellWindowId_WorkspaceContainer, | 231 DCHECK_EQ(internal::kShellWindowId_WorkspaceContainer, |
| 219 workspace_window->id()); | 232 workspace_window->id()); |
| 220 workspace_window->AddObserver(this); | 233 workspace_window->AddObserver(this); |
| 221 } | 234 } |
| 222 } | 235 } |
| 223 | 236 |
| 224 ////////////////////////////////////////////////////////////////////////////// | 237 ////////////////////////////////////////////////////////////////////////////// |
| 225 // WindowCycleController, private: | 238 // WindowCycleController, private: |
| 226 | 239 |
| 227 void WindowCycleController::StartCycling() { | 240 void WindowCycleController::StartCycling() { |
| 228 windows_.reset(new WindowCycleList(BuildWindowList(&mru_windows_))); | 241 windows_.reset(new WindowCycleList(BuildWindowList(&mru_windows_, false))); |
| 229 } | 242 } |
| 230 | 243 |
| 231 void WindowCycleController::Step(Direction direction) { | 244 void WindowCycleController::Step(Direction direction) { |
| 232 DCHECK(windows_.get()); | 245 DCHECK(windows_.get()); |
| 233 windows_->Step(direction == FORWARD ? WindowCycleList::FORWARD : | 246 windows_->Step(direction == FORWARD ? WindowCycleList::FORWARD : |
| 234 WindowCycleList::BACKWARD); | 247 WindowCycleList::BACKWARD); |
| 235 } | 248 } |
| 236 | 249 |
| 237 void WindowCycleController::StopCycling() { | 250 void WindowCycleController::StopCycling() { |
| 238 windows_.reset(); | 251 windows_.reset(); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 283 mru_windows_.remove(window); | 296 mru_windows_.remove(window); |
| 284 if (window->id() == internal::kShellWindowId_WorkspaceContainer) | 297 if (window->id() == internal::kShellWindowId_WorkspaceContainer) |
| 285 window->RemoveObserver(this); | 298 window->RemoveObserver(this); |
| 286 } | 299 } |
| 287 | 300 |
| 288 void WindowCycleController::OnWindowDestroying(aura::Window* window) { | 301 void WindowCycleController::OnWindowDestroying(aura::Window* window) { |
| 289 window->RemoveObserver(this); | 302 window->RemoveObserver(this); |
| 290 } | 303 } |
| 291 | 304 |
| 292 } // namespace ash | 305 } // namespace ash |
| OLD | NEW |