| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/workspace/workspace_window_resizer.h" | 5 #include "ash/common/wm/workspace/workspace_window_resizer.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #include <utility> | 9 #include <utility> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "ash/common/ash_switches.h" | |
| 13 #include "ash/common/metrics/user_metrics_action.h" | 12 #include "ash/common/metrics/user_metrics_action.h" |
| 14 #include "ash/common/wm/default_window_resizer.h" | 13 #include "ash/common/wm/default_window_resizer.h" |
| 15 #include "ash/common/wm/dock/docked_window_layout_manager.h" | |
| 16 #include "ash/common/wm/dock/docked_window_resizer.h" | |
| 17 #include "ash/common/wm/panels/panel_window_resizer.h" | 14 #include "ash/common/wm/panels/panel_window_resizer.h" |
| 18 #include "ash/common/wm/window_positioning_utils.h" | 15 #include "ash/common/wm/window_positioning_utils.h" |
| 19 #include "ash/common/wm/window_state.h" | 16 #include "ash/common/wm/window_state.h" |
| 20 #include "ash/common/wm/wm_event.h" | 17 #include "ash/common/wm/wm_event.h" |
| 21 #include "ash/common/wm/wm_screen_util.h" | 18 #include "ash/common/wm/wm_screen_util.h" |
| 22 #include "ash/common/wm/workspace/phantom_window_controller.h" | 19 #include "ash/common/wm/workspace/phantom_window_controller.h" |
| 23 #include "ash/common/wm/workspace/two_step_edge_cycler.h" | 20 #include "ash/common/wm/workspace/two_step_edge_cycler.h" |
| 24 #include "ash/common/wm_lookup.h" | 21 #include "ash/common/wm_lookup.h" |
| 25 #include "ash/common/wm_shell.h" | 22 #include "ash/common/wm_shell.h" |
| 26 #include "ash/common/wm_window.h" | 23 #include "ash/common/wm_window.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 // implement proper transition from one resizer to another during or at the | 57 // implement proper transition from one resizer to another during or at the |
| 61 // end of the drag. This also causes http://crbug.com/247085. | 58 // end of the drag. This also causes http://crbug.com/247085. |
| 62 // It seems the only thing the panel or dock resizer needs to do is notify the | 59 // It seems the only thing the panel or dock resizer needs to do is notify the |
| 63 // layout manager when a docked window is being dragged. We should have a | 60 // layout manager when a docked window is being dragged. We should have a |
| 64 // better way of doing this, perhaps by having a way of observing drags or | 61 // better way of doing this, perhaps by having a way of observing drags or |
| 65 // having a generic drag window wrapper which informs a layout manager that a | 62 // having a generic drag window wrapper which informs a layout manager that a |
| 66 // drag has started or stopped. | 63 // drag has started or stopped. |
| 67 // It may be possible to refactor and eliminate chaining. | 64 // It may be possible to refactor and eliminate chaining. |
| 68 std::unique_ptr<WindowResizer> window_resizer; | 65 std::unique_ptr<WindowResizer> window_resizer; |
| 69 | 66 |
| 70 if (!window_state->IsNormalOrSnapped() && !window_state->IsDocked()) | 67 if (!window_state->IsNormalOrSnapped()) |
| 71 return std::unique_ptr<WindowResizer>(); | 68 return std::unique_ptr<WindowResizer>(); |
| 72 | 69 |
| 73 int bounds_change = | 70 int bounds_change = |
| 74 WindowResizer::GetBoundsChangeForWindowComponent(window_component); | 71 WindowResizer::GetBoundsChangeForWindowComponent(window_component); |
| 75 if (bounds_change == WindowResizer::kBoundsChangeDirection_None) | 72 if (bounds_change == WindowResizer::kBoundsChangeDirection_None) |
| 76 return std::unique_ptr<WindowResizer>(); | 73 return std::unique_ptr<WindowResizer>(); |
| 77 | 74 |
| 78 window_state->CreateDragDetails(point_in_parent, window_component, source); | 75 window_state->CreateDragDetails(point_in_parent, window_component, source); |
| 79 const int parent_shell_window_id = | 76 const int parent_shell_window_id = |
| 80 window->GetParent() ? window->GetParent()->GetShellWindowId() : -1; | 77 window->GetParent() ? window->GetParent()->GetShellWindowId() : -1; |
| 81 if (window->GetParent() && | 78 if (window->GetParent() && |
| 82 (parent_shell_window_id == kShellWindowId_DefaultContainer || | 79 (parent_shell_window_id == kShellWindowId_DefaultContainer || |
| 83 parent_shell_window_id == kShellWindowId_DockedContainer || | |
| 84 parent_shell_window_id == kShellWindowId_PanelContainer)) { | 80 parent_shell_window_id == kShellWindowId_PanelContainer)) { |
| 85 window_resizer.reset( | 81 window_resizer.reset( |
| 86 WorkspaceWindowResizer::Create(window_state, std::vector<WmWindow*>())); | 82 WorkspaceWindowResizer::Create(window_state, std::vector<WmWindow*>())); |
| 87 } else { | 83 } else { |
| 88 window_resizer.reset(DefaultWindowResizer::Create(window_state)); | 84 window_resizer.reset(DefaultWindowResizer::Create(window_state)); |
| 89 } | 85 } |
| 90 window_resizer = window->GetShell()->CreateDragWindowResizer( | 86 window_resizer = window->GetShell()->CreateDragWindowResizer( |
| 91 std::move(window_resizer), window_state); | 87 std::move(window_resizer), window_state); |
| 92 if (window->GetType() == ui::wm::WINDOW_TYPE_PANEL) | 88 if (window->GetType() == ui::wm::WINDOW_TYPE_PANEL) { |
| 93 window_resizer.reset( | 89 window_resizer.reset( |
| 94 PanelWindowResizer::Create(window_resizer.release(), window_state)); | 90 PanelWindowResizer::Create(window_resizer.release(), window_state)); |
| 95 if (window_resizer && window->GetParent() && !window->GetTransientParent() && | |
| 96 (parent_shell_window_id == kShellWindowId_DefaultContainer || | |
| 97 parent_shell_window_id == kShellWindowId_DockedContainer || | |
| 98 parent_shell_window_id == kShellWindowId_PanelContainer)) { | |
| 99 window_resizer.reset( | |
| 100 DockedWindowResizer::Create(window_resizer.release(), window_state)); | |
| 101 } | 91 } |
| 102 return window_resizer; | 92 return window_resizer; |
| 103 } | 93 } |
| 104 | 94 |
| 105 namespace { | 95 namespace { |
| 106 | 96 |
| 107 // Snapping distance used instead of WorkspaceWindowResizer::kScreenEdgeInset | 97 // Snapping distance used instead of WorkspaceWindowResizer::kScreenEdgeInset |
| 108 // when resizing a window using touchscreen. | 98 // when resizing a window using touchscreen. |
| 109 const int kScreenEdgeInsetForTouchDrag = 32; | 99 const int kScreenEdgeInsetForTouchDrag = 32; |
| 110 | 100 |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 return; | 372 return; |
| 383 } | 373 } |
| 384 const bool in_original_root = !root || root == GetTarget()->GetRootWindow(); | 374 const bool in_original_root = !root || root == GetTarget()->GetRootWindow(); |
| 385 // Hide a phantom window for snapping if the cursor is in another root window. | 375 // Hide a phantom window for snapping if the cursor is in another root window. |
| 386 if (in_original_root) { | 376 if (in_original_root) { |
| 387 UpdateSnapPhantomWindow(location_in_parent, bounds); | 377 UpdateSnapPhantomWindow(location_in_parent, bounds); |
| 388 } else { | 378 } else { |
| 389 snap_type_ = SNAP_NONE; | 379 snap_type_ = SNAP_NONE; |
| 390 snap_phantom_window_controller_.reset(); | 380 snap_phantom_window_controller_.reset(); |
| 391 edge_cycler_.reset(); | 381 edge_cycler_.reset(); |
| 392 SetDraggedWindowDocked(false); | |
| 393 } | 382 } |
| 394 } | 383 } |
| 395 | 384 |
| 396 void WorkspaceWindowResizer::CompleteDrag() { | 385 void WorkspaceWindowResizer::CompleteDrag() { |
| 397 if (!did_move_or_resize_) | 386 if (!did_move_or_resize_) |
| 398 return; | 387 return; |
| 399 | 388 |
| 400 window_state()->set_bounds_changed_by_user(true); | 389 window_state()->set_bounds_changed_by_user(true); |
| 401 snap_phantom_window_controller_.reset(); | 390 snap_phantom_window_controller_.reset(); |
| 402 | 391 |
| 403 // If the window's state type changed over the course of the drag do not snap | 392 // If the window's state type changed over the course of the drag do not snap |
| 404 // the window. This happens when the user minimizes or maximizes the window | 393 // the window. This happens when the user minimizes or maximizes the window |
| 405 // using a keyboard shortcut while dragging it. | 394 // using a keyboard shortcut while dragging it. |
| 406 if (window_state()->GetStateType() != details().initial_state_type) | 395 if (window_state()->GetStateType() != details().initial_state_type) |
| 407 return; | 396 return; |
| 408 | 397 |
| 409 bool snapped = false; | 398 bool snapped = false; |
| 410 if (snap_type_ == SNAP_LEFT || snap_type_ == SNAP_RIGHT) { | 399 if (snap_type_ == SNAP_LEFT || snap_type_ == SNAP_RIGHT) { |
| 411 if (!window_state()->HasRestoreBounds()) { | 400 if (!window_state()->HasRestoreBounds()) { |
| 412 gfx::Rect initial_bounds = GetTarget()->GetParent()->ConvertRectToScreen( | 401 gfx::Rect initial_bounds = GetTarget()->GetParent()->ConvertRectToScreen( |
| 413 details().initial_bounds_in_parent); | 402 details().initial_bounds_in_parent); |
| 414 window_state()->SetRestoreBoundsInScreen( | 403 window_state()->SetRestoreBoundsInScreen( |
| 415 details().restore_bounds.IsEmpty() ? initial_bounds | 404 details().restore_bounds.IsEmpty() ? initial_bounds |
| 416 : details().restore_bounds); | 405 : details().restore_bounds); |
| 417 } | 406 } |
| 418 if (!dock_layout_->is_dragged_window_docked()) { | 407 // TODO(oshima): Add event source type to WMEvent and move |
| 419 // TODO(oshima): Add event source type to WMEvent and move | 408 // metrics recording inside WindowState::OnWMEvent. |
| 420 // metrics recording inside WindowState::OnWMEvent. | 409 const wm::WMEvent event(snap_type_ == SNAP_LEFT ? wm::WM_EVENT_SNAP_LEFT |
| 421 const wm::WMEvent event(snap_type_ == SNAP_LEFT | 410 : wm::WM_EVENT_SNAP_RIGHT); |
| 422 ? wm::WM_EVENT_SNAP_LEFT | 411 window_state()->OnWMEvent(&event); |
| 423 : wm::WM_EVENT_SNAP_RIGHT); | 412 shell_->RecordUserMetricsAction(snap_type_ == SNAP_LEFT |
| 424 window_state()->OnWMEvent(&event); | 413 ? UMA_DRAG_MAXIMIZE_LEFT |
| 425 shell_->RecordUserMetricsAction(snap_type_ == SNAP_LEFT | 414 : UMA_DRAG_MAXIMIZE_RIGHT); |
| 426 ? UMA_DRAG_MAXIMIZE_LEFT | 415 snapped = true; |
| 427 : UMA_DRAG_MAXIMIZE_RIGHT); | |
| 428 snapped = true; | |
| 429 } | |
| 430 } | 416 } |
| 431 | 417 |
| 432 if (!snapped) { | 418 if (!snapped) { |
| 433 if (window_state()->IsSnapped()) { | 419 if (window_state()->IsSnapped()) { |
| 434 // Keep the window snapped if the user resizes the window such that the | 420 // Keep the window snapped if the user resizes the window such that the |
| 435 // window has valid bounds for a snapped window. Always unsnap the window | 421 // window has valid bounds for a snapped window. Always unsnap the window |
| 436 // if the user dragged the window via the caption area because doing this | 422 // if the user dragged the window via the caption area because doing this |
| 437 // is slightly less confusing. | 423 // is slightly less confusing. |
| 438 if (details().window_component == HTCAPTION || | 424 if (details().window_component == HTCAPTION || |
| 439 !AreBoundsValidSnappedBounds(window_state()->GetStateType(), | 425 !AreBoundsValidSnappedBounds(window_state()->GetStateType(), |
| 440 GetTarget()->GetBounds())) { | 426 GetTarget()->GetBounds())) { |
| 441 // Set the window to WINDOW_STATE_TYPE_NORMAL but keep the | 427 // Set the window to WINDOW_STATE_TYPE_NORMAL but keep the |
| 442 // window at the bounds that the user has moved/resized the | 428 // window at the bounds that the user has moved/resized the |
| 443 // window to. | 429 // window to. |
| 444 window_state()->SaveCurrentBoundsForRestore(); | 430 window_state()->SaveCurrentBoundsForRestore(); |
| 445 window_state()->Restore(); | 431 window_state()->Restore(); |
| 446 } | 432 } |
| 447 } else if (!dock_layout_->is_dragged_window_docked()) { | 433 } else { |
| 448 // The window was not snapped and is not snapped. This is a user | 434 // The window was not snapped and is not snapped. This is a user |
| 449 // resize/drag and so the current bounds should be maintained, clearing | 435 // resize/drag and so the current bounds should be maintained, clearing |
| 450 // any prior restore bounds. When the window is docked the restore bound | 436 // any prior restore bounds. When the window is docked the restore bound |
| 451 // must be kept so the docked state can be reverted properly. | 437 // must be kept so the docked state can be reverted properly. |
| 452 window_state()->ClearRestoreBounds(); | 438 window_state()->ClearRestoreBounds(); |
| 453 } | 439 } |
| 454 } | 440 } |
| 455 } | 441 } |
| 456 | 442 |
| 457 void WorkspaceWindowResizer::RevertDrag() { | 443 void WorkspaceWindowResizer::RevertDrag() { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 weak_ptr_factory_(this) { | 489 weak_ptr_factory_(this) { |
| 504 DCHECK(details().is_resizable); | 490 DCHECK(details().is_resizable); |
| 505 | 491 |
| 506 // A mousemove should still show the cursor even if the window is | 492 // A mousemove should still show the cursor even if the window is |
| 507 // being moved or resized with touch, so do not lock the cursor. | 493 // being moved or resized with touch, so do not lock the cursor. |
| 508 if (details().source != aura::client::WINDOW_MOVE_SOURCE_TOUCH) { | 494 if (details().source != aura::client::WINDOW_MOVE_SOURCE_TOUCH) { |
| 509 shell_->LockCursor(); | 495 shell_->LockCursor(); |
| 510 did_lock_cursor_ = true; | 496 did_lock_cursor_ = true; |
| 511 } | 497 } |
| 512 | 498 |
| 513 dock_layout_ = DockedWindowLayoutManager::Get(GetTarget()); | |
| 514 | |
| 515 // Only support attaching to the right/bottom. | 499 // Only support attaching to the right/bottom. |
| 516 DCHECK(attached_windows_.empty() || (details().window_component == HTRIGHT || | 500 DCHECK(attached_windows_.empty() || (details().window_component == HTRIGHT || |
| 517 details().window_component == HTBOTTOM)); | 501 details().window_component == HTBOTTOM)); |
| 518 | 502 |
| 519 // TODO: figure out how to deal with window going off the edge. | 503 // TODO: figure out how to deal with window going off the edge. |
| 520 | 504 |
| 521 // Calculate sizes so that we can maintain the ratios if we need to resize. | 505 // Calculate sizes so that we can maintain the ratios if we need to resize. |
| 522 int total_available = 0; | 506 int total_available = 0; |
| 523 for (size_t i = 0; i < attached_windows_.size(); ++i) { | 507 for (size_t i = 0; i < attached_windows_.size(); ++i) { |
| 524 gfx::Size min(attached_windows_[i]->GetMinimumSize()); | 508 gfx::Size min(attached_windows_[i]->GetMinimumSize()); |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 868 void WorkspaceWindowResizer::UpdateSnapPhantomWindow(const gfx::Point& location, | 852 void WorkspaceWindowResizer::UpdateSnapPhantomWindow(const gfx::Point& location, |
| 869 const gfx::Rect& bounds) { | 853 const gfx::Rect& bounds) { |
| 870 if (!did_move_or_resize_ || details().window_component != HTCAPTION) | 854 if (!did_move_or_resize_ || details().window_component != HTCAPTION) |
| 871 return; | 855 return; |
| 872 | 856 |
| 873 SnapType last_type = snap_type_; | 857 SnapType last_type = snap_type_; |
| 874 snap_type_ = GetSnapType(location); | 858 snap_type_ = GetSnapType(location); |
| 875 if (snap_type_ == SNAP_NONE || snap_type_ != last_type) { | 859 if (snap_type_ == SNAP_NONE || snap_type_ != last_type) { |
| 876 snap_phantom_window_controller_.reset(); | 860 snap_phantom_window_controller_.reset(); |
| 877 edge_cycler_.reset(); | 861 edge_cycler_.reset(); |
| 878 if (snap_type_ == SNAP_NONE) { | 862 if (snap_type_ == SNAP_NONE) |
| 879 SetDraggedWindowDocked(false); | |
| 880 return; | 863 return; |
| 881 } | |
| 882 } | 864 } |
| 883 | 865 |
| 884 DCHECK(snap_type_ == SNAP_LEFT || snap_type_ == SNAP_RIGHT); | 866 DCHECK(snap_type_ == SNAP_LEFT || snap_type_ == SNAP_RIGHT); |
| 885 DockedAlignment desired_alignment = (snap_type_ == SNAP_LEFT) | |
| 886 ? DOCKED_ALIGNMENT_LEFT | |
| 887 : DOCKED_ALIGNMENT_RIGHT; | |
| 888 const bool can_dock = | |
| 889 ash::switches::DockedWindowsEnabled() && | |
| 890 dock_layout_->CanDockWindow(GetTarget(), desired_alignment) && | |
| 891 dock_layout_->GetAlignmentOfWindow(GetTarget()) != DOCKED_ALIGNMENT_NONE; | |
| 892 if (!can_dock) { | |
| 893 // If the window cannot be docked, undock the window. This may change the | |
| 894 // workspace bounds and hence |snap_type_|. | |
| 895 SetDraggedWindowDocked(false); | |
| 896 snap_type_ = GetSnapType(location); | |
| 897 } | |
| 898 const bool can_snap = snap_type_ != SNAP_NONE && window_state()->CanSnap(); | 867 const bool can_snap = snap_type_ != SNAP_NONE && window_state()->CanSnap(); |
| 899 if (!can_snap && !can_dock) { | 868 if (!can_snap) { |
| 900 snap_type_ = SNAP_NONE; | 869 snap_type_ = SNAP_NONE; |
| 901 snap_phantom_window_controller_.reset(); | 870 snap_phantom_window_controller_.reset(); |
| 902 edge_cycler_.reset(); | 871 edge_cycler_.reset(); |
| 903 return; | 872 return; |
| 904 } | 873 } |
| 905 if (!edge_cycler_) { | 874 if (!edge_cycler_) { |
| 906 edge_cycler_.reset(new TwoStepEdgeCycler( | 875 edge_cycler_.reset(new TwoStepEdgeCycler( |
| 907 location, snap_type_ == SNAP_LEFT | 876 location, snap_type_ == SNAP_LEFT |
| 908 ? TwoStepEdgeCycler::DIRECTION_LEFT | 877 ? TwoStepEdgeCycler::DIRECTION_LEFT |
| 909 : TwoStepEdgeCycler::DIRECTION_RIGHT)); | 878 : TwoStepEdgeCycler::DIRECTION_RIGHT)); |
| 910 } else { | 879 } else { |
| 911 edge_cycler_->OnMove(location); | 880 edge_cycler_->OnMove(location); |
| 912 } | 881 } |
| 913 | 882 |
| 914 // Update phantom window with snapped or docked guide bounds. | 883 // Update phantom window with snapped or docked guide bounds. |
| 915 // Windows that cannot be snapped or are less wide than kMaxDockWidth can get | 884 // Windows that cannot be snapped or are less wide than kMaxDockWidth can get |
| 916 // docked without going through a snapping sequence. | 885 // docked without going through a snapping sequence. |
| 917 gfx::Rect phantom_bounds; | 886 gfx::Rect phantom_bounds = |
| 918 const bool should_dock = | 887 (snap_type_ == SNAP_LEFT) |
| 919 can_dock && (!can_snap || | 888 ? wm::GetDefaultLeftSnappedWindowBoundsInParent(GetTarget()) |
| 920 GetTarget()->GetBounds().width() <= | 889 : wm::GetDefaultRightSnappedWindowBoundsInParent(GetTarget()); |
| 921 DockedWindowLayoutManager::kMaxDockWidth || | |
| 922 edge_cycler_->use_second_mode() || | |
| 923 dock_layout_->is_dragged_window_docked()); | |
| 924 if (should_dock) { | |
| 925 SetDraggedWindowDocked(true); | |
| 926 phantom_bounds = GetTarget()->GetParent()->ConvertRectFromScreen( | |
| 927 dock_layout_->dragged_bounds()); | |
| 928 } else { | |
| 929 phantom_bounds = | |
| 930 (snap_type_ == SNAP_LEFT) | |
| 931 ? wm::GetDefaultLeftSnappedWindowBoundsInParent(GetTarget()) | |
| 932 : wm::GetDefaultRightSnappedWindowBoundsInParent(GetTarget()); | |
| 933 } | |
| 934 | 890 |
| 935 if (!snap_phantom_window_controller_) { | 891 if (!snap_phantom_window_controller_) { |
| 936 snap_phantom_window_controller_.reset( | 892 snap_phantom_window_controller_.reset( |
| 937 new PhantomWindowController(GetTarget())); | 893 new PhantomWindowController(GetTarget())); |
| 938 } | 894 } |
| 939 snap_phantom_window_controller_->Show( | 895 snap_phantom_window_controller_->Show( |
| 940 GetTarget()->GetParent()->ConvertRectToScreen(phantom_bounds)); | 896 GetTarget()->GetParent()->ConvertRectToScreen(phantom_bounds)); |
| 941 } | 897 } |
| 942 | 898 |
| 943 void WorkspaceWindowResizer::RestackWindows() { | 899 void WorkspaceWindowResizer::RestackWindows() { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 986 inset_right = kScreenEdgeInsetForTouchDrag; | 942 inset_right = kScreenEdgeInsetForTouchDrag; |
| 987 area.Inset(inset_left, 0, inset_right, 0); | 943 area.Inset(inset_left, 0, inset_right, 0); |
| 988 } | 944 } |
| 989 if (location.x() <= area.x()) | 945 if (location.x() <= area.x()) |
| 990 return SNAP_LEFT; | 946 return SNAP_LEFT; |
| 991 if (location.x() >= area.right() - 1) | 947 if (location.x() >= area.right() - 1) |
| 992 return SNAP_RIGHT; | 948 return SNAP_RIGHT; |
| 993 return SNAP_NONE; | 949 return SNAP_NONE; |
| 994 } | 950 } |
| 995 | 951 |
| 996 void WorkspaceWindowResizer::SetDraggedWindowDocked(bool should_dock) { | |
| 997 if (should_dock) { | |
| 998 if (!dock_layout_->is_dragged_window_docked()) { | |
| 999 window_state()->set_bounds_changed_by_user(false); | |
| 1000 dock_layout_->DockDraggedWindow(GetTarget()); | |
| 1001 } | |
| 1002 } else { | |
| 1003 if (dock_layout_->is_dragged_window_docked()) { | |
| 1004 dock_layout_->UndockDraggedWindow(); | |
| 1005 window_state()->set_bounds_changed_by_user(true); | |
| 1006 } | |
| 1007 } | |
| 1008 } | |
| 1009 | |
| 1010 bool WorkspaceWindowResizer::AreBoundsValidSnappedBounds( | 952 bool WorkspaceWindowResizer::AreBoundsValidSnappedBounds( |
| 1011 wm::WindowStateType snapped_type, | 953 wm::WindowStateType snapped_type, |
| 1012 const gfx::Rect& bounds_in_parent) const { | 954 const gfx::Rect& bounds_in_parent) const { |
| 1013 DCHECK(snapped_type == wm::WINDOW_STATE_TYPE_LEFT_SNAPPED || | 955 DCHECK(snapped_type == wm::WINDOW_STATE_TYPE_LEFT_SNAPPED || |
| 1014 snapped_type == wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED); | 956 snapped_type == wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED); |
| 1015 gfx::Rect snapped_bounds = wm::GetDisplayWorkAreaBoundsInParent(GetTarget()); | 957 gfx::Rect snapped_bounds = wm::GetDisplayWorkAreaBoundsInParent(GetTarget()); |
| 1016 if (snapped_type == wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED) | 958 if (snapped_type == wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED) |
| 1017 snapped_bounds.set_x(snapped_bounds.right() - bounds_in_parent.width()); | 959 snapped_bounds.set_x(snapped_bounds.right() - bounds_in_parent.width()); |
| 1018 snapped_bounds.set_width(bounds_in_parent.width()); | 960 snapped_bounds.set_width(bounds_in_parent.width()); |
| 1019 return bounds_in_parent == snapped_bounds; | 961 return bounds_in_parent == snapped_bounds; |
| 1020 } | 962 } |
| 1021 | 963 |
| 1022 } // namespace ash | 964 } // namespace ash |
| OLD | NEW |