| Index: mash/wm/root_window_controller.cc
|
| diff --git a/mash/wm/root_window_controller.cc b/mash/wm/root_window_controller.cc
|
| deleted file mode 100644
|
| index 5a1e8c7ab64ed31ac934aede351dbc3fb071f7cc..0000000000000000000000000000000000000000
|
| --- a/mash/wm/root_window_controller.cc
|
| +++ /dev/null
|
| @@ -1,351 +0,0 @@
|
| -// Copyright 2016 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "mash/wm/root_window_controller.h"
|
| -
|
| -#include <stdint.h>
|
| -
|
| -#include <map>
|
| -#include <sstream>
|
| -
|
| -#include "ash/common/shell_window_ids.h"
|
| -#include "ash/common/wm/always_on_top_controller.h"
|
| -#include "ash/common/wm/dock/docked_window_layout_manager.h"
|
| -#include "ash/common/wm/panels/panel_layout_manager.h"
|
| -#include "ash/common/wm/workspace/workspace_layout_manager.h"
|
| -#include "ash/common/wm/workspace/workspace_layout_manager_delegate.h"
|
| -#include "base/bind.h"
|
| -#include "base/command_line.h"
|
| -#include "base/memory/ptr_util.h"
|
| -#include "components/mus/common/event_matcher_util.h"
|
| -#include "components/mus/common/switches.h"
|
| -#include "components/mus/common/util.h"
|
| -#include "components/mus/public/cpp/property_type_converters.h"
|
| -#include "components/mus/public/cpp/window.h"
|
| -#include "components/mus/public/cpp/window_tree_client.h"
|
| -#include "components/mus/public/cpp/window_tree_host_factory.h"
|
| -#include "components/mus/public/interfaces/window_manager.mojom.h"
|
| -#include "mash/session/public/interfaces/session.mojom.h"
|
| -#include "mash/wm/background_layout.h"
|
| -#include "mash/wm/bridge/wm_globals_mus.h"
|
| -#include "mash/wm/bridge/wm_root_window_controller_mus.h"
|
| -#include "mash/wm/bridge/wm_shelf_mus.h"
|
| -#include "mash/wm/bridge/wm_window_mus.h"
|
| -#include "mash/wm/container_ids.h"
|
| -#include "mash/wm/fill_layout.h"
|
| -#include "mash/wm/screenlock_layout.h"
|
| -#include "mash/wm/shadow_controller.h"
|
| -#include "mash/wm/shelf_layout_manager.h"
|
| -#include "mash/wm/status_layout_manager.h"
|
| -#include "mash/wm/window_manager.h"
|
| -#include "mash/wm/window_manager_application.h"
|
| -#include "mojo/public/cpp/bindings/type_converter.h"
|
| -#include "services/shell/public/cpp/connector.h"
|
| -#include "ui/display/mojo/display_type_converters.h"
|
| -
|
| -using ash::mojom::Container;
|
| -
|
| -namespace mash {
|
| -namespace wm {
|
| -namespace {
|
| -
|
| -const uint32_t kWindowSwitchAccelerator = 1;
|
| -
|
| -void AssertTrue(bool success) {
|
| - DCHECK(success);
|
| -}
|
| -
|
| -int ContainerToLocalId(Container container) {
|
| - return static_cast<int>(container);
|
| -}
|
| -
|
| -class WorkspaceLayoutManagerDelegateImpl
|
| - : public ash::wm::WorkspaceLayoutManagerDelegate {
|
| - public:
|
| - explicit WorkspaceLayoutManagerDelegateImpl(
|
| - WmRootWindowControllerMus* root_window_controller)
|
| - : root_window_controller_(root_window_controller) {}
|
| - ~WorkspaceLayoutManagerDelegateImpl() override = default;
|
| -
|
| - // WorkspaceLayoutManagerDelegate:
|
| - void UpdateShelfVisibility() override { NOTIMPLEMENTED(); }
|
| - void OnFullscreenStateChanged(bool is_fullscreen) override {
|
| - // TODO(sky): this should only do something if there is a shelf, see
|
| - // implementation in ash/shell.cc.
|
| - NOTIMPLEMENTED();
|
| - root_window_controller_->NotifyFullscreenStateChange(is_fullscreen);
|
| - }
|
| -
|
| - private:
|
| - WmRootWindowControllerMus* root_window_controller_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(WorkspaceLayoutManagerDelegateImpl);
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -// static
|
| -RootWindowController* RootWindowController::CreateFromDisplay(
|
| - WindowManagerApplication* app,
|
| - mus::mojom::DisplayPtr display,
|
| - mus::mojom::WindowTreeClientRequest client_request) {
|
| - RootWindowController* controller = new RootWindowController(app);
|
| - controller->display_ = display.To<display::Display>();
|
| - new mus::WindowTreeClient(controller, controller->window_manager_.get(),
|
| - std::move(client_request));
|
| - return controller;
|
| -}
|
| -
|
| -void RootWindowController::Destroy() {
|
| - // See class description for details on lifetime.
|
| - if (root_) {
|
| - delete root_->window_tree();
|
| - } else {
|
| - // This case only happens if we're destroyed before OnEmbed().
|
| - delete this;
|
| - }
|
| -}
|
| -
|
| -shell::Connector* RootWindowController::GetConnector() {
|
| - return app_->connector();
|
| -}
|
| -
|
| -mus::Window* RootWindowController::GetWindowForContainer(Container container) {
|
| - return root_->GetChildByLocalId(ContainerToLocalId(container));
|
| -}
|
| -
|
| -bool RootWindowController::WindowIsContainer(const mus::Window* window) const {
|
| - return window && window->local_id() > ContainerToLocalId(Container::ROOT) &&
|
| - window->local_id() < ContainerToLocalId(Container::COUNT);
|
| -}
|
| -
|
| -mus::WindowManagerClient* RootWindowController::window_manager_client() {
|
| - return window_manager_->window_manager_client();
|
| -}
|
| -
|
| -void RootWindowController::OnAccelerator(uint32_t id, const ui::Event& event) {
|
| - switch (id) {
|
| - case kWindowSwitchAccelerator:
|
| - window_manager_client()->ActivateNextWindow();
|
| - break;
|
| - default:
|
| - app_->OnAccelerator(id, event);
|
| - break;
|
| - }
|
| -}
|
| -
|
| -ShelfLayoutManager* RootWindowController::GetShelfLayoutManager() {
|
| - return static_cast<ShelfLayoutManager*>(
|
| - layout_managers_[GetWindowForContainer(Container::USER_PRIVATE_SHELF)]
|
| - .get());
|
| -}
|
| -
|
| -StatusLayoutManager* RootWindowController::GetStatusLayoutManager() {
|
| - return static_cast<StatusLayoutManager*>(
|
| - layout_managers_[GetWindowForContainer(Container::STATUS)].get());
|
| -}
|
| -
|
| -RootWindowController::RootWindowController(WindowManagerApplication* app)
|
| - : app_(app), root_(nullptr), window_count_(0) {
|
| - window_manager_.reset(new WindowManager);
|
| -}
|
| -
|
| -RootWindowController::~RootWindowController() {}
|
| -
|
| -void RootWindowController::AddAccelerators() {
|
| - window_manager_client()->AddAccelerator(
|
| - kWindowSwitchAccelerator,
|
| - mus::CreateKeyMatcher(mus::mojom::KeyboardCode::TAB,
|
| - mus::mojom::kEventFlagControlDown),
|
| - base::Bind(&AssertTrue));
|
| -}
|
| -
|
| -void RootWindowController::OnEmbed(mus::Window* root) {
|
| - root_ = root;
|
| - root_->set_local_id(ContainerToLocalId(Container::ROOT));
|
| - root_->AddObserver(this);
|
| - layout_managers_[root_].reset(new FillLayout(root_));
|
| -
|
| - app_->OnRootWindowControllerGotRoot(this);
|
| -
|
| - wm_root_window_controller_.reset(
|
| - new WmRootWindowControllerMus(app_->globals(), this));
|
| -
|
| - CreateContainers();
|
| -
|
| - for (size_t i = 0; i < kNumActivationContainers; ++i) {
|
| - window_manager_client()->AddActivationParent(
|
| - GetWindowForContainer(kActivationContainers[i]));
|
| - }
|
| -
|
| - ash::wm::WmWindow* always_on_top_container =
|
| - wm::WmWindowMus::Get(root)->GetChildByShellWindowId(
|
| - ash::kShellWindowId_AlwaysOnTopContainer);
|
| - always_on_top_controller_.reset(
|
| - new ash::AlwaysOnTopController(always_on_top_container));
|
| -
|
| - AddAccelerators();
|
| -
|
| - window_manager_->Initialize(this, app_->session());
|
| -
|
| - shadow_controller_.reset(new ShadowController(root->window_tree()));
|
| -
|
| - app_->OnRootWindowControllerDoneInit(this);
|
| -}
|
| -
|
| -void RootWindowController::OnWindowTreeClientDestroyed(
|
| - mus::WindowTreeClient* client) {
|
| - shadow_controller_.reset();
|
| - delete this;
|
| -}
|
| -
|
| -void RootWindowController::OnEventObserved(const ui::Event& event,
|
| - mus::Window* target) {
|
| - // Does not use EventObservers.
|
| -}
|
| -
|
| -void RootWindowController::OnWindowDestroyed(mus::Window* window) {
|
| - DCHECK_EQ(window, root_);
|
| - app_->OnRootWindowDestroyed(this);
|
| - root_->RemoveObserver(this);
|
| - // Delete the |window_manager_| here so that WindowManager doesn't have to
|
| - // worry about the possibility of |root_| being null.
|
| - window_manager_.reset();
|
| - root_ = nullptr;
|
| -}
|
| -
|
| -void RootWindowController::OnShelfWindowAvailable() {
|
| - ash::DockedWindowLayoutManager::Get(WmWindowMus::Get(root_))
|
| - ->SetShelf(wm_shelf_.get());
|
| -
|
| - ash::PanelLayoutManager::Get(WmWindowMus::Get(root_))
|
| - ->SetShelf(wm_shelf_.get());
|
| -
|
| - // TODO: http://crbug.com/614182 Ash's ShelfLayoutManager implements
|
| - // DockedWindowLayoutManagerObserver so that it can inset by the docked
|
| - // windows.
|
| - // docked_layout_manager_->AddObserver(shelf_->shelf_layout_manager());
|
| -}
|
| -
|
| -void RootWindowController::CreateContainer(Container container,
|
| - Container parent_container) {
|
| - // Set the window's name to the container name (e.g. "Container::LOGIN"),
|
| - // which makes the window hierarchy easier to read.
|
| - std::map<std::string, std::vector<uint8_t>> properties;
|
| - std::ostringstream container_name;
|
| - container_name << container;
|
| - properties[mus::mojom::WindowManager::kName_Property] =
|
| - mojo::ConvertTo<std::vector<uint8_t>>(container_name.str());
|
| -
|
| - mus::Window* window = root_->window_tree()->NewWindow(&properties);
|
| - window->set_local_id(ContainerToLocalId(container));
|
| - layout_managers_[window].reset(new FillLayout(window));
|
| - WmWindowMus::Get(window)->SetShellWindowId(
|
| - MashContainerToAshContainer(container));
|
| -
|
| - // User private windows are hidden by default until the window manager learns
|
| - // the lock state, so their contents are never accidentally revealed. Tests,
|
| - // however, usually assume the screen is unlocked.
|
| - const bool is_test = base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| - mus::switches::kUseTestConfig);
|
| - window->SetVisible(container != Container::USER_PRIVATE || is_test);
|
| -
|
| - mus::Window* parent =
|
| - root_->GetChildByLocalId(ContainerToLocalId(parent_container));
|
| - parent->AddChild(window);
|
| -}
|
| -
|
| -void RootWindowController::CreateContainers() {
|
| - CreateContainer(Container::ALL_USER_BACKGROUND, Container::ROOT);
|
| - CreateContainer(Container::USER, Container::ROOT);
|
| - CreateContainer(Container::USER_BACKGROUND, Container::USER);
|
| - CreateContainer(Container::USER_PRIVATE, Container::USER);
|
| - CreateContainer(Container::USER_PRIVATE_WINDOWS, Container::USER_PRIVATE);
|
| - CreateContainer(Container::USER_PRIVATE_ALWAYS_ON_TOP_WINDOWS,
|
| - Container::USER_PRIVATE);
|
| - CreateContainer(Container::USER_PRIVATE_DOCKED_WINDOWS,
|
| - Container::USER_PRIVATE);
|
| - CreateContainer(Container::USER_PRIVATE_PRESENTATION_WINDOWS,
|
| - Container::USER_PRIVATE);
|
| - CreateContainer(Container::USER_PRIVATE_SHELF, Container::USER_PRIVATE);
|
| - CreateContainer(Container::USER_PRIVATE_PANELS, Container::USER_PRIVATE);
|
| - CreateContainer(Container::USER_PRIVATE_APP_LIST, Container::USER_PRIVATE);
|
| - CreateContainer(Container::USER_PRIVATE_SYSTEM_MODAL,
|
| - Container::USER_PRIVATE);
|
| - CreateContainer(Container::LOGIN, Container::ROOT);
|
| - CreateContainer(Container::LOGIN_WINDOWS, Container::LOGIN);
|
| - CreateContainer(Container::LOGIN_APP, Container::LOGIN);
|
| - CreateContainer(Container::LOGIN_SHELF, Container::LOGIN);
|
| - CreateContainer(Container::STATUS, Container::ROOT);
|
| - CreateContainer(Container::BUBBLES, Container::ROOT);
|
| - CreateContainer(Container::SYSTEM_MODAL_WINDOWS, Container::ROOT);
|
| - CreateContainer(Container::KEYBOARD, Container::ROOT);
|
| - CreateContainer(Container::MENUS, Container::ROOT);
|
| - CreateContainer(Container::DRAG_AND_TOOLTIPS, Container::ROOT);
|
| -
|
| - // Override the default layout managers for certain containers.
|
| - mus::Window* user_background =
|
| - GetWindowForContainer(Container::USER_BACKGROUND);
|
| - layout_managers_[user_background].reset(
|
| - new BackgroundLayout(user_background));
|
| -
|
| - mus::Window* login_app = GetWindowForContainer(Container::LOGIN_APP);
|
| - layout_managers_[login_app].reset(new ScreenlockLayout(login_app));
|
| -
|
| - mus::Window* user_shelf =
|
| - GetWindowForContainer(Container::USER_PRIVATE_SHELF);
|
| - ShelfLayoutManager* shelf_layout_manager =
|
| - new ShelfLayoutManager(user_shelf, this);
|
| - layout_managers_[user_shelf].reset(shelf_layout_manager);
|
| -
|
| - wm_shelf_.reset(new WmShelfMus(shelf_layout_manager));
|
| -
|
| - mus::Window* status = GetWindowForContainer(Container::STATUS);
|
| - layout_managers_[status].reset(new StatusLayoutManager(status));
|
| -
|
| - mus::Window* user_private_windows =
|
| - GetWindowForContainer(Container::USER_PRIVATE_WINDOWS);
|
| - // WorkspaceLayoutManager is not a mash::wm::LayoutManager (it's an
|
| - // ash::wm::LayoutManager), so it can't be in |layout_managers_|.
|
| - layout_managers_.erase(user_private_windows);
|
| - std::unique_ptr<WorkspaceLayoutManagerDelegateImpl>
|
| - workspace_layout_manager_delegate(new WorkspaceLayoutManagerDelegateImpl(
|
| - wm_root_window_controller_.get()));
|
| - WmWindowMus* user_private_windows_wm = WmWindowMus::Get(user_private_windows);
|
| - user_private_windows_wm->SetSnapsChildrenToPhysicalPixelBoundary();
|
| - user_private_windows_wm->SetChildrenUseExtendedHitRegion();
|
| - user_private_windows_wm->SetLayoutManager(
|
| - base::WrapUnique(new ash::WorkspaceLayoutManager(
|
| - user_private_windows_wm,
|
| - std::move(workspace_layout_manager_delegate))));
|
| -
|
| - mus::Window* user_private_docked_windows =
|
| - GetWindowForContainer(Container::USER_PRIVATE_DOCKED_WINDOWS);
|
| - WmWindowMus* user_private_docked_windows_wm =
|
| - WmWindowMus::Get(user_private_docked_windows);
|
| - user_private_docked_windows_wm->SetSnapsChildrenToPhysicalPixelBoundary();
|
| - layout_managers_.erase(user_private_docked_windows);
|
| - user_private_docked_windows_wm->SetChildrenUseExtendedHitRegion();
|
| - user_private_docked_windows_wm->SetLayoutManager(base::WrapUnique(
|
| - new ash::DockedWindowLayoutManager(user_private_docked_windows_wm)));
|
| -
|
| - mus::Window* user_private_panels =
|
| - GetWindowForContainer(Container::USER_PRIVATE_PANELS);
|
| - WmWindowMus* user_private_panels_wm = WmWindowMus::Get(user_private_panels);
|
| - user_private_panels_wm->SetSnapsChildrenToPhysicalPixelBoundary();
|
| - layout_managers_.erase(user_private_panels);
|
| - user_private_panels_wm->SetChildrenUseExtendedHitRegion();
|
| - user_private_panels_wm->SetLayoutManager(
|
| - base::WrapUnique(new ash::PanelLayoutManager(user_private_panels_wm)));
|
| -
|
| - mus::Window* user_private_always_on_top =
|
| - GetWindowForContainer(Container::USER_PRIVATE_ALWAYS_ON_TOP_WINDOWS);
|
| - WmWindowMus* user_private_always_on_top_wm =
|
| - WmWindowMus::Get(user_private_always_on_top);
|
| - user_private_always_on_top_wm->SetChildrenUseExtendedHitRegion();
|
| - user_private_always_on_top_wm->SetSnapsChildrenToPhysicalPixelBoundary();
|
| -}
|
| -
|
| -} // namespace wm
|
| -} // namespace mash
|
|
|