Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(629)

Unified Diff: ui/aura_shell/workspace/workspace.cc

Issue 9035001: Move some more WM functionality down into ash. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/aura_shell/workspace/workspace.h ('k') | ui/aura_shell/workspace/workspace_manager.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/aura_shell/workspace/workspace.cc
===================================================================
--- ui/aura_shell/workspace/workspace.cc (revision 115655)
+++ ui/aura_shell/workspace/workspace.cc (working copy)
@@ -1,286 +0,0 @@
-// Copyright (c) 2011 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 "ui/aura_shell/workspace/workspace.h"
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/root_window.h"
-#include "ui/aura/window.h"
-#include "ui/aura_shell/property_util.h"
-#include "ui/aura_shell/window_util.h"
-#include "ui/aura_shell/workspace/workspace_manager.h"
-#include "ui/base/ui_base_types.h"
-#include "ui/gfx/compositor/layer.h"
-#include "ui/gfx/compositor/layer_animator.h"
-
-namespace {
-// Horizontal margin between windows.
-const int kWindowHorizontalMargin = 10;
-
-// Maximum number of windows a workspace can have.
-size_t g_max_windows_per_workspace = 2;
-
-// Returns the bounds of the window that should be used to calculate
-// the layout. It uses the restore bounds if exits, or
-// the target bounds of the window. The target bounds is the
-// final destination of |window| if the window's layer is animating,
-// or the current bounds of the window of no animation is currently
-// in progress.
-gfx::Rect GetLayoutBounds(aura::Window* window) {
- const gfx::Rect* restore_bounds = aura_shell::GetRestoreBounds(window);
- return restore_bounds ? *restore_bounds : window->GetTargetBounds();
-}
-
-// Returns the width of the window that should be used to calculate
-// the layout. See |GetLayoutBounds| for more details.
-int GetLayoutWidth(aura::Window* window) {
- return GetLayoutBounds(window).width();
-}
-
-} // namespace
-
-namespace aura_shell {
-namespace internal {
-
-Workspace::Workspace(WorkspaceManager* manager)
- : workspace_manager_(manager) {
- workspace_manager_->AddWorkspace(this);
-}
-
-Workspace::~Workspace() {
- workspace_manager_->RemoveWorkspace(this);
-}
-
-void Workspace::SetBounds(const gfx::Rect& bounds) {
- bool bounds_changed = bounds_ != bounds;
- bounds_ = bounds;
- if (bounds_changed)
- Layout(NULL);
-}
-
-gfx::Rect Workspace::GetWorkAreaBounds() const {
- return workspace_manager_->GetWorkAreaBounds(bounds_);
-}
-
-bool Workspace::AddWindowAfter(aura::Window* window, aura::Window* after) {
- if (!CanAdd(window))
- return false;
- DCHECK(!Contains(window));
-
- if (!after) { // insert at the end.
- windows_.push_back(window);
- } else {
- DCHECK(Contains(after));
- aura::Window::Windows::iterator i =
- std::find(windows_.begin(), windows_.end(), after);
- windows_.insert(++i, window);
- }
- Layout(window);
-
- return true;
-}
-
-void Workspace::RemoveWindow(aura::Window* window) {
- DCHECK(Contains(window));
- windows_.erase(std::find(windows_.begin(), windows_.end(), window));
- Layout(NULL);
-}
-
-bool Workspace::Contains(aura::Window* window) const {
- return std::find(windows_.begin(), windows_.end(), window) != windows_.end();
-}
-
-aura::Window* Workspace::FindRotateWindowForLocation(
- const gfx::Point& position) {
- aura::Window* active = aura_shell::GetActiveWindow();
- if (GetTotalWindowsWidth() < bounds_.width()) {
- // If all windows fit to the width of the workspace, it returns the
- // window which contains |position|'s x coordinate.
- for (aura::Window::Windows::const_iterator i = windows_.begin();
- i != windows_.end();
- ++i) {
- if (active == *i)
- continue;
- gfx::Rect bounds = (*i)->GetTargetBounds();
- if (bounds.x() < position.x() && position.x() < bounds.right())
- return *i;
- }
- } else if (bounds_.x() < position.x() && position.x() < bounds_.right()) {
- // If windows are overlapping, it divides the workspace into
- // regions with the same width, and returns the Nth window that
- // corresponds to the region that contains the |position|.
- int width = bounds_.width() / windows_.size();
- size_t index = (position.x() - bounds_.x()) / width;
- DCHECK(index < windows_.size());
- aura::Window* window = windows_[index];
- if (window != active)
- return window;
- }
- return NULL;
-}
-
-void Workspace::RotateWindows(aura::Window* source, aura::Window* target) {
- DCHECK(Contains(source));
- DCHECK(Contains(target));
- aura::Window::Windows::iterator source_iter =
- std::find(windows_.begin(), windows_.end(), source);
- aura::Window::Windows::iterator target_iter =
- std::find(windows_.begin(), windows_.end(), target);
- DCHECK(source_iter != target_iter);
- if (source_iter < target_iter)
- std::rotate(source_iter, source_iter + 1, target_iter + 1);
- else
- std::rotate(target_iter, source_iter, source_iter + 1);
- Layout(NULL);
-}
-
-aura::Window* Workspace::ShiftWindows(aura::Window* insert,
- aura::Window* until,
- aura::Window* target,
- ShiftDirection direction) {
- DCHECK(until);
- DCHECK(!Contains(insert));
-
- bool shift_reached_until = GetIndexOf(until) >= 0;
- if (shift_reached_until) {
- // Calling RemoveWindow here causes the animation set in Layout below
- // to be ignored. See crbug.com/102413.
- windows_.erase(std::find(windows_.begin(), windows_.end(), until));
- }
- aura::Window* pushed = NULL;
- if (direction == SHIFT_TO_RIGHT) {
- aura::Window::Windows::iterator iter =
- std::find(windows_.begin(), windows_.end(), target);
- // Insert at |target| position, or at the begining.
- if (iter == windows_.end())
- iter = windows_.begin();
- windows_.insert(iter, insert);
- if (!shift_reached_until) {
- pushed = windows_.back();
- windows_.erase(--windows_.end());
- }
- } else {
- aura::Window::Windows::iterator iter =
- std::find(windows_.begin(), windows_.end(), target);
- // Insert after |target|, or at the end.
- if (iter != windows_.end())
- ++iter;
- windows_.insert(iter, insert);
- if (!shift_reached_until) {
- pushed = windows_.front();
- windows_.erase(windows_.begin());
- }
- }
- Layout(NULL);
- return pushed;
-}
-
-void Workspace::Activate() {
- workspace_manager_->SetActiveWorkspace(this);
-}
-
-void Workspace::Layout(aura::Window* no_animation) {
- aura::Window* ignore = workspace_manager_->ignored_window();
- workspace_manager_->set_layout_in_progress(true);
- gfx::Rect work_area = workspace_manager_->GetWorkAreaBounds(bounds_);
- int total_width = GetTotalWindowsWidth();
- if (total_width < work_area.width()) {
- int dx = (work_area.width() - total_width) / 2;
- for (aura::Window::Windows::iterator i = windows_.begin();
- i != windows_.end();
- ++i) {
- if (*i != ignore) {
- MoveWindowTo(*i,
- gfx::Point(work_area.x() + dx, work_area.y()),
- no_animation != *i);
- }
- dx += GetLayoutWidth(*i) + kWindowHorizontalMargin;
- }
- } else {
- DCHECK_LT(windows_.size(), 3U);
- // TODO(oshima): This is messy. Figure out general algorithm to
- // layout more than 2 windows.
- if (windows_[0] != ignore) {
- MoveWindowTo(windows_[0],
- work_area.origin(),
- no_animation != windows_[0]);
- }
- if (windows_.size() == 2 && windows_[1] != ignore) {
- MoveWindowTo(windows_[1],
- gfx::Point(work_area.right() - GetLayoutWidth(windows_[1]),
- work_area.y()),
- no_animation != windows_[1]);
- }
- }
- workspace_manager_->set_layout_in_progress(false);
-}
-
-bool Workspace::ContainsFullscreenWindow() const {
- for (aura::Window::Windows::const_iterator i = windows_.begin();
- i != windows_.end();
- ++i) {
- aura::Window* w = *i;
- if (w->IsVisible() &&
- w->GetIntProperty(aura::client::kShowStateKey) ==
- ui::SHOW_STATE_FULLSCREEN)
- return true;
- }
- return false;
-}
-
-int Workspace::GetIndexOf(aura::Window* window) const {
- aura::Window::Windows::const_iterator i =
- std::find(windows_.begin(), windows_.end(), window);
- return i == windows_.end() ? -1 : i - windows_.begin();
-}
-
-bool Workspace::CanAdd(aura::Window* window) const {
- // TODO(oshima): This should be based on available space and the
- // size of the |window|.
- //NOTIMPLEMENTED();
- return windows_.size() < g_max_windows_per_workspace;
-}
-
-void Workspace::MoveWindowTo(
- aura::Window* window,
- const gfx::Point& origin,
- bool animate) {
- gfx::Rect bounds = GetLayoutBounds(window);
- gfx::Rect work_area = GetWorkAreaBounds();
- // Make sure the window isn't bigger than the workspace size.
- bounds.SetRect(origin.x(), origin.y(),
- std::min(work_area.width(), bounds.width()),
- std::min(work_area.height(), bounds.height()));
- if (animate) {
- ui::LayerAnimator::ScopedSettings settings(window->layer()->GetAnimator());
- window->SetBounds(bounds);
- } else {
- window->SetBounds(bounds);
- }
-}
-
-int Workspace::GetTotalWindowsWidth() const {
- int total_width = 0;
- for (aura::Window::Windows::const_iterator i = windows_.begin();
- i != windows_.end();
- ++i) {
- if (total_width)
- total_width += kWindowHorizontalMargin;
- total_width += GetLayoutWidth(*i);
- }
- return total_width;
-}
-
-// static
-size_t Workspace::SetMaxWindowsCount(size_t max) {
- int old = g_max_windows_per_workspace;
- g_max_windows_per_workspace = max;
- return old;
-}
-
-} // namespace internal
-} // namespace aura_shell
« no previous file with comments | « ui/aura_shell/workspace/workspace.h ('k') | ui/aura_shell/workspace/workspace_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698