| Index: ash/wm/window_state.cc
|
| diff --git a/ash/wm/window_state.cc b/ash/wm/window_state.cc
|
| index 1a06a58da1bb0a0b876bb2c64457d10d234feab1..85976b5a7f47021876ab875a045a564c3f293554 100644
|
| --- a/ash/wm/window_state.cc
|
| +++ b/ash/wm/window_state.cc
|
| @@ -88,6 +88,11 @@ bool WindowState::IsDocked() const {
|
| window_->parent()->id() == internal::kShellWindowId_DockedContainer;
|
| }
|
|
|
| +bool WindowState::IsSnapped() const {
|
| + return window_show_type_ == SHOW_TYPE_LEFT_SNAPPED ||
|
| + window_show_type_ == SHOW_TYPE_RIGHT_SNAPPED;
|
| +}
|
| +
|
| bool WindowState::CanMaximize() const {
|
| return window_->GetProperty(aura::client::kCanMaximizeKey);
|
| }
|
| @@ -136,7 +141,7 @@ void WindowState::SnapLeft(const gfx::Rect& bounds) {
|
| }
|
|
|
| void WindowState::SnapRight(const gfx::Rect& bounds) {
|
| - SnapWindow(SHOW_TYPE_LEFT_SNAPPED, bounds);
|
| + SnapWindow(SHOW_TYPE_RIGHT_SNAPPED, bounds);
|
| }
|
|
|
| void WindowState::Minimize() {
|
| @@ -159,6 +164,9 @@ void WindowState::Deactivate() {
|
| }
|
|
|
| void WindowState::Restore() {
|
| + // Set |window_show_type_| to SHOW_TYPE_NORMAL now so that an observer
|
| + // observing kShowStateKey gets the correct value when querying IsSnapped().
|
| + window_show_type_ = SHOW_TYPE_NORMAL;
|
| window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
|
| }
|
|
|
| @@ -265,24 +273,39 @@ void WindowState::OnWindowDestroying(aura::Window* window) {
|
|
|
| void WindowState::SnapWindow(WindowShowType left_or_right,
|
| const gfx::Rect& bounds) {
|
| - if (IsMaximizedOrFullscreen()) {
|
| - // Before we can set the bounds we need to restore the window.
|
| - // Restoring the window will set the window to its restored bounds.
|
| - // To avoid an unnecessary bounds changes (which may have side effects)
|
| - // we set the restore bounds to the bounds we want, restore the window,
|
| - // then reset the restore bounds. This way no unnecessary bounds
|
| - // changes occurs and the original restore bounds is remembered.
|
| - gfx::Rect restore_bounds_in_screen =
|
| - GetRestoreBoundsInScreen();
|
| - SetRestoreBoundsInParent(bounds);
|
| + // Compute the bounds that the window will restore to. If the window does not
|
| + // already have restore bounds, it will be restored (when un-snapped) to the
|
| + // last bounds that it had before getting snapped.
|
| + gfx::Rect restore_bounds_in_screen(HasRestoreBounds() ?
|
| + GetRestoreBoundsInScreen() : window_->GetBoundsInScreen());
|
| + // Set the window's restore bounds so that WorkspaceLayoutManager knows
|
| + // which width to use when the snapped window is moved to the edge.
|
| + SetRestoreBoundsInParent(bounds);
|
| +
|
| + bool was_maximized = IsMaximizedOrFullscreen();
|
| + // Before we can set the bounds we need to restore the window.
|
| + // Restoring the window will set the window to its restored bounds set above.
|
| + // Restore will cause OnWindowPropertyChanged() so it needs to be done
|
| + // before notifying that the WindowShowType has changed to |left_or_right|.
|
| + if (was_maximized)
|
| Restore();
|
| - SetRestoreBoundsInScreen(restore_bounds_in_screen);
|
| - } else {
|
| - window_->SetBounds(bounds);
|
| - }
|
| DCHECK(left_or_right == SHOW_TYPE_LEFT_SNAPPED ||
|
| left_or_right == SHOW_TYPE_RIGHT_SNAPPED);
|
| + WindowShowType old_type = window_show_type_;
|
| window_show_type_ = left_or_right;
|
| + FOR_EACH_OBSERVER(
|
| + WindowStateObserver, observer_list_,
|
| + OnWindowShowTypeChanged(this, old_type));
|
| + // TODO(varkha): Ideally the bounds should be changed in a LayoutManager upon
|
| + // observing the WindowShowType change.
|
| + // If the window is a child of kShellWindowId_DockedContainer such as during
|
| + // a drag, the window's bounds are not set in
|
| + // WorkspaceLayoutManager::OnWindowShowTypeChanged(). Set them here. Skip
|
| + // setting the bounds otherwise to avoid stopping the slide animation which
|
| + // was started as a result of OnWindowShowTypeChanged().
|
| + if (IsDocked())
|
| + window_->SetBounds(bounds);
|
| + SetRestoreBoundsInScreen(restore_bounds_in_screen);
|
| }
|
|
|
| WindowState* GetActiveWindowState() {
|
|
|