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

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 (nit) 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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 68
69 bool WindowState::IsFullscreen() const { 69 bool WindowState::IsFullscreen() const {
70 return GetShowState() == ui::SHOW_STATE_FULLSCREEN; 70 return GetShowState() == ui::SHOW_STATE_FULLSCREEN;
71 } 71 }
72 72
73 bool WindowState::IsMaximizedOrFullscreen() const { 73 bool WindowState::IsMaximizedOrFullscreen() const {
74 return IsMaximizedOrFullscreenState(GetShowState()); 74 return IsMaximizedOrFullscreenState(GetShowState());
75 } 75 }
76 76
77 bool WindowState::IsNormalShowState() const { 77 bool WindowState::IsNormalShowState() const {
78 ui::WindowShowState state = window_->GetProperty(aura::client::kShowStateKey); 78 ui::WindowShowState state = window_->GetProperty(aura::client::kShowStateKey);
pkotwicz 2013/11/27 20:24:43 In a separate CL we must absolutely kill this meth
varkha 2013/11/28 01:09:37 Yes.
79 return state == ui::SHOW_STATE_NORMAL || state == ui::SHOW_STATE_DEFAULT; 79 return state == ui::SHOW_STATE_NORMAL || state == ui::SHOW_STATE_DEFAULT;
80 } 80 }
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 // When a window |IsSnapped| it is auto-positioned by layout manager to stay
pkotwicz 2013/11/27 20:24:43 You can actually kill the if statement completely.
varkha 2013/11/28 01:09:37 I don't think we can rely on WindowState::OnWindow
168 // snapped at a screen edge. Stop this auto-positioning when Restore() is
169 // called such as at the end of a drag or when centering a window.
170 if (IsSnapped())
171 window_show_type_ = SHOW_TYPE_NORMAL;
162 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); 172 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
163 } 173 }
164 174
165 void WindowState::ToggleMaximized() { 175 void WindowState::ToggleMaximized() {
166 if (IsMaximized()) 176 if (IsMaximized())
167 Restore(); 177 Restore();
168 else if (CanMaximize()) 178 else if (CanMaximize())
169 Maximize(); 179 Maximize();
170 } 180 }
171 181
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 OnWindowShowTypeChanged(this, ToWindowShowType(old_state))); 268 OnWindowShowTypeChanged(this, ToWindowShowType(old_state)));
259 } 269 }
260 } 270 }
261 271
262 void WindowState::OnWindowDestroying(aura::Window* window) { 272 void WindowState::OnWindowDestroying(aura::Window* window) {
263 window_->RemoveObserver(this); 273 window_->RemoveObserver(this);
264 } 274 }
265 275
266 void WindowState::SnapWindow(WindowShowType left_or_right, 276 void WindowState::SnapWindow(WindowShowType left_or_right,
267 const gfx::Rect& bounds) { 277 const gfx::Rect& bounds) {
268 if (IsMaximizedOrFullscreen()) { 278 // We set the restore bounds to the bounds we want, restore the window if
269 // Before we can set the bounds we need to restore the window. 279 // necessary or set the bounds explicitly, then recover the restore bounds.
270 // Restoring the window will set the window to its restored bounds. 280 // This way no unnecessary bounds changes occurs and the original restore
271 // To avoid an unnecessary bounds changes (which may have side effects) 281 // bounds are remembered.
272 // we set the restore bounds to the bounds we want, restore the window, 282 gfx::Rect restore_bounds_in_screen(HasRestoreBounds() ?
273 // then reset the restore bounds. This way no unnecessary bounds 283 GetRestoreBoundsInScreen() : window_->GetBoundsInScreen());
274 // changes occurs and the original restore bounds is remembered. 284 SetRestoreBoundsInParent(bounds);
275 gfx::Rect restore_bounds_in_screen = 285
276 GetRestoreBoundsInScreen(); 286 bool was_maximized = IsMaximizedOrFullscreen();
277 SetRestoreBoundsInParent(bounds); 287 // Before we can set the bounds we need to restore the window.
288 // Restoring the window will set the window to its restored bounds set above.
289 // Restore will cause OnWindowPropertyChanged() so it needs to be done
290 // before notifying that the WindowShowType has changed to |left_or_right|.
291 if (was_maximized)
278 Restore(); 292 Restore();
279 SetRestoreBoundsInScreen(restore_bounds_in_screen);
280 } else {
281 window_->SetBounds(bounds);
282 }
283 DCHECK(left_or_right == SHOW_TYPE_LEFT_SNAPPED || 293 DCHECK(left_or_right == SHOW_TYPE_LEFT_SNAPPED ||
284 left_or_right == SHOW_TYPE_RIGHT_SNAPPED); 294 left_or_right == SHOW_TYPE_RIGHT_SNAPPED);
295 WindowShowType old_type = window_show_type_;
285 window_show_type_ = left_or_right; 296 window_show_type_ = left_or_right;
297 FOR_EACH_OBSERVER(
298 WindowStateObserver, observer_list_,
299 OnWindowShowTypeChanged(this, old_type));
300 // TODO(varkha): Ideally the bounds should be changed in a LayoutManager upon
301 // observing the WindowShowType change.
302 // There is no need to SetBounds second time if a window used to be maximized.
303 // In that case the bounds were already set when Restore() was called above.
304 if (!was_maximized)
305 window_->SetBounds(bounds);
306 SetRestoreBoundsInScreen(restore_bounds_in_screen);
286 } 307 }
287 308
288 WindowState* GetActiveWindowState() { 309 WindowState* GetActiveWindowState() {
289 aura::Window* active = GetActiveWindow(); 310 aura::Window* active = GetActiveWindow();
290 return active ? GetWindowState(active) : NULL; 311 return active ? GetWindowState(active) : NULL;
291 } 312 }
292 313
293 WindowState* GetWindowState(aura::Window* window) { 314 WindowState* GetWindowState(aura::Window* window) {
294 if (!window) 315 if (!window)
295 return NULL; 316 return NULL;
296 WindowState* settings = window->GetProperty(internal::kWindowStateKey); 317 WindowState* settings = window->GetProperty(internal::kWindowStateKey);
297 if(!settings) { 318 if(!settings) {
298 settings = new WindowState(window); 319 settings = new WindowState(window);
299 window->SetProperty(internal::kWindowStateKey, settings); 320 window->SetProperty(internal::kWindowStateKey, settings);
300 } 321 }
301 return settings; 322 return settings;
302 } 323 }
303 324
304 const WindowState* GetWindowState(const aura::Window* window) { 325 const WindowState* GetWindowState(const aura::Window* window) {
305 return GetWindowState(const_cast<aura::Window*>(window)); 326 return GetWindowState(const_cast<aura::Window*>(window));
306 } 327 }
307 328
308 } // namespace wm 329 } // namespace wm
309 } // namespace ash 330 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698