| Index: ash/root_window_controller.cc
|
| diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0938beb27daab9f761aa6ad7826190730b06218e
|
| --- /dev/null
|
| +++ b/ash/root_window_controller.cc
|
| @@ -0,0 +1,218 @@
|
| +// Copyright (c) 2012 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 "ash/root_window_controller.h"
|
| +
|
| +#include "ash/shell.h"
|
| +#include "ash/shell_factory.h"
|
| +#include "ash/shell_window_ids.h"
|
| +#include "ash/wm/base_layout_manager.h"
|
| +#include "ash/wm/event_client_impl.h"
|
| +#include "ash/wm/property_util.h"
|
| +#include "ash/wm/root_window_layout_manager.h"
|
| +#include "ash/wm/screen_dimmer.h"
|
| +#include "ash/wm/system_modal_container_layout_manager.h"
|
| +#include "ash/wm/toplevel_window_event_filter.h"
|
| +#include "ash/wm/visibility_controller.h"
|
| +#include "ash/wm/workspace/workspace_manager.h"
|
| +#include "ash/wm/workspace_controller.h"
|
| +#include "ui/aura/client/tooltip_client.h"
|
| +#include "ui/aura/root_window.h"
|
| +
|
| +namespace ash {
|
| +namespace {
|
| +
|
| +// Creates a new window for use as a container.
|
| +aura::Window* CreateContainer(int window_id,
|
| + const char* name,
|
| + aura::Window* parent) {
|
| + aura::Window* container = new aura::Window(NULL);
|
| + container->set_id(window_id);
|
| + container->SetName(name);
|
| + container->Init(ui::LAYER_NOT_DRAWN);
|
| + parent->AddChild(container);
|
| + if (window_id != internal::kShellWindowId_UnparentedControlContainer)
|
| + container->Show();
|
| + return container;
|
| +}
|
| +
|
| +// Creates each of the special window containers that holds windows of various
|
| +// types in the shell UI.
|
| +void CreateContainersInRootWindow(aura::RootWindow* root_window) {
|
| + // These containers are just used by PowerButtonController to animate groups
|
| + // of containers simultaneously without messing up the current transformations
|
| + // on those containers. These are direct children of the root window; all of
|
| + // the other containers are their children.
|
| + aura::Window* non_lock_screen_containers = CreateContainer(
|
| + internal::kShellWindowId_NonLockScreenContainersContainer,
|
| + "NonLockScreenContainersContainer",
|
| + root_window);
|
| + aura::Window* lock_screen_containers = CreateContainer(
|
| + internal::kShellWindowId_LockScreenContainersContainer,
|
| + "LockScreenContainersContainer",
|
| + root_window);
|
| + aura::Window* lock_screen_related_containers = CreateContainer(
|
| + internal::kShellWindowId_LockScreenRelatedContainersContainer,
|
| + "LockScreenRelatedContainersContainer",
|
| + root_window);
|
| +
|
| + CreateContainer(internal::kShellWindowId_UnparentedControlContainer,
|
| + "UnparentedControlContainer",
|
| + non_lock_screen_containers);
|
| +
|
| + aura::Window* desktop_background_containers = CreateContainer(
|
| + internal::kShellWindowId_DesktopBackgroundContainer,
|
| + "DesktopBackgroundContainer",
|
| + non_lock_screen_containers);
|
| + SetChildWindowVisibilityChangesAnimated(desktop_background_containers);
|
| +
|
| + aura::Window* default_container = CreateContainer(
|
| + internal::kShellWindowId_DefaultContainer,
|
| + "DefaultContainer",
|
| + non_lock_screen_containers);
|
| + default_container->SetEventFilter(
|
| + new ToplevelWindowEventFilter(default_container));
|
| + SetChildWindowVisibilityChangesAnimated(default_container);
|
| +
|
| + aura::Window* always_on_top_container = CreateContainer(
|
| + internal::kShellWindowId_AlwaysOnTopContainer,
|
| + "AlwaysOnTopContainer",
|
| + non_lock_screen_containers);
|
| + always_on_top_container->SetEventFilter(
|
| + new ToplevelWindowEventFilter(always_on_top_container));
|
| + SetChildWindowVisibilityChangesAnimated(always_on_top_container);
|
| +
|
| + CreateContainer(internal::kShellWindowId_PanelContainer,
|
| + "PanelContainer",
|
| + non_lock_screen_containers);
|
| +
|
| + CreateContainer(internal::kShellWindowId_LauncherContainer,
|
| + "LauncherContainer",
|
| + non_lock_screen_containers);
|
| +
|
| + CreateContainer(internal::kShellWindowId_AppListContainer,
|
| + "AppListContainer",
|
| + non_lock_screen_containers);
|
| +
|
| + aura::Window* modal_container = CreateContainer(
|
| + internal::kShellWindowId_SystemModalContainer,
|
| + "SystemModalContainer",
|
| + non_lock_screen_containers);
|
| + modal_container->SetEventFilter(
|
| + new ToplevelWindowEventFilter(modal_container));
|
| + modal_container->SetLayoutManager(
|
| + new internal::SystemModalContainerLayoutManager(modal_container));
|
| + SetChildWindowVisibilityChangesAnimated(modal_container);
|
| +
|
| + // TODO(beng): Figure out if we can make this use
|
| + // SystemModalContainerEventFilter instead of stops_event_propagation.
|
| + aura::Window* lock_container = CreateContainer(
|
| + internal::kShellWindowId_LockScreenContainer,
|
| + "LockScreenContainer",
|
| + lock_screen_containers);
|
| + lock_container->SetLayoutManager(
|
| + new internal::BaseLayoutManager(root_window));
|
| + // TODO(beng): stopsevents
|
| +
|
| + aura::Window* lock_modal_container = CreateContainer(
|
| + internal::kShellWindowId_LockSystemModalContainer,
|
| + "LockSystemModalContainer",
|
| + lock_screen_containers);
|
| + lock_modal_container->SetEventFilter(
|
| + new ToplevelWindowEventFilter(lock_modal_container));
|
| + lock_modal_container->SetLayoutManager(
|
| + new internal::SystemModalContainerLayoutManager(lock_modal_container));
|
| + SetChildWindowVisibilityChangesAnimated(lock_modal_container);
|
| +
|
| + CreateContainer(internal::kShellWindowId_StatusContainer,
|
| + "StatusContainer",
|
| + lock_screen_related_containers);
|
| +
|
| + aura::Window* settings_bubble_container = CreateContainer(
|
| + internal::kShellWindowId_SettingBubbleContainer,
|
| + "SettingBubbleContainer",
|
| + lock_screen_related_containers);
|
| + SetChildWindowVisibilityChangesAnimated(settings_bubble_container);
|
| +
|
| + aura::Window* menu_container = CreateContainer(
|
| + internal::kShellWindowId_MenuContainer,
|
| + "MenuContainer",
|
| + lock_screen_related_containers);
|
| + SetChildWindowVisibilityChangesAnimated(menu_container);
|
| +
|
| + aura::Window* drag_drop_container = CreateContainer(
|
| + internal::kShellWindowId_DragImageAndTooltipContainer,
|
| + "DragImageAndTooltipContainer",
|
| + lock_screen_related_containers);
|
| + SetChildWindowVisibilityChangesAnimated(drag_drop_container);
|
| +
|
| + CreateContainer(internal::kShellWindowId_OverlayContainer,
|
| + "OverlayContainer",
|
| + lock_screen_related_containers);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +namespace internal {
|
| +
|
| +RootWindowController::RootWindowController(aura::RootWindow* root_window)
|
| + : root_window_(root_window) {
|
| + SetRootWindowController(root_window, this);
|
| +
|
| + event_client_.reset(new internal::EventClientImpl(root_window));
|
| + screen_dimmer_.reset(new internal::ScreenDimmer(root_window));
|
| +}
|
| +
|
| +RootWindowController::~RootWindowController() {
|
| + SetRootWindowController(root_window_.get(), NULL);
|
| + event_client_.reset();
|
| + screen_dimmer_.reset();
|
| + workspace_controller_.reset();
|
| + root_window_.reset();
|
| +}
|
| +
|
| +aura::Window* RootWindowController::GetContainer(int container_id) {
|
| + return root_window_->GetChildById(container_id);
|
| +}
|
| +
|
| +void RootWindowController::InitLayoutManagers() {
|
| + root_window_layout_ =
|
| + new internal::RootWindowLayoutManager(root_window_.get());
|
| + root_window_->SetLayoutManager(root_window_layout_);
|
| +
|
| + aura::Window* default_container =
|
| + GetContainer(internal::kShellWindowId_DefaultContainer);
|
| + // Workspace manager has its own layout managers.
|
| + workspace_controller_.reset(
|
| + new internal::WorkspaceController(default_container));
|
| +
|
| + aura::Window* always_on_top_container =
|
| + GetContainer(internal::kShellWindowId_AlwaysOnTopContainer);
|
| + always_on_top_container->SetLayoutManager(
|
| + new internal::BaseLayoutManager(
|
| + always_on_top_container->GetRootWindow()));
|
| +}
|
| +
|
| +void RootWindowController::CreateContainers() {
|
| + CreateContainersInRootWindow(root_window_.get());
|
| +}
|
| +
|
| +void RootWindowController::CloseChildWindows() {
|
| + // Close background widget first as it depends on tooltip.
|
| + root_window_layout_->SetBackgroundWidget(NULL);
|
| + workspace_controller_.reset();
|
| + aura::client::SetTooltipClient(root_window_.get(), NULL);
|
| +
|
| + while (!root_window_->children().empty()) {
|
| + aura::Window* child = root_window_->children()[0];
|
| + delete child;
|
| + }
|
| +}
|
| +
|
| +bool RootWindowController::IsInMaximizedMode() const {
|
| + return workspace_controller_->workspace_manager()->IsInMaximizedMode();
|
| +}
|
| +
|
| +} // namespace internal
|
| +} // namespace ash
|
|
|