Chromium Code Reviews| Index: ash/mus/window_manager.cc |
| diff --git a/ash/mus/window_manager.cc b/ash/mus/window_manager.cc |
| index 08559ea1f4767343d6d8bb92dae73e47cca137dd..da994ab400d47660f9f73a5070d39b74fe6fe59f 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,20 @@ 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) { |
| + root_window_controller->wm_root_window_controller()->MoveWindowsTo( |
| + WmWindowMus::Get(GetPrimaryRootWindowController()->root())); |
|
James Cook
2016/09/21 22:03:19
DCHECK that the root_window_controller being destr
sky
2016/09/21 22:47:49
Done.
|
| + } |
| + |
| 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 +198,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 +221,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 +291,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( |