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