| Index: ash/wm/workspace/workspace_manager.cc
|
| diff --git a/ash/wm/workspace/workspace_manager.cc b/ash/wm/workspace/workspace_manager.cc
|
| deleted file mode 100644
|
| index ca87dc738379047c8f628b58aeef7291d4b4adb7..0000000000000000000000000000000000000000
|
| --- a/ash/wm/workspace/workspace_manager.cc
|
| +++ /dev/null
|
| @@ -1,368 +0,0 @@
|
| -// 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/wm/workspace/workspace_manager.h"
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "ash/screen_ash.h"
|
| -#include "ash/shell.h"
|
| -#include "ash/wm/property_util.h"
|
| -#include "ash/wm/shelf_layout_manager.h"
|
| -#include "ash/wm/window_animations.h"
|
| -#include "ash/wm/window_util.h"
|
| -#include "ash/wm/workspace/managed_workspace.h"
|
| -#include "ash/wm/workspace/maximized_workspace.h"
|
| -#include "base/auto_reset.h"
|
| -#include "base/logging.h"
|
| -#include "base/stl_util.h"
|
| -#include "ui/aura/client/aura_constants.h"
|
| -#include "ui/aura/env.h"
|
| -#include "ui/aura/root_window.h"
|
| -#include "ui/aura/window.h"
|
| -#include "ui/base/ui_base_types.h"
|
| -#include "ui/compositor/layer.h"
|
| -#include "ui/compositor/layer_animator.h"
|
| -#include "ui/compositor/scoped_layer_animation_settings.h"
|
| -#include "ui/gfx/screen.h"
|
| -#include "ui/gfx/transform.h"
|
| -
|
| -namespace {
|
| -
|
| -// Returns a list of all the windows with layers in |result|. Optionally
|
| -// ignores the window |ignore_window|.
|
| -void BuildWindowList(const std::vector<aura::Window*>& windows,
|
| - aura::Window* ignore_window,
|
| - std::vector<aura::Window*>* result) {
|
| - for (size_t i = 0; i < windows.size(); ++i) {
|
| - if (windows[i] == ignore_window)
|
| - continue;
|
| - if (windows[i]->layer())
|
| - result->push_back(windows[i]);
|
| - BuildWindowList(windows[i]->transient_children(), ignore_window, result);
|
| - }
|
| -}
|
| -
|
| -}
|
| -
|
| -namespace ash {
|
| -namespace internal {
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// WindowManager, public:
|
| -
|
| -WorkspaceManager::WorkspaceManager(aura::Window* contents_view)
|
| - : contents_view_(contents_view),
|
| - active_workspace_(NULL),
|
| - maximize_restore_window_(NULL),
|
| - grid_size_(0),
|
| - shelf_(NULL) {
|
| - DCHECK(contents_view);
|
| -}
|
| -
|
| -WorkspaceManager::~WorkspaceManager() {
|
| - std::vector<Workspace*> copy_to_delete(workspaces_);
|
| - STLDeleteElements(©_to_delete);
|
| -}
|
| -
|
| -// static
|
| -bool WorkspaceManager::ShouldManageWindow(aura::Window* window) {
|
| - return window->type() == aura::client::WINDOW_TYPE_NORMAL &&
|
| - !window->transient_parent() &&
|
| - ash::GetTrackedByWorkspace(window) &&
|
| - (!ash::GetPersistsAcrossAllWorkspaces(window) ||
|
| - wm::IsWindowMaximized(window));
|
| -}
|
| -
|
| -bool WorkspaceManager::Contains(aura::Window* window) const {
|
| - return FindBy(window) != NULL;
|
| -}
|
| -
|
| -void WorkspaceManager::AddWindow(aura::Window* window) {
|
| - DCHECK(ShouldManageWindow(window));
|
| -
|
| - Workspace* current_workspace = FindBy(window);
|
| - if (current_workspace) {
|
| - // Already know about this window. Make sure the workspace is active.
|
| - if (active_workspace_ != current_workspace) {
|
| - if (active_workspace_)
|
| - window->layer()->GetAnimator()->StopAnimating();
|
| - current_workspace->Activate();
|
| - }
|
| - window->Show();
|
| - UpdateShelfVisibility();
|
| - return;
|
| - }
|
| -
|
| - Workspace* workspace = NULL;
|
| - Workspace::Type type_for_window = Workspace::TypeForWindow(window);
|
| - switch (type_for_window) {
|
| - case Workspace::TYPE_MANAGED:
|
| - // All normal windows go in the same workspace.
|
| - workspace = GetManagedWorkspace();
|
| - break;
|
| -
|
| - case Workspace::TYPE_MAXIMIZED:
|
| - // All maximized windows go in their own workspace.
|
| - break;
|
| - }
|
| -
|
| - if (!workspace)
|
| - workspace = CreateWorkspace(type_for_window);
|
| - workspace->AddWindowAfter(window, NULL);
|
| - workspace->Activate();
|
| - UpdateShelfVisibility();
|
| -}
|
| -
|
| -void WorkspaceManager::RemoveWindow(aura::Window* window) {
|
| - Workspace* workspace = FindBy(window);
|
| - if (!workspace)
|
| - return;
|
| - workspace->RemoveWindow(window);
|
| - CleanupWorkspace(workspace);
|
| -}
|
| -
|
| -void WorkspaceManager::UpdateShelfVisibility() {
|
| - if (shelf_)
|
| - shelf_->UpdateVisibilityState();
|
| -}
|
| -
|
| -void WorkspaceManager::ShowStateChanged(aura::Window* window) {
|
| - Workspace* workspace = FindBy(window);
|
| - if (!workspace)
|
| - return;
|
| - if (!ShouldManageWindow(window)) {
|
| - RemoveWindow(window);
|
| - } else {
|
| - Workspace::Type old_type = workspace->type();
|
| - Workspace::Type new_type = Workspace::TypeForWindow(window);
|
| - if (new_type != old_type)
|
| - OnTypeOfWorkspacedNeededChanged(window);
|
| - }
|
| - UpdateShelfVisibility();
|
| -}
|
| -
|
| -bool WorkspaceManager::IsInMaximizedMode() const {
|
| - return active_workspace_ &&
|
| - active_workspace_->type() == Workspace::TYPE_MAXIMIZED;
|
| -}
|
| -
|
| -WorkspaceWindowState WorkspaceManager::GetWindowState() const {
|
| - if (!shelf_ || !active_workspace_)
|
| - return WORKSPACE_WINDOW_STATE_DEFAULT;
|
| -
|
| - // TODO: this code needs to be made multi-display aware.
|
| - gfx::Rect shelf_bounds(shelf_->GetIdealBounds());
|
| - const aura::Window::Windows& windows(contents_view_->children());
|
| - bool window_overlaps_launcher = false;
|
| - bool has_maximized_window = false;
|
| - for (aura::Window::Windows::const_iterator i = windows.begin();
|
| - i != windows.end(); ++i) {
|
| - gfx::Rect b = (*i)->bounds();
|
| - if (GetIgnoredByShelf(*i))
|
| - continue;
|
| - ui::Layer* layer = (*i)->layer();
|
| - if (!layer->GetTargetVisibility() || layer->GetTargetOpacity() == 0.0f)
|
| - continue;
|
| - if (wm::IsWindowMaximized(*i)) {
|
| - // An untracked window may still be fullscreen so we keep iterating when
|
| - // we hit a maximized window.
|
| - has_maximized_window = true;
|
| - } else if (wm::IsWindowFullscreen(*i)) {
|
| - return WORKSPACE_WINDOW_STATE_FULL_SCREEN;
|
| - }
|
| - if (!window_overlaps_launcher && (*i)->bounds().Intersects(shelf_bounds))
|
| - window_overlaps_launcher = true;
|
| - }
|
| - if (has_maximized_window)
|
| - return WORKSPACE_WINDOW_STATE_MAXIMIZED;
|
| -
|
| - return window_overlaps_launcher ?
|
| - WORKSPACE_WINDOW_STATE_WINDOW_OVERLAPS_SHELF :
|
| - WORKSPACE_WINDOW_STATE_DEFAULT;
|
| -}
|
| -
|
| -void WorkspaceManager::SetShelf(ShelfLayoutManager* shelf) {
|
| - shelf_ = shelf;
|
| -}
|
| -
|
| -void WorkspaceManager::SetActiveWorkspaceByWindow(aura::Window* window) {
|
| - Workspace* workspace = FindBy(window);
|
| - if (workspace)
|
| - workspace->Activate();
|
| -}
|
| -
|
| -aura::Window* WorkspaceManager::GetParentForNewWindow(aura::Window* window) {
|
| - return contents_view_;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// WorkspaceManager, private:
|
| -
|
| -void WorkspaceManager::AddWorkspace(Workspace* workspace) {
|
| - DCHECK(std::find(workspaces_.begin(), workspaces_.end(),
|
| - workspace) == workspaces_.end());
|
| - if (active_workspace_) {
|
| - // New workspaces go right after current workspace.
|
| - Workspaces::iterator i = std::find(workspaces_.begin(), workspaces_.end(),
|
| - active_workspace_);
|
| - workspaces_.insert(++i, workspace);
|
| - } else {
|
| - workspaces_.push_back(workspace);
|
| - }
|
| -}
|
| -
|
| -void WorkspaceManager::RemoveWorkspace(Workspace* workspace) {
|
| - Workspaces::iterator i = std::find(workspaces_.begin(),
|
| - workspaces_.end(),
|
| - workspace);
|
| - DCHECK(i != workspaces_.end());
|
| - i = workspaces_.erase(i);
|
| - if (active_workspace_ == workspace) {
|
| - // TODO: need mru order.
|
| - if (i != workspaces_.end())
|
| - SetActiveWorkspace(*i);
|
| - else if (!workspaces_.empty())
|
| - SetActiveWorkspace(workspaces_.back());
|
| - else
|
| - active_workspace_ = NULL;
|
| - }
|
| -}
|
| -
|
| -void WorkspaceManager::SetVisibilityOfWorkspaceWindows(
|
| - ash::internal::Workspace* workspace,
|
| - AnimateChangeType change_type,
|
| - bool value) {
|
| - std::vector<aura::Window*> children;
|
| - BuildWindowList(workspace->windows(), maximize_restore_window_, &children);
|
| - SetWindowLayerVisibility(children, change_type, value);
|
| -}
|
| -
|
| -void WorkspaceManager::SetWindowLayerVisibility(
|
| - const std::vector<aura::Window*>& windows,
|
| - AnimateChangeType change_type,
|
| - bool value) {
|
| - for (size_t i = 0; i < windows.size(); ++i) {
|
| - ui::Layer* layer = windows[i]->layer();
|
| - // Only show the layer for windows that want to be visible.
|
| - if (layer && (!value || windows[i]->TargetVisibility())) {
|
| - bool animation_disabled =
|
| - windows[i]->GetProperty(aura::client::kAnimationsDisabledKey);
|
| - WindowVisibilityAnimationType animation_type =
|
| - GetWindowVisibilityAnimationType(windows[i]);
|
| - windows[i]->SetProperty(aura::client::kAnimationsDisabledKey,
|
| - change_type == DONT_ANIMATE);
|
| - bool update_layer = true;
|
| - if (change_type == ANIMATE) {
|
| - ash::SetWindowVisibilityAnimationType(
|
| - windows[i],
|
| - value ? ash::WINDOW_VISIBILITY_ANIMATION_TYPE_WORKSPACE_SHOW :
|
| - ash::WINDOW_VISIBILITY_ANIMATION_TYPE_WORKSPACE_HIDE);
|
| - if (ash::internal::AnimateOnChildWindowVisibilityChanged(
|
| - windows[i], value))
|
| - update_layer = false;
|
| - }
|
| - if (update_layer)
|
| - layer->SetVisible(value);
|
| - // Reset the animation type so it isn't used in a future hide/show.
|
| - ash::SetWindowVisibilityAnimationType(
|
| - windows[i], animation_type);
|
| - windows[i]->SetProperty(aura::client::kAnimationsDisabledKey,
|
| - animation_disabled);
|
| - }
|
| - }
|
| -}
|
| -
|
| -Workspace* WorkspaceManager::GetActiveWorkspace() const {
|
| - return active_workspace_;
|
| -}
|
| -
|
| -Workspace* WorkspaceManager::FindBy(aura::Window* window) const {
|
| - int index = GetWorkspaceIndexContaining(window);
|
| - return index < 0 ? NULL : workspaces_[index];
|
| -}
|
| -
|
| -void WorkspaceManager::SetActiveWorkspace(Workspace* workspace) {
|
| - if (active_workspace_ == workspace)
|
| - return;
|
| - DCHECK(std::find(workspaces_.begin(), workspaces_.end(),
|
| - workspace) != workspaces_.end());
|
| - if (active_workspace_)
|
| - SetVisibilityOfWorkspaceWindows(active_workspace_, ANIMATE, false);
|
| - Workspace* last_active = active_workspace_;
|
| - active_workspace_ = workspace;
|
| - if (active_workspace_) {
|
| - SetVisibilityOfWorkspaceWindows(active_workspace_,
|
| - last_active ? ANIMATE : DONT_ANIMATE, true);
|
| - UpdateShelfVisibility();
|
| - }
|
| -}
|
| -
|
| -// Returns the index of the workspace that contains the |window|.
|
| -int WorkspaceManager::GetWorkspaceIndexContaining(aura::Window* window) const {
|
| - for (Workspaces::const_iterator i = workspaces_.begin();
|
| - i != workspaces_.end();
|
| - ++i) {
|
| - if ((*i)->Contains(window))
|
| - return i - workspaces_.begin();
|
| - }
|
| - return -1;
|
| -}
|
| -
|
| -void WorkspaceManager::SetWindowBounds(aura::Window* window,
|
| - const gfx::Rect& bounds) {
|
| - window->SetBounds(bounds);
|
| -}
|
| -
|
| -void WorkspaceManager::OnTypeOfWorkspacedNeededChanged(aura::Window* window) {
|
| - DCHECK(ShouldManageWindow(window));
|
| - Workspace* current_workspace = FindBy(window);
|
| - DCHECK(current_workspace);
|
| - Workspace* new_workspace = NULL;
|
| - if (Workspace::TypeForWindow(window) == Workspace::TYPE_MAXIMIZED) {
|
| - // Unmaximized -> maximized; create a new workspace.
|
| - current_workspace->RemoveWindow(window);
|
| - new_workspace = CreateWorkspace(Workspace::TYPE_MAXIMIZED);
|
| - new_workspace->AddWindowAfter(window, NULL);
|
| - } else {
|
| - // Maximized -> unmaximized; move window to unmaximized workspace.
|
| - new_workspace = GetManagedWorkspace();
|
| - current_workspace->RemoveWindow(window);
|
| - if (!new_workspace)
|
| - new_workspace = CreateWorkspace(Workspace::TYPE_MANAGED);
|
| - new_workspace->AddWindowAfter(window, NULL);
|
| - }
|
| - maximize_restore_window_ = window;
|
| - SetActiveWorkspace(new_workspace);
|
| - maximize_restore_window_ = NULL;
|
| - // Delete at the end so that we don't attempt to switch to another
|
| - // workspace in RemoveWorkspace().
|
| - CleanupWorkspace(current_workspace);
|
| -}
|
| -
|
| -Workspace* WorkspaceManager::GetManagedWorkspace() {
|
| - for (size_t i = 0; i < workspaces_.size(); ++i) {
|
| - if (workspaces_[i]->type() == Workspace::TYPE_MANAGED)
|
| - return workspaces_[i];
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -Workspace* WorkspaceManager::CreateWorkspace(Workspace::Type type) {
|
| - Workspace* workspace = NULL;
|
| - if (type == Workspace::TYPE_MAXIMIZED)
|
| - workspace = new MaximizedWorkspace(this);
|
| - else
|
| - workspace = new ManagedWorkspace(this);
|
| - AddWorkspace(workspace);
|
| - return workspace;
|
| -}
|
| -
|
| -void WorkspaceManager::CleanupWorkspace(Workspace* workspace) {
|
| - if (workspace->type() != Workspace::TYPE_MANAGED && workspace->is_empty())
|
| - delete workspace;
|
| -}
|
| -
|
| -} // namespace internal
|
| -} // namespace ash
|
|
|