OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |