| 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/common/wm/default_state.h" | 5 #include "ash/common/wm/default_state.h" |
| 6 | 6 |
| 7 #include "ash/common/ash_switches.h" | |
| 8 #include "ash/common/wm/dock/docked_window_layout_manager.h" | |
| 9 #include "ash/common/wm/window_animation_types.h" | 7 #include "ash/common/wm/window_animation_types.h" |
| 10 #include "ash/common/wm/window_parenting_utils.h" | 8 #include "ash/common/wm/window_parenting_utils.h" |
| 11 #include "ash/common/wm/window_positioning_utils.h" | 9 #include "ash/common/wm/window_positioning_utils.h" |
| 12 #include "ash/common/wm/window_state.h" | 10 #include "ash/common/wm/window_state.h" |
| 13 #include "ash/common/wm/window_state_delegate.h" | 11 #include "ash/common/wm/window_state_delegate.h" |
| 14 #include "ash/common/wm/window_state_util.h" | 12 #include "ash/common/wm/window_state_util.h" |
| 15 #include "ash/common/wm/wm_event.h" | 13 #include "ash/common/wm/wm_event.h" |
| 16 #include "ash/common/wm/wm_screen_util.h" | 14 #include "ash/common/wm/wm_screen_util.h" |
| 17 #include "ash/common/wm_shell.h" | 15 #include "ash/common/wm_shell.h" |
| 18 #include "ash/common/wm_window.h" | 16 #include "ash/common/wm_window.h" |
| 19 #include "ash/public/cpp/shell_window_ids.h" | 17 #include "ash/public/cpp/shell_window_ids.h" |
| 20 #include "ash/root_window_controller.h" | 18 #include "ash/root_window_controller.h" |
| 21 #include "ui/display/display.h" | 19 #include "ui/display/display.h" |
| 22 #include "ui/display/screen.h" | 20 #include "ui/display/screen.h" |
| 23 | 21 |
| 24 namespace ash { | 22 namespace ash { |
| 25 namespace wm { | 23 namespace wm { |
| 26 namespace { | 24 namespace { |
| 27 | 25 |
| 28 // This specifies how much percent (30%) of a window rect | 26 // This specifies how much percent (30%) of a window rect |
| 29 // must be visible when the window is added to the workspace. | 27 // must be visible when the window is added to the workspace. |
| 30 const float kMinimumPercentOnScreenArea = 0.3f; | 28 const float kMinimumPercentOnScreenArea = 0.3f; |
| 31 | 29 |
| 32 // When a window that has restore bounds at least as large as a work area is | 30 // When a window that has restore bounds at least as large as a work area is |
| 33 // unmaximized, inset the bounds slightly so that they are not exactly the same. | 31 // unmaximized, inset the bounds slightly so that they are not exactly the same. |
| 34 // This makes it easier to resize the window. | 32 // This makes it easier to resize the window. |
| 35 const int kMaximizedWindowInset = 10; // DIPs. | 33 const int kMaximizedWindowInset = 10; // DIPs. |
| 36 | 34 |
| 37 bool IsMinimizedWindowState(const WindowStateType state_type) { | 35 bool IsMinimizedWindowState(const WindowStateType state_type) { |
| 38 return state_type == WINDOW_STATE_TYPE_MINIMIZED || | 36 return state_type == WINDOW_STATE_TYPE_MINIMIZED; |
| 39 state_type == WINDOW_STATE_TYPE_DOCKED_MINIMIZED; | |
| 40 } | 37 } |
| 41 | 38 |
| 42 void MoveToDisplayForRestore(WindowState* window_state) { | 39 void MoveToDisplayForRestore(WindowState* window_state) { |
| 43 if (!window_state->HasRestoreBounds()) | 40 if (!window_state->HasRestoreBounds()) |
| 44 return; | 41 return; |
| 45 const gfx::Rect restore_bounds = window_state->GetRestoreBoundsInScreen(); | 42 const gfx::Rect restore_bounds = window_state->GetRestoreBoundsInScreen(); |
| 46 | 43 |
| 47 // Move only if the restore bounds is outside of | 44 // Move only if the restore bounds is outside of |
| 48 // the display. There is no information about in which | 45 // the display. There is no information about in which |
| 49 // display it should be restored, so this is best guess. | 46 // display it should be restored, so this is best guess. |
| 50 // TODO(oshima): Restore information should contain the | 47 // TODO(oshima): Restore information should contain the |
| 51 // work area information like WindowResizer does for the | 48 // work area information like WindowResizer does for the |
| 52 // last window location. | 49 // last window location. |
| 53 gfx::Rect display_area = | 50 gfx::Rect display_area = |
| 54 window_state->window()->GetDisplayNearestWindow().bounds(); | 51 window_state->window()->GetDisplayNearestWindow().bounds(); |
| 55 | 52 |
| 56 if (!display_area.Intersects(restore_bounds)) { | 53 if (!display_area.Intersects(restore_bounds)) { |
| 57 const display::Display& display = | 54 const display::Display& display = |
| 58 display::Screen::GetScreen()->GetDisplayMatching(restore_bounds); | 55 display::Screen::GetScreen()->GetDisplayMatching(restore_bounds); |
| 59 WmShell* shell = window_state->window()->GetShell(); | 56 WmShell* shell = window_state->window()->GetShell(); |
| 60 WmWindow* new_root = shell->GetRootWindowForDisplayId(display.id()); | 57 WmWindow* new_root = shell->GetRootWindowForDisplayId(display.id()); |
| 61 if (new_root != window_state->window()->GetRootWindow()) { | 58 if (new_root != window_state->window()->GetRootWindow()) { |
| 62 WmWindow* new_container = new_root->GetChildByShellWindowId( | 59 WmWindow* new_container = new_root->GetChildByShellWindowId( |
| 63 window_state->window()->GetParent()->GetShellWindowId()); | 60 window_state->window()->GetParent()->GetShellWindowId()); |
| 64 new_container->AddChild(window_state->window()); | 61 new_container->AddChild(window_state->window()); |
| 65 } | 62 } |
| 66 } | 63 } |
| 67 } | 64 } |
| 68 | 65 |
| 69 DockedWindowLayoutManager* GetDockedWindowLayoutManager(WmShell* shell) { | |
| 70 return DockedWindowLayoutManager::Get(shell->GetActiveWindow()); | |
| 71 } | |
| 72 | |
| 73 class ScopedPreferredAlignmentResetter { | |
| 74 public: | |
| 75 ScopedPreferredAlignmentResetter(DockedAlignment dock_alignment, | |
| 76 DockedWindowLayoutManager* dock_layout) | |
| 77 : docked_window_layout_manager_(dock_layout) { | |
| 78 docked_window_layout_manager_->set_preferred_alignment(dock_alignment); | |
| 79 } | |
| 80 ~ScopedPreferredAlignmentResetter() { | |
| 81 docked_window_layout_manager_->set_preferred_alignment( | |
| 82 DOCKED_ALIGNMENT_NONE); | |
| 83 } | |
| 84 | |
| 85 private: | |
| 86 DockedWindowLayoutManager* docked_window_layout_manager_; | |
| 87 | |
| 88 DISALLOW_COPY_AND_ASSIGN(ScopedPreferredAlignmentResetter); | |
| 89 }; | |
| 90 | |
| 91 class ScopedDockedLayoutEventSourceResetter { | |
| 92 public: | |
| 93 ScopedDockedLayoutEventSourceResetter(DockedWindowLayoutManager* dock_layout) | |
| 94 : docked_window_layout_manager_(dock_layout) { | |
| 95 docked_window_layout_manager_->set_event_source( | |
| 96 DOCKED_ACTION_SOURCE_KEYBOARD); | |
| 97 } | |
| 98 ~ScopedDockedLayoutEventSourceResetter() { | |
| 99 docked_window_layout_manager_->set_event_source( | |
| 100 DOCKED_ACTION_SOURCE_UNKNOWN); | |
| 101 } | |
| 102 | |
| 103 private: | |
| 104 DockedWindowLayoutManager* docked_window_layout_manager_; | |
| 105 | |
| 106 DISALLOW_COPY_AND_ASSIGN(ScopedDockedLayoutEventSourceResetter); | |
| 107 }; | |
| 108 | |
| 109 void CycleSnap(WindowState* window_state, WMEventType event) { | 66 void CycleSnap(WindowState* window_state, WMEventType event) { |
| 110 DCHECK(!ash::switches::DockedWindowsEnabled()); | |
| 111 | |
| 112 wm::WindowStateType desired_snap_state = | 67 wm::WindowStateType desired_snap_state = |
| 113 event == WM_EVENT_CYCLE_SNAP_DOCK_LEFT | 68 event == WM_EVENT_CYCLE_SNAP_LEFT ? wm::WINDOW_STATE_TYPE_LEFT_SNAPPED |
| 114 ? wm::WINDOW_STATE_TYPE_LEFT_SNAPPED | 69 : wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED; |
| 115 : wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED; | |
| 116 | 70 |
| 117 if (window_state->CanSnap() && | 71 if (window_state->CanSnap() && |
| 118 window_state->GetStateType() != desired_snap_state && | 72 window_state->GetStateType() != desired_snap_state && |
| 119 window_state->window()->GetType() != ui::wm::WINDOW_TYPE_PANEL) { | 73 window_state->window()->GetType() != ui::wm::WINDOW_TYPE_PANEL) { |
| 120 const wm::WMEvent event(desired_snap_state == | 74 const wm::WMEvent event(desired_snap_state == |
| 121 wm::WINDOW_STATE_TYPE_LEFT_SNAPPED | 75 wm::WINDOW_STATE_TYPE_LEFT_SNAPPED |
| 122 ? wm::WM_EVENT_SNAP_LEFT | 76 ? wm::WM_EVENT_SNAP_LEFT |
| 123 : wm::WM_EVENT_SNAP_RIGHT); | 77 : wm::WM_EVENT_SNAP_RIGHT); |
| 124 window_state->OnWMEvent(&event); | 78 window_state->OnWMEvent(&event); |
| 125 return; | 79 return; |
| 126 } | 80 } |
| 127 | 81 |
| 128 if (window_state->IsSnapped()) { | 82 if (window_state->IsSnapped()) { |
| 129 window_state->Restore(); | 83 window_state->Restore(); |
| 130 return; | 84 return; |
| 131 } | 85 } |
| 132 window_state->window()->Animate(::wm::WINDOW_ANIMATION_TYPE_BOUNCE); | 86 window_state->window()->Animate(::wm::WINDOW_ANIMATION_TYPE_BOUNCE); |
| 133 } | 87 } |
| 134 | 88 |
| 135 void CycleSnapDock(WindowState* window_state, WMEventType event) { | |
| 136 DCHECK(ash::switches::DockedWindowsEnabled()); | |
| 137 | |
| 138 DockedWindowLayoutManager* dock_layout = | |
| 139 GetDockedWindowLayoutManager(window_state->window()->GetShell()); | |
| 140 wm::WindowStateType desired_snap_state = | |
| 141 event == WM_EVENT_CYCLE_SNAP_DOCK_LEFT | |
| 142 ? wm::WINDOW_STATE_TYPE_LEFT_SNAPPED | |
| 143 : wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED; | |
| 144 DockedAlignment desired_dock_alignment = | |
| 145 event == WM_EVENT_CYCLE_SNAP_DOCK_LEFT ? DOCKED_ALIGNMENT_LEFT | |
| 146 : DOCKED_ALIGNMENT_RIGHT; | |
| 147 DockedAlignment current_dock_alignment = | |
| 148 dock_layout ? dock_layout->CalculateAlignment() : DOCKED_ALIGNMENT_NONE; | |
| 149 | |
| 150 if (!window_state->IsDocked() || | |
| 151 (current_dock_alignment != DOCKED_ALIGNMENT_NONE && | |
| 152 current_dock_alignment != desired_dock_alignment)) { | |
| 153 if (window_state->CanSnap() && | |
| 154 window_state->GetStateType() != desired_snap_state && | |
| 155 window_state->window()->GetType() != ui::wm::WINDOW_TYPE_PANEL) { | |
| 156 const wm::WMEvent event(desired_snap_state == | |
| 157 wm::WINDOW_STATE_TYPE_LEFT_SNAPPED | |
| 158 ? wm::WM_EVENT_SNAP_LEFT | |
| 159 : wm::WM_EVENT_SNAP_RIGHT); | |
| 160 window_state->OnWMEvent(&event); | |
| 161 return; | |
| 162 } | |
| 163 | |
| 164 if (dock_layout && | |
| 165 dock_layout->CanDockWindow(window_state->window(), | |
| 166 desired_dock_alignment)) { | |
| 167 if (window_state->IsDocked()) { | |
| 168 dock_layout->MaybeSetDesiredDockedAlignment(desired_dock_alignment); | |
| 169 return; | |
| 170 } | |
| 171 | |
| 172 ScopedDockedLayoutEventSourceResetter event_source_resetter(dock_layout); | |
| 173 ScopedPreferredAlignmentResetter alignmentResetter(desired_dock_alignment, | |
| 174 dock_layout); | |
| 175 const wm::WMEvent event(wm::WM_EVENT_DOCK); | |
| 176 window_state->OnWMEvent(&event); | |
| 177 return; | |
| 178 } | |
| 179 } | |
| 180 | |
| 181 if (window_state->IsDocked() || window_state->IsSnapped()) { | |
| 182 ScopedDockedLayoutEventSourceResetter event_source_resetter(dock_layout); | |
| 183 window_state->Restore(); | |
| 184 return; | |
| 185 } | |
| 186 window_state->window()->Animate(::wm::WINDOW_ANIMATION_TYPE_BOUNCE); | |
| 187 } | |
| 188 | |
| 189 } // namespace | 89 } // namespace |
| 190 | 90 |
| 191 DefaultState::DefaultState(WindowStateType initial_state_type) | 91 DefaultState::DefaultState(WindowStateType initial_state_type) |
| 192 : state_type_(initial_state_type), stored_window_state_(nullptr) {} | 92 : state_type_(initial_state_type), stored_window_state_(nullptr) {} |
| 193 DefaultState::~DefaultState() {} | 93 DefaultState::~DefaultState() {} |
| 194 | 94 |
| 195 void DefaultState::OnWMEvent(WindowState* window_state, const WMEvent* event) { | 95 void DefaultState::OnWMEvent(WindowState* window_state, const WMEvent* event) { |
| 196 if (ProcessWorkspaceEvents(window_state, event)) | 96 if (ProcessWorkspaceEvents(window_state, event)) |
| 197 return; | 97 return; |
| 198 | 98 |
| 199 // Do not change the PINNED window state if this is not unpin event. | 99 // Do not change the PINNED window state if this is not unpin event. |
| 200 if (window_state->IsTrustedPinned() && event->type() != WM_EVENT_NORMAL) | 100 if (window_state->IsTrustedPinned() && event->type() != WM_EVENT_NORMAL) |
| 201 return; | 101 return; |
| 202 | 102 |
| 203 if (ProcessCompoundEvents(window_state, event)) | 103 if (ProcessCompoundEvents(window_state, event)) |
| 204 return; | 104 return; |
| 205 | 105 |
| 206 WindowStateType current_state_type = window_state->GetStateType(); | 106 WindowStateType current_state_type = window_state->GetStateType(); |
| 207 WindowStateType next_state_type = WINDOW_STATE_TYPE_NORMAL; | 107 WindowStateType next_state_type = WINDOW_STATE_TYPE_NORMAL; |
| 208 switch (event->type()) { | 108 switch (event->type()) { |
| 209 case WM_EVENT_NORMAL: | 109 case WM_EVENT_NORMAL: |
| 210 next_state_type = current_state_type == WINDOW_STATE_TYPE_DOCKED_MINIMIZED | 110 next_state_type = WINDOW_STATE_TYPE_NORMAL; |
| 211 ? WINDOW_STATE_TYPE_DOCKED | |
| 212 : WINDOW_STATE_TYPE_NORMAL; | |
| 213 break; | 111 break; |
| 214 case WM_EVENT_MAXIMIZE: | 112 case WM_EVENT_MAXIMIZE: |
| 215 next_state_type = WINDOW_STATE_TYPE_MAXIMIZED; | 113 next_state_type = WINDOW_STATE_TYPE_MAXIMIZED; |
| 216 break; | 114 break; |
| 217 case WM_EVENT_MINIMIZE: | 115 case WM_EVENT_MINIMIZE: |
| 218 next_state_type = current_state_type == WINDOW_STATE_TYPE_DOCKED | 116 next_state_type = WINDOW_STATE_TYPE_MINIMIZED; |
| 219 ? WINDOW_STATE_TYPE_DOCKED_MINIMIZED | |
| 220 : WINDOW_STATE_TYPE_MINIMIZED; | |
| 221 break; | 117 break; |
| 222 case WM_EVENT_FULLSCREEN: | 118 case WM_EVENT_FULLSCREEN: |
| 223 next_state_type = WINDOW_STATE_TYPE_FULLSCREEN; | 119 next_state_type = WINDOW_STATE_TYPE_FULLSCREEN; |
| 224 break; | 120 break; |
| 225 case WM_EVENT_SNAP_LEFT: | 121 case WM_EVENT_SNAP_LEFT: |
| 226 next_state_type = WINDOW_STATE_TYPE_LEFT_SNAPPED; | 122 next_state_type = WINDOW_STATE_TYPE_LEFT_SNAPPED; |
| 227 break; | 123 break; |
| 228 case WM_EVENT_SNAP_RIGHT: | 124 case WM_EVENT_SNAP_RIGHT: |
| 229 next_state_type = WINDOW_STATE_TYPE_RIGHT_SNAPPED; | 125 next_state_type = WINDOW_STATE_TYPE_RIGHT_SNAPPED; |
| 230 break; | 126 break; |
| 231 case WM_EVENT_DOCK: | |
| 232 next_state_type = WINDOW_STATE_TYPE_DOCKED; | |
| 233 break; | |
| 234 case WM_EVENT_SET_BOUNDS: | 127 case WM_EVENT_SET_BOUNDS: |
| 235 SetBounds(window_state, static_cast<const SetBoundsEvent*>(event)); | 128 SetBounds(window_state, static_cast<const SetBoundsEvent*>(event)); |
| 236 return; | 129 return; |
| 237 case WM_EVENT_SHOW_INACTIVE: | 130 case WM_EVENT_SHOW_INACTIVE: |
| 238 next_state_type = WINDOW_STATE_TYPE_INACTIVE; | 131 next_state_type = WINDOW_STATE_TYPE_INACTIVE; |
| 239 break; | 132 break; |
| 240 case WM_EVENT_PIN: | 133 case WM_EVENT_PIN: |
| 241 case WM_EVENT_TRUSTED_PIN: | 134 case WM_EVENT_TRUSTED_PIN: |
| 242 // If there already is a pinned window, it is not allowed to set it | 135 // If there already is a pinned window, it is not allowed to set it |
| 243 // to this window. | 136 // to this window. |
| 244 // TODO(hidehiko): If a system modal window is openening, the pinning | 137 // TODO(hidehiko): If a system modal window is openening, the pinning |
| 245 // probably should fail. | 138 // probably should fail. |
| 246 if (WmShell::Get()->IsPinned()) { | 139 if (WmShell::Get()->IsPinned()) { |
| 247 LOG(ERROR) << "An PIN event will be failed since another window is " | 140 LOG(ERROR) << "An PIN event will be failed since another window is " |
| 248 << "already in pinned mode."; | 141 << "already in pinned mode."; |
| 249 next_state_type = current_state_type; | 142 next_state_type = current_state_type; |
| 250 } else { | 143 } else { |
| 251 next_state_type = event->type() == WM_EVENT_PIN | 144 next_state_type = event->type() == WM_EVENT_PIN |
| 252 ? WINDOW_STATE_TYPE_PINNED | 145 ? WINDOW_STATE_TYPE_PINNED |
| 253 : WINDOW_STATE_TYPE_TRUSTED_PINNED; | 146 : WINDOW_STATE_TYPE_TRUSTED_PINNED; |
| 254 } | 147 } |
| 255 break; | 148 break; |
| 256 case WM_EVENT_TOGGLE_MAXIMIZE_CAPTION: | 149 case WM_EVENT_TOGGLE_MAXIMIZE_CAPTION: |
| 257 case WM_EVENT_TOGGLE_MAXIMIZE: | 150 case WM_EVENT_TOGGLE_MAXIMIZE: |
| 258 case WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE: | 151 case WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE: |
| 259 case WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE: | 152 case WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE: |
| 260 case WM_EVENT_TOGGLE_FULLSCREEN: | 153 case WM_EVENT_TOGGLE_FULLSCREEN: |
| 261 case WM_EVENT_CYCLE_SNAP_DOCK_LEFT: | 154 case WM_EVENT_CYCLE_SNAP_LEFT: |
| 262 case WM_EVENT_CYCLE_SNAP_DOCK_RIGHT: | 155 case WM_EVENT_CYCLE_SNAP_RIGHT: |
| 263 case WM_EVENT_CENTER: | 156 case WM_EVENT_CENTER: |
| 264 NOTREACHED() << "Compound event should not reach here:" << event; | 157 NOTREACHED() << "Compound event should not reach here:" << event; |
| 265 return; | 158 return; |
| 266 case WM_EVENT_ADDED_TO_WORKSPACE: | 159 case WM_EVENT_ADDED_TO_WORKSPACE: |
| 267 case WM_EVENT_WORKAREA_BOUNDS_CHANGED: | 160 case WM_EVENT_WORKAREA_BOUNDS_CHANGED: |
| 268 case WM_EVENT_DISPLAY_BOUNDS_CHANGED: | 161 case WM_EVENT_DISPLAY_BOUNDS_CHANGED: |
| 269 NOTREACHED() << "Workspace event should not reach here:" << event; | 162 NOTREACHED() << "Workspace event should not reach here:" << event; |
| 270 return; | 163 return; |
| 271 } | 164 } |
| 272 | 165 |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 } | 297 } |
| 405 | 298 |
| 406 window_state->SetRestoreBoundsInParent(restore_bounds); | 299 window_state->SetRestoreBoundsInParent(restore_bounds); |
| 407 window->SetBounds(new_bounds); | 300 window->SetBounds(new_bounds); |
| 408 } | 301 } |
| 409 return true; | 302 return true; |
| 410 } | 303 } |
| 411 case WM_EVENT_TOGGLE_FULLSCREEN: | 304 case WM_EVENT_TOGGLE_FULLSCREEN: |
| 412 ToggleFullScreen(window_state, window_state->delegate()); | 305 ToggleFullScreen(window_state, window_state->delegate()); |
| 413 return true; | 306 return true; |
| 414 case WM_EVENT_CYCLE_SNAP_DOCK_LEFT: | 307 case WM_EVENT_CYCLE_SNAP_LEFT: |
| 415 case WM_EVENT_CYCLE_SNAP_DOCK_RIGHT: | 308 case WM_EVENT_CYCLE_SNAP_RIGHT: |
| 416 if (ash::switches::DockedWindowsEnabled()) | 309 CycleSnap(window_state, event->type()); |
| 417 CycleSnapDock(window_state, event->type()); | |
| 418 else | |
| 419 CycleSnap(window_state, event->type()); | |
| 420 return true; | 310 return true; |
| 421 case WM_EVENT_CENTER: | 311 case WM_EVENT_CENTER: |
| 422 CenterWindow(window_state); | 312 CenterWindow(window_state); |
| 423 return true; | 313 return true; |
| 424 case WM_EVENT_NORMAL: | 314 case WM_EVENT_NORMAL: |
| 425 case WM_EVENT_MAXIMIZE: | 315 case WM_EVENT_MAXIMIZE: |
| 426 case WM_EVENT_MINIMIZE: | 316 case WM_EVENT_MINIMIZE: |
| 427 case WM_EVENT_FULLSCREEN: | 317 case WM_EVENT_FULLSCREEN: |
| 428 case WM_EVENT_PIN: | 318 case WM_EVENT_PIN: |
| 429 case WM_EVENT_TRUSTED_PIN: | 319 case WM_EVENT_TRUSTED_PIN: |
| 430 case WM_EVENT_SNAP_LEFT: | 320 case WM_EVENT_SNAP_LEFT: |
| 431 case WM_EVENT_SNAP_RIGHT: | 321 case WM_EVENT_SNAP_RIGHT: |
| 432 case WM_EVENT_SET_BOUNDS: | 322 case WM_EVENT_SET_BOUNDS: |
| 433 case WM_EVENT_SHOW_INACTIVE: | 323 case WM_EVENT_SHOW_INACTIVE: |
| 434 case WM_EVENT_DOCK: | |
| 435 break; | 324 break; |
| 436 case WM_EVENT_ADDED_TO_WORKSPACE: | 325 case WM_EVENT_ADDED_TO_WORKSPACE: |
| 437 case WM_EVENT_WORKAREA_BOUNDS_CHANGED: | 326 case WM_EVENT_WORKAREA_BOUNDS_CHANGED: |
| 438 case WM_EVENT_DISPLAY_BOUNDS_CHANGED: | 327 case WM_EVENT_DISPLAY_BOUNDS_CHANGED: |
| 439 NOTREACHED() << "Workspace event should not reach here:" << event; | 328 NOTREACHED() << "Workspace event should not reach here:" << event; |
| 440 break; | 329 break; |
| 441 } | 330 } |
| 442 return false; | 331 return false; |
| 443 } | 332 } |
| 444 | 333 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 525 window_state->AdjustSnappedBounds(&bounds); | 414 window_state->AdjustSnappedBounds(&bounds); |
| 526 if (window_state->window()->GetTargetBounds() != bounds) | 415 if (window_state->window()->GetTargetBounds() != bounds) |
| 527 window_state->SetBoundsDirectAnimated(bounds); | 416 window_state->SetBoundsDirectAnimated(bounds); |
| 528 return true; | 417 return true; |
| 529 } | 418 } |
| 530 case WM_EVENT_TOGGLE_MAXIMIZE_CAPTION: | 419 case WM_EVENT_TOGGLE_MAXIMIZE_CAPTION: |
| 531 case WM_EVENT_TOGGLE_MAXIMIZE: | 420 case WM_EVENT_TOGGLE_MAXIMIZE: |
| 532 case WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE: | 421 case WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE: |
| 533 case WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE: | 422 case WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE: |
| 534 case WM_EVENT_TOGGLE_FULLSCREEN: | 423 case WM_EVENT_TOGGLE_FULLSCREEN: |
| 535 case WM_EVENT_CYCLE_SNAP_DOCK_LEFT: | 424 case WM_EVENT_CYCLE_SNAP_LEFT: |
| 536 case WM_EVENT_CYCLE_SNAP_DOCK_RIGHT: | 425 case WM_EVENT_CYCLE_SNAP_RIGHT: |
| 537 case WM_EVENT_CENTER: | 426 case WM_EVENT_CENTER: |
| 538 case WM_EVENT_NORMAL: | 427 case WM_EVENT_NORMAL: |
| 539 case WM_EVENT_MAXIMIZE: | 428 case WM_EVENT_MAXIMIZE: |
| 540 case WM_EVENT_MINIMIZE: | 429 case WM_EVENT_MINIMIZE: |
| 541 case WM_EVENT_FULLSCREEN: | 430 case WM_EVENT_FULLSCREEN: |
| 542 case WM_EVENT_PIN: | 431 case WM_EVENT_PIN: |
| 543 case WM_EVENT_TRUSTED_PIN: | 432 case WM_EVENT_TRUSTED_PIN: |
| 544 case WM_EVENT_SNAP_LEFT: | 433 case WM_EVENT_SNAP_LEFT: |
| 545 case WM_EVENT_SNAP_RIGHT: | 434 case WM_EVENT_SNAP_RIGHT: |
| 546 case WM_EVENT_SET_BOUNDS: | 435 case WM_EVENT_SET_BOUNDS: |
| 547 case WM_EVENT_SHOW_INACTIVE: | 436 case WM_EVENT_SHOW_INACTIVE: |
| 548 case WM_EVENT_DOCK: | |
| 549 break; | 437 break; |
| 550 } | 438 } |
| 551 return false; | 439 return false; |
| 552 } | 440 } |
| 553 | 441 |
| 554 // static | 442 // static |
| 555 bool DefaultState::SetMaximizedOrFullscreenBounds(WindowState* window_state) { | 443 bool DefaultState::SetMaximizedOrFullscreenBounds(WindowState* window_state) { |
| 556 DCHECK(!window_state->is_dragged()); | 444 DCHECK(!window_state->is_dragged()); |
| 557 if (window_state->IsMaximized()) { | 445 if (window_state->IsMaximized()) { |
| 558 window_state->SetBoundsDirect( | 446 window_state->SetBoundsDirect( |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 686 WmWindow* window = window_state->window(); | 574 WmWindow* window = window_state->window(); |
| 687 gfx::Rect bounds_in_parent; | 575 gfx::Rect bounds_in_parent; |
| 688 switch (state_type_) { | 576 switch (state_type_) { |
| 689 case WINDOW_STATE_TYPE_LEFT_SNAPPED: | 577 case WINDOW_STATE_TYPE_LEFT_SNAPPED: |
| 690 case WINDOW_STATE_TYPE_RIGHT_SNAPPED: | 578 case WINDOW_STATE_TYPE_RIGHT_SNAPPED: |
| 691 bounds_in_parent = | 579 bounds_in_parent = |
| 692 state_type_ == WINDOW_STATE_TYPE_LEFT_SNAPPED | 580 state_type_ == WINDOW_STATE_TYPE_LEFT_SNAPPED |
| 693 ? GetDefaultLeftSnappedWindowBoundsInParent(window) | 581 ? GetDefaultLeftSnappedWindowBoundsInParent(window) |
| 694 : GetDefaultRightSnappedWindowBoundsInParent(window); | 582 : GetDefaultRightSnappedWindowBoundsInParent(window); |
| 695 break; | 583 break; |
| 696 case WINDOW_STATE_TYPE_DOCKED: { | |
| 697 // TODO(afakhry): Remove in M58. | |
| 698 DCHECK(ash::switches::DockedWindowsEnabled()); | |
| 699 if (window->GetParent()->GetShellWindowId() != | |
| 700 kShellWindowId_DockedContainer) { | |
| 701 WmWindow* docked_container = | |
| 702 window->GetRootWindow()->GetChildByShellWindowId( | |
| 703 kShellWindowId_DockedContainer); | |
| 704 ReparentChildWithTransientChildren(window, window->GetParent(), | |
| 705 docked_container); | |
| 706 } | |
| 707 // Return early because we don't want to update the bounds of the | |
| 708 // window below; as the bounds are managed by the dock layout. | |
| 709 return; | |
| 710 } | |
| 711 case WINDOW_STATE_TYPE_DEFAULT: | 584 case WINDOW_STATE_TYPE_DEFAULT: |
| 712 case WINDOW_STATE_TYPE_NORMAL: { | 585 case WINDOW_STATE_TYPE_NORMAL: { |
| 713 gfx::Rect work_area_in_parent = GetDisplayWorkAreaBoundsInParent(window); | 586 gfx::Rect work_area_in_parent = GetDisplayWorkAreaBoundsInParent(window); |
| 714 if (window_state->HasRestoreBounds()) { | 587 if (window_state->HasRestoreBounds()) { |
| 715 bounds_in_parent = window_state->GetRestoreBoundsInParent(); | 588 bounds_in_parent = window_state->GetRestoreBoundsInParent(); |
| 716 // Check if the |window|'s restored size is bigger than the working area | 589 // Check if the |window|'s restored size is bigger than the working area |
| 717 // This may happen if a window was resized to maximized bounds or if the | 590 // This may happen if a window was resized to maximized bounds or if the |
| 718 // display resolution changed while the window was maximized. | 591 // display resolution changed while the window was maximized. |
| 719 if (previous_state_type == WINDOW_STATE_TYPE_MAXIMIZED && | 592 if (previous_state_type == WINDOW_STATE_TYPE_MAXIMIZED && |
| 720 bounds_in_parent.width() >= work_area_in_parent.width() && | 593 bounds_in_parent.width() >= work_area_in_parent.width() && |
| (...skipping 18 matching lines...) Expand all Loading... |
| 739 case WINDOW_STATE_TYPE_MAXIMIZED: | 612 case WINDOW_STATE_TYPE_MAXIMIZED: |
| 740 bounds_in_parent = GetMaximizedWindowBoundsInParent(window); | 613 bounds_in_parent = GetMaximizedWindowBoundsInParent(window); |
| 741 break; | 614 break; |
| 742 | 615 |
| 743 case WINDOW_STATE_TYPE_FULLSCREEN: | 616 case WINDOW_STATE_TYPE_FULLSCREEN: |
| 744 case WINDOW_STATE_TYPE_PINNED: | 617 case WINDOW_STATE_TYPE_PINNED: |
| 745 case WINDOW_STATE_TYPE_TRUSTED_PINNED: | 618 case WINDOW_STATE_TYPE_TRUSTED_PINNED: |
| 746 bounds_in_parent = GetDisplayBoundsInParent(window); | 619 bounds_in_parent = GetDisplayBoundsInParent(window); |
| 747 break; | 620 break; |
| 748 | 621 |
| 749 case WINDOW_STATE_TYPE_DOCKED_MINIMIZED: | |
| 750 case WINDOW_STATE_TYPE_MINIMIZED: | 622 case WINDOW_STATE_TYPE_MINIMIZED: |
| 751 break; | 623 break; |
| 752 case WINDOW_STATE_TYPE_INACTIVE: | 624 case WINDOW_STATE_TYPE_INACTIVE: |
| 753 case WINDOW_STATE_TYPE_END: | 625 case WINDOW_STATE_TYPE_END: |
| 754 case WINDOW_STATE_TYPE_AUTO_POSITIONED: | 626 case WINDOW_STATE_TYPE_AUTO_POSITIONED: |
| 755 return; | 627 return; |
| 756 } | 628 } |
| 757 | 629 |
| 758 if (!window_state->IsMinimized()) { | 630 if (!window_state->IsMinimized()) { |
| 759 if (IsMinimizedWindowState(previous_state_type) || | 631 if (IsMinimizedWindowState(previous_state_type) || |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 gfx::Rect center_in_parent = GetDisplayWorkAreaBoundsInParent(window); | 686 gfx::Rect center_in_parent = GetDisplayWorkAreaBoundsInParent(window); |
| 815 center_in_parent.ClampToCenteredSize(window->GetBounds().size()); | 687 center_in_parent.ClampToCenteredSize(window->GetBounds().size()); |
| 816 window_state->SetBoundsDirectAnimated(center_in_parent); | 688 window_state->SetBoundsDirectAnimated(center_in_parent); |
| 817 } | 689 } |
| 818 // Centering window is treated as if a user moved and resized the window. | 690 // Centering window is treated as if a user moved and resized the window. |
| 819 window_state->set_bounds_changed_by_user(true); | 691 window_state->set_bounds_changed_by_user(true); |
| 820 } | 692 } |
| 821 | 693 |
| 822 } // namespace wm | 694 } // namespace wm |
| 823 } // namespace ash | 695 } // namespace ash |
| OLD | NEW |