Chromium Code Reviews| Index: ash/mus/window_manager.cc |
| diff --git a/ash/mus/window_manager.cc b/ash/mus/window_manager.cc |
| index fcdced5651970f2aa4577aa2e4944993f10aa8aa..8d7f21ed199732b9a745f33942fefce63c5022a2 100644 |
| --- a/ash/mus/window_manager.cc |
| +++ b/ash/mus/window_manager.cc |
| @@ -20,13 +20,14 @@ |
| #include "ash/mus/move_event_handler.h" |
| #include "ash/mus/non_client_frame_controller.h" |
| #include "ash/mus/property_util.h" |
| -#include "ash/mus/root_window_controller.h" |
| #include "ash/mus/screen_mus.h" |
| #include "ash/mus/shadow_controller.h" |
| #include "ash/mus/shell_delegate_mus.h" |
| +#include "ash/mus/top_level_window_factory.h" |
| #include "ash/mus/window_properties.h" |
| #include "ash/public/cpp/shell_window_ids.h" |
| #include "ash/root_window_controller.h" |
| +#include "ash/root_window_settings.h" |
| #include "ash/shell.h" |
| #include "ash/shell_init_params.h" |
| #include "ash/wm/ash_focus_rules.h" |
| @@ -92,7 +93,7 @@ void WindowManager::Init( |
| if (connector_) |
| connector_->BindInterface(ui::mojom::kServiceName, &display_controller_); |
| - screen_ = base::MakeUnique<ScreenMus>(); |
| + screen_ = base::MakeUnique<ScreenMus>(display_controller_.get()); |
| display::Screen::SetScreenInstance(screen_.get()); |
| pointer_watcher_event_router_ = |
| @@ -136,25 +137,6 @@ void WindowManager::DeleteAllRootWindowControllers() { |
| DCHECK(root_window_controllers_.empty()); |
| } |
| -aura::Window* WindowManager::NewTopLevelWindow( |
| - ui::mojom::WindowType window_type, |
| - std::map<std::string, std::vector<uint8_t>>* properties) { |
| - RootWindowController* root_window_controller = |
| - GetRootWindowControllerForNewTopLevelWindow(properties); |
| - aura::Window* window = |
| - root_window_controller->NewTopLevelWindow(window_type, properties); |
| - if (properties->count( |
| - ui::mojom::WindowManager::kWindowIgnoredByShelf_Property)) { |
| - wm::WindowState* window_state = WmWindow::Get(window)->GetWindowState(); |
| - window_state->set_ignored_by_shelf(mojo::ConvertTo<bool>( |
| - (*properties) |
| - [ui::mojom::WindowManager::kWindowIgnoredByShelf_Property])); |
| - // No need to persist this value. |
| - properties->erase(ui::mojom::WindowManager::kWindowIgnoredByShelf_Property); |
| - } |
| - return window; |
| -} |
| - |
| std::set<RootWindowController*> WindowManager::GetRootWindowControllers() { |
| std::set<RootWindowController*> result; |
| for (auto& root_window_controller : root_window_controllers_) |
| @@ -190,11 +172,9 @@ void WindowManager::CreatePrimaryRootWindowController( |
| std::unique_ptr<aura::WindowTreeHostMus> window_tree_host) { |
| // See comment in CreateRootWindowController(). |
| DCHECK(created_shell_); |
| - std::unique_ptr<RootWindowController> root_window_controller_ptr( |
| - new RootWindowController( |
| - this, std::move(window_tree_host), screen_->GetAllDisplays()[0], |
| - ash::RootWindowController::RootWindowType::PRIMARY)); |
| - root_window_controllers_.insert(std::move(root_window_controller_ptr)); |
| + CreateAndRegisterRootWindowController( |
| + std::move(window_tree_host), screen_->GetAllDisplays()[0], |
| + RootWindowController::RootWindowType::PRIMARY); |
| } |
| void WindowManager::CreateShell( |
| @@ -213,31 +193,25 @@ void WindowManager::CreateShell( |
| Shell::CreateInstance(init_params); |
| } |
| -void WindowManager::CreateRootWindowController( |
| +void WindowManager::CreateAndRegisterRootWindowController( |
| std::unique_ptr<aura::WindowTreeHostMus> window_tree_host, |
| const display::Display& display, |
| - ash::RootWindowController::RootWindowType root_window_type) { |
| - // The ash startup sequence creates the Shell, which creates |
| - // WindowTreeHostManager, which creates the WindowTreeHosts and |
| - // RootWindowControllers. For mash we are supplied the WindowTreeHost when |
| - // a display is added (and WindowTreeHostManager is not used in mash). Mash |
| - // waits for the first WindowTreeHost, then creates the shell. As there are |
| - // order dependencies we have to create the RootWindowController at a similar |
| - // time as cash, to do that we inject the WindowTreeHost into ShellInitParams. |
| - // Shell calls to WmShell::InitHosts(), which calls back to |
| - // CreatePrimaryRootWindowController(). |
| - if (!created_shell_) { |
| - CreateShell(std::move(window_tree_host)); |
| - return; |
| + RootWindowController::RootWindowType root_window_type) { |
| + RootWindowSettings* root_window_settings = |
| + InitRootWindowSettings(window_tree_host->window()); |
| + root_window_settings->display_id = display.id(); |
| + std::unique_ptr<RootWindowController> root_window_controller( |
| + new RootWindowController(nullptr, window_tree_host.release())); |
|
msw
2017/01/18 23:31:27
nit: MakeUnique
sky
2017/01/19 01:02:20
The constructor is private and WindowManager is a
|
| + root_window_controller->Init(root_window_type); |
| + // TODO: To avoid lots of IPC AddActivationParent() should take an array. |
| + // http://crbug.com/682048. |
| + WmWindow* root_window = root_window_controller->GetWindow(); |
| + for (size_t i = 0; i < kNumActivatableShellWindowIds; ++i) { |
| + window_manager_client_->AddActivationParent( |
| + root_window->GetChildByShellWindowId(kActivatableShellWindowIds[i]) |
| + ->aura_window()); |
| } |
| - std::unique_ptr<RootWindowController> root_window_controller_ptr( |
| - new RootWindowController( |
| - this, std::move(window_tree_host), display, |
| - ash::RootWindowController::RootWindowType::SECONDARY)); |
| - root_window_controllers_.insert(std::move(root_window_controller_ptr)); |
| - |
| - for (auto& observer : *screen_->display_list().observers()) |
| - observer.OnDisplayAdded(display); |
| + root_window_controllers_.insert(std::move(root_window_controller)); |
| } |
| void WindowManager::DestroyRootWindowController( |
| @@ -245,8 +219,8 @@ void WindowManager::DestroyRootWindowController( |
| bool in_shutdown) { |
| if (!in_shutdown && root_window_controllers_.size() > 1) { |
| DCHECK_NE(root_window_controller, GetPrimaryRootWindowController()); |
| - root_window_controller->ash_root_window_controller()->MoveWindowsTo( |
| - GetPrimaryRootWindowController()->root()); |
| + root_window_controller->MoveWindowsTo( |
| + GetPrimaryRootWindowController()->GetRootWindow()); |
| } |
| root_window_controller->Shutdown(); |
| @@ -282,20 +256,6 @@ RootWindowController* WindowManager::GetPrimaryRootWindowController() { |
| ->aura_window()); |
| } |
| -RootWindowController* |
| -WindowManager::GetRootWindowControllerForNewTopLevelWindow( |
| - std::map<std::string, std::vector<uint8_t>>* properties) { |
| - // If a specific display was requested, use it. |
| - const int64_t display_id = GetInitialDisplayId(*properties); |
| - for (auto& root_window_controller_ptr : root_window_controllers_) { |
| - if (root_window_controller_ptr->display().id() == display_id) |
| - return root_window_controller_ptr.get(); |
| - } |
| - |
| - return RootWindowController::ForWindow( |
| - WmShellMus::Get()->GetRootWindowForNewWindows()->aura_window()); |
| -} |
| - |
| void WindowManager::OnEmbed( |
| std::unique_ptr<aura::WindowTreeHostMus> window_tree_host) { |
| // WindowManager should never see this, instead OnWmNewDisplay() is called. |
| @@ -369,7 +329,7 @@ aura::Window* WindowManager::OnWmCreateTopLevelWindow( |
| return nullptr; |
| } |
| - return NewTopLevelWindow(window_type, properties); |
| + return CreateAndParentTopLevelWindow(this, window_type, properties); |
| } |
| void WindowManager::OnWmClientJankinessChanged( |
| @@ -398,18 +358,34 @@ void WindowManager::OnWmWillCreateDisplay(const display::Display& display) { |
| void WindowManager::OnWmNewDisplay( |
| std::unique_ptr<aura::WindowTreeHostMus> window_tree_host, |
| const display::Display& display) { |
| - ash::RootWindowController::RootWindowType root_window_type = |
| + RootWindowController::RootWindowType root_window_type = |
| screen_->display_list().displays().size() == 1 |
| - ? ash::RootWindowController::RootWindowType::PRIMARY |
| - : ash::RootWindowController::RootWindowType::SECONDARY; |
| - CreateRootWindowController(std::move(window_tree_host), display, |
| - root_window_type); |
| + ? RootWindowController::RootWindowType::PRIMARY |
| + : RootWindowController::RootWindowType::SECONDARY; |
| + // The ash startup sequence creates the Shell, which creates |
| + // WindowTreeHostManager, which creates the WindowTreeHosts and |
| + // RootWindowControllers. For mash we are supplied the WindowTreeHost when |
| + // a display is added (and WindowTreeHostManager is not used in mash). Mash |
| + // waits for the first WindowTreeHost, then creates the shell. As there are |
| + // order dependencies we have to create the RootWindowController at a similar |
| + // time as cash, to do that we inject the WindowTreeHost into ShellInitParams. |
| + // Shell calls to WmShell::InitHosts(), which calls back to |
| + // CreatePrimaryRootWindowController(). |
| + if (!created_shell_) { |
| + CreateShell(std::move(window_tree_host)); |
| + return; |
| + } |
| + CreateAndRegisterRootWindowController(std::move(window_tree_host), display, |
| + root_window_type); |
| + |
| + for (auto& observer : *screen_->display_list().observers()) |
| + observer.OnDisplayAdded(display); |
| } |
| void WindowManager::OnWmDisplayRemoved( |
| aura::WindowTreeHostMus* window_tree_host) { |
| for (auto& root_window_controller_ptr : root_window_controllers_) { |
| - if (root_window_controller_ptr->window_tree_host() == window_tree_host) { |
| + if (root_window_controller_ptr->GetHost() == window_tree_host) { |
| const bool in_shutdown = false; |
| DestroyRootWindowController(root_window_controller_ptr.get(), |
| in_shutdown); |
| @@ -419,15 +395,7 @@ void WindowManager::OnWmDisplayRemoved( |
| } |
| void WindowManager::OnWmDisplayModified(const display::Display& display) { |
| - for (auto& controller : root_window_controllers_) { |
| - if (controller->display().id() == display.id()) { |
| - controller->SetDisplay(display); |
| - // The root window will be resized by the window server. |
| - return; |
| - } |
| - } |
| - |
| - NOTREACHED(); |
| + screen_->display_list().UpdateDisplay(display); |
| } |
| void WindowManager::OnWmPerformMoveLoop( |