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 "athena/wm/window_manager_impl.h" | 5 #include "athena/wm/window_manager_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "athena/common/container_priorities.h" | 9 #include "athena/common/container_priorities.h" |
10 #include "athena/screen/public/screen_manager.h" | 10 #include "athena/screen/public/screen_manager.h" |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
95 window->SetBounds(gfx::Rect(work_area)); | 95 window->SetBounds(gfx::Rect(work_area)); |
96 } | 96 } |
97 } | 97 } |
98 } | 98 } |
99 | 99 |
100 void AthenaContainerLayoutManager::OnWindowAddedToLayout(aura::Window* child) { | 100 void AthenaContainerLayoutManager::OnWindowAddedToLayout(aura::Window* child) { |
101 aura::Window::Windows list = instance->window_list_provider_->GetWindowList(); | 101 aura::Window::Windows list = instance->window_list_provider_->GetWindowList(); |
102 if (std::find(list.begin(), list.end(), child) == list.end()) | 102 if (std::find(list.begin(), list.end(), child) == list.end()) |
103 return; | 103 return; |
104 if (instance->split_view_controller_->IsSplitViewModeActive()) { | 104 if (instance->split_view_controller_->IsSplitViewModeActive()) { |
105 child->Show(); | |
106 wm::ActivateWindow(child); | |
105 instance->split_view_controller_->ReplaceWindow( | 107 instance->split_view_controller_->ReplaceWindow( |
106 instance->split_view_controller_->left_window(), child); | 108 instance->split_view_controller_->left_window(), child); |
107 } else { | 109 } else { |
108 gfx::Size size = | 110 gfx::Size size = |
109 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area().size(); | 111 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area().size(); |
110 child->SetBounds(gfx::Rect(size)); | 112 child->SetBounds(gfx::Rect(size)); |
sadrul
2014/09/09 14:27:28
Where do we activate this new window in normal mod
pkotwicz
2014/09/09 17:06:28
In practice we activate this window in normal mode
| |
111 } | 113 } |
112 } | 114 } |
113 | 115 |
114 void AthenaContainerLayoutManager::OnWillRemoveWindowFromLayout( | 116 void AthenaContainerLayoutManager::OnWillRemoveWindowFromLayout( |
115 aura::Window* child) { | 117 aura::Window* child) { |
116 } | 118 } |
117 | 119 |
118 void AthenaContainerLayoutManager::OnWindowRemovedFromLayout( | 120 void AthenaContainerLayoutManager::OnWindowRemovedFromLayout( |
119 aura::Window* child) { | 121 aura::Window* child) { |
120 } | 122 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
167 } | 169 } |
168 | 170 |
169 void WindowManagerImpl::ToggleOverview() { | 171 void WindowManagerImpl::ToggleOverview() { |
170 SetInOverview(overview_.get() == NULL); | 172 SetInOverview(overview_.get() == NULL); |
171 } | 173 } |
172 | 174 |
173 bool WindowManagerImpl::IsOverviewModeActive() { | 175 bool WindowManagerImpl::IsOverviewModeActive() { |
174 return overview_; | 176 return overview_; |
175 } | 177 } |
176 | 178 |
179 void WindowManagerImpl::ToggleSplitView() { | |
180 // TODO(oshima): Figure out what to do. | |
181 if (IsOverviewModeActive()) | |
182 return; | |
183 | |
184 if (split_view_controller_->IsSplitViewModeActive()) { | |
185 split_view_controller_->DeactivateSplitMode(); | |
186 FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnSplitViewModeExit()); | |
187 // Relayout so that windows are maximzied. | |
188 container_->layout_manager()->OnWindowResized(); | |
189 } else if (window_list_provider_->GetWindowList().size() > 1) { | |
190 FOR_EACH_OBSERVER(WindowManagerObserver, | |
191 observers_, | |
192 OnSplitViewModeEnter()); | |
193 aura::Window* active_window = | |
194 window_list_provider_->GetWindowList().back(); | |
195 wm::ActivateWindow(active_window); | |
196 split_view_controller_->ActivateSplitMode(active_window, NULL); | |
197 } | |
198 } | |
199 | |
177 void WindowManagerImpl::SetInOverview(bool active) { | 200 void WindowManagerImpl::SetInOverview(bool active) { |
178 bool in_overview = !!overview_; | 201 bool in_overview = !!overview_; |
179 if (active == in_overview) | 202 if (active == in_overview) |
180 return; | 203 return; |
181 | 204 |
182 bezel_controller_->set_left_right_delegate( | 205 bezel_controller_->set_left_right_delegate( |
183 active ? NULL : split_view_controller_.get()); | 206 active ? NULL : split_view_controller_.get()); |
184 if (active) { | 207 if (active) { |
185 FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnOverviewModeEnter()); | 208 FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnOverviewModeEnter()); |
186 | 209 |
(...skipping 24 matching lines...) Expand all Loading... | |
211 | 234 |
212 void WindowManagerImpl::AddObserver(WindowManagerObserver* observer) { | 235 void WindowManagerImpl::AddObserver(WindowManagerObserver* observer) { |
213 observers_.AddObserver(observer); | 236 observers_.AddObserver(observer); |
214 } | 237 } |
215 | 238 |
216 void WindowManagerImpl::RemoveObserver(WindowManagerObserver* observer) { | 239 void WindowManagerImpl::RemoveObserver(WindowManagerObserver* observer) { |
217 observers_.RemoveObserver(observer); | 240 observers_.RemoveObserver(observer); |
218 } | 241 } |
219 | 242 |
220 void WindowManagerImpl::ToggleSplitViewForTest() { | 243 void WindowManagerImpl::ToggleSplitViewForTest() { |
221 ToggleSplitview(); | 244 ToggleSplitView(); |
222 } | 245 } |
223 | 246 |
224 void WindowManagerImpl::OnSelectWindow(aura::Window* window) { | 247 void WindowManagerImpl::OnSelectWindow(aura::Window* window) { |
225 if (split_view_controller_->IsSplitViewModeActive()) { | 248 if (split_view_controller_->IsSplitViewModeActive()) { |
226 split_view_controller_->DeactivateSplitMode(); | 249 split_view_controller_->DeactivateSplitMode(); |
227 FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnSplitViewModeExit()); | 250 FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnSplitViewModeExit()); |
228 } | 251 } |
229 wm::ActivateWindow(window); | 252 wm::ActivateWindow(window); |
230 SetInOverview(false); | 253 SetInOverview(false); |
231 // If |window| does not have the size of the work-area, then make sure it is | 254 // If |window| does not have the size of the work-area, then make sure it is |
(...skipping 18 matching lines...) Expand all Loading... | |
250 desired_bounds, | 273 desired_bounds, |
251 gfx::Transform()))); | 274 gfx::Transform()))); |
252 window->SetTransform(transform); | 275 window->SetTransform(transform); |
253 } | 276 } |
254 } | 277 } |
255 | 278 |
256 void WindowManagerImpl::OnSplitViewMode(aura::Window* left, | 279 void WindowManagerImpl::OnSplitViewMode(aura::Window* left, |
257 aura::Window* right) { | 280 aura::Window* right) { |
258 SetInOverview(false); | 281 SetInOverview(false); |
259 FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnSplitViewModeEnter()); | 282 FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnSplitViewModeEnter()); |
283 if (right) | |
284 wm::ActivateWindow(right); | |
285 else | |
286 wm::ActivateWindow(left); | |
sadrul
2014/09/09 14:27:28
Both left and right can be NULL here.
pkotwicz
2014/09/09 17:06:28
In practice, either |left| or |right| must be acti
| |
260 split_view_controller_->ActivateSplitMode(left, right); | 287 split_view_controller_->ActivateSplitMode(left, right); |
261 } | 288 } |
262 | 289 |
263 void WindowManagerImpl::OnWindowAdded(aura::Window* new_window) { | 290 void WindowManagerImpl::OnWindowAdded(aura::Window* new_window) { |
264 // TODO(oshima): Creating a new window should updates the ovewview mode | 291 // TODO(oshima): Creating a new window should updates the ovewview mode |
265 // instead of exitting. | 292 // instead of exitting. |
266 if (new_window->type() == ui::wm::WINDOW_TYPE_NORMAL) | 293 if (new_window->type() == ui::wm::WINDOW_TYPE_NORMAL) |
267 SetInOverview(false); | 294 SetInOverview(false); |
268 } | 295 } |
269 | 296 |
270 void WindowManagerImpl::OnWindowDestroying(aura::Window* window) { | 297 void WindowManagerImpl::OnWindowDestroying(aura::Window* window) { |
271 if (window == container_) | 298 if (window == container_) |
272 container_.reset(); | 299 container_.reset(); |
273 } | 300 } |
274 | 301 |
275 bool WindowManagerImpl::IsCommandEnabled(int command_id) const { | 302 bool WindowManagerImpl::IsCommandEnabled(int command_id) const { |
276 return true; | 303 return true; |
277 } | 304 } |
278 | 305 |
279 bool WindowManagerImpl::OnAcceleratorFired(int command_id, | 306 bool WindowManagerImpl::OnAcceleratorFired(int command_id, |
280 const ui::Accelerator& accelerator) { | 307 const ui::Accelerator& accelerator) { |
281 switch (command_id) { | 308 switch (command_id) { |
282 case CMD_TOGGLE_OVERVIEW: | 309 case CMD_TOGGLE_OVERVIEW: |
283 ToggleOverview(); | 310 ToggleOverview(); |
284 break; | 311 break; |
285 case CMD_TOGGLE_SPLIT_VIEW: | 312 case CMD_TOGGLE_SPLIT_VIEW: |
286 ToggleSplitview(); | 313 ToggleSplitView(); |
287 break; | 314 break; |
288 } | 315 } |
289 return true; | 316 return true; |
290 } | 317 } |
291 | 318 |
292 void WindowManagerImpl::ToggleSplitview() { | |
293 // TODO(oshima): Figure out what to do. | |
294 if (IsOverviewModeActive()) | |
295 return; | |
296 | |
297 if (split_view_controller_->IsSplitViewModeActive()) { | |
298 split_view_controller_->DeactivateSplitMode(); | |
299 FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnSplitViewModeExit()); | |
300 // Relayout so that windows are maximzied. | |
301 container_->layout_manager()->OnWindowResized(); | |
302 } else if (window_list_provider_->GetWindowList().size() > 1) { | |
303 FOR_EACH_OBSERVER(WindowManagerObserver, | |
304 observers_, | |
305 OnSplitViewModeEnter()); | |
306 split_view_controller_->ActivateSplitMode(NULL, NULL); | |
307 } | |
308 } | |
309 | |
310 aura::Window* WindowManagerImpl::GetWindowBehind(aura::Window* window) { | 319 aura::Window* WindowManagerImpl::GetWindowBehind(aura::Window* window) { |
311 const aura::Window::Windows& windows = window_list_provider_->GetWindowList(); | 320 const aura::Window::Windows& windows = window_list_provider_->GetWindowList(); |
312 aura::Window::Windows::const_reverse_iterator iter = | 321 aura::Window::Windows::const_reverse_iterator iter = |
313 std::find(windows.rbegin(), windows.rend(), window); | 322 std::find(windows.rbegin(), windows.rend(), window); |
314 CHECK(iter != windows.rend()); | 323 CHECK(iter != windows.rend()); |
315 ++iter; | 324 ++iter; |
316 aura::Window* behind = NULL; | 325 aura::Window* behind = NULL; |
317 if (iter != windows.rend()) | 326 if (iter != windows.rend()) |
318 behind = *iter++; | 327 behind = *iter++; |
319 | 328 |
(...skipping 29 matching lines...) Expand all Loading... | |
349 transform.Translate(dx, 0); | 358 transform.Translate(dx, 0); |
350 next_window->SetTransform(transform); | 359 next_window->SetTransform(transform); |
351 } | 360 } |
352 } | 361 } |
353 | 362 |
354 void WindowManagerImpl::OnTitleDragCompleted(aura::Window* window) { | 363 void WindowManagerImpl::OnTitleDragCompleted(aura::Window* window) { |
355 aura::Window* next_window = GetWindowBehind(window); | 364 aura::Window* next_window = GetWindowBehind(window); |
356 if (!next_window) | 365 if (!next_window) |
357 return; | 366 return; |
358 if (split_view_controller_->IsSplitViewModeActive()) { | 367 if (split_view_controller_->IsSplitViewModeActive()) { |
368 wm::ActivateWindow(next_window); | |
359 split_view_controller_->ReplaceWindow(window, next_window); | 369 split_view_controller_->ReplaceWindow(window, next_window); |
sadrul
2014/09/09 14:27:28
Can you explain why this order is important?
pkotwicz
2014/09/09 17:06:28
Order is important because I changed SplitViewCont
| |
360 wm::ActivateWindow(next_window); | |
361 } else { | 370 } else { |
362 ui::ScopedLayerAnimationSettings | 371 ui::ScopedLayerAnimationSettings |
363 settings(next_window->layer()->GetAnimator()); | 372 settings(next_window->layer()->GetAnimator()); |
364 settings.AddObserver(new ui::ClosureAnimationObserver( | 373 settings.AddObserver(new ui::ClosureAnimationObserver( |
365 base::Bind(&SetWindowState, | 374 base::Bind(&SetWindowState, |
366 base::Unretained(next_window), | 375 base::Unretained(next_window), |
367 window->bounds(), | 376 window->bounds(), |
368 gfx::Transform()))); | 377 gfx::Transform()))); |
369 | 378 |
370 gfx::Transform transform; | 379 gfx::Transform transform; |
(...skipping 30 matching lines...) Expand all Loading... | |
401 DCHECK(!instance); | 410 DCHECK(!instance); |
402 } | 411 } |
403 | 412 |
404 // static | 413 // static |
405 WindowManager* WindowManager::GetInstance() { | 414 WindowManager* WindowManager::GetInstance() { |
406 DCHECK(instance); | 415 DCHECK(instance); |
407 return instance; | 416 return instance; |
408 } | 417 } |
409 | 418 |
410 } // namespace athena | 419 } // namespace athena |
OLD | NEW |