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 e823455d48e15688f8759c3194c0497bf2cd57b9..e2e9b51958fed420c2eae219a85a4bc2c7873a8d 100644 |
--- a/ash/wm/maximize_mode/maximize_mode_window_state.cc |
+++ b/ash/wm/maximize_mode/maximize_mode_window_state.cc |
@@ -45,8 +45,11 @@ gfx::Size GetMaximumSizeOfWindow(wm::WindowState* window_state) { |
return size; |
} |
-// 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) { |
+ 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()) { |
@@ -116,18 +119,25 @@ 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: |
+ ShowWindow(window_state, |
+ current_state_type_ != wm::WINDOW_STATE_TYPE_FULLSCREEN ? |
+ FULL_SCREEN : MAXIMIZED_OR_CENTERED, |
+ true); |
oshima
2014/04/23 15:57:38
can you refactor the code in default_state and use
Mr4D (OOO till 08-26)
2014/04/23 19:20:31
Not quite sure what you want. Either way - that sh
Mr4D (OOO till 08-26)
2014/04/25 17:36:29
Your comment was a bit confusing. It sounded like
oshima
2014/04/25 18:46:55
Yes, that's what I meant. The same code should wor
|
+ break; |
+ case wm::WM_EVENT_FULLSCREEN: |
+ ShowWindow(window_state, FULL_SCREEN, 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); |
+ ShowWindow(window_state, MAXIMIZED_OR_CENTERED, true); |
return; |
case wm::WM_EVENT_MINIMIZE: |
if (current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) { |
@@ -142,7 +152,10 @@ void MaximizeModeWindowState::OnWMEvent(wm::WindowState* window_state, |
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); |
+ ShowWindow(window_state, |
+ current_state_type_ == wm::WINDOW_STATE_TYPE_FULLSCREEN ? |
+ FULL_SCREEN : MAXIMIZED_OR_CENTERED, |
+ true); |
} else if (current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) { |
// In all other cases (except for minimized windows) we respect the |
// requested bounds and center it to a fully visible area on the screen. |
@@ -156,12 +169,18 @@ void MaximizeModeWindowState::OnWMEvent(wm::WindowState* window_state, |
} |
break; |
case wm::WM_EVENT_ADDED_TO_WORKSPACE: |
- MaximizeOrCenterWindow(window_state, true); |
+ ShowWindow(window_state, |
+ current_state_type_ == wm::WINDOW_STATE_TYPE_FULLSCREEN ? |
+ FULL_SCREEN : MAXIMIZED_OR_CENTERED, |
+ 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); |
+ ShowWindow(window_state, |
+ current_state_type_ == wm::WINDOW_STATE_TYPE_FULLSCREEN ? |
+ FULL_SCREEN : MAXIMIZED_OR_CENTERED, |
+ false); |
break; |
} |
} |
@@ -177,8 +196,9 @@ 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) { |
+ ShowWindow(window_state, MAXIMIZED_OR_CENTERED, true); |
} |
window_state->set_can_be_dragged(false); |
@@ -188,12 +208,14 @@ void MaximizeModeWindowState::DetachState(wm::WindowState* window_state) { |
window_state->set_can_be_dragged(true); |
} |
-void MaximizeModeWindowState::MaximizeOrCenterWindow( |
+void MaximizeModeWindowState::ShowWindow( |
wm::WindowState* window_state, |
+ MaximizeModeWindowState::ShowState show_state, |
bool animated) { |
const wm::WindowStateType target_state = |
- window_state->CanMaximize() ? wm::WINDOW_STATE_TYPE_MAXIMIZED : |
- wm::WINDOW_STATE_TYPE_NORMAL; |
+ show_state == FULL_SCREEN ? wm::WINDOW_STATE_TYPE_FULLSCREEN : |
+ (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); |