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

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 (rebase) 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 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 129
130 void WindowState::Maximize() { 130 void WindowState::Maximize() {
131 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); 131 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED);
132 } 132 }
133 133
134 void WindowState::SnapLeft(const gfx::Rect& bounds) { 134 void WindowState::SnapLeft(const gfx::Rect& bounds) {
135 SnapWindow(SHOW_TYPE_LEFT_SNAPPED, bounds); 135 SnapWindow(SHOW_TYPE_LEFT_SNAPPED, bounds);
136 } 136 }
137 137
138 void WindowState::SnapRight(const gfx::Rect& bounds) { 138 void WindowState::SnapRight(const gfx::Rect& bounds) {
139 SnapWindow(SHOW_TYPE_LEFT_SNAPPED, bounds); 139 SnapWindow(SHOW_TYPE_RIGHT_SNAPPED, bounds);
140 } 140 }
141 141
142 void WindowState::Minimize() { 142 void WindowState::Minimize() {
143 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); 143 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED);
144 } 144 }
145 145
146 void WindowState::Unminimize() { 146 void WindowState::Unminimize() {
147 window_->SetProperty( 147 window_->SetProperty(
148 aura::client::kShowStateKey, 148 aura::client::kShowStateKey,
149 window_->GetProperty(aura::client::kRestoreShowStateKey)); 149 window_->GetProperty(aura::client::kRestoreShowStateKey));
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 237
238 void WindowState::SetTrackedByWorkspace(bool tracked_by_workspace) { 238 void WindowState::SetTrackedByWorkspace(bool tracked_by_workspace) {
239 if (tracked_by_workspace_ == tracked_by_workspace) 239 if (tracked_by_workspace_ == tracked_by_workspace)
240 return; 240 return;
241 bool old = tracked_by_workspace_; 241 bool old = tracked_by_workspace_;
242 tracked_by_workspace_ = tracked_by_workspace; 242 tracked_by_workspace_ = tracked_by_workspace;
243 FOR_EACH_OBSERVER(WindowStateObserver, observer_list_, 243 FOR_EACH_OBSERVER(WindowStateObserver, observer_list_,
244 OnTrackedByWorkspaceChanged(this, old)); 244 OnTrackedByWorkspaceChanged(this, old));
245 } 245 }
246 246
247 void WindowState::SetWindowShowTypeUnsnapped() {
248 if (window_show_type_ != SHOW_TYPE_LEFT_SNAPPED &&
249 window_show_type_ != SHOW_TYPE_RIGHT_SNAPPED) {
250 return;
251 }
252 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.
253 }
254
255 void WindowState::SetBoundsChangedByUser(bool bounds_changed_by_user) {
256 bounds_changed_by_user_ = bounds_changed_by_user;
257 if (bounds_changed_by_user_)
258 SetWindowShowTypeUnsnapped();
259 }
260
247 void WindowState::OnWindowPropertyChanged(aura::Window* window, 261 void WindowState::OnWindowPropertyChanged(aura::Window* window,
248 const void* key, 262 const void* key,
249 intptr_t old) { 263 intptr_t old) {
250 DCHECK_EQ(window, window_); 264 DCHECK_EQ(window, window_);
251 if (key == aura::client::kShowStateKey) { 265 if (key == aura::client::kShowStateKey) {
252 window_show_type_ = ToWindowShowType(GetShowState()); 266 window_show_type_ = ToWindowShowType(GetShowState());
253 ui::WindowShowState old_state = static_cast<ui::WindowShowState>(old); 267 ui::WindowShowState old_state = static_cast<ui::WindowShowState>(old);
254 // TODO(oshima): Notify only when the state has changed. 268 // TODO(oshima): Notify only when the state has changed.
255 // Doing so break a few tests now. 269 // Doing so break a few tests now.
256 FOR_EACH_OBSERVER( 270 FOR_EACH_OBSERVER(
257 WindowStateObserver, observer_list_, 271 WindowStateObserver, observer_list_,
258 OnWindowShowTypeChanged(this, ToWindowShowType(old_state))); 272 OnWindowShowTypeChanged(this, ToWindowShowType(old_state)));
259 } 273 }
260 } 274 }
261 275
262 void WindowState::OnWindowDestroying(aura::Window* window) { 276 void WindowState::OnWindowDestroying(aura::Window* window) {
263 window_->RemoveObserver(this); 277 window_->RemoveObserver(this);
264 } 278 }
265 279
266 void WindowState::SnapWindow(WindowShowType left_or_right, 280 void WindowState::SnapWindow(WindowShowType left_or_right,
267 const gfx::Rect& bounds) { 281 const gfx::Rect& bounds) {
268 if (IsMaximizedOrFullscreen()) { 282 gfx::Rect restore_bounds_in_screen(HasRestoreBounds() ?
283 GetRestoreBoundsInScreen() : window_->GetBoundsInScreen());
284
285 bool was_maximized = IsMaximizedOrFullscreen();
286 if (was_maximized) {
269 // Before we can set the bounds we need to restore the window. 287 // Before we can set the bounds we need to restore the window.
270 // Restoring the window will set the window to its restored bounds. 288 // Restoring the window will set the window to its restored bounds.
271 // To avoid an unnecessary bounds changes (which may have side effects) 289 // To avoid an unnecessary bounds changes (which may have side effects)
272 // we set the restore bounds to the bounds we want, restore the window, 290 // we set the restore bounds to the bounds we want, restore the window,
273 // then reset the restore bounds. This way no unnecessary bounds 291 // then recover the restore bounds. This way no unnecessary bounds
274 // changes occurs and the original restore bounds is remembered. 292 // changes occurs and the original restore bounds are remembered.
275 gfx::Rect restore_bounds_in_screen =
276 GetRestoreBoundsInScreen();
277 SetRestoreBoundsInParent(bounds); 293 SetRestoreBoundsInParent(bounds);
294 // Restore will cause OnWindowPropertyChanged so it needs to be done
295 // before notifying about show type change to snapped.
278 Restore(); 296 Restore();
279 SetRestoreBoundsInScreen(restore_bounds_in_screen);
280 } else {
281 window_->SetBounds(bounds);
282 } 297 }
283 DCHECK(left_or_right == SHOW_TYPE_LEFT_SNAPPED || 298 DCHECK(left_or_right == SHOW_TYPE_LEFT_SNAPPED ||
284 left_or_right == SHOW_TYPE_RIGHT_SNAPPED); 299 left_or_right == SHOW_TYPE_RIGHT_SNAPPED);
300 WindowShowType old_type = window_show_type_;
285 window_show_type_ = left_or_right; 301 window_show_type_ = left_or_right;
302 FOR_EACH_OBSERVER(
303 WindowStateObserver, observer_list_,
304 OnWindowShowTypeChanged(this, old_type));
305 if (!was_maximized)
306 window_->SetBounds(bounds);
307 SetRestoreBoundsInScreen(restore_bounds_in_screen);
286 } 308 }
287 309
288 WindowState* GetActiveWindowState() { 310 WindowState* GetActiveWindowState() {
289 aura::Window* active = GetActiveWindow(); 311 aura::Window* active = GetActiveWindow();
290 return active ? GetWindowState(active) : NULL; 312 return active ? GetWindowState(active) : NULL;
291 } 313 }
292 314
293 WindowState* GetWindowState(aura::Window* window) { 315 WindowState* GetWindowState(aura::Window* window) {
294 if (!window) 316 if (!window)
295 return NULL; 317 return NULL;
296 WindowState* settings = window->GetProperty(internal::kWindowStateKey); 318 WindowState* settings = window->GetProperty(internal::kWindowStateKey);
297 if(!settings) { 319 if(!settings) {
298 settings = new WindowState(window); 320 settings = new WindowState(window);
299 window->SetProperty(internal::kWindowStateKey, settings); 321 window->SetProperty(internal::kWindowStateKey, settings);
300 } 322 }
301 return settings; 323 return settings;
302 } 324 }
303 325
304 const WindowState* GetWindowState(const aura::Window* window) { 326 const WindowState* GetWindowState(const aura::Window* window) {
305 return GetWindowState(const_cast<aura::Window*>(window)); 327 return GetWindowState(const_cast<aura::Window*>(window));
306 } 328 }
307 329
308 } // namespace wm 330 } // namespace wm
309 } // namespace ash 331 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698