maximize_mode_window_state.cc revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// found in the LICENSE file.
423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ash/wm/maximize_mode/maximize_mode_window_state.h"
623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ash/display/display_controller.h"
823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ash/screen_util.h"
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ash/shell.h"
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ash/shell_window_ids.h"
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ash/wm/coordinate_conversion.h"
1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ash/wm/maximize_mode/maximize_mode_window_manager.h"
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ash/wm/window_animations.h"
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ash/wm/window_state.h"
1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ash/wm/window_state_delegate.h"
1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ash/wm/window_util.h"
1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ash/wm/wm_event.h"
1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ash/wm/workspace/workspace_window_resizer.h"
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/aura/client/aura_constants.h"
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/aura/window.h"
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/aura/window_delegate.h"
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/gfx/display.h"
2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/gfx/rect.h"
2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace ash {
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace internal {
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace {
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Returns the biggest possible size for a window which is about to be
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// maximized.
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)gfx::Size GetMaximumSizeOfWindow(wm::WindowState* window_state) {
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DCHECK(window_state->CanMaximize());
3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Size workspace_size = ScreenUtil::GetMaximizedWindowBoundsInParent(
3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      window_state->window()).size();
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  aura::WindowDelegate* delegate = window_state->window()->delegate();
3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (!delegate)
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return workspace_size;
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Size size = delegate->GetMaximumSize();
4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (size.IsEmpty())
4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return workspace_size;
4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  size.SetToMin(workspace_size);
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return size;
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Returns the maximized and centered bounds of a window.
5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)gfx::Rect GetMaximizedAndCenteredBounds(wm::WindowState* state_object) {
5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Rect bounds_in_parent;
5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (state_object->CanMaximize()) {
5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    bounds_in_parent.set_size(GetMaximumSizeOfWindow(state_object));
5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  } else {
5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // We prefer the user given window dimensions over the current windows
5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // dimensions since they are likely to be the result from some other state
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // object logic.
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    if (state_object->HasRestoreBounds())
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      bounds_in_parent = state_object->GetRestoreBoundsInParent();
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    else
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      bounds_in_parent = state_object->window()->bounds();
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Rect work_area_in_parent =
6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      ScreenUtil::GetDisplayWorkAreaBoundsInParent(state_object->window());
6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area_in_parent,
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                  &bounds_in_parent);
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Center the window over the work area.
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  int x = (work_area_in_parent.width() - bounds_in_parent.width()) / 2 +
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          work_area_in_parent.x();
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  int y = (work_area_in_parent.height() - bounds_in_parent.height()) / 2 +
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          work_area_in_parent.y();
7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bounds_in_parent.set_origin(gfx::Point(x, y));
7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return bounds_in_parent;
7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace
8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// static
8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void MaximizeModeWindowState::UpdateWindowPosition(
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    wm::WindowState* window_state, bool animated) {
8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Rect bounds_in_parent = GetMaximizedAndCenteredBounds(window_state);
8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (bounds_in_parent == window_state->window()->bounds())
8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return;
8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (animated)
9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    window_state->SetBoundsDirect(bounds_in_parent);
9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  else
9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    window_state->SetBoundsDirectAnimated(bounds_in_parent);
9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)MaximizeModeWindowState::MaximizeModeWindowState(
9723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    aura::Window* window, MaximizeModeWindowManager* creator)
9823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    : window_(window),
9923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      creator_(creator),
10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      current_state_type_(wm::GetWindowState(window)->GetStateType()) {
10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  old_state_.reset(
10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      wm::GetWindowState(window)->SetStateObject(
10323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          scoped_ptr<State>(this).Pass()).release());
10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)MaximizeModeWindowState::~MaximizeModeWindowState() {
10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  creator_->WindowStateDestroyed(window_);
10823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
10923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
11023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void MaximizeModeWindowState::LeaveMaximizeMode(wm::WindowState* window_state) {
11123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Note: When we return we will destroy ourselves with the |our_reference|.
11223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<wm::WindowState::State> our_reference =
11323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      window_state->SetStateObject(old_state_.Pass());
11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
11523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
11623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void MaximizeModeWindowState::OnWMEvent(wm::WindowState* window_state,
11723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                        const wm::WMEvent* event) {
11823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  switch (event->type()) {
11923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_TOGGLE_MAXIMIZE_CAPTION:
12023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE:
12123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE:
12223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_TOGGLE_FULLSCREEN:
12323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_TOGGLE_MAXIMIZE:
12423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_CENTER:
12523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_FULLSCREEN:
12623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_SNAP_LEFT:
12723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_SNAP_RIGHT:
12823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_NORMAL:
12923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_MAXIMIZE:
13023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      MaximizeOrCenterWindow(window_state, true);
13123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      return;
13223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_MINIMIZE:
13323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      if (current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) {
13423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        current_state_type_ = wm::WINDOW_STATE_TYPE_MINIMIZED;
13523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        window_state->Minimize();
13623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      }
13723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      return;
13823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_SHOW_INACTIVE:
13923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      return;
14023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_SET_BOUNDS:
14123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      if (current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED &&
14223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          current_state_type_ != wm::WINDOW_STATE_TYPE_MAXIMIZED) {
14323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        gfx::Rect bounds_in_parent =
14423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)            (static_cast<const wm::SetBoundsEvent*>(event))->requested_bounds();
14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        bounds_in_parent.ClampToCenteredSize(
14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)             ScreenUtil::GetDisplayWorkAreaBoundsInParent(
14723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                 window_state->window()).size());
14823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        if (bounds_in_parent != window_state->window()->bounds())
14923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          window_state->SetBoundsDirectAnimated(bounds_in_parent);
15023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      }
15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      break;
15223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_ADDED_TO_WORKSPACE:
15323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      MaximizeOrCenterWindow(window_state, true);
15423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      break;
15523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED:
15623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case wm::WM_EVENT_DISPLAY_BOUNDS_CHANGED:
15723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      if (current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED)
15823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        MaximizeOrCenterWindow(window_state, false);
15923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      break;
16023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
16123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
16223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
16323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)wm::WindowStateType MaximizeModeWindowState::GetType() const {
16423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return current_state_type_;
16523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
16623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
16723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void MaximizeModeWindowState::AttachState(
16823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    wm::WindowState* window_state,
16923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    wm::WindowState::State* previous_state) {
17023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  current_state_type_ = previous_state->GetType();
17123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
17223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Initialize the state to a good preset.
17323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (current_state_type_ != wm::WINDOW_STATE_TYPE_MAXIMIZED &&
17423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) {
17523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    MaximizeOrCenterWindow(window_state, true);
17623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
17723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
17823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  window_state->set_can_be_dragged(false);
17923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
18023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
18123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void MaximizeModeWindowState::DetachState(wm::WindowState* window_state) {
18223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  window_state->set_can_be_dragged(true);
18323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
18423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
18523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void MaximizeModeWindowState::MaximizeOrCenterWindow(
18623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    wm::WindowState* window_state,
18723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    bool animated) {
18823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const wm::WindowStateType target_state =
18923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      window_state->CanMaximize() ? wm::WINDOW_STATE_TYPE_MAXIMIZED :
19023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                    wm::WINDOW_STATE_TYPE_NORMAL;
19123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const wm::WindowStateType old_state_type = current_state_type_;
19223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Rect bounds_in_parent = GetMaximizedAndCenteredBounds(window_state);
19323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
19423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if (current_state_type_ != target_state) {
19523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    current_state_type_ = target_state;
19623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    window_state->UpdateWindowShowStateFromStateType();
19723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    window_state->NotifyPreStateTypeChange(old_state_type);
19823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // If we have a target bounds rectangle, we center it and set it
19923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // accordingly.
20023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    if (!bounds_in_parent.IsEmpty()) {
20123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      if (current_state_type_ == wm::WINDOW_STATE_TYPE_MINIMIZED || !animated)
20223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        window_state->SetBoundsDirect(bounds_in_parent);
20323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      else
20423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        window_state->SetBoundsDirectAnimated(bounds_in_parent);
20523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    }
20623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    window_state->NotifyPostStateTypeChange(old_state_type);
20723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  } else if (!bounds_in_parent.IsEmpty() &&
20823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)             bounds_in_parent != window_state->window()->bounds()) {
20923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Coming here, we were most probably called through a display change.
21023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Do not animate.
21123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    if (animated)
21223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      window_state->SetBoundsDirectAnimated(bounds_in_parent);
21323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    else
21423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      window_state->SetBoundsDirect(bounds_in_parent);
21523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
21623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
21723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  if ((window_state->window()->TargetVisibility() ||
21823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      old_state_type == wm::WINDOW_STATE_TYPE_MINIMIZED) &&
21923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      !window_state->window()->layer()->visible()) {
22023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // The layer may be hidden if the window was previously minimized. Make
22123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // sure it's visible.
22223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    window_state->window()->Show();
22323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
22423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
22523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
22623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace internal
22723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace ash
228