| Index: ash/wm/workspace/auto_window_management.cc
|
| ===================================================================
|
| --- ash/wm/workspace/auto_window_management.cc (revision 164764)
|
| +++ ash/wm/workspace/auto_window_management.cc (working copy)
|
| @@ -1,178 +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/auto_window_management.h"
|
| -
|
| -#include "ash/ash_switches.h"
|
| -#include "ash/shell.h"
|
| -#include "ash/wm/property_util.h"
|
| -#include "ash/wm/window_animations.h"
|
| -#include "ash/wm/window_util.h"
|
| -#include "base/command_line.h"
|
| -#include "ui/aura/window.h"
|
| -#include "ui/aura/client/aura_constants.h"
|
| -#include "ui/compositor/layer_animator.h"
|
| -#include "ui/compositor/scoped_layer_animation_settings.h"
|
| -#include "ui/gfx/screen.h"
|
| -
|
| -namespace ash {
|
| -namespace internal {
|
| -
|
| -namespace {
|
| -
|
| -// The time in milliseconds which should be used to visually move a window
|
| -// through an automatic "intelligent" window management option.
|
| -const int kWindowAutoMoveDurationMS = 125;
|
| -
|
| -// Check if any management should be performed (with a given |window|).
|
| -bool UseAutoWindowMagerForWindow(const aura::Window* window) {
|
| - return !CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kAshDisableAutoWindowPlacement) &&
|
| - GetTrackedByWorkspace(window) &&
|
| - wm::IsWindowPositionManaged(window);
|
| -}
|
| -
|
| -// Check if a given |window| can be managed. This includes that it's state is
|
| -// not minimized/maximized/the user has changed it's size by hand already.
|
| -// It furthermore checks for the WindowIsManaged status.
|
| -bool WindowPositionCanBeManaged(const aura::Window* window) {
|
| - return (wm::IsWindowPositionManaged(window) &&
|
| - !wm::IsWindowMinimized(window) &&
|
| - !wm::IsWindowMaximized(window) &&
|
| - !wm::HasUserChangedWindowPositionOrSize(window));
|
| -}
|
| -
|
| -// Given a |window|, return the only |other_window| which has an impact on
|
| -// the automated windows location management. If there is more then one window,
|
| -// false is returned, but the |other_window| will be set to the first one
|
| -// found.
|
| -// If the return value is true a single window was found.
|
| -bool GetOtherVisibleAndManageableWindow(const aura::Window* window,
|
| - aura::Window** other_window) {
|
| - *other_window = NULL;
|
| - const aura::Window::Windows& windows = window->parent()->children();
|
| - // Find a single open managed window.
|
| - for (size_t i = 0; i < windows.size(); i++) {
|
| - aura::Window* iterated_window = windows[i];
|
| - if (window != iterated_window &&
|
| - iterated_window->type() == aura::client::WINDOW_TYPE_NORMAL &&
|
| - iterated_window->TargetVisibility() &&
|
| - wm::IsWindowPositionManaged(iterated_window)) {
|
| - // Bail if we find a second usable window.
|
| - if (*other_window)
|
| - return false;
|
| - *other_window = iterated_window;
|
| - }
|
| - }
|
| - return *other_window != NULL;
|
| -}
|
| -
|
| -// Get the work area for a given |window|.
|
| -gfx::Rect GetWorkAreaForWindow(const aura::Window* window) {
|
| - gfx::Rect work_area = gfx::Rect(window->parent()->bounds().size());
|
| - work_area.Inset(Shell::GetScreen()->GetDisplayMatching(
|
| - work_area).GetWorkAreaInsets());
|
| - return work_area;
|
| -}
|
| -
|
| -// Move the given |bounds| on the available |parent_width| to the
|
| -// direction. If |move_right| is true, the rectangle gets moved to the right
|
| -// corner, otherwise to the left one.
|
| -bool MoveRectToOneSide(int parent_width, bool move_right, gfx::Rect* bounds) {
|
| - if (move_right) {
|
| - if (parent_width > bounds->right()) {
|
| - bounds->set_x(parent_width - bounds->width());
|
| - return true;
|
| - }
|
| - } else {
|
| - if (0 < bounds->x()) {
|
| - bounds->set_x(0);
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -// Move a |window| to a new |bound|. Animate if desired by user.
|
| -// Note: The function will do nothing if the bounds did not change.
|
| -void SetBoundsAnimated(aura::Window* window, const gfx::Rect& bounds) {
|
| - if (bounds == window->GetTargetBounds())
|
| - return;
|
| -
|
| - if (window->GetProperty(aura::client::kAnimationsDisabledKey) ||
|
| - CommandLine::ForCurrentProcess()->HasSwitch(
|
| - ash::switches::kAshWindowAnimationsDisabled)) {
|
| - window->SetBounds(bounds);
|
| - return;
|
| - }
|
| -
|
| - ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator());
|
| - settings.SetTransitionDuration(
|
| - base::TimeDelta::FromMilliseconds(kWindowAutoMoveDurationMS));
|
| - window->SetBounds(bounds);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -void RearrangeVisibleWindowOnHideOrRemove(const aura::Window* removed_window) {
|
| - if (!UseAutoWindowMagerForWindow(removed_window))
|
| - return;
|
| - // Find a single open browser window.
|
| - aura::Window* other_shown_window = NULL;
|
| - if (!GetOtherVisibleAndManageableWindow(removed_window,
|
| - &other_shown_window) ||
|
| - !WindowPositionCanBeManaged(other_shown_window))
|
| - return;
|
| - // Center the window (only in x).
|
| - gfx::Rect work_area = GetWorkAreaForWindow(removed_window);
|
| - gfx::Rect bounds = other_shown_window->bounds();
|
| - bounds.set_x((work_area.width() - bounds.width()) / 2);
|
| - SetBoundsAnimated(other_shown_window, bounds);
|
| -}
|
| -
|
| -void RearrangeVisibleWindowOnShow(aura::Window* added_window) {
|
| - if (!UseAutoWindowMagerForWindow(added_window) ||
|
| - wm::HasUserChangedWindowPositionOrSize(added_window) ||
|
| - !added_window->TargetVisibility())
|
| - return;
|
| - // Find a single open managed window.
|
| - aura::Window* other_shown_window = NULL;
|
| - if (!GetOtherVisibleAndManageableWindow(added_window,
|
| - &other_shown_window)) {
|
| - // It could be that this window is the first window joining the workspace.
|
| - if (!WindowPositionCanBeManaged(added_window) || other_shown_window)
|
| - return;
|
| -
|
| - // If so we have to make sure it is centered.
|
| - gfx::Rect work_area = GetWorkAreaForWindow(added_window);
|
| - gfx::Rect bounds = added_window->bounds();
|
| - bounds.set_x((work_area.width() - bounds.width()) / 2);
|
| - added_window->SetBounds(bounds);
|
| - return;
|
| - }
|
| -
|
| - // When going from one to two windows both windows loose their "positioned
|
| - // by user" flags.
|
| - ash::wm::SetUserHasChangedWindowPositionOrSize(added_window, false);
|
| - ash::wm::SetUserHasChangedWindowPositionOrSize(other_shown_window, false);
|
| -
|
| - if (WindowPositionCanBeManaged(other_shown_window)) {
|
| - gfx::Rect work_area = GetWorkAreaForWindow(added_window);
|
| -
|
| - // Push away the other window.
|
| - gfx::Rect other_bounds = other_shown_window->bounds();
|
| - bool move_right = other_bounds.CenterPoint().x() < work_area.width() / 2;
|
| - if (MoveRectToOneSide(work_area.width(), move_right, &other_bounds))
|
| - SetBoundsAnimated(other_shown_window, other_bounds);
|
| -
|
| - // Push the new window also to the opposite location (if needed).
|
| - // Since it is just coming into view, we do not need to animate it.
|
| - gfx::Rect added_bounds = added_window->bounds();
|
| - if (MoveRectToOneSide(work_area.width(), !move_right, &added_bounds))
|
| - added_window->SetBounds(added_bounds);
|
| - }
|
| -}
|
| -
|
| -} // namespace internal
|
| -} // namespace ash
|
|
|