Index: ash/wm/window_state.cc |
diff --git a/ash/wm/window_state.cc b/ash/wm/window_state.cc |
index 1a06a58da1bb0a0b876bb2c64457d10d234feab1..cd1de08e21c2bc2a23ebf458d8499ac78b296b97 100644 |
--- a/ash/wm/window_state.cc |
+++ b/ash/wm/window_state.cc |
@@ -136,7 +136,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() { |
@@ -244,6 +244,20 @@ void WindowState::SetTrackedByWorkspace(bool tracked_by_workspace) { |
OnTrackedByWorkspaceChanged(this, old)); |
} |
+void WindowState::SetWindowShowTypeUnsnapped() { |
+ if (window_show_type_ != SHOW_TYPE_LEFT_SNAPPED && |
+ window_show_type_ != SHOW_TYPE_RIGHT_SNAPPED) { |
+ return; |
+ } |
+ window_show_type_ = SHOW_TYPE_NORMAL; |
oshima
2013/11/25 23:20:40
if (window_show_type_ == ||
varkha
2013/11/26 22:16:58
Done.
|
+} |
+ |
+void WindowState::SetBoundsChangedByUser(bool bounds_changed_by_user) { |
+ bounds_changed_by_user_ = bounds_changed_by_user; |
+ if (bounds_changed_by_user_) |
+ SetWindowShowTypeUnsnapped(); |
+} |
+ |
void WindowState::OnWindowPropertyChanged(aura::Window* window, |
const void* key, |
intptr_t old) { |
@@ -265,24 +279,32 @@ void WindowState::OnWindowDestroying(aura::Window* window) { |
void WindowState::SnapWindow(WindowShowType left_or_right, |
const gfx::Rect& bounds) { |
- if (IsMaximizedOrFullscreen()) { |
+ gfx::Rect restore_bounds_in_screen(HasRestoreBounds() ? |
+ GetRestoreBoundsInScreen() : window_->GetBoundsInScreen()); |
+ |
+ bool was_maximized = IsMaximizedOrFullscreen(); |
+ if (was_maximized) { |
// 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(); |
+ // then recover the restore bounds. This way no unnecessary bounds |
+ // changes occurs and the original restore bounds are remembered. |
SetRestoreBoundsInParent(bounds); |
+ // Restore will cause OnWindowPropertyChanged so it needs to be done |
+ // before notifying about show type change to snapped. |
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)); |
+ if (!was_maximized) |
+ window_->SetBounds(bounds); |
+ SetRestoreBoundsInScreen(restore_bounds_in_screen); |
} |
WindowState* GetActiveWindowState() { |