Index: ash/mus/window_manager.cc |
diff --git a/ash/mus/window_manager.cc b/ash/mus/window_manager.cc |
index 08559ea1f4767343d6d8bb92dae73e47cca137dd..43124a9d76f342be6111678c7dd0b8bd3b9e097c 100644 |
--- a/ash/mus/window_manager.cc |
+++ b/ash/mus/window_manager.cc |
@@ -13,6 +13,7 @@ |
#include "ash/mus/accelerators/accelerator_ids.h" |
#include "ash/mus/app_list_presenter_mus.h" |
#include "ash/mus/bridge/wm_lookup_mus.h" |
+#include "ash/mus/bridge/wm_root_window_controller_mus.h" |
#include "ash/mus/bridge/wm_shell_mus.h" |
#include "ash/mus/bridge/wm_window_mus.h" |
#include "ash/mus/move_event_handler.h" |
@@ -151,7 +152,6 @@ RootWindowController* WindowManager::CreateRootWindowController( |
RootWindowController* root_window_controller = |
root_window_controller_ptr.get(); |
root_window_controllers_.insert(std::move(root_window_controller_ptr)); |
- window->AddObserver(this); |
FOR_EACH_OBSERVER(WindowManagerObserver, observers_, |
OnRootWindowControllerAdded(root_window_controller)); |
@@ -170,19 +170,21 @@ RootWindowController* WindowManager::CreateRootWindowController( |
void WindowManager::DestroyRootWindowController( |
RootWindowController* root_window_controller) { |
- // TODO(sky): WindowManager shouldn't need to observe the windows. Instead |
- // WindowManager should have a specific API that is called when a display is |
- // removed. |
+ if (root_window_controllers_.size() > 1) { |
+ DCHECK_NE(root_window_controller, GetPrimaryRootWindowController()); |
+ root_window_controller->wm_root_window_controller()->MoveWindowsTo( |
+ WmWindowMus::Get(GetPrimaryRootWindowController()->root())); |
+ } |
+ |
ui::Window* root_window = root_window_controller->root(); |
auto it = FindRootWindowControllerByWindow(root_window); |
DCHECK(it != root_window_controllers_.end()); |
- FOR_EACH_OBSERVER(WindowManagerObserver, observers_, |
- OnWillDestroyRootWindowController((*it).get())); |
+ |
+ (*it)->Shutdown(); |
+ |
+ // NOTE: classic ash deleted RootWindowController after a delay (DeleteSoon()) |
+ // this may need to change to mirror that. |
root_window_controllers_.erase(it); |
- // Remove the observer so we don't see the OnWindowDestroying/Destroyed as we |
- // already handled it here. |
- root_window->RemoveObserver(this); |
- root_window->Destroy(); |
} |
void WindowManager::Shutdown() { |
@@ -197,7 +199,7 @@ void WindowManager::Shutdown() { |
// Destroy the roots of the RootWindowControllers, which triggers removal |
// in OnWindowDestroyed(). |
while (!root_window_controllers_.empty()) |
- (*root_window_controllers_.begin())->root()->Destroy(); |
+ DestroyRootWindowController(root_window_controllers_.begin()->get()); |
lookup_.reset(); |
shell_->Shutdown(); |
@@ -220,18 +222,10 @@ WindowManager::FindRootWindowControllerByWindow(ui::Window* window) { |
return root_window_controllers_.end(); |
} |
-void WindowManager::OnWindowDestroying(ui::Window* window) { |
- auto it = FindRootWindowControllerByWindow(window); |
- DCHECK(it != root_window_controllers_.end()); |
- FOR_EACH_OBSERVER(WindowManagerObserver, observers_, |
- OnWillDestroyRootWindowController((*it).get())); |
-} |
- |
-void WindowManager::OnWindowDestroyed(ui::Window* window) { |
- auto it = FindRootWindowControllerByWindow(window); |
- DCHECK(it != root_window_controllers_.end()); |
- window->RemoveObserver(this); |
- root_window_controllers_.erase(it); |
+RootWindowController* WindowManager::GetPrimaryRootWindowController() { |
+ return static_cast<WmRootWindowControllerMus*>( |
+ WmShell::Get()->GetPrimaryRootWindowController()) |
+ ->root_window_controller(); |
} |
void WindowManager::OnEmbed(ui::Window* root) { |
@@ -298,8 +292,9 @@ void WindowManager::OnWmNewDisplay(ui::Window* window, |
} |
void WindowManager::OnWmDisplayRemoved(ui::Window* window) { |
- // TODO(sky): wire up this up correctly. |
- NOTIMPLEMENTED(); |
+ auto iter = FindRootWindowControllerByWindow(window); |
+ DCHECK(iter != root_window_controllers_.end()); |
+ DestroyRootWindowController(iter->get()); |
} |
void WindowManager::OnWmPerformMoveLoop( |