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 4933e76425bc244c7447b16234d30ef14b3d7b9e..b677214edc4533a86502d5988912700fbc83b5e4 100644 |
--- a/ash/wm/maximize_mode/maximize_mode_window_state.cc |
+++ b/ash/wm/maximize_mode/maximize_mode_window_state.cc |
@@ -13,6 +13,7 @@ |
#include "ash/wm/window_animations.h" |
#include "ash/wm/window_state.h" |
#include "ash/wm/window_state_delegate.h" |
+#include "ash/wm/window_state_util.h" |
#include "ash/wm/window_util.h" |
#include "ash/wm/wm_event.h" |
#include "ash/wm/workspace/workspace_window_resizer.h" |
@@ -54,8 +55,11 @@ gfx::Rect GetCenteredBounds(const gfx::Rect& bounds_in_parent, |
return work_area_in_parent; |
} |
-// Returns the maximized and centered bounds of a window. |
+// Returns the maximized/full screen and/or centered bounds of a window. |
gfx::Rect GetMaximizedAndCenteredBounds(wm::WindowState* state_object) { |
oshima
2014/04/25 20:14:59
nit: can you come up with better name as it now al
Mr4D (OOO till 08-26)
2014/04/25 21:00:49
Done.
|
+ if (state_object->IsFullscreen()) |
+ return ScreenUtil::GetDisplayBoundsInParent(state_object->window()); |
+ |
gfx::Rect bounds_in_parent; |
// Make the window as big as possible. |
if (state_object->CanMaximize() || state_object->CanResize()) { |
@@ -111,34 +115,38 @@ void MaximizeModeWindowState::LeaveMaximizeMode(wm::WindowState* window_state) { |
void MaximizeModeWindowState::OnWMEvent(wm::WindowState* window_state, |
const wm::WMEvent* event) { |
switch (event->type()) { |
+ case wm::WM_EVENT_TOGGLE_FULLSCREEN: |
+ ToggleFullScreen(window_state, window_state->delegate()); |
+ break; |
+ case wm::WM_EVENT_FULLSCREEN: |
+ UpdateWindow(window_state, wm::WINDOW_STATE_TYPE_FULLSCREEN, true); |
+ break; |
case wm::WM_EVENT_TOGGLE_MAXIMIZE_CAPTION: |
case wm::WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE: |
case wm::WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE: |
- case wm::WM_EVENT_TOGGLE_FULLSCREEN: |
case wm::WM_EVENT_TOGGLE_MAXIMIZE: |
case wm::WM_EVENT_CENTER: |
- case wm::WM_EVENT_FULLSCREEN: |
case wm::WM_EVENT_SNAP_LEFT: |
case wm::WM_EVENT_SNAP_RIGHT: |
case wm::WM_EVENT_NORMAL: |
case wm::WM_EVENT_MAXIMIZE: |
- MaximizeOrCenterWindow(window_state, true); |
+ UpdateWindow(window_state, |
+ GetMaximizedOrCenteredWindowType(window_state), |
+ true); |
return; |
case wm::WM_EVENT_MINIMIZE: |
- if (current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) { |
- current_state_type_ = wm::WINDOW_STATE_TYPE_MINIMIZED; |
- Minimize(window_state); |
- } |
+ UpdateWindow(window_state, wm::WINDOW_STATE_TYPE_MINIMIZED, true); |
return; |
case wm::WM_EVENT_SHOW_INACTIVE: |
return; |
case wm::WM_EVENT_SET_BOUNDS: |
- if (current_state_type_ == wm::WINDOW_STATE_TYPE_MAXIMIZED || |
- window_state->CanResize()) { |
+ if (window_state->CanResize()) { |
// In case the window is resizable and / or maximized we ignore the |
// requested bounds change and resize to the biggest possible size. |
- MaximizeOrCenterWindow(window_state, true); |
- } else if (current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) { |
+ UpdateBounds(window_state, true); |
+ } else |
+ if (current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED && |
+ current_state_type_ != wm::WINDOW_STATE_TYPE_MAXIMIZED) { |
// In all other cases (except for minimized windows) we respect the |
// requested bounds and center it to a fully visible area on the screen. |
gfx::Rect bounds_in_parent = |
@@ -153,12 +161,18 @@ void MaximizeModeWindowState::OnWMEvent(wm::WindowState* window_state, |
} |
break; |
case wm::WM_EVENT_ADDED_TO_WORKSPACE: |
- MaximizeOrCenterWindow(window_state, true); |
+ if (current_state_type_ != wm::WINDOW_STATE_TYPE_MAXIMIZED && |
+ current_state_type_ != wm::WINDOW_STATE_TYPE_FULLSCREEN && |
+ current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) { |
+ wm::WindowStateType new_state = |
+ GetMaximizedOrCenteredWindowType(window_state); |
+ UpdateWindow(window_state, new_state, true); |
+ } |
break; |
case wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED: |
case wm::WM_EVENT_DISPLAY_BOUNDS_CHANGED: |
if (current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) |
- MaximizeOrCenterWindow(window_state, false); |
+ UpdateBounds(window_state, true); |
break; |
} |
} |
@@ -174,8 +188,11 @@ void MaximizeModeWindowState::AttachState( |
// Initialize the state to a good preset. |
if (current_state_type_ != wm::WINDOW_STATE_TYPE_MAXIMIZED && |
- current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) { |
- MaximizeOrCenterWindow(window_state, true); |
+ current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED && |
+ current_state_type_ != wm::WINDOW_STATE_TYPE_FULLSCREEN) { |
+ UpdateWindow(window_state, |
+ GetMaximizedOrCenteredWindowType(window_state), |
+ true); |
} |
window_state->set_can_be_dragged(false); |
@@ -185,38 +202,41 @@ void MaximizeModeWindowState::DetachState(wm::WindowState* window_state) { |
window_state->set_can_be_dragged(true); |
} |
-void MaximizeModeWindowState::MaximizeOrCenterWindow( |
- wm::WindowState* window_state, |
- bool animated) { |
- const wm::WindowStateType target_state = |
- window_state->CanMaximize() ? wm::WINDOW_STATE_TYPE_MAXIMIZED : |
- wm::WINDOW_STATE_TYPE_NORMAL; |
- const wm::WindowStateType old_state_type = current_state_type_; |
- gfx::Rect bounds_in_parent = GetMaximizedAndCenteredBounds(window_state); |
+void MaximizeModeWindowState::UpdateWindow(wm::WindowState* window_state, |
+ wm::WindowStateType target_state, |
+ bool animated) { |
+ DCHECK(target_state == wm::WINDOW_STATE_TYPE_MINIMIZED || |
+ target_state == wm::WINDOW_STATE_TYPE_MAXIMIZED || |
+ (target_state == wm::WINDOW_STATE_TYPE_NORMAL && |
+ !window_state->CanMaximize()) || |
+ target_state == wm::WINDOW_STATE_TYPE_FULLSCREEN); |
+ |
+ if (target_state == wm::WINDOW_STATE_TYPE_MINIMIZED) { |
+ if (current_state_type_ == wm::WINDOW_STATE_TYPE_MINIMIZED) |
+ return; |
- if (current_state_type_ != target_state) { |
current_state_type_ = target_state; |
- window_state->UpdateWindowShowStateFromStateType(); |
- window_state->NotifyPreStateTypeChange(old_state_type); |
- // If we have a target bounds rectangle, we center it and set it |
- // accordingly. |
- if (!bounds_in_parent.IsEmpty()) { |
- if (current_state_type_ == wm::WINDOW_STATE_TYPE_MINIMIZED || !animated) |
- window_state->SetBoundsDirect(bounds_in_parent); |
- else |
- window_state->SetBoundsDirectAnimated(bounds_in_parent); |
- } |
- window_state->NotifyPostStateTypeChange(old_state_type); |
- } else if (!bounds_in_parent.IsEmpty() && |
- bounds_in_parent != window_state->window()->bounds()) { |
- // Coming here, we were most probably called through a display change. |
- // Do not animate. |
- if (animated) |
- window_state->SetBoundsDirectAnimated(bounds_in_parent); |
- else |
- window_state->SetBoundsDirect(bounds_in_parent); |
+ ::wm::SetWindowVisibilityAnimationType( |
+ window_state->window(), WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE); |
+ window_state->window()->Hide(); |
+ if (window_state->IsActive()) |
+ window_state->Deactivate(); |
+ return; |
} |
+ if (current_state_type_ == target_state) { |
+ // If the state type did not change, update it accordingly. |
+ UpdateBounds(window_state, animated); |
+ return; |
+ } |
+ |
+ const wm::WindowStateType old_state_type = current_state_type_; |
+ current_state_type_ = target_state; |
+ window_state->UpdateWindowShowStateFromStateType(); |
+ window_state->NotifyPreStateTypeChange(old_state_type); |
+ UpdateBounds(window_state, animated); |
+ window_state->NotifyPostStateTypeChange(old_state_type); |
+ |
if ((window_state->window()->TargetVisibility() || |
old_state_type == wm::WINDOW_STATE_TYPE_MINIMIZED) && |
!window_state->window()->layer()->visible()) { |
@@ -226,15 +246,27 @@ void MaximizeModeWindowState::MaximizeOrCenterWindow( |
} |
} |
-void MaximizeModeWindowState::Minimize(wm::WindowState* window_state) { |
- ::wm::SetWindowVisibilityAnimationType( |
- window_state->window(), WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE); |
+wm::WindowStateType MaximizeModeWindowState::GetMaximizedOrCenteredWindowType( |
+ wm::WindowState* window_state) { |
+ return window_state->CanMaximize() ? wm::WINDOW_STATE_TYPE_MAXIMIZED : |
+ wm::WINDOW_STATE_TYPE_NORMAL; |
+} |
- // Hide the window. |
- window_state->window()->Hide(); |
- // Activate another window. |
- if (window_state->IsActive()) |
- window_state->Deactivate(); |
+void MaximizeModeWindowState::UpdateBounds(wm::WindowState* window_state, |
+ bool animated) { |
+ gfx::Rect bounds_in_parent = GetMaximizedAndCenteredBounds(window_state); |
+ // If we have a target bounds rectangle, we center it and set it |
+ // accordingly. |
+ if (!bounds_in_parent.IsEmpty() && |
+ bounds_in_parent != window_state->window()->bounds()) { |
+ if (current_state_type_ == wm::WINDOW_STATE_TYPE_MINIMIZED || |
+ !window_state->window()->IsVisible() || |
+ !animated) { |
+ window_state->SetBoundsDirect(bounds_in_parent); |
+ } else { |
+ window_state->SetBoundsDirectAnimated(bounds_in_parent); |
+ } |
+ } |
} |
} // namespace ash |