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

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 SetWindowShowTypeUnsnapped();
pkotwicz 2013/11/27 06:21:57 Nit: SetWindowShowTypeUnsapped() now has a single
varkha 2013/11/27 06:38:54 Done.
162 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); 168 window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
163 } 169 }
164 170
165 void WindowState::ToggleMaximized() { 171 void WindowState::ToggleMaximized() {
166 if (IsMaximized()) 172 if (IsMaximized())
167 Restore(); 173 Restore();
168 else if (CanMaximize()) 174 else if (CanMaximize())
169 Maximize(); 175 Maximize();
170 } 176 }
171 177
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 OnWindowShowTypeChanged(this, ToWindowShowType(old_state))); 264 OnWindowShowTypeChanged(this, ToWindowShowType(old_state)));
259 } 265 }
260 } 266 }
261 267
262 void WindowState::OnWindowDestroying(aura::Window* window) { 268 void WindowState::OnWindowDestroying(aura::Window* window) {
263 window_->RemoveObserver(this); 269 window_->RemoveObserver(this);
264 } 270 }
265 271
266 void WindowState::SnapWindow(WindowShowType left_or_right, 272 void WindowState::SnapWindow(WindowShowType left_or_right,
267 const gfx::Rect& bounds) { 273 const gfx::Rect& bounds) {
268 if (IsMaximizedOrFullscreen()) { 274 gfx::Rect restore_bounds_in_screen(HasRestoreBounds() ?
269 // Before we can set the bounds we need to restore the window. 275 GetRestoreBoundsInScreen() : window_->GetBoundsInScreen());
270 // Restoring the window will set the window to its restored bounds. 276 // Before we can set the bounds we need to restore the window.
pkotwicz 2013/11/27 06:21:57 This comment needs to be updated.
varkha 2013/11/27 06:38:54 Done.
271 // To avoid an unnecessary bounds changes (which may have side effects) 277 // Restoring the window will set the window to its restored bounds.
272 // we set the restore bounds to the bounds we want, restore the window, 278 // To avoid an unnecessary bounds changes (which may have side effects)
273 // then reset the restore bounds. This way no unnecessary bounds 279 // we set the restore bounds to the bounds we want, restore the window,
274 // changes occurs and the original restore bounds is remembered. 280 // then recover the restore bounds. This way no unnecessary bounds
275 gfx::Rect restore_bounds_in_screen = 281 // changes occurs and the original restore bounds are remembered.
276 GetRestoreBoundsInScreen(); 282 SetRestoreBoundsInParent(bounds);
277 SetRestoreBoundsInParent(bounds); 283
284 bool was_maximized = IsMaximizedOrFullscreen();
285 // Restore will cause OnWindowPropertyChanged so it needs to be done
pkotwicz 2013/11/27 06:21:57 Nit: OnWindowPropertyChanged()
varkha 2013/11/27 06:38:54 Done.
286 // before notifying about show type change to snapped.
pkotwicz 2013/11/27 06:21:57 Nit: about show type change to snapped -> that the
varkha 2013/11/27 06:38:54 Done.
287 if (was_maximized)
278 Restore(); 288 Restore();
279 SetRestoreBoundsInScreen(restore_bounds_in_screen);
280 } else {
281 window_->SetBounds(bounds);
282 }
283 DCHECK(left_or_right == SHOW_TYPE_LEFT_SNAPPED || 289 DCHECK(left_or_right == SHOW_TYPE_LEFT_SNAPPED ||
284 left_or_right == SHOW_TYPE_RIGHT_SNAPPED); 290 left_or_right == SHOW_TYPE_RIGHT_SNAPPED);
291 WindowShowType old_type = window_show_type_;
285 window_show_type_ = left_or_right; 292 window_show_type_ = left_or_right;
293 FOR_EACH_OBSERVER(
294 WindowStateObserver, observer_list_,
295 OnWindowShowTypeChanged(this, old_type));
296 // TODO(varkha): Ideally the bounds should be changed in a LayoutManager upon
297 // observing the WindowShowType change.
298 if (!was_maximized)
pkotwicz 2013/11/27 06:21:57 Is there any harm in always setting the bounds? (I
varkha 2013/11/27 06:38:54 In opposite case the bounds are already set correc
299 window_->SetBounds(bounds);
300 SetRestoreBoundsInScreen(restore_bounds_in_screen);
301 }
302
303 void WindowState::SetWindowShowTypeUnsnapped() {
304 if (IsSnapped())
305 window_show_type_ = SHOW_TYPE_NORMAL;
286 } 306 }
287 307
288 WindowState* GetActiveWindowState() { 308 WindowState* GetActiveWindowState() {
289 aura::Window* active = GetActiveWindow(); 309 aura::Window* active = GetActiveWindow();
290 return active ? GetWindowState(active) : NULL; 310 return active ? GetWindowState(active) : NULL;
291 } 311 }
292 312
293 WindowState* GetWindowState(aura::Window* window) { 313 WindowState* GetWindowState(aura::Window* window) {
294 if (!window) 314 if (!window)
295 return NULL; 315 return NULL;
296 WindowState* settings = window->GetProperty(internal::kWindowStateKey); 316 WindowState* settings = window->GetProperty(internal::kWindowStateKey);
297 if(!settings) { 317 if(!settings) {
298 settings = new WindowState(window); 318 settings = new WindowState(window);
299 window->SetProperty(internal::kWindowStateKey, settings); 319 window->SetProperty(internal::kWindowStateKey, settings);
300 } 320 }
301 return settings; 321 return settings;
302 } 322 }
303 323
304 const WindowState* GetWindowState(const aura::Window* window) { 324 const WindowState* GetWindowState(const aura::Window* window) {
305 return GetWindowState(const_cast<aura::Window*>(window)); 325 return GetWindowState(const_cast<aura::Window*>(window));
306 } 326 }
307 327
308 } // namespace wm 328 } // namespace wm
309 } // namespace ash 329 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698