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

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 (comments) 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 if (IsSnapped())
168 window_show_type_ = SHOW_TYPE_NORMAL;
oshima 2013/11/27 18:28:14 can you add comment why this is necessary?
varkha 2013/11/27 19:07:32 Done.
162 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); 169 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
163 } 170 }
164 171
165 void WindowState::ToggleMaximized() { 172 void WindowState::ToggleMaximized() {
166 if (IsMaximized()) 173 if (IsMaximized())
167 Restore(); 174 Restore();
168 else if (CanMaximize()) 175 else if (CanMaximize())
169 Maximize(); 176 Maximize();
170 } 177 }
171 178
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 OnWindowShowTypeChanged(this, ToWindowShowType(old_state))); 265 OnWindowShowTypeChanged(this, ToWindowShowType(old_state)));
259 } 266 }
260 } 267 }
261 268
262 void WindowState::OnWindowDestroying(aura::Window* window) { 269 void WindowState::OnWindowDestroying(aura::Window* window) {
263 window_->RemoveObserver(this); 270 window_->RemoveObserver(this);
264 } 271 }
265 272
266 void WindowState::SnapWindow(WindowShowType left_or_right, 273 void WindowState::SnapWindow(WindowShowType left_or_right,
267 const gfx::Rect& bounds) { 274 const gfx::Rect& bounds) {
268 if (IsMaximizedOrFullscreen()) { 275 // We set the restore bounds to the bounds we want, restore the window if
pkotwicz 2013/11/27 20:24:43 This comment is not useful. It describes what the
varkha 2013/11/28 01:09:37 I have changed the comment to make sure the result
269 // Before we can set the bounds we need to restore the window. 276 // necessary or set the bounds explicitly, then recover the restore bounds.
270 // Restoring the window will set the window to its restored bounds. 277 // This way no unnecessary bounds changes occurs and the original restore
271 // To avoid an unnecessary bounds changes (which may have side effects) 278 // bounds are remembered.
272 // we set the restore bounds to the bounds we want, restore the window, 279 gfx::Rect restore_bounds_in_screen(HasRestoreBounds() ?
273 // then reset the restore bounds. This way no unnecessary bounds 280 GetRestoreBoundsInScreen() : window_->GetBoundsInScreen());
274 // changes occurs and the original restore bounds is remembered. 281 SetRestoreBoundsInParent(bounds);
275 gfx::Rect restore_bounds_in_screen = 282
276 GetRestoreBoundsInScreen(); 283 bool was_maximized = IsMaximizedOrFullscreen();
277 SetRestoreBoundsInParent(bounds); 284 // Before we can set the bounds we need to restore the window.
285 // Restoring the window will set the window to its restored bounds set above.
286 // Restore will cause OnWindowPropertyChanged() so it needs to be done
287 // before notifying that the WindowShowType has changed to |left_or_right|.
288 if (was_maximized)
278 Restore(); 289 Restore();
279 SetRestoreBoundsInScreen(restore_bounds_in_screen);
280 } else {
281 window_->SetBounds(bounds);
282 }
283 DCHECK(left_or_right == SHOW_TYPE_LEFT_SNAPPED || 290 DCHECK(left_or_right == SHOW_TYPE_LEFT_SNAPPED ||
284 left_or_right == SHOW_TYPE_RIGHT_SNAPPED); 291 left_or_right == SHOW_TYPE_RIGHT_SNAPPED);
292 WindowShowType old_type = window_show_type_;
285 window_show_type_ = left_or_right; 293 window_show_type_ = left_or_right;
294 FOR_EACH_OBSERVER(
295 WindowStateObserver, observer_list_,
296 OnWindowShowTypeChanged(this, old_type));
297 // TODO(varkha): Ideally the bounds should be changed in a LayoutManager upon
298 // observing the WindowShowType change.
299 // There is no need to SetBounds second time if a window used to be maximized.
300 // In that case the bounds were already set when Restore() was called above.
301 if (!was_maximized)
pkotwicz 2013/11/27 20:24:43 Can we change the condition to: if (window_->paren
varkha 2013/11/28 01:09:37 Done.
302 window_->SetBounds(bounds);
303 SetRestoreBoundsInScreen(restore_bounds_in_screen);
286 } 304 }
287 305
288 WindowState* GetActiveWindowState() { 306 WindowState* GetActiveWindowState() {
289 aura::Window* active = GetActiveWindow(); 307 aura::Window* active = GetActiveWindow();
290 return active ? GetWindowState(active) : NULL; 308 return active ? GetWindowState(active) : NULL;
291 } 309 }
292 310
293 WindowState* GetWindowState(aura::Window* window) { 311 WindowState* GetWindowState(aura::Window* window) {
294 if (!window) 312 if (!window)
295 return NULL; 313 return NULL;
296 WindowState* settings = window->GetProperty(internal::kWindowStateKey); 314 WindowState* settings = window->GetProperty(internal::kWindowStateKey);
297 if(!settings) { 315 if(!settings) {
298 settings = new WindowState(window); 316 settings = new WindowState(window);
299 window->SetProperty(internal::kWindowStateKey, settings); 317 window->SetProperty(internal::kWindowStateKey, settings);
300 } 318 }
301 return settings; 319 return settings;
302 } 320 }
303 321
304 const WindowState* GetWindowState(const aura::Window* window) { 322 const WindowState* GetWindowState(const aura::Window* window) {
305 return GetWindowState(const_cast<aura::Window*>(window)); 323 return GetWindowState(const_cast<aura::Window*>(window));
306 } 324 }
307 325
308 } // namespace wm 326 } // namespace wm
309 } // namespace ash 327 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698