Chromium Code Reviews| 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/wm/maximize_mode/maximize_mode_window_state.h" | 5 #include "ash/wm/maximize_mode/maximize_mode_window_state.h" |
| 6 | 6 |
| 7 #include "ash/display/display_controller.h" | 7 #include "ash/display/display_controller.h" |
| 8 #include "ash/screen_util.h" | 8 #include "ash/screen_util.h" |
| 9 #include "ash/shell.h" | 9 #include "ash/shell.h" |
| 10 #include "ash/shell_window_ids.h" | 10 #include "ash/shell_window_ids.h" |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 38 return workspace_size; | 38 return workspace_size; |
| 39 | 39 |
| 40 gfx::Size size = delegate->GetMaximumSize(); | 40 gfx::Size size = delegate->GetMaximumSize(); |
| 41 if (size.IsEmpty()) | 41 if (size.IsEmpty()) |
| 42 return workspace_size; | 42 return workspace_size; |
| 43 | 43 |
| 44 size.SetToMin(workspace_size); | 44 size.SetToMin(workspace_size); |
| 45 return size; | 45 return size; |
| 46 } | 46 } |
| 47 | 47 |
| 48 // Returns the maximized and centered bounds of a window. | 48 // Returns the maximized/full screen and/or centered bounds of a window. |
| 49 gfx::Rect GetMaximizedAndCenteredBounds(wm::WindowState* state_object) { | 49 gfx::Rect GetMaximizedAndCenteredBounds(wm::WindowState* state_object) { |
| 50 if (state_object->IsFullscreen()) | |
| 51 return ScreenUtil::GetDisplayBoundsInParent(state_object->window()); | |
| 52 | |
| 50 gfx::Rect bounds_in_parent; | 53 gfx::Rect bounds_in_parent; |
| 51 // Make the window as big as possible. | 54 // Make the window as big as possible. |
| 52 if (state_object->CanMaximize() || state_object->CanResize()) { | 55 if (state_object->CanMaximize() || state_object->CanResize()) { |
| 53 bounds_in_parent.set_size(GetMaximumSizeOfWindow(state_object)); | 56 bounds_in_parent.set_size(GetMaximumSizeOfWindow(state_object)); |
| 54 } else { | 57 } else { |
| 55 // We prefer the user given window dimensions over the current windows | 58 // We prefer the user given window dimensions over the current windows |
| 56 // dimensions since they are likely to be the result from some other state | 59 // dimensions since they are likely to be the result from some other state |
| 57 // object logic. | 60 // object logic. |
| 58 if (state_object->HasRestoreBounds()) | 61 if (state_object->HasRestoreBounds()) |
| 59 bounds_in_parent = state_object->GetRestoreBoundsInParent(); | 62 bounds_in_parent = state_object->GetRestoreBoundsInParent(); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 109 | 112 |
| 110 void MaximizeModeWindowState::LeaveMaximizeMode(wm::WindowState* window_state) { | 113 void MaximizeModeWindowState::LeaveMaximizeMode(wm::WindowState* window_state) { |
| 111 // Note: When we return we will destroy ourselves with the |our_reference|. | 114 // Note: When we return we will destroy ourselves with the |our_reference|. |
| 112 scoped_ptr<wm::WindowState::State> our_reference = | 115 scoped_ptr<wm::WindowState::State> our_reference = |
| 113 window_state->SetStateObject(old_state_.Pass()); | 116 window_state->SetStateObject(old_state_.Pass()); |
| 114 } | 117 } |
| 115 | 118 |
| 116 void MaximizeModeWindowState::OnWMEvent(wm::WindowState* window_state, | 119 void MaximizeModeWindowState::OnWMEvent(wm::WindowState* window_state, |
| 117 const wm::WMEvent* event) { | 120 const wm::WMEvent* event) { |
| 118 switch (event->type()) { | 121 switch (event->type()) { |
| 122 case wm::WM_EVENT_TOGGLE_FULLSCREEN: | |
| 123 ShowWindow(window_state, | |
| 124 current_state_type_ != wm::WINDOW_STATE_TYPE_FULLSCREEN ? | |
| 125 FULL_SCREEN : MAXIMIZED_OR_CENTERED, | |
| 126 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
| |
| 127 break; | |
| 128 case wm::WM_EVENT_FULLSCREEN: | |
| 129 ShowWindow(window_state, FULL_SCREEN, true); | |
| 130 break; | |
| 119 case wm::WM_EVENT_TOGGLE_MAXIMIZE_CAPTION: | 131 case wm::WM_EVENT_TOGGLE_MAXIMIZE_CAPTION: |
| 120 case wm::WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE: | 132 case wm::WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE: |
| 121 case wm::WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE: | 133 case wm::WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE: |
| 122 case wm::WM_EVENT_TOGGLE_FULLSCREEN: | |
| 123 case wm::WM_EVENT_TOGGLE_MAXIMIZE: | 134 case wm::WM_EVENT_TOGGLE_MAXIMIZE: |
| 124 case wm::WM_EVENT_CENTER: | 135 case wm::WM_EVENT_CENTER: |
| 125 case wm::WM_EVENT_FULLSCREEN: | |
| 126 case wm::WM_EVENT_SNAP_LEFT: | 136 case wm::WM_EVENT_SNAP_LEFT: |
| 127 case wm::WM_EVENT_SNAP_RIGHT: | 137 case wm::WM_EVENT_SNAP_RIGHT: |
| 128 case wm::WM_EVENT_NORMAL: | 138 case wm::WM_EVENT_NORMAL: |
| 129 case wm::WM_EVENT_MAXIMIZE: | 139 case wm::WM_EVENT_MAXIMIZE: |
| 130 MaximizeOrCenterWindow(window_state, true); | 140 ShowWindow(window_state, MAXIMIZED_OR_CENTERED, true); |
| 131 return; | 141 return; |
| 132 case wm::WM_EVENT_MINIMIZE: | 142 case wm::WM_EVENT_MINIMIZE: |
| 133 if (current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) { | 143 if (current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) { |
| 134 current_state_type_ = wm::WINDOW_STATE_TYPE_MINIMIZED; | 144 current_state_type_ = wm::WINDOW_STATE_TYPE_MINIMIZED; |
| 135 Minimize(window_state); | 145 Minimize(window_state); |
| 136 } | 146 } |
| 137 return; | 147 return; |
| 138 case wm::WM_EVENT_SHOW_INACTIVE: | 148 case wm::WM_EVENT_SHOW_INACTIVE: |
| 139 return; | 149 return; |
| 140 case wm::WM_EVENT_SET_BOUNDS: | 150 case wm::WM_EVENT_SET_BOUNDS: |
|
oshima
2014/04/23 15:57:38
a window in fullscreen state or maximzied state ca
Mr4D (OOO till 08-26)
2014/04/23 19:20:31
Not entirely correct. A window could have (changin
oshima
2014/04/24 00:35:15
I don't think that's supposed to be possible becau
Mr4D (OOO till 08-26)
2014/04/24 21:52:13
Checked with scheib@ and this should be correct fo
| |
| 141 if (current_state_type_ == wm::WINDOW_STATE_TYPE_MAXIMIZED || | 151 if (current_state_type_ == wm::WINDOW_STATE_TYPE_MAXIMIZED || |
| 142 window_state->CanResize()) { | 152 window_state->CanResize()) { |
| 143 // In case the window is resizable and / or maximized we ignore the | 153 // In case the window is resizable and / or maximized we ignore the |
| 144 // requested bounds change and resize to the biggest possible size. | 154 // requested bounds change and resize to the biggest possible size. |
| 145 MaximizeOrCenterWindow(window_state, true); | 155 ShowWindow(window_state, |
| 156 current_state_type_ == wm::WINDOW_STATE_TYPE_FULLSCREEN ? | |
| 157 FULL_SCREEN : MAXIMIZED_OR_CENTERED, | |
| 158 true); | |
| 146 } else if (current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) { | 159 } else if (current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) { |
| 147 // In all other cases (except for minimized windows) we respect the | 160 // In all other cases (except for minimized windows) we respect the |
| 148 // requested bounds and center it to a fully visible area on the screen. | 161 // requested bounds and center it to a fully visible area on the screen. |
| 149 gfx::Rect bounds_in_parent = | 162 gfx::Rect bounds_in_parent = |
| 150 (static_cast<const wm::SetBoundsEvent*>(event))->requested_bounds(); | 163 (static_cast<const wm::SetBoundsEvent*>(event))->requested_bounds(); |
| 151 bounds_in_parent.ClampToCenteredSize( | 164 bounds_in_parent.ClampToCenteredSize( |
| 152 ScreenUtil::GetDisplayWorkAreaBoundsInParent( | 165 ScreenUtil::GetDisplayWorkAreaBoundsInParent( |
| 153 window_state->window()).size()); | 166 window_state->window()).size()); |
| 154 if (bounds_in_parent != window_state->window()->bounds()) | 167 if (bounds_in_parent != window_state->window()->bounds()) |
| 155 window_state->SetBoundsDirectAnimated(bounds_in_parent); | 168 window_state->SetBoundsDirectAnimated(bounds_in_parent); |
| 156 } | 169 } |
| 157 break; | 170 break; |
| 158 case wm::WM_EVENT_ADDED_TO_WORKSPACE: | 171 case wm::WM_EVENT_ADDED_TO_WORKSPACE: |
| 159 MaximizeOrCenterWindow(window_state, true); | 172 ShowWindow(window_state, |
| 173 current_state_type_ == wm::WINDOW_STATE_TYPE_FULLSCREEN ? | |
| 174 FULL_SCREEN : MAXIMIZED_OR_CENTERED, | |
| 175 true); | |
| 160 break; | 176 break; |
| 161 case wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED: | 177 case wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED: |
| 162 case wm::WM_EVENT_DISPLAY_BOUNDS_CHANGED: | 178 case wm::WM_EVENT_DISPLAY_BOUNDS_CHANGED: |
| 163 if (current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) | 179 if (current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) |
| 164 MaximizeOrCenterWindow(window_state, false); | 180 ShowWindow(window_state, |
| 181 current_state_type_ == wm::WINDOW_STATE_TYPE_FULLSCREEN ? | |
| 182 FULL_SCREEN : MAXIMIZED_OR_CENTERED, | |
| 183 false); | |
| 165 break; | 184 break; |
| 166 } | 185 } |
| 167 } | 186 } |
| 168 | 187 |
| 169 wm::WindowStateType MaximizeModeWindowState::GetType() const { | 188 wm::WindowStateType MaximizeModeWindowState::GetType() const { |
| 170 return current_state_type_; | 189 return current_state_type_; |
| 171 } | 190 } |
| 172 | 191 |
| 173 void MaximizeModeWindowState::AttachState( | 192 void MaximizeModeWindowState::AttachState( |
| 174 wm::WindowState* window_state, | 193 wm::WindowState* window_state, |
| 175 wm::WindowState::State* previous_state) { | 194 wm::WindowState::State* previous_state) { |
| 176 current_state_type_ = previous_state->GetType(); | 195 current_state_type_ = previous_state->GetType(); |
| 177 | 196 |
| 178 // Initialize the state to a good preset. | 197 // Initialize the state to a good preset. |
| 179 if (current_state_type_ != wm::WINDOW_STATE_TYPE_MAXIMIZED && | 198 if (current_state_type_ != wm::WINDOW_STATE_TYPE_MAXIMIZED && |
| 180 current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED) { | 199 current_state_type_ != wm::WINDOW_STATE_TYPE_MINIMIZED && |
| 181 MaximizeOrCenterWindow(window_state, true); | 200 current_state_type_ != wm::WINDOW_STATE_TYPE_FULLSCREEN) { |
| 201 ShowWindow(window_state, MAXIMIZED_OR_CENTERED, true); | |
| 182 } | 202 } |
| 183 | 203 |
| 184 window_state->set_can_be_dragged(false); | 204 window_state->set_can_be_dragged(false); |
| 185 } | 205 } |
| 186 | 206 |
| 187 void MaximizeModeWindowState::DetachState(wm::WindowState* window_state) { | 207 void MaximizeModeWindowState::DetachState(wm::WindowState* window_state) { |
| 188 window_state->set_can_be_dragged(true); | 208 window_state->set_can_be_dragged(true); |
| 189 } | 209 } |
| 190 | 210 |
| 191 void MaximizeModeWindowState::MaximizeOrCenterWindow( | 211 void MaximizeModeWindowState::ShowWindow( |
| 192 wm::WindowState* window_state, | 212 wm::WindowState* window_state, |
| 213 MaximizeModeWindowState::ShowState show_state, | |
| 193 bool animated) { | 214 bool animated) { |
| 194 const wm::WindowStateType target_state = | 215 const wm::WindowStateType target_state = |
| 195 window_state->CanMaximize() ? wm::WINDOW_STATE_TYPE_MAXIMIZED : | 216 show_state == FULL_SCREEN ? wm::WINDOW_STATE_TYPE_FULLSCREEN : |
| 196 wm::WINDOW_STATE_TYPE_NORMAL; | 217 (window_state->CanMaximize() ? wm::WINDOW_STATE_TYPE_MAXIMIZED : |
| 218 wm::WINDOW_STATE_TYPE_NORMAL); | |
| 197 const wm::WindowStateType old_state_type = current_state_type_; | 219 const wm::WindowStateType old_state_type = current_state_type_; |
| 198 gfx::Rect bounds_in_parent = GetMaximizedAndCenteredBounds(window_state); | 220 gfx::Rect bounds_in_parent = GetMaximizedAndCenteredBounds(window_state); |
| 199 | 221 |
| 200 if (current_state_type_ != target_state) { | 222 if (current_state_type_ != target_state) { |
| 201 current_state_type_ = target_state; | 223 current_state_type_ = target_state; |
| 202 window_state->UpdateWindowShowStateFromStateType(); | 224 window_state->UpdateWindowShowStateFromStateType(); |
| 203 window_state->NotifyPreStateTypeChange(old_state_type); | 225 window_state->NotifyPreStateTypeChange(old_state_type); |
| 204 // If we have a target bounds rectangle, we center it and set it | 226 // If we have a target bounds rectangle, we center it and set it |
| 205 // accordingly. | 227 // accordingly. |
| 206 if (!bounds_in_parent.IsEmpty()) { | 228 if (!bounds_in_parent.IsEmpty()) { |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 234 window_state->window(), WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE); | 256 window_state->window(), WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE); |
| 235 | 257 |
| 236 // Hide the window. | 258 // Hide the window. |
| 237 window_state->window()->Hide(); | 259 window_state->window()->Hide(); |
| 238 // Activate another window. | 260 // Activate another window. |
| 239 if (window_state->IsActive()) | 261 if (window_state->IsActive()) |
| 240 window_state->Deactivate(); | 262 window_state->Deactivate(); |
| 241 } | 263 } |
| 242 | 264 |
| 243 } // namespace ash | 265 } // namespace ash |
| OLD | NEW |