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