OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "athena/wm/public/window_manager.h" | 5 #include "athena/wm/public/window_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "athena/common/container_priorities.h" | 9 #include "athena/common/container_priorities.h" |
10 #include "athena/input/public/accelerator_manager.h" | 10 #include "athena/input/public/accelerator_manager.h" |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 const ui::Accelerator& accelerator) { | 240 const ui::Accelerator& accelerator) { |
241 switch (command_id) { | 241 switch (command_id) { |
242 case CMD_TOGGLE_OVERVIEW: | 242 case CMD_TOGGLE_OVERVIEW: |
243 ToggleOverview(); | 243 ToggleOverview(); |
244 break; | 244 break; |
245 } | 245 } |
246 return true; | 246 return true; |
247 } | 247 } |
248 | 248 |
249 aura::Window* WindowManagerImpl::GetWindowBehind(aura::Window* window) { | 249 aura::Window* WindowManagerImpl::GetWindowBehind(aura::Window* window) { |
250 const aura::Window::Windows& windows = container_->children(); | 250 const aura::Window::Windows& windows = window_list_provider_->GetWindowList(); |
251 aura::Window::Windows::const_iterator iter = | 251 aura::Window::Windows::const_reverse_iterator iter = |
252 std::find(windows.begin(), windows.end(), window); | 252 std::find(windows.rbegin(), windows.rend(), window); |
253 CHECK(iter != windows.end()); | 253 CHECK(iter != windows.rend()); |
254 return (iter == windows.begin()) ? NULL : *(iter - 1); | 254 ++iter; |
| 255 aura::Window* behind = NULL; |
| 256 if (iter != windows.rend()) |
| 257 behind = *iter++; |
| 258 |
| 259 if (split_view_controller_->IsSplitViewModeActive()) { |
| 260 aura::Window* left = split_view_controller_->left_window(); |
| 261 aura::Window* right = split_view_controller_->right_window(); |
| 262 CHECK(window == left || window == right); |
| 263 if (behind == left || behind == right) |
| 264 behind = (iter == windows.rend()) ? NULL : *iter; |
| 265 } |
| 266 |
| 267 return behind; |
255 } | 268 } |
256 | 269 |
257 void WindowManagerImpl::OnTitleDragStarted(aura::Window* window) { | 270 void WindowManagerImpl::OnTitleDragStarted(aura::Window* window) { |
| 271 aura::Window* next_window = GetWindowBehind(window); |
| 272 if (!next_window) |
| 273 return; |
| 274 // Make sure |window| is active. Also make sure that |next_window| is visible, |
| 275 // and positioned to match the top-left edge of |window|. |
| 276 wm::ActivateWindow(window); |
| 277 next_window->Show(); |
| 278 int dx = window->bounds().x() - next_window->bounds().x(); |
| 279 if (dx) { |
| 280 gfx::Transform transform; |
| 281 transform.Translate(dx, 0); |
| 282 next_window->SetTransform(transform); |
| 283 } |
258 } | 284 } |
259 | 285 |
260 void WindowManagerImpl::OnTitleDragCompleted(aura::Window* window) { | 286 void WindowManagerImpl::OnTitleDragCompleted(aura::Window* window) { |
261 aura::Window* next_window = GetWindowBehind(window); | 287 aura::Window* next_window = GetWindowBehind(window); |
262 if (next_window) | 288 if (!next_window) |
| 289 return; |
| 290 if (split_view_controller_->IsSplitViewModeActive()) |
| 291 split_view_controller_->ReplaceWindow(window, next_window); |
| 292 else |
263 OnSelectWindow(next_window); | 293 OnSelectWindow(next_window); |
| 294 wm::ActivateWindow(next_window); |
264 } | 295 } |
265 | 296 |
266 void WindowManagerImpl::OnTitleDragCanceled(aura::Window* window) { | 297 void WindowManagerImpl::OnTitleDragCanceled(aura::Window* window) { |
| 298 aura::Window* next_window = GetWindowBehind(window); |
| 299 if (!next_window) |
| 300 return; |
| 301 next_window->SetTransform(gfx::Transform()); |
267 } | 302 } |
268 | 303 |
269 AthenaContainerLayoutManager::AthenaContainerLayoutManager() { | 304 AthenaContainerLayoutManager::AthenaContainerLayoutManager() { |
270 } | 305 } |
271 | 306 |
272 AthenaContainerLayoutManager::~AthenaContainerLayoutManager() { | 307 AthenaContainerLayoutManager::~AthenaContainerLayoutManager() { |
273 } | 308 } |
274 | 309 |
275 void AthenaContainerLayoutManager::OnWindowResized() { | 310 void AthenaContainerLayoutManager::OnWindowResized() { |
276 instance->Layout(); | 311 instance->Layout(); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 DCHECK(!instance); | 354 DCHECK(!instance); |
320 } | 355 } |
321 | 356 |
322 // static | 357 // static |
323 WindowManager* WindowManager::GetInstance() { | 358 WindowManager* WindowManager::GetInstance() { |
324 DCHECK(instance); | 359 DCHECK(instance); |
325 return instance; | 360 return instance; |
326 } | 361 } |
327 | 362 |
328 } // namespace athena | 363 } // namespace athena |
OLD | NEW |