Index: ash/wm/maximize_mode/maximize_mode_window_state.cc |
diff --git a/ash/wm/maximize_mode/maximize_mode_window_state.cc b/ash/wm/maximize_mode/maximize_mode_window_state.cc |
index 989fff71822c8b40e44aafde767fd93ab2670b50..8befd20fc28e0da4d7b7e1910a184983bc7c25c7 100644 |
--- a/ash/wm/maximize_mode/maximize_mode_window_state.cc |
+++ b/ash/wm/maximize_mode/maximize_mode_window_state.cc |
@@ -11,6 +11,7 @@ |
#include "ash/shell.h" |
#include "ash/wm/maximize_mode/maximize_mode_window_manager.h" |
#include "ash/wm/screen_pinning_controller.h" |
+#include "ash/wm/splitview/split_view_controller.h" |
#include "ash/wm/window_animation_types.h" |
#include "ash/wm/window_properties.h" |
#include "ash/wm/window_state_util.h" |
@@ -67,11 +68,36 @@ gfx::Rect GetCenteredBounds(const gfx::Rect& bounds_in_parent, |
return work_area_in_parent; |
} |
+// Returns true if the window can snap in maximized mode. |
+bool CanSnap(wm::WindowState* window_state) { |
+ // If split view mode is not allowed in maximized mode, do not allow snap |
+ // window. |
+ if (!SplitViewController::ShouldAllowSplitView()) |
+ return false; |
+ return window_state->CanSnap(); |
+} |
+ |
// Returns the maximized/full screen and/or centered bounds of a window. |
gfx::Rect GetBoundsInMaximizedMode(wm::WindowState* state_object) { |
if (state_object->IsFullscreen() || state_object->IsPinned()) |
return ScreenUtil::GetDisplayBoundsInParent(state_object->window()); |
+ if (state_object->GetStateType() == wm::WINDOW_STATE_TYPE_LEFT_SNAPPED) { |
+ DCHECK(CanSnap(state_object)); |
+ return Shell::Get() |
+ ->split_view_controller() |
+ ->GetSnappedWindowBoundsInParent(state_object->window(), |
+ SplitViewController::LEFT_SNAPPED); |
+ } |
+ |
+ if (state_object->GetStateType() == wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED) { |
+ DCHECK(CanSnap(state_object)); |
+ return Shell::Get() |
+ ->split_view_controller() |
+ ->GetSnappedWindowBoundsInParent(state_object->window(), |
+ SplitViewController::RIGHT_SNAPPED); |
+ } |
+ |
gfx::Rect bounds_in_parent; |
// Make the window as big as possible. |
if (state_object->CanMaximize() || state_object->CanResize()) { |
@@ -169,13 +195,23 @@ void MaximizeModeWindowState::OnWMEvent(wm::WindowState* window_state, |
case wm::WM_EVENT_CYCLE_SNAP_LEFT: |
case wm::WM_EVENT_CYCLE_SNAP_RIGHT: |
case wm::WM_EVENT_CENTER: |
- case wm::WM_EVENT_SNAP_LEFT: |
- case wm::WM_EVENT_SNAP_RIGHT: |
case wm::WM_EVENT_NORMAL: |
case wm::WM_EVENT_MAXIMIZE: |
UpdateWindow(window_state, GetMaximizedOrCenteredWindowType(window_state), |
true); |
return; |
+ case wm::WM_EVENT_SNAP_LEFT: |
+ UpdateWindow(window_state, |
+ GetSnappedWindowStateType( |
+ window_state, wm::WINDOW_STATE_TYPE_LEFT_SNAPPED), |
+ true); |
+ return; |
+ case wm::WM_EVENT_SNAP_RIGHT: |
+ UpdateWindow(window_state, |
+ GetSnappedWindowStateType( |
+ window_state, wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED), |
+ true); |
+ return; |
case wm::WM_EVENT_MINIMIZE: |
UpdateWindow(window_state, wm::WINDOW_STATE_TYPE_MINIMIZED, true); |
return; |
@@ -274,7 +310,9 @@ void MaximizeModeWindowState::UpdateWindow(wm::WindowState* window_state, |
target_state == wm::WINDOW_STATE_TYPE_TRUSTED_PINNED || |
(target_state == wm::WINDOW_STATE_TYPE_NORMAL && |
!window_state->CanMaximize()) || |
- target_state == wm::WINDOW_STATE_TYPE_FULLSCREEN); |
+ target_state == wm::WINDOW_STATE_TYPE_FULLSCREEN || |
+ target_state == wm::WINDOW_STATE_TYPE_LEFT_SNAPPED || |
+ target_state == wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED); |
if (current_state_type_ == target_state) { |
if (target_state == wm::WINDOW_STATE_TYPE_MINIMIZED) |
@@ -295,6 +333,14 @@ void MaximizeModeWindowState::UpdateWindow(wm::WindowState* window_state, |
window_state->window()->Hide(); |
if (window_state->IsActive()) |
window_state->Deactivate(); |
+ } else if (target_state == wm::WINDOW_STATE_TYPE_LEFT_SNAPPED) { |
+ window_state->SetBoundsDirectAnimated( |
+ Shell::Get()->split_view_controller()->GetSnappedWindowBoundsInParent( |
+ window_state->window(), SplitViewController::LEFT_SNAPPED)); |
+ } else if (target_state == wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED) { |
+ window_state->SetBoundsDirectAnimated( |
+ Shell::Get()->split_view_controller()->GetSnappedWindowBoundsInParent( |
+ window_state->window(), SplitViewController::RIGHT_SNAPPED)); |
} else { |
UpdateBounds(window_state, animated); |
} |
@@ -324,6 +370,15 @@ wm::WindowStateType MaximizeModeWindowState::GetMaximizedOrCenteredWindowType( |
: wm::WINDOW_STATE_TYPE_NORMAL; |
} |
+wm::WindowStateType MaximizeModeWindowState::GetSnappedWindowStateType( |
+ wm::WindowState* window_state, |
+ wm::WindowStateType target_state) { |
+ DCHECK(target_state == wm::WINDOW_STATE_TYPE_LEFT_SNAPPED || |
+ target_state == wm::WINDOW_STATE_TYPE_RIGHT_SNAPPED); |
+ return CanSnap(window_state) ? target_state |
+ : GetMaximizedOrCenteredWindowType(window_state); |
+} |
+ |
void MaximizeModeWindowState::UpdateBounds(wm::WindowState* window_state, |
bool animated) { |
if (defer_bounds_updates_) |