Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(693)

Unified Diff: ash/common/wm_root_window_controller.cc

Issue 2350953009: Centralizes more shared code between ash and mash (Closed)
Patch Set: feedback Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/common/wm_root_window_controller.h ('k') | ash/common/wm_window.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/common/wm_root_window_controller.cc
diff --git a/ash/common/wm_root_window_controller.cc b/ash/common/wm_root_window_controller.cc
index 025958149de0511d632bb6b4c2e4f8c77bd11de5..91051d2eab55c7378302ee71fb4249e3d3ff4662 100644
--- a/ash/common/wm_root_window_controller.cc
+++ b/ash/common/wm_root_window_controller.cc
@@ -10,11 +10,15 @@
#include "ash/common/shell_window_ids.h"
#include "ash/common/wallpaper/wallpaper_delegate.h"
#include "ash/common/wallpaper/wallpaper_widget_controller.h"
+#include "ash/common/wm/always_on_top_controller.h"
#include "ash/common/wm/container_finder.h"
+#include "ash/common/wm/dock/docked_window_layout_manager.h"
#include "ash/common/wm/lock_layout_manager.h"
+#include "ash/common/wm/panels/panel_layout_manager.h"
#include "ash/common/wm/root_window_layout_manager.h"
#include "ash/common/wm/system_modal_container_layout_manager.h"
#include "ash/common/wm/window_state.h"
+#include "ash/common/wm/wm_snap_to_pixel_layout_manager.h"
#include "ash/common/wm/workspace/workspace_layout_manager.h"
#include "ash/common/wm/workspace_controller.h"
#include "ash/common/wm_shell.h"
@@ -138,8 +142,7 @@ WmWindow* CreateContainer(int window_id, const char* name, WmWindow* parent) {
} // namespace
-WmRootWindowController::WmRootWindowController(WmWindow* root)
- : root_(root), root_window_layout_manager_(nullptr) {}
+WmRootWindowController::WmRootWindowController(WmWindow* root) : root_(root) {}
WmRootWindowController::~WmRootWindowController() {
if (animating_wallpaper_widget_controller_.get())
@@ -241,7 +244,7 @@ void WmRootWindowController::OnWallpaperAnimationFinished(
void WmRootWindowController::MoveWindowsTo(WmWindow* dest) {
// Clear the workspace controller, so it doesn't incorrectly update the shelf.
- DeleteWorkspaceController();
+ workspace_controller_.reset();
ReparentAllWindows(GetWindow(), dest);
}
@@ -446,10 +449,97 @@ void WmRootWindowController::CreateLayoutManagers() {
DCHECK(lock_container);
lock_container->SetLayoutManager(
base::MakeUnique<LockLayoutManager>(lock_container));
+
+ WmWindow* always_on_top_container =
+ GetContainer(kShellWindowId_AlwaysOnTopContainer);
+ DCHECK(always_on_top_container);
+ always_on_top_controller_ =
+ base::MakeUnique<AlwaysOnTopController>(always_on_top_container);
+
+ // Create Docked windows layout manager
+ WmWindow* docked_container = GetContainer(kShellWindowId_DockedContainer);
+ docked_window_layout_manager_ =
+ new DockedWindowLayoutManager(docked_container);
+ docked_container->SetLayoutManager(
+ base::WrapUnique(docked_window_layout_manager_));
+
+ // Create Panel layout manager
+ WmWindow* panel_container = GetContainer(kShellWindowId_PanelContainer);
+ panel_layout_manager_ = new PanelLayoutManager(panel_container);
+ panel_container->SetLayoutManager(base::WrapUnique(panel_layout_manager_));
+
+ wm::WmSnapToPixelLayoutManager::InstallOnContainers(root_);
}
-void WmRootWindowController::DeleteWorkspaceController() {
+void WmRootWindowController::ResetRootForNewWindowsIfNecessary() {
+ WmShell* shell = WmShell::Get();
+ // Change the target root window before closing child windows. If any child
+ // being removed triggers a relayout of the shelf it will try to build a
+ // window list adding windows from the target root window's containers which
+ // may have already gone away.
+ if (shell->GetRootWindowForNewWindows() == GetWindow()) {
+ // The root window for new windows is being destroyed. Switch to the primary
+ // root window if possible.
+ WmWindow* primary_root = shell->GetPrimaryRootWindow();
+ shell->set_root_window_for_new_windows(
+ primary_root == GetWindow() ? nullptr : primary_root);
+ }
+}
+
+void WmRootWindowController::CloseChildWindows() {
+ // NOTE: this may be called multiple times.
+
+ // |panel_layout_manager_| needs to be shut down before windows are destroyed.
+ if (panel_layout_manager_) {
+ panel_layout_manager_->Shutdown();
+ panel_layout_manager_ = nullptr;
+ }
+
+ // |docked_window_layout_manager_| needs to be shut down before windows are
+ // destroyed.
+ if (docked_window_layout_manager_) {
+ docked_window_layout_manager_->Shutdown();
+ docked_window_layout_manager_ = nullptr;
+ }
+
+ WmShelf* shelf = GetShelf();
+ shelf->ShutdownShelfWidget();
+
workspace_controller_.reset();
+
+ // Explicitly destroy top level windows. We do this because such windows may
+ // query the RootWindow for state.
+ WmWindowTracker non_toplevel_windows;
+ non_toplevel_windows.Add(root_);
+ while (!non_toplevel_windows.windows().empty()) {
+ WmWindow* non_toplevel_window = non_toplevel_windows.Pop();
+ WmWindowTracker toplevel_windows;
+ for (WmWindow* child : non_toplevel_window->GetChildren()) {
+ if (!ShouldDestroyWindowInCloseChildWindows(child))
+ continue;
+ if (child->HasNonClientArea())
+ toplevel_windows.Add(child);
+ else
+ non_toplevel_windows.Add(child);
+ }
+ while (!toplevel_windows.windows().empty())
+ toplevel_windows.Pop()->Destroy();
+ }
+ // And then remove the containers.
+ while (!root_->GetChildren().empty()) {
+ WmWindow* child = root_->GetChildren()[0];
+ if (ShouldDestroyWindowInCloseChildWindows(child))
+ child->Destroy();
+ else
+ root_->RemoveChild(child);
+ }
+
+ shelf->DestroyShelfWidget();
+
+ // CloseChildWindows() may be called twice during the shutdown of ash
+ // unittests. Avoid notifying WmShelf that the shelf has been destroyed twice.
+ if (shelf->IsShelfInitialized())
+ shelf->ShutdownShelf();
}
void WmRootWindowController::OnMenuClosed() {
« no previous file with comments | « ash/common/wm_root_window_controller.h ('k') | ash/common/wm_window.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698