Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: ash/wm/window_state.cc

Issue 68033003: Undocks window first before side-snapping bounds (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Undocks window first before side-snapping bounds (nits) Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/wm/window_state.h" 5 #include "ash/wm/window_state.h"
6 6
7 #include "ash/root_window_controller.h" 7 #include "ash/root_window_controller.h"
8 #include "ash/screen_ash.h" 8 #include "ash/screen_ash.h"
9 #include "ash/shell_window_ids.h" 9 #include "ash/shell_window_ids.h"
10 #include "ash/wm/window_properties.h" 10 #include "ash/wm/window_properties.h"
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 81
82 bool WindowState::IsActive() const { 82 bool WindowState::IsActive() const {
83 return IsActiveWindow(window_); 83 return IsActiveWindow(window_);
84 } 84 }
85 85
86 bool WindowState::IsDocked() const { 86 bool WindowState::IsDocked() const {
87 return window_->parent() && 87 return window_->parent() &&
88 window_->parent()->id() == internal::kShellWindowId_DockedContainer; 88 window_->parent()->id() == internal::kShellWindowId_DockedContainer;
89 } 89 }
90 90
91 bool WindowState::IsSnapped() const {
92 return window_show_type_ == SHOW_TYPE_LEFT_SNAPPED ||
93 window_show_type_ == SHOW_TYPE_RIGHT_SNAPPED;
94 }
95
91 bool WindowState::CanMaximize() const { 96 bool WindowState::CanMaximize() const {
92 return window_->GetProperty(aura::client::kCanMaximizeKey); 97 return window_->GetProperty(aura::client::kCanMaximizeKey);
93 } 98 }
94 99
95 bool WindowState::CanMinimize() const { 100 bool WindowState::CanMinimize() const {
96 internal::RootWindowController* controller = 101 internal::RootWindowController* controller =
97 internal::RootWindowController::ForWindow(window_); 102 internal::RootWindowController::ForWindow(window_);
98 if (!controller) 103 if (!controller)
99 return false; 104 return false;
100 aura::Window* lockscreen = controller->GetContainer( 105 aura::Window* lockscreen = controller->GetContainer(
(...skipping 28 matching lines...) Expand all
129 134
130 void WindowState::Maximize() { 135 void WindowState::Maximize() {
131 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); 136 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED);
132 } 137 }
133 138
134 void WindowState::SnapLeft(const gfx::Rect& bounds) { 139 void WindowState::SnapLeft(const gfx::Rect& bounds) {
135 SnapWindow(SHOW_TYPE_LEFT_SNAPPED, bounds); 140 SnapWindow(SHOW_TYPE_LEFT_SNAPPED, bounds);
136 } 141 }
137 142
138 void WindowState::SnapRight(const gfx::Rect& bounds) { 143 void WindowState::SnapRight(const gfx::Rect& bounds) {
139 SnapWindow(SHOW_TYPE_LEFT_SNAPPED, bounds); 144 SnapWindow(SHOW_TYPE_RIGHT_SNAPPED, bounds);
140 } 145 }
141 146
142 void WindowState::Minimize() { 147 void WindowState::Minimize() {
143 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); 148 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED);
144 } 149 }
145 150
146 void WindowState::Unminimize() { 151 void WindowState::Unminimize() {
147 window_->SetProperty( 152 window_->SetProperty(
148 aura::client::kShowStateKey, 153 aura::client::kShowStateKey,
149 window_->GetProperty(aura::client::kRestoreShowStateKey)); 154 window_->GetProperty(aura::client::kRestoreShowStateKey));
150 window_->ClearProperty(aura::client::kRestoreShowStateKey); 155 window_->ClearProperty(aura::client::kRestoreShowStateKey);
151 } 156 }
152 157
153 void WindowState::Activate() { 158 void WindowState::Activate() {
154 ActivateWindow(window_); 159 ActivateWindow(window_);
155 } 160 }
156 161
157 void WindowState::Deactivate() { 162 void WindowState::Deactivate() {
158 DeactivateWindow(window_); 163 DeactivateWindow(window_);
159 } 164 }
160 165
161 void WindowState::Restore() { 166 void WindowState::Restore() {
167 // Set |window_show_type_| to SHOW_TYPE_NORMAL now so that an observer
168 // observing kShowStateKey gets the correct value when querying IsSnapped().
169 window_show_type_ = SHOW_TYPE_NORMAL;
162 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); 170 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
163 } 171 }
164 172
165 void WindowState::ToggleMaximized() { 173 void WindowState::ToggleMaximized() {
166 if (IsMaximized()) 174 if (IsMaximized())
167 Restore(); 175 Restore();
168 else if (CanMaximize()) 176 else if (CanMaximize())
169 Maximize(); 177 Maximize();
170 } 178 }
171 179
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 OnWindowShowTypeChanged(this, ToWindowShowType(old_state))); 266 OnWindowShowTypeChanged(this, ToWindowShowType(old_state)));
259 } 267 }
260 } 268 }
261 269
262 void WindowState::OnWindowDestroying(aura::Window* window) { 270 void WindowState::OnWindowDestroying(aura::Window* window) {
263 window_->RemoveObserver(this); 271 window_->RemoveObserver(this);
264 } 272 }
265 273
266 void WindowState::SnapWindow(WindowShowType left_or_right, 274 void WindowState::SnapWindow(WindowShowType left_or_right,
267 const gfx::Rect& bounds) { 275 const gfx::Rect& bounds) {
268 if (IsMaximizedOrFullscreen()) { 276 // Compute the bounds that the window will restore to. If the window does not
269 // Before we can set the bounds we need to restore the window. 277 // already have restore bounds, it will be restored (when un-snapped) to the
270 // Restoring the window will set the window to its restored bounds. 278 // last bounds that it had before getting snapped.
271 // To avoid an unnecessary bounds changes (which may have side effects) 279 gfx::Rect restore_bounds_in_screen(HasRestoreBounds() ?
272 // we set the restore bounds to the bounds we want, restore the window, 280 GetRestoreBoundsInScreen() : window_->GetBoundsInScreen());
273 // then reset the restore bounds. This way no unnecessary bounds 281 // Set the window's restore bounds so that WorkspaceLayoutManager knows
274 // changes occurs and the original restore bounds is remembered. 282 // which width to use when the snapped window is moved to the edge.
275 gfx::Rect restore_bounds_in_screen = 283 SetRestoreBoundsInParent(bounds);
276 GetRestoreBoundsInScreen(); 284
277 SetRestoreBoundsInParent(bounds); 285 bool was_maximized = IsMaximizedOrFullscreen();
286 // Before we can set the bounds we need to restore the window.
287 // Restoring the window will set the window to its restored bounds set above.
288 // Restore will cause OnWindowPropertyChanged() so it needs to be done
289 // before notifying that the WindowShowType has changed to |left_or_right|.
290 if (was_maximized)
278 Restore(); 291 Restore();
279 SetRestoreBoundsInScreen(restore_bounds_in_screen);
280 } else {
281 window_->SetBounds(bounds);
282 }
283 DCHECK(left_or_right == SHOW_TYPE_LEFT_SNAPPED || 292 DCHECK(left_or_right == SHOW_TYPE_LEFT_SNAPPED ||
284 left_or_right == SHOW_TYPE_RIGHT_SNAPPED); 293 left_or_right == SHOW_TYPE_RIGHT_SNAPPED);
294 WindowShowType old_type = window_show_type_;
285 window_show_type_ = left_or_right; 295 window_show_type_ = left_or_right;
296 FOR_EACH_OBSERVER(
297 WindowStateObserver, observer_list_,
298 OnWindowShowTypeChanged(this, old_type));
299 // TODO(varkha): Ideally the bounds should be changed in a LayoutManager upon
300 // observing the WindowShowType change.
301 // If the window is a child of kShellWindowId_DockedContainer such as during
302 // a drag, the window's bounds are not set in
303 // WorkspaceLayoutManager::OnWindowShowTypeChanged(). Set them here. Skip
304 // setting the bounds otherwise to avoid stopping the slide animation which
305 // was started as a result of OnWindowShowTypeChanged().
306 if (IsDocked())
307 window_->SetBounds(bounds);
308 SetRestoreBoundsInScreen(restore_bounds_in_screen);
286 } 309 }
287 310
288 WindowState* GetActiveWindowState() { 311 WindowState* GetActiveWindowState() {
289 aura::Window* active = GetActiveWindow(); 312 aura::Window* active = GetActiveWindow();
290 return active ? GetWindowState(active) : NULL; 313 return active ? GetWindowState(active) : NULL;
291 } 314 }
292 315
293 WindowState* GetWindowState(aura::Window* window) { 316 WindowState* GetWindowState(aura::Window* window) {
294 if (!window) 317 if (!window)
295 return NULL; 318 return NULL;
296 WindowState* settings = window->GetProperty(internal::kWindowStateKey); 319 WindowState* settings = window->GetProperty(internal::kWindowStateKey);
297 if(!settings) { 320 if(!settings) {
298 settings = new WindowState(window); 321 settings = new WindowState(window);
299 window->SetProperty(internal::kWindowStateKey, settings); 322 window->SetProperty(internal::kWindowStateKey, settings);
300 } 323 }
301 return settings; 324 return settings;
302 } 325 }
303 326
304 const WindowState* GetWindowState(const aura::Window* window) { 327 const WindowState* GetWindowState(const aura::Window* window) {
305 return GetWindowState(const_cast<aura::Window*>(window)); 328 return GetWindowState(const_cast<aura::Window*>(window));
306 } 329 }
307 330
308 } // namespace wm 331 } // namespace wm
309 } // namespace ash 332 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698