| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/default_state.h" | 5 #include "ash/wm/default_state.h" |
| 6 | 6 |
| 7 #include "ash/public/cpp/shell_window_ids.h" | 7 #include "ash/public/cpp/shell_window_ids.h" |
| 8 #include "ash/root_window_controller.h" | 8 #include "ash/root_window_controller.h" |
| 9 #include "ash/screen_util.h" | 9 #include "ash/screen_util.h" |
| 10 #include "ash/shell.h" | 10 #include "ash/shell.h" |
| 11 #include "ash/shell_port.h" | 11 #include "ash/shell_port.h" |
| 12 #include "ash/wm/screen_pinning_controller.h" | 12 #include "ash/wm/screen_pinning_controller.h" |
| 13 #include "ash/wm/window_animation_types.h" | 13 #include "ash/wm/window_animation_types.h" |
| 14 #include "ash/wm/window_parenting_utils.h" | 14 #include "ash/wm/window_parenting_utils.h" |
| 15 #include "ash/wm/window_positioning_utils.h" | 15 #include "ash/wm/window_positioning_utils.h" |
| 16 #include "ash/wm/window_state.h" | 16 #include "ash/wm/window_state.h" |
| 17 #include "ash/wm/window_state_delegate.h" | 17 #include "ash/wm/window_state_delegate.h" |
| 18 #include "ash/wm/window_state_util.h" | 18 #include "ash/wm/window_state_util.h" |
| 19 #include "ash/wm/wm_event.h" | 19 #include "ash/wm/wm_event.h" |
| 20 #include "ash/wm_window.h" | 20 #include "ash/wm_window.h" |
| 21 #include "ui/aura/client/aura_constants.h" | 21 #include "ui/aura/client/aura_constants.h" |
| 22 #include "ui/aura/window.h" | 22 #include "ui/aura/window.h" |
| 23 #include "ui/aura/window_delegate.h" |
| 23 #include "ui/display/display.h" | 24 #include "ui/display/display.h" |
| 24 #include "ui/display/screen.h" | 25 #include "ui/display/screen.h" |
| 26 #include "ui/wm/core/window_util.h" |
| 25 | 27 |
| 26 namespace ash { | 28 namespace ash { |
| 27 namespace wm { | 29 namespace wm { |
| 28 namespace { | 30 namespace { |
| 29 | 31 |
| 30 // This specifies how much percent (30%) of a window rect | 32 // This specifies how much percent (30%) of a window rect |
| 31 // must be visible when the window is added to the workspace. | 33 // must be visible when the window is added to the workspace. |
| 32 const float kMinimumPercentOnScreenArea = 0.3f; | 34 const float kMinimumPercentOnScreenArea = 0.3f; |
| 33 | 35 |
| 34 // When a window that has restore bounds at least as large as a work area is | 36 // When a window that has restore bounds at least as large as a work area is |
| 35 // unmaximized, inset the bounds slightly so that they are not exactly the same. | 37 // unmaximized, inset the bounds slightly so that they are not exactly the same. |
| 36 // This makes it easier to resize the window. | 38 // This makes it easier to resize the window. |
| 37 const int kMaximizedWindowInset = 10; // DIPs. | 39 const int kMaximizedWindowInset = 10; // DIPs. |
| 38 | 40 |
| 41 gfx::Size GetWindowMaximumSize(aura::Window* window) { |
| 42 return window->delegate() ? window->delegate()->GetMaximumSize() |
| 43 : gfx::Size(); |
| 44 } |
| 45 |
| 39 bool IsMinimizedWindowState(const WindowStateType state_type) { | 46 bool IsMinimizedWindowState(const WindowStateType state_type) { |
| 40 return state_type == WINDOW_STATE_TYPE_MINIMIZED; | 47 return state_type == WINDOW_STATE_TYPE_MINIMIZED; |
| 41 } | 48 } |
| 42 | 49 |
| 43 void MoveToDisplayForRestore(WindowState* window_state) { | 50 void MoveToDisplayForRestore(WindowState* window_state) { |
| 44 if (!window_state->HasRestoreBounds()) | 51 if (!window_state->HasRestoreBounds()) |
| 45 return; | 52 return; |
| 46 const gfx::Rect restore_bounds = window_state->GetRestoreBoundsInScreen(); | 53 const gfx::Rect restore_bounds = window_state->GetRestoreBoundsInScreen(); |
| 47 | 54 |
| 48 // Move only if the restore bounds is outside of | 55 // Move only if the restore bounds is outside of |
| 49 // the display. There is no information about in which | 56 // the display. There is no information about in which |
| 50 // display it should be restored, so this is best guess. | 57 // display it should be restored, so this is best guess. |
| 51 // TODO(oshima): Restore information should contain the | 58 // TODO(oshima): Restore information should contain the |
| 52 // work area information like WindowResizer does for the | 59 // work area information like WindowResizer does for the |
| 53 // last window location. | 60 // last window location. |
| 54 gfx::Rect display_area = | 61 gfx::Rect display_area = display::Screen::GetScreen() |
| 55 window_state->window()->GetDisplayNearestWindow().bounds(); | 62 ->GetDisplayNearestWindow(window_state->window()) |
| 63 .bounds(); |
| 56 | 64 |
| 57 if (!display_area.Intersects(restore_bounds)) { | 65 if (!display_area.Intersects(restore_bounds)) { |
| 58 const display::Display& display = | 66 const display::Display& display = |
| 59 display::Screen::GetScreen()->GetDisplayMatching(restore_bounds); | 67 display::Screen::GetScreen()->GetDisplayMatching(restore_bounds); |
| 60 RootWindowController* new_root_controller = | 68 RootWindowController* new_root_controller = |
| 61 Shell::Get()->GetRootWindowControllerWithDisplayId(display.id()); | 69 Shell::Get()->GetRootWindowControllerWithDisplayId(display.id()); |
| 62 if (new_root_controller->GetRootWindow() != | 70 if (new_root_controller->GetRootWindow() != |
| 63 window_state->window()->GetRootWindow()->aura_window()) { | 71 window_state->window()->GetRootWindow()) { |
| 64 aura::Window* new_container = | 72 aura::Window* new_container = |
| 65 new_root_controller->GetRootWindow()->GetChildById( | 73 new_root_controller->GetRootWindow()->GetChildById( |
| 66 window_state->window()->GetParent()->aura_window()->id()); | 74 window_state->window()->parent()->id()); |
| 67 new_container->AddChild(window_state->window()->aura_window()); | 75 new_container->AddChild(window_state->window()); |
| 68 } | 76 } |
| 69 } | 77 } |
| 70 } | 78 } |
| 71 | 79 |
| 72 void CycleSnap(WindowState* window_state, WMEventType event) { | 80 void CycleSnap(WindowState* window_state, WMEventType event) { |
| 73 wm::WindowStateType desired_snap_state = | 81 wm::WindowStateType desired_snap_state = |
| 74 event == WM_EVENT_CYCLE_SNAP_LEFT ? wm::WINDOW_STATE_TYPE_LEFT_SNAPPED | 82 event == WM_EVENT_CYCLE_SNAP_LEFT ? wm::WINDOW_STATE_TYPE_LEFT_SNAPPED |
| 75 : wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED; | 83 : wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED; |
| 76 | 84 |
| 77 if (window_state->CanSnap() && | 85 if (window_state->CanSnap() && |
| 78 window_state->GetStateType() != desired_snap_state && | 86 window_state->GetStateType() != desired_snap_state && |
| 79 window_state->window()->GetType() != ui::wm::WINDOW_TYPE_PANEL) { | 87 window_state->window()->type() != ui::wm::WINDOW_TYPE_PANEL) { |
| 80 const wm::WMEvent event(desired_snap_state == | 88 const wm::WMEvent event(desired_snap_state == |
| 81 wm::WINDOW_STATE_TYPE_LEFT_SNAPPED | 89 wm::WINDOW_STATE_TYPE_LEFT_SNAPPED |
| 82 ? wm::WM_EVENT_SNAP_LEFT | 90 ? wm::WM_EVENT_SNAP_LEFT |
| 83 : wm::WM_EVENT_SNAP_RIGHT); | 91 : wm::WM_EVENT_SNAP_RIGHT); |
| 84 window_state->OnWMEvent(&event); | 92 window_state->OnWMEvent(&event); |
| 85 return; | 93 return; |
| 86 } | 94 } |
| 87 | 95 |
| 88 if (window_state->IsSnapped()) { | 96 if (window_state->IsSnapped()) { |
| 89 window_state->Restore(); | 97 window_state->Restore(); |
| 90 return; | 98 return; |
| 91 } | 99 } |
| 92 window_state->window()->Animate(::wm::WINDOW_ANIMATION_TYPE_BOUNCE); | 100 ::wm::AnimateWindow(window_state->window(), |
| 101 ::wm::WINDOW_ANIMATION_TYPE_BOUNCE); |
| 93 } | 102 } |
| 94 | 103 |
| 95 } // namespace | 104 } // namespace |
| 96 | 105 |
| 97 DefaultState::DefaultState(WindowStateType initial_state_type) | 106 DefaultState::DefaultState(WindowStateType initial_state_type) |
| 98 : state_type_(initial_state_type), stored_window_state_(nullptr) {} | 107 : state_type_(initial_state_type), stored_window_state_(nullptr) {} |
| 99 DefaultState::~DefaultState() {} | 108 DefaultState::~DefaultState() {} |
| 100 | 109 |
| 101 void DefaultState::OnWMEvent(WindowState* window_state, const WMEvent* event) { | 110 void DefaultState::OnWMEvent(WindowState* window_state, const WMEvent* event) { |
| 102 if (ProcessWorkspaceEvents(window_state, event)) | 111 if (ProcessWorkspaceEvents(window_state, event)) |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 NOTREACHED() << "Compound event should not reach here:" << event; | 172 NOTREACHED() << "Compound event should not reach here:" << event; |
| 164 return; | 173 return; |
| 165 case WM_EVENT_ADDED_TO_WORKSPACE: | 174 case WM_EVENT_ADDED_TO_WORKSPACE: |
| 166 case WM_EVENT_WORKAREA_BOUNDS_CHANGED: | 175 case WM_EVENT_WORKAREA_BOUNDS_CHANGED: |
| 167 case WM_EVENT_DISPLAY_BOUNDS_CHANGED: | 176 case WM_EVENT_DISPLAY_BOUNDS_CHANGED: |
| 168 NOTREACHED() << "Workspace event should not reach here:" << event; | 177 NOTREACHED() << "Workspace event should not reach here:" << event; |
| 169 return; | 178 return; |
| 170 } | 179 } |
| 171 | 180 |
| 172 if (next_state_type == current_state_type && window_state->IsSnapped()) { | 181 if (next_state_type == current_state_type && window_state->IsSnapped()) { |
| 173 aura::Window* window = window_state->window()->aura_window(); | 182 aura::Window* window = window_state->window(); |
| 174 gfx::Rect snapped_bounds = | 183 gfx::Rect snapped_bounds = |
| 175 event->type() == WM_EVENT_SNAP_LEFT | 184 event->type() == WM_EVENT_SNAP_LEFT |
| 176 ? GetDefaultLeftSnappedWindowBoundsInParent(window) | 185 ? GetDefaultLeftSnappedWindowBoundsInParent(window) |
| 177 : GetDefaultRightSnappedWindowBoundsInParent(window); | 186 : GetDefaultRightSnappedWindowBoundsInParent(window); |
| 178 window_state->SetBoundsDirectAnimated(snapped_bounds); | 187 window_state->SetBoundsDirectAnimated(snapped_bounds); |
| 179 return; | 188 return; |
| 180 } | 189 } |
| 181 | 190 |
| 182 if (event->type() == WM_EVENT_SNAP_LEFT || | 191 if (event->type() == WM_EVENT_SNAP_LEFT || |
| 183 event->type() == WM_EVENT_SNAP_RIGHT) { | 192 event->type() == WM_EVENT_SNAP_RIGHT) { |
| 184 window_state->set_bounds_changed_by_user(true); | 193 window_state->set_bounds_changed_by_user(true); |
| 185 } | 194 } |
| 186 | 195 |
| 187 EnterToNextState(window_state, next_state_type); | 196 EnterToNextState(window_state, next_state_type); |
| 188 } | 197 } |
| 189 | 198 |
| 190 WindowStateType DefaultState::GetType() const { | 199 WindowStateType DefaultState::GetType() const { |
| 191 return state_type_; | 200 return state_type_; |
| 192 } | 201 } |
| 193 | 202 |
| 194 void DefaultState::AttachState(WindowState* window_state, | 203 void DefaultState::AttachState(WindowState* window_state, |
| 195 WindowState::State* state_in_previous_mode) { | 204 WindowState::State* state_in_previous_mode) { |
| 196 DCHECK_EQ(stored_window_state_, window_state); | 205 DCHECK_EQ(stored_window_state_, window_state); |
| 197 | 206 |
| 198 ReenterToCurrentState(window_state, state_in_previous_mode); | 207 ReenterToCurrentState(window_state, state_in_previous_mode); |
| 199 | 208 |
| 200 // If the display has changed while in the another mode, | 209 // If the display has changed while in the another mode, |
| 201 // we need to let windows know the change. | 210 // we need to let windows know the change. |
| 202 display::Display current_display = | 211 display::Display current_display = |
| 203 window_state->window()->GetDisplayNearestWindow(); | 212 display::Screen::GetScreen()->GetDisplayNearestWindow( |
| 213 window_state->window()); |
| 204 if (stored_display_state_.bounds() != current_display.bounds()) { | 214 if (stored_display_state_.bounds() != current_display.bounds()) { |
| 205 const WMEvent event(wm::WM_EVENT_DISPLAY_BOUNDS_CHANGED); | 215 const WMEvent event(wm::WM_EVENT_DISPLAY_BOUNDS_CHANGED); |
| 206 window_state->OnWMEvent(&event); | 216 window_state->OnWMEvent(&event); |
| 207 } else if (stored_display_state_.work_area() != current_display.work_area()) { | 217 } else if (stored_display_state_.work_area() != current_display.work_area()) { |
| 208 const WMEvent event(wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED); | 218 const WMEvent event(wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED); |
| 209 window_state->OnWMEvent(&event); | 219 window_state->OnWMEvent(&event); |
| 210 } | 220 } |
| 211 } | 221 } |
| 212 | 222 |
| 213 void DefaultState::DetachState(WindowState* window_state) { | 223 void DefaultState::DetachState(WindowState* window_state) { |
| 214 stored_window_state_ = window_state; | 224 stored_window_state_ = window_state; |
| 215 stored_bounds_ = window_state->window()->GetBounds(); | 225 stored_bounds_ = window_state->window()->bounds(); |
| 216 stored_restore_bounds_ = window_state->HasRestoreBounds() | 226 stored_restore_bounds_ = window_state->HasRestoreBounds() |
| 217 ? window_state->GetRestoreBoundsInParent() | 227 ? window_state->GetRestoreBoundsInParent() |
| 218 : gfx::Rect(); | 228 : gfx::Rect(); |
| 219 // Remember the display state so that in case of the display change | 229 // Remember the display state so that in case of the display change |
| 220 // while in the other mode, we can perform necessary action to | 230 // while in the other mode, we can perform necessary action to |
| 221 // restore the window state to the proper state for the current | 231 // restore the window state to the proper state for the current |
| 222 // display. | 232 // display. |
| 223 stored_display_state_ = window_state->window()->GetDisplayNearestWindow(); | 233 stored_display_state_ = display::Screen::GetScreen()->GetDisplayNearestWindow( |
| 234 window_state->window()); |
| 224 } | 235 } |
| 225 | 236 |
| 226 // static | 237 // static |
| 227 bool DefaultState::ProcessCompoundEvents(WindowState* window_state, | 238 bool DefaultState::ProcessCompoundEvents(WindowState* window_state, |
| 228 const WMEvent* event) { | 239 const WMEvent* event) { |
| 229 WmWindow* window = window_state->window(); | 240 aura::Window* window = window_state->window(); |
| 230 | 241 |
| 231 switch (event->type()) { | 242 switch (event->type()) { |
| 232 case WM_EVENT_TOGGLE_MAXIMIZE_CAPTION: | 243 case WM_EVENT_TOGGLE_MAXIMIZE_CAPTION: |
| 233 if (window_state->IsFullscreen()) { | 244 if (window_state->IsFullscreen()) { |
| 234 const wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN); | 245 const wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN); |
| 235 window_state->OnWMEvent(&event); | 246 window_state->OnWMEvent(&event); |
| 236 } else if (window_state->IsMaximized()) { | 247 } else if (window_state->IsMaximized()) { |
| 237 window_state->Restore(); | 248 window_state->Restore(); |
| 238 } else if (window_state->IsNormalOrSnapped()) { | 249 } else if (window_state->IsNormalOrSnapped()) { |
| 239 if (window_state->CanMaximize()) | 250 if (window_state->CanMaximize()) |
| 240 window_state->Maximize(); | 251 window_state->Maximize(); |
| 241 } | 252 } |
| 242 return true; | 253 return true; |
| 243 case WM_EVENT_TOGGLE_MAXIMIZE: | 254 case WM_EVENT_TOGGLE_MAXIMIZE: |
| 244 if (window_state->IsFullscreen()) { | 255 if (window_state->IsFullscreen()) { |
| 245 const wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN); | 256 const wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN); |
| 246 window_state->OnWMEvent(&event); | 257 window_state->OnWMEvent(&event); |
| 247 } else if (window_state->IsMaximized()) { | 258 } else if (window_state->IsMaximized()) { |
| 248 window_state->Restore(); | 259 window_state->Restore(); |
| 249 } else if (window_state->CanMaximize()) { | 260 } else if (window_state->CanMaximize()) { |
| 250 window_state->Maximize(); | 261 window_state->Maximize(); |
| 251 } | 262 } |
| 252 return true; | 263 return true; |
| 253 case WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE: { | 264 case WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE: { |
| 254 gfx::Rect work_area = | 265 gfx::Rect work_area = |
| 255 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window->aura_window()); | 266 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window); |
| 256 | 267 |
| 257 // Maximize vertically if: | 268 // Maximize vertically if: |
| 258 // - The window does not have a max height defined. | 269 // - The window does not have a max height defined. |
| 259 // - The window has the normal state type. Snapped windows are excluded | 270 // - The window has the normal state type. Snapped windows are excluded |
| 260 // because they are already maximized vertically and reverting to the | 271 // because they are already maximized vertically and reverting to the |
| 261 // restored bounds looks weird. | 272 // restored bounds looks weird. |
| 262 if (window->GetMaximumSize().height() != 0 || | 273 if (GetWindowMaximumSize(window).height() != 0 || |
| 263 !window_state->IsNormalStateType()) { | 274 !window_state->IsNormalStateType()) { |
| 264 return true; | 275 return true; |
| 265 } | 276 } |
| 266 if (window_state->HasRestoreBounds() && | 277 if (window_state->HasRestoreBounds() && |
| 267 (window->GetBounds().height() == work_area.height() && | 278 (window->bounds().height() == work_area.height() && |
| 268 window->GetBounds().y() == work_area.y())) { | 279 window->bounds().y() == work_area.y())) { |
| 269 window_state->SetAndClearRestoreBounds(); | 280 window_state->SetAndClearRestoreBounds(); |
| 270 } else { | 281 } else { |
| 271 window_state->SaveCurrentBoundsForRestore(); | 282 window_state->SaveCurrentBoundsForRestore(); |
| 272 window->SetBounds(gfx::Rect(window->GetBounds().x(), work_area.y(), | 283 window->SetBounds(gfx::Rect(window->bounds().x(), work_area.y(), |
| 273 window->GetBounds().width(), | 284 window->bounds().width(), |
| 274 work_area.height())); | 285 work_area.height())); |
| 275 } | 286 } |
| 276 return true; | 287 return true; |
| 277 } | 288 } |
| 278 case WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE: { | 289 case WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE: { |
| 279 // Maximize horizontally if: | 290 // Maximize horizontally if: |
| 280 // - The window does not have a max width defined. | 291 // - The window does not have a max width defined. |
| 281 // - The window is snapped or has the normal state type. | 292 // - The window is snapped or has the normal state type. |
| 282 if (window->GetMaximumSize().width() != 0) | 293 if (GetWindowMaximumSize(window).width() != 0) |
| 283 return true; | 294 return true; |
| 284 if (!window_state->IsNormalOrSnapped()) | 295 if (!window_state->IsNormalOrSnapped()) |
| 285 return true; | 296 return true; |
| 286 gfx::Rect work_area = | 297 gfx::Rect work_area = |
| 287 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window->aura_window()); | 298 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window); |
| 288 if (window_state->IsNormalStateType() && | 299 if (window_state->IsNormalStateType() && |
| 289 window_state->HasRestoreBounds() && | 300 window_state->HasRestoreBounds() && |
| 290 (window->GetBounds().width() == work_area.width() && | 301 (window->bounds().width() == work_area.width() && |
| 291 window->GetBounds().x() == work_area.x())) { | 302 window->bounds().x() == work_area.x())) { |
| 292 window_state->SetAndClearRestoreBounds(); | 303 window_state->SetAndClearRestoreBounds(); |
| 293 } else { | 304 } else { |
| 294 gfx::Rect new_bounds(work_area.x(), window->GetBounds().y(), | 305 gfx::Rect new_bounds(work_area.x(), window->bounds().y(), |
| 295 work_area.width(), window->GetBounds().height()); | 306 work_area.width(), window->bounds().height()); |
| 296 | 307 |
| 297 gfx::Rect restore_bounds = window->GetBounds(); | 308 gfx::Rect restore_bounds = window->bounds(); |
| 298 if (window_state->IsSnapped()) { | 309 if (window_state->IsSnapped()) { |
| 299 window_state->SetRestoreBoundsInParent(new_bounds); | 310 window_state->SetRestoreBoundsInParent(new_bounds); |
| 300 window_state->Restore(); | 311 window_state->Restore(); |
| 301 | 312 |
| 302 // The restore logic prevents a window from being restored to bounds | 313 // The restore logic prevents a window from being restored to bounds |
| 303 // which match the workspace bounds exactly so it is necessary to set | 314 // which match the workspace bounds exactly so it is necessary to set |
| 304 // the bounds again below. | 315 // the bounds again below. |
| 305 } | 316 } |
| 306 | 317 |
| 307 window_state->SetRestoreBoundsInParent(restore_bounds); | 318 window_state->SetRestoreBoundsInParent(restore_bounds); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 // root window, the bounds will be updated after they are added | 358 // root window, the bounds will be updated after they are added |
| 348 // to the root window. | 359 // to the root window. |
| 349 // If a window is opened as maximized or fullscreen, its bounds may be | 360 // If a window is opened as maximized or fullscreen, its bounds may be |
| 350 // empty, so update the bounds now before checking empty. | 361 // empty, so update the bounds now before checking empty. |
| 351 if (window_state->is_dragged() || | 362 if (window_state->is_dragged() || |
| 352 window_state->allow_set_bounds_direct() || | 363 window_state->allow_set_bounds_direct() || |
| 353 SetMaximizedOrFullscreenBounds(window_state)) { | 364 SetMaximizedOrFullscreenBounds(window_state)) { |
| 354 return true; | 365 return true; |
| 355 } | 366 } |
| 356 | 367 |
| 357 WmWindow* window = window_state->window(); | 368 aura::Window* window = window_state->window(); |
| 358 gfx::Rect bounds = window->GetBounds(); | 369 gfx::Rect bounds = window->bounds(); |
| 359 | 370 |
| 360 // Don't adjust window bounds if the bounds are empty as this | 371 // Don't adjust window bounds if the bounds are empty as this |
| 361 // happens when a new views::Widget is created. | 372 // happens when a new views::Widget is created. |
| 362 if (bounds.IsEmpty()) | 373 if (bounds.IsEmpty()) |
| 363 return true; | 374 return true; |
| 364 | 375 |
| 365 // Only windows of type WINDOW_TYPE_NORMAL or WINDOW_TYPE_PANEL need to be | 376 // Only windows of type WINDOW_TYPE_NORMAL or WINDOW_TYPE_PANEL need to be |
| 366 // adjusted to have minimum visibility, because they are positioned by the | 377 // adjusted to have minimum visibility, because they are positioned by the |
| 367 // user and user should always be able to interact with them. Other | 378 // user and user should always be able to interact with them. Other |
| 368 // windows are positioned programmatically. | 379 // windows are positioned programmatically. |
| 369 if (!window_state->IsUserPositionable()) | 380 if (!window_state->IsUserPositionable()) |
| 370 return true; | 381 return true; |
| 371 | 382 |
| 372 // Use entire display instead of workarea. The logic ensures 30% | 383 // Use entire display instead of workarea. The logic ensures 30% |
| 373 // visibility which should be enough to see where the window gets | 384 // visibility which should be enough to see where the window gets |
| 374 // moved. | 385 // moved. |
| 375 gfx::Rect display_area = | 386 gfx::Rect display_area = ScreenUtil::GetDisplayBoundsInParent(window); |
| 376 ScreenUtil::GetDisplayBoundsInParent(window->aura_window()); | |
| 377 int min_width = bounds.width() * wm::kMinimumPercentOnScreenArea; | 387 int min_width = bounds.width() * wm::kMinimumPercentOnScreenArea; |
| 378 int min_height = bounds.height() * wm::kMinimumPercentOnScreenArea; | 388 int min_height = bounds.height() * wm::kMinimumPercentOnScreenArea; |
| 379 wm::AdjustBoundsToEnsureWindowVisibility(display_area, min_width, | 389 wm::AdjustBoundsToEnsureWindowVisibility(display_area, min_width, |
| 380 min_height, &bounds); | 390 min_height, &bounds); |
| 381 window_state->AdjustSnappedBounds(&bounds); | 391 window_state->AdjustSnappedBounds(&bounds); |
| 382 if (window->GetBounds() != bounds) | 392 if (window->bounds() != bounds) |
| 383 window_state->SetBoundsConstrained(bounds); | 393 window_state->SetBoundsConstrained(bounds); |
| 384 return true; | 394 return true; |
| 385 } | 395 } |
| 386 case WM_EVENT_DISPLAY_BOUNDS_CHANGED: { | 396 case WM_EVENT_DISPLAY_BOUNDS_CHANGED: { |
| 387 if (window_state->is_dragged() || | 397 if (window_state->is_dragged() || |
| 388 window_state->allow_set_bounds_direct() || | 398 window_state->allow_set_bounds_direct() || |
| 389 SetMaximizedOrFullscreenBounds(window_state)) { | 399 SetMaximizedOrFullscreenBounds(window_state)) { |
| 390 return true; | 400 return true; |
| 391 } | 401 } |
| 392 gfx::Rect work_area_in_parent = | 402 gfx::Rect work_area_in_parent = |
| 393 ScreenUtil::GetDisplayWorkAreaBoundsInParent( | 403 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_state->window()); |
| 394 window_state->window()->aura_window()); | |
| 395 gfx::Rect bounds = window_state->window()->GetTargetBounds(); | 404 gfx::Rect bounds = window_state->window()->GetTargetBounds(); |
| 396 // When display bounds has changed, make sure the entire window is fully | 405 // When display bounds has changed, make sure the entire window is fully |
| 397 // visible. | 406 // visible. |
| 398 bounds.AdjustToFit(work_area_in_parent); | 407 bounds.AdjustToFit(work_area_in_parent); |
| 399 window_state->AdjustSnappedBounds(&bounds); | 408 window_state->AdjustSnappedBounds(&bounds); |
| 400 if (window_state->window()->GetTargetBounds() != bounds) | 409 if (window_state->window()->GetTargetBounds() != bounds) |
| 401 window_state->SetBoundsDirectAnimated(bounds); | 410 window_state->SetBoundsDirectAnimated(bounds); |
| 402 return true; | 411 return true; |
| 403 } | 412 } |
| 404 case WM_EVENT_WORKAREA_BOUNDS_CHANGED: { | 413 case WM_EVENT_WORKAREA_BOUNDS_CHANGED: { |
| 405 // Don't resize the maximized window when the desktop is covered | 414 // Don't resize the maximized window when the desktop is covered |
| 406 // by fullscreen window. crbug.com/504299. | 415 // by fullscreen window. crbug.com/504299. |
| 407 bool in_fullscreen = | 416 bool in_fullscreen = |
| 408 window_state->window() | 417 RootWindowController::ForWindow(window_state->window()) |
| 409 ->GetRootWindowController() | |
| 410 ->GetWorkspaceWindowState() == WORKSPACE_WINDOW_STATE_FULL_SCREEN; | 418 ->GetWorkspaceWindowState() == WORKSPACE_WINDOW_STATE_FULL_SCREEN; |
| 411 if (in_fullscreen && window_state->IsMaximized()) | 419 if (in_fullscreen && window_state->IsMaximized()) |
| 412 return true; | 420 return true; |
| 413 | 421 |
| 414 if (window_state->is_dragged() || | 422 if (window_state->is_dragged() || |
| 415 window_state->allow_set_bounds_direct() || | 423 window_state->allow_set_bounds_direct() || |
| 416 SetMaximizedOrFullscreenBounds(window_state)) { | 424 SetMaximizedOrFullscreenBounds(window_state)) { |
| 417 return true; | 425 return true; |
| 418 } | 426 } |
| 419 gfx::Rect work_area_in_parent = | 427 gfx::Rect work_area_in_parent = |
| 420 ScreenUtil::GetDisplayWorkAreaBoundsInParent( | 428 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_state->window()); |
| 421 window_state->window()->aura_window()); | |
| 422 gfx::Rect bounds = window_state->window()->GetTargetBounds(); | 429 gfx::Rect bounds = window_state->window()->GetTargetBounds(); |
| 423 if (!window_state->window()->GetTransientParent()) { | 430 if (!::wm::GetTransientParent(window_state->window())) { |
| 424 wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area_in_parent, | 431 wm::AdjustBoundsToEnsureMinimumWindowVisibility(work_area_in_parent, |
| 425 &bounds); | 432 &bounds); |
| 426 } | 433 } |
| 427 window_state->AdjustSnappedBounds(&bounds); | 434 window_state->AdjustSnappedBounds(&bounds); |
| 428 if (window_state->window()->GetTargetBounds() != bounds) | 435 if (window_state->window()->GetTargetBounds() != bounds) |
| 429 window_state->SetBoundsDirectAnimated(bounds); | 436 window_state->SetBoundsDirectAnimated(bounds); |
| 430 return true; | 437 return true; |
| 431 } | 438 } |
| 432 case WM_EVENT_TOGGLE_MAXIMIZE_CAPTION: | 439 case WM_EVENT_TOGGLE_MAXIMIZE_CAPTION: |
| 433 case WM_EVENT_TOGGLE_MAXIMIZE: | 440 case WM_EVENT_TOGGLE_MAXIMIZE: |
| (...skipping 16 matching lines...) Expand all Loading... |
| 450 break; | 457 break; |
| 451 } | 458 } |
| 452 return false; | 459 return false; |
| 453 } | 460 } |
| 454 | 461 |
| 455 // static | 462 // static |
| 456 bool DefaultState::SetMaximizedOrFullscreenBounds(WindowState* window_state) { | 463 bool DefaultState::SetMaximizedOrFullscreenBounds(WindowState* window_state) { |
| 457 DCHECK(!window_state->is_dragged()); | 464 DCHECK(!window_state->is_dragged()); |
| 458 DCHECK(!window_state->allow_set_bounds_direct()); | 465 DCHECK(!window_state->allow_set_bounds_direct()); |
| 459 if (window_state->IsMaximized()) { | 466 if (window_state->IsMaximized()) { |
| 460 window_state->SetBoundsDirect(ScreenUtil::GetMaximizedWindowBoundsInParent( | 467 window_state->SetBoundsDirect( |
| 461 window_state->window()->aura_window())); | 468 ScreenUtil::GetMaximizedWindowBoundsInParent(window_state->window())); |
| 462 return true; | 469 return true; |
| 463 } | 470 } |
| 464 if (window_state->IsFullscreen()) { | 471 if (window_state->IsFullscreen()) { |
| 465 window_state->SetBoundsDirect(ScreenUtil::GetDisplayBoundsInParent( | 472 window_state->SetBoundsDirect( |
| 466 window_state->window()->aura_window())); | 473 ScreenUtil::GetDisplayBoundsInParent(window_state->window())); |
| 467 return true; | 474 return true; |
| 468 } | 475 } |
| 469 return false; | 476 return false; |
| 470 } | 477 } |
| 471 | 478 |
| 472 // static | 479 // static |
| 473 void DefaultState::SetBounds(WindowState* window_state, | 480 void DefaultState::SetBounds(WindowState* window_state, |
| 474 const SetBoundsEvent* event) { | 481 const SetBoundsEvent* event) { |
| 475 if (window_state->is_dragged() || window_state->allow_set_bounds_direct()) { | 482 if (window_state->is_dragged() || window_state->allow_set_bounds_direct()) { |
| 476 // TODO(oshima|varkha): Is this still needed? crbug.com/485612. | 483 // TODO(oshima|varkha): Is this still needed? crbug.com/485612. |
| 477 window_state->SetBoundsDirect(event->requested_bounds()); | 484 window_state->SetBoundsDirect(event->requested_bounds()); |
| 478 } else if (window_state->IsSnapped()) { | 485 } else if (window_state->IsSnapped()) { |
| 479 gfx::Rect work_area_in_parent = | 486 gfx::Rect work_area_in_parent = |
| 480 ScreenUtil::GetDisplayWorkAreaBoundsInParent( | 487 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_state->window()); |
| 481 window_state->window()->aura_window()); | |
| 482 gfx::Rect child_bounds(event->requested_bounds()); | 488 gfx::Rect child_bounds(event->requested_bounds()); |
| 483 wm::AdjustBoundsSmallerThan(work_area_in_parent.size(), &child_bounds); | 489 wm::AdjustBoundsSmallerThan(work_area_in_parent.size(), &child_bounds); |
| 484 window_state->AdjustSnappedBounds(&child_bounds); | 490 window_state->AdjustSnappedBounds(&child_bounds); |
| 485 window_state->SetBoundsDirect(child_bounds); | 491 window_state->SetBoundsDirect(child_bounds); |
| 486 } else if (!SetMaximizedOrFullscreenBounds(window_state)) { | 492 } else if (!SetMaximizedOrFullscreenBounds(window_state)) { |
| 487 window_state->SetBoundsConstrained(event->requested_bounds()); | 493 window_state->SetBoundsConstrained(event->requested_bounds()); |
| 488 } | 494 } |
| 489 } | 495 } |
| 490 | 496 |
| 491 void DefaultState::EnterToNextState(WindowState* window_state, | 497 void DefaultState::EnterToNextState(WindowState* window_state, |
| 492 WindowStateType next_state_type) { | 498 WindowStateType next_state_type) { |
| 493 // Do nothing if we're already in the same state. | 499 // Do nothing if we're already in the same state. |
| 494 if (state_type_ == next_state_type) | 500 if (state_type_ == next_state_type) |
| 495 return; | 501 return; |
| 496 | 502 |
| 497 WindowStateType previous_state_type = state_type_; | 503 WindowStateType previous_state_type = state_type_; |
| 498 state_type_ = next_state_type; | 504 state_type_ = next_state_type; |
| 499 | 505 |
| 500 window_state->UpdateWindowPropertiesFromStateType(); | 506 window_state->UpdateWindowPropertiesFromStateType(); |
| 501 window_state->NotifyPreStateTypeChange(previous_state_type); | 507 window_state->NotifyPreStateTypeChange(previous_state_type); |
| 502 | 508 |
| 503 if (window_state->window()->GetParent()) { | 509 if (window_state->window()->parent()) { |
| 504 if (!window_state->HasRestoreBounds() && | 510 if (!window_state->HasRestoreBounds() && |
| 505 (previous_state_type == WINDOW_STATE_TYPE_DEFAULT || | 511 (previous_state_type == WINDOW_STATE_TYPE_DEFAULT || |
| 506 previous_state_type == WINDOW_STATE_TYPE_NORMAL) && | 512 previous_state_type == WINDOW_STATE_TYPE_NORMAL) && |
| 507 !window_state->IsMinimized() && !window_state->IsNormalStateType()) { | 513 !window_state->IsMinimized() && !window_state->IsNormalStateType()) { |
| 508 window_state->SaveCurrentBoundsForRestore(); | 514 window_state->SaveCurrentBoundsForRestore(); |
| 509 } | 515 } |
| 510 | 516 |
| 511 // When restoring from a minimized state, we want to restore to the | 517 // When restoring from a minimized state, we want to restore to the |
| 512 // previous bounds. However, we want to maintain the restore bounds. | 518 // previous bounds. However, we want to maintain the restore bounds. |
| 513 // (The restore bounds are set if a user maximized the window in one | 519 // (The restore bounds are set if a user maximized the window in one |
| (...skipping 18 matching lines...) Expand all Loading... |
| 532 else if (window_state->IsNormalStateType()) | 538 else if (window_state->IsNormalStateType()) |
| 533 window_state->ClearRestoreBounds(); | 539 window_state->ClearRestoreBounds(); |
| 534 } | 540 } |
| 535 window_state->NotifyPostStateTypeChange(previous_state_type); | 541 window_state->NotifyPostStateTypeChange(previous_state_type); |
| 536 | 542 |
| 537 if (next_state_type == WINDOW_STATE_TYPE_PINNED || | 543 if (next_state_type == WINDOW_STATE_TYPE_PINNED || |
| 538 previous_state_type == WINDOW_STATE_TYPE_PINNED || | 544 previous_state_type == WINDOW_STATE_TYPE_PINNED || |
| 539 next_state_type == WINDOW_STATE_TYPE_TRUSTED_PINNED || | 545 next_state_type == WINDOW_STATE_TYPE_TRUSTED_PINNED || |
| 540 previous_state_type == WINDOW_STATE_TYPE_TRUSTED_PINNED) { | 546 previous_state_type == WINDOW_STATE_TYPE_TRUSTED_PINNED) { |
| 541 Shell::Get()->screen_pinning_controller()->SetPinnedWindow( | 547 Shell::Get()->screen_pinning_controller()->SetPinnedWindow( |
| 542 window_state->window()); | 548 WmWindow::Get(window_state->window())); |
| 543 } | 549 } |
| 544 } | 550 } |
| 545 | 551 |
| 546 void DefaultState::ReenterToCurrentState( | 552 void DefaultState::ReenterToCurrentState( |
| 547 WindowState* window_state, | 553 WindowState* window_state, |
| 548 WindowState::State* state_in_previous_mode) { | 554 WindowState::State* state_in_previous_mode) { |
| 549 WindowStateType previous_state_type = state_in_previous_mode->GetType(); | 555 WindowStateType previous_state_type = state_in_previous_mode->GetType(); |
| 550 | 556 |
| 551 // A state change should not move a window into or out of full screen or | 557 // A state change should not move a window into or out of full screen or |
| 552 // pinned since these are "special mode" the user wanted to be in and | 558 // pinned since these are "special mode" the user wanted to be in and |
| (...skipping 25 matching lines...) Expand all Loading... |
| 578 if (!stored_restore_bounds_.IsEmpty()) | 584 if (!stored_restore_bounds_.IsEmpty()) |
| 579 window_state->SetRestoreBoundsInParent(stored_restore_bounds_); | 585 window_state->SetRestoreBoundsInParent(stored_restore_bounds_); |
| 580 else | 586 else |
| 581 window_state->ClearRestoreBounds(); | 587 window_state->ClearRestoreBounds(); |
| 582 | 588 |
| 583 window_state->NotifyPostStateTypeChange(previous_state_type); | 589 window_state->NotifyPostStateTypeChange(previous_state_type); |
| 584 } | 590 } |
| 585 | 591 |
| 586 void DefaultState::UpdateBoundsFromState(WindowState* window_state, | 592 void DefaultState::UpdateBoundsFromState(WindowState* window_state, |
| 587 WindowStateType previous_state_type) { | 593 WindowStateType previous_state_type) { |
| 588 aura::Window* window = window_state->window()->aura_window(); | 594 aura::Window* window = window_state->window(); |
| 589 gfx::Rect bounds_in_parent; | 595 gfx::Rect bounds_in_parent; |
| 590 switch (state_type_) { | 596 switch (state_type_) { |
| 591 case WINDOW_STATE_TYPE_LEFT_SNAPPED: | 597 case WINDOW_STATE_TYPE_LEFT_SNAPPED: |
| 592 case WINDOW_STATE_TYPE_RIGHT_SNAPPED: | 598 case WINDOW_STATE_TYPE_RIGHT_SNAPPED: |
| 593 bounds_in_parent = | 599 bounds_in_parent = |
| 594 state_type_ == WINDOW_STATE_TYPE_LEFT_SNAPPED | 600 state_type_ == WINDOW_STATE_TYPE_LEFT_SNAPPED |
| 595 ? GetDefaultLeftSnappedWindowBoundsInParent(window) | 601 ? GetDefaultLeftSnappedWindowBoundsInParent(window) |
| 596 : GetDefaultRightSnappedWindowBoundsInParent(window); | 602 : GetDefaultRightSnappedWindowBoundsInParent(window); |
| 597 break; | 603 break; |
| 598 | 604 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 681 !window_state->IsMaximizedOrFullscreenOrPinned()) { | 687 !window_state->IsMaximizedOrFullscreenOrPinned()) { |
| 682 window_state->set_unminimize_to_restore_bounds(false); | 688 window_state->set_unminimize_to_restore_bounds(false); |
| 683 } | 689 } |
| 684 } | 690 } |
| 685 } | 691 } |
| 686 | 692 |
| 687 // static | 693 // static |
| 688 void DefaultState::CenterWindow(WindowState* window_state) { | 694 void DefaultState::CenterWindow(WindowState* window_state) { |
| 689 if (!window_state->IsNormalOrSnapped()) | 695 if (!window_state->IsNormalOrSnapped()) |
| 690 return; | 696 return; |
| 691 WmWindow* window = window_state->window(); | 697 aura::Window* window = window_state->window(); |
| 692 if (window_state->IsSnapped()) { | 698 if (window_state->IsSnapped()) { |
| 693 gfx::Rect center_in_screen = window->GetDisplayNearestWindow().work_area(); | 699 gfx::Rect center_in_screen = display::Screen::GetScreen() |
| 700 ->GetDisplayNearestWindow(window) |
| 701 .work_area(); |
| 694 gfx::Size size = window_state->HasRestoreBounds() | 702 gfx::Size size = window_state->HasRestoreBounds() |
| 695 ? window_state->GetRestoreBoundsInScreen().size() | 703 ? window_state->GetRestoreBoundsInScreen().size() |
| 696 : window->GetBounds().size(); | 704 : window->bounds().size(); |
| 697 center_in_screen.ClampToCenteredSize(size); | 705 center_in_screen.ClampToCenteredSize(size); |
| 698 window_state->SetRestoreBoundsInScreen(center_in_screen); | 706 window_state->SetRestoreBoundsInScreen(center_in_screen); |
| 699 window_state->Restore(); | 707 window_state->Restore(); |
| 700 } else { | 708 } else { |
| 701 gfx::Rect center_in_parent = | 709 gfx::Rect center_in_parent = |
| 702 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window->aura_window()); | 710 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window); |
| 703 center_in_parent.ClampToCenteredSize(window->GetBounds().size()); | 711 center_in_parent.ClampToCenteredSize(window->bounds().size()); |
| 704 window_state->SetBoundsDirectAnimated(center_in_parent); | 712 window_state->SetBoundsDirectAnimated(center_in_parent); |
| 705 } | 713 } |
| 706 // Centering window is treated as if a user moved and resized the window. | 714 // Centering window is treated as if a user moved and resized the window. |
| 707 window_state->set_bounds_changed_by_user(true); | 715 window_state->set_bounds_changed_by_user(true); |
| 708 } | 716 } |
| 709 | 717 |
| 710 } // namespace wm | 718 } // namespace wm |
| 711 } // namespace ash | 719 } // namespace ash |
| OLD | NEW |