Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/common/wm_root_window_controller.h" | 5 #include "ash/common/wm_root_window_controller.h" |
| 6 | 6 |
| 7 #include "ash/common/session/session_state_delegate.h" | 7 #include "ash/common/session/session_state_delegate.h" |
| 8 #include "ash/common/shelf/wm_shelf.h" | 8 #include "ash/common/shelf/wm_shelf.h" |
| 9 #include "ash/common/shell_delegate.h" | 9 #include "ash/common/shell_delegate.h" |
| 10 #include "ash/common/shell_window_ids.h" | 10 #include "ash/common/shell_window_ids.h" |
| 11 #include "ash/common/wallpaper/wallpaper_delegate.h" | 11 #include "ash/common/wallpaper/wallpaper_delegate.h" |
| 12 #include "ash/common/wallpaper/wallpaper_widget_controller.h" | 12 #include "ash/common/wallpaper/wallpaper_widget_controller.h" |
| 13 #include "ash/common/wm/always_on_top_controller.h" | |
| 13 #include "ash/common/wm/container_finder.h" | 14 #include "ash/common/wm/container_finder.h" |
| 15 #include "ash/common/wm/dock/docked_window_layout_manager.h" | |
| 14 #include "ash/common/wm/lock_layout_manager.h" | 16 #include "ash/common/wm/lock_layout_manager.h" |
| 17 #include "ash/common/wm/panels/panel_layout_manager.h" | |
| 15 #include "ash/common/wm/root_window_layout_manager.h" | 18 #include "ash/common/wm/root_window_layout_manager.h" |
| 16 #include "ash/common/wm/system_modal_container_layout_manager.h" | 19 #include "ash/common/wm/system_modal_container_layout_manager.h" |
| 17 #include "ash/common/wm/window_state.h" | 20 #include "ash/common/wm/window_state.h" |
| 21 #include "ash/common/wm/wm_snap_to_pixel_layout_manager.h" | |
| 18 #include "ash/common/wm/workspace/workspace_layout_manager.h" | 22 #include "ash/common/wm/workspace/workspace_layout_manager.h" |
| 19 #include "ash/common/wm/workspace_controller.h" | 23 #include "ash/common/wm/workspace_controller.h" |
| 20 #include "ash/common/wm_shell.h" | 24 #include "ash/common/wm_shell.h" |
| 21 #include "ash/common/wm_window.h" | 25 #include "ash/common/wm_window.h" |
| 22 #include "base/memory/ptr_util.h" | 26 #include "base/memory/ptr_util.h" |
| 23 #include "ui/base/models/menu_model.h" | 27 #include "ui/base/models/menu_model.h" |
| 24 #include "ui/views/controls/menu/menu_model_adapter.h" | 28 #include "ui/views/controls/menu/menu_model_adapter.h" |
| 25 #include "ui/views/controls/menu/menu_runner.h" | 29 #include "ui/views/controls/menu/menu_runner.h" |
| 26 | 30 |
| 27 namespace ash { | 31 namespace ash { |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 131 window->SetShellWindowId(window_id); | 135 window->SetShellWindowId(window_id); |
| 132 window->SetName(name); | 136 window->SetName(name); |
| 133 parent->AddChild(window); | 137 parent->AddChild(window); |
| 134 if (window_id != kShellWindowId_UnparentedControlContainer) | 138 if (window_id != kShellWindowId_UnparentedControlContainer) |
| 135 window->Show(); | 139 window->Show(); |
| 136 return window; | 140 return window; |
| 137 } | 141 } |
| 138 | 142 |
| 139 } // namespace | 143 } // namespace |
| 140 | 144 |
| 141 WmRootWindowController::WmRootWindowController(WmWindow* root) | 145 WmRootWindowController::WmRootWindowController(WmWindow* root) : root_(root) {} |
| 142 : root_(root), root_window_layout_manager_(nullptr) {} | |
| 143 | 146 |
| 144 WmRootWindowController::~WmRootWindowController() { | 147 WmRootWindowController::~WmRootWindowController() { |
| 145 if (animating_wallpaper_widget_controller_.get()) | 148 if (animating_wallpaper_widget_controller_.get()) |
| 146 animating_wallpaper_widget_controller_->StopAnimating(); | 149 animating_wallpaper_widget_controller_->StopAnimating(); |
| 147 } | 150 } |
| 148 | 151 |
| 149 void WmRootWindowController::SetWallpaperWidgetController( | 152 void WmRootWindowController::SetWallpaperWidgetController( |
| 150 WallpaperWidgetController* controller) { | 153 WallpaperWidgetController* controller) { |
| 151 wallpaper_widget_controller_.reset(controller); | 154 wallpaper_widget_controller_.reset(controller); |
| 152 } | 155 } |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 234 WallpaperWidgetController* controller = | 237 WallpaperWidgetController* controller = |
| 235 animating_wallpaper_widget_controller()->GetController(true); | 238 animating_wallpaper_widget_controller()->GetController(true); |
| 236 DCHECK_EQ(controller->widget(), widget); | 239 DCHECK_EQ(controller->widget(), widget); |
| 237 // Release the old controller and close its wallpaper widget. | 240 // Release the old controller and close its wallpaper widget. |
| 238 SetWallpaperWidgetController(controller); | 241 SetWallpaperWidgetController(controller); |
| 239 } | 242 } |
| 240 } | 243 } |
| 241 | 244 |
| 242 void WmRootWindowController::MoveWindowsTo(WmWindow* dest) { | 245 void WmRootWindowController::MoveWindowsTo(WmWindow* dest) { |
| 243 // Clear the workspace controller, so it doesn't incorrectly update the shelf. | 246 // Clear the workspace controller, so it doesn't incorrectly update the shelf. |
| 244 DeleteWorkspaceController(); | 247 workspace_controller_.reset(); |
| 245 ReparentAllWindows(GetWindow(), dest); | 248 ReparentAllWindows(GetWindow(), dest); |
| 246 } | 249 } |
| 247 | 250 |
| 248 void WmRootWindowController::CreateContainers() { | 251 void WmRootWindowController::CreateContainers() { |
| 249 // These containers are just used by PowerButtonController to animate groups | 252 // These containers are just used by PowerButtonController to animate groups |
| 250 // of containers simultaneously without messing up the current transformations | 253 // of containers simultaneously without messing up the current transformations |
| 251 // on those containers. These are direct children of the root window; all of | 254 // on those containers. These are direct children of the root window; all of |
| 252 // the other containers are their children. | 255 // the other containers are their children. |
| 253 | 256 |
| 254 // The wallpaper container is not part of the lock animation, so it is not | 257 // The wallpaper container is not part of the lock animation, so it is not |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 439 GetContainer(kShellWindowId_LockSystemModalContainer); | 442 GetContainer(kShellWindowId_LockSystemModalContainer); |
| 440 DCHECK(lock_modal_container); | 443 DCHECK(lock_modal_container); |
| 441 lock_modal_container->SetLayoutManager( | 444 lock_modal_container->SetLayoutManager( |
| 442 base::MakeUnique<SystemModalContainerLayoutManager>( | 445 base::MakeUnique<SystemModalContainerLayoutManager>( |
| 443 lock_modal_container)); | 446 lock_modal_container)); |
| 444 | 447 |
| 445 WmWindow* lock_container = GetContainer(kShellWindowId_LockScreenContainer); | 448 WmWindow* lock_container = GetContainer(kShellWindowId_LockScreenContainer); |
| 446 DCHECK(lock_container); | 449 DCHECK(lock_container); |
| 447 lock_container->SetLayoutManager( | 450 lock_container->SetLayoutManager( |
| 448 base::MakeUnique<LockLayoutManager>(lock_container)); | 451 base::MakeUnique<LockLayoutManager>(lock_container)); |
| 452 | |
| 453 WmWindow* always_on_top_container = | |
| 454 GetContainer(kShellWindowId_AlwaysOnTopContainer); | |
| 455 DCHECK(always_on_top_container); | |
| 456 always_on_top_controller_ = | |
| 457 base::MakeUnique<AlwaysOnTopController>(always_on_top_container); | |
| 458 | |
| 459 // Create Docked windows layout manager | |
| 460 WmWindow* docked_container = GetContainer(kShellWindowId_DockedContainer); | |
| 461 docked_window_layout_manager_ = | |
| 462 new DockedWindowLayoutManager(docked_container); | |
| 463 docked_container->SetLayoutManager( | |
| 464 base::WrapUnique(docked_window_layout_manager_)); | |
| 465 | |
| 466 // Create Panel layout manager | |
| 467 WmWindow* panel_container = GetContainer(kShellWindowId_PanelContainer); | |
| 468 panel_layout_manager_ = new PanelLayoutManager(panel_container); | |
| 469 panel_container->SetLayoutManager(base::WrapUnique(panel_layout_manager_)); | |
| 470 | |
| 471 wm::WmSnapToPixelLayoutManager::InstallOnContainers(root_); | |
| 449 } | 472 } |
| 450 | 473 |
| 451 void WmRootWindowController::DeleteWorkspaceController() { | 474 void WmRootWindowController::ResetRootForNewWindowsIfNecessary() { |
| 475 WmShell* shell = WmShell::Get(); | |
| 476 // Change the target root window before closing child windows. If any child | |
| 477 // being removed triggers a relayout of the shelf it will try to build a | |
| 478 // window list adding windows from the target root window's containers which | |
| 479 // may have already gone away. | |
| 480 if (shell->GetRootWindowForNewWindows() == GetWindow()) { | |
| 481 // The root window for new windows is being destroyed. Switch to the primary | |
| 482 // root window if possible. | |
| 483 WmWindow* primary_root = shell->GetPrimaryRootWindow(); | |
| 484 shell->set_root_window_for_new_windows( | |
| 485 primary_root == GetWindow() ? nullptr : primary_root); | |
| 486 } | |
| 487 } | |
| 488 | |
| 489 void WmRootWindowController::CloseChildWindows() { | |
| 490 // NOTE: this may be called multiple times. | |
|
James Cook
2016/09/21 22:03:18
Aside: It's such a bummer this is true.
| |
| 491 | |
| 492 // |panel_layout_manager_| needs to be shut down before windows are destroyed. | |
| 493 if (panel_layout_manager_) { | |
| 494 panel_layout_manager_->Shutdown(); | |
| 495 panel_layout_manager_ = nullptr; | |
| 496 } | |
| 497 | |
| 498 // |docked_window_layout_manager_| needs to be shut down before windows are | |
| 499 // destroyed. | |
| 500 if (docked_window_layout_manager_) { | |
| 501 docked_window_layout_manager_->Shutdown(); | |
| 502 docked_window_layout_manager_ = nullptr; | |
| 503 } | |
| 504 | |
| 505 WmShelf* shelf = GetShelf(); | |
| 506 shelf->ShutdownShelfWidget(); | |
| 507 | |
| 452 workspace_controller_.reset(); | 508 workspace_controller_.reset(); |
| 509 | |
| 510 // Explicitly destroy top level windows. We do this as during part of | |
| 511 // destruction such windows may query the RootWindow for state. | |
|
James Cook
2016/09/21 22:03:18
nit: because such windows...
sky
2016/09/21 22:47:48
Done.
| |
| 512 WmWindowTracker non_toplevel_windows; | |
| 513 non_toplevel_windows.Add(root_); | |
| 514 while (!non_toplevel_windows.windows().empty()) { | |
| 515 WmWindow* non_toplevel_window = non_toplevel_windows.Pop(); | |
| 516 WmWindowTracker toplevel_windows; | |
| 517 for (WmWindow* child : non_toplevel_window->GetChildren()) { | |
| 518 if (!ShouldDestroyWindowInCloseChildWindows(child)) | |
| 519 continue; | |
| 520 if (child->HasNonClientArea()) | |
| 521 toplevel_windows.Add(child); | |
| 522 else | |
| 523 non_toplevel_windows.Add(child); | |
| 524 } | |
| 525 while (!toplevel_windows.windows().empty()) | |
| 526 toplevel_windows.Pop()->Destroy(); | |
| 527 } | |
| 528 // And then remove the containers. | |
| 529 while (!root_->GetChildren().empty()) { | |
| 530 WmWindow* child = root_->GetChildren()[0]; | |
| 531 if (ShouldDestroyWindowInCloseChildWindows(child)) | |
| 532 child->Destroy(); | |
| 533 else | |
| 534 root_->RemoveChild(child); | |
| 535 } | |
| 536 | |
| 537 shelf->DestroyShelfWidget(); | |
| 538 | |
| 539 // CloseChildWindows() may be called twice during the shutdown of ash | |
| 540 // unittests. Avoid notifying WmShelf that the shelf has been destroyed twice. | |
| 541 if (shelf->IsShelfInitialized()) | |
| 542 shelf->ShutdownShelf(); | |
| 453 } | 543 } |
| 454 | 544 |
| 455 void WmRootWindowController::OnMenuClosed() { | 545 void WmRootWindowController::OnMenuClosed() { |
| 456 menu_runner_.reset(); | 546 menu_runner_.reset(); |
| 457 menu_model_adapter_.reset(); | 547 menu_model_adapter_.reset(); |
| 458 menu_model_.reset(); | 548 menu_model_.reset(); |
| 459 GetShelf()->UpdateVisibilityState(); | 549 GetShelf()->UpdateVisibilityState(); |
| 460 } | 550 } |
| 461 | 551 |
| 462 } // namespace ash | 552 } // namespace ash |
| OLD | NEW |