Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(297)

Side by Side Diff: athena/wm/window_manager_impl.cc

Issue 546123002: Ensure that an activity is activated when overview mode is exited (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « athena/wm/window_manager_impl.h ('k') | athena/wm/window_manager_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
11 #include "athena/wm/bezel_controller.h" 11 #include "athena/wm/bezel_controller.h"
12 #include "athena/wm/public/window_manager_observer.h" 12 #include "athena/wm/public/window_manager_observer.h"
13 #include "athena/wm/split_view_controller.h" 13 #include "athena/wm/split_view_controller.h"
14 #include "athena/wm/title_drag_controller.h" 14 #include "athena/wm/title_drag_controller.h"
15 #include "athena/wm/window_list_provider_impl.h" 15 #include "athena/wm/window_list_provider_impl.h"
16 #include "athena/wm/window_overview_mode.h" 16 #include "athena/wm/window_overview_mode.h"
17 #include "base/auto_reset.h"
17 #include "base/bind.h" 18 #include "base/bind.h"
18 #include "base/logging.h" 19 #include "base/logging.h"
19 #include "ui/aura/layout_manager.h" 20 #include "ui/aura/layout_manager.h"
20 #include "ui/aura/window.h" 21 #include "ui/aura/window.h"
21 #include "ui/compositor/closure_animation_observer.h" 22 #include "ui/compositor/closure_animation_observer.h"
22 #include "ui/compositor/scoped_layer_animation_settings.h" 23 #include "ui/compositor/scoped_layer_animation_settings.h"
23 #include "ui/gfx/display.h" 24 #include "ui/gfx/display.h"
24 #include "ui/gfx/screen.h" 25 #include "ui/gfx/screen.h"
25 #include "ui/wm/core/shadow_controller.h" 26 #include "ui/wm/core/shadow_controller.h"
26 #include "ui/wm/core/window_util.h" 27 #include "ui/wm/core/window_util.h"
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 } else { 95 } else {
95 window->SetBounds(gfx::Rect(work_area)); 96 window->SetBounds(gfx::Rect(work_area));
96 } 97 }
97 } 98 }
98 } 99 }
99 100
100 void AthenaContainerLayoutManager::OnWindowAddedToLayout(aura::Window* child) { 101 void AthenaContainerLayoutManager::OnWindowAddedToLayout(aura::Window* child) {
101 aura::Window::Windows list = instance->window_list_provider_->GetWindowList(); 102 aura::Window::Windows list = instance->window_list_provider_->GetWindowList();
102 if (std::find(list.begin(), list.end(), child) == list.end()) 103 if (std::find(list.begin(), list.end(), child) == list.end())
103 return; 104 return;
104 if (instance->split_view_controller_->IsSplitViewModeActive()) { 105
106 if (instance->split_view_controller_->IsSplitViewModeActive() &&
107 !instance->IsOverviewModeActive()) {
105 child->Show(); 108 child->Show();
106 wm::ActivateWindow(child); 109 wm::ActivateWindow(child);
107 instance->split_view_controller_->ReplaceWindow( 110 instance->split_view_controller_->ReplaceWindow(
108 instance->split_view_controller_->left_window(), child); 111 instance->split_view_controller_->left_window(), child);
109 } else { 112 } else {
110 gfx::Size size = 113 gfx::Size size =
111 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area().size(); 114 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area().size();
112 child->SetBounds(gfx::Rect(size)); 115 child->SetBounds(gfx::Rect(size));
113 } 116 }
117
118 if (instance->IsOverviewModeActive()) {
119 // TODO(pkotwicz|oshima). Creating a new window should only exit overview
120 // mode if the new window is activated.
121 instance->OnSelectWindow(child);
122 }
114 } 123 }
115 124
116 void AthenaContainerLayoutManager::OnWillRemoveWindowFromLayout( 125 void AthenaContainerLayoutManager::OnWillRemoveWindowFromLayout(
117 aura::Window* child) { 126 aura::Window* child) {
118 } 127 }
119 128
120 void AthenaContainerLayoutManager::OnWindowRemovedFromLayout( 129 void AthenaContainerLayoutManager::OnWindowRemovedFromLayout(
121 aura::Window* child) { 130 aura::Window* child) {
122 } 131 }
123 132
124 void AthenaContainerLayoutManager::OnChildWindowVisibilityChanged( 133 void AthenaContainerLayoutManager::OnChildWindowVisibilityChanged(
125 aura::Window* child, 134 aura::Window* child,
126 bool visible) { 135 bool visible) {
127 } 136 }
128 137
129 void AthenaContainerLayoutManager::SetChildBounds( 138 void AthenaContainerLayoutManager::SetChildBounds(
130 aura::Window* child, 139 aura::Window* child,
131 const gfx::Rect& requested_bounds) { 140 const gfx::Rect& requested_bounds) {
132 if (!requested_bounds.IsEmpty()) 141 if (!requested_bounds.IsEmpty())
133 SetChildBoundsDirect(child, requested_bounds); 142 SetChildBoundsDirect(child, requested_bounds);
134 } 143 }
135 144
136 WindowManagerImpl::WindowManagerImpl() { 145 WindowManagerImpl::WindowManagerImpl() : selecting_window_(false) {
137 ScreenManager::ContainerParams params("DefaultContainer", CP_DEFAULT); 146 ScreenManager::ContainerParams params("DefaultContainer", CP_DEFAULT);
138 params.can_activate_children = true; 147 params.can_activate_children = true;
139 container_.reset(ScreenManager::Get()->CreateDefaultContainer(params)); 148 container_.reset(ScreenManager::Get()->CreateDefaultContainer(params));
140 container_->SetLayoutManager(new AthenaContainerLayoutManager); 149 container_->SetLayoutManager(new AthenaContainerLayoutManager);
141 container_->AddObserver(this); 150 container_->AddObserver(this);
142 window_list_provider_.reset(new WindowListProviderImpl(container_.get())); 151 window_list_provider_.reset(new WindowListProviderImpl(container_.get()));
143 bezel_controller_.reset(new BezelController(container_.get())); 152 bezel_controller_.reset(new BezelController(container_.get()));
144 split_view_controller_.reset( 153 split_view_controller_.reset(
145 new SplitViewController(container_.get(), window_list_provider_.get())); 154 new SplitViewController(container_.get(), window_list_provider_.get()));
146 bezel_controller_->set_left_right_delegate(split_view_controller_.get()); 155 bezel_controller_->set_left_right_delegate(split_view_controller_.get());
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 wm::ActivateWindow(active_window); 204 wm::ActivateWindow(active_window);
196 split_view_controller_->ActivateSplitMode(active_window, NULL); 205 split_view_controller_->ActivateSplitMode(active_window, NULL);
197 } 206 }
198 } 207 }
199 208
200 void WindowManagerImpl::SetInOverview(bool active) { 209 void WindowManagerImpl::SetInOverview(bool active) {
201 bool in_overview = !!overview_; 210 bool in_overview = !!overview_;
202 if (active == in_overview) 211 if (active == in_overview)
203 return; 212 return;
204 213
214 if (!active && !selecting_window_) {
215 overview_->SelectDefaultWindow();
216 // If SelectDefaultWindow() did not select a window (e.g. there are no
217 // windows open), it should not be possible to exit overview.
218 return;
219 }
220
205 bezel_controller_->set_left_right_delegate( 221 bezel_controller_->set_left_right_delegate(
206 active ? NULL : split_view_controller_.get()); 222 active ? NULL : split_view_controller_.get());
207 if (active) { 223 if (active) {
208 FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnOverviewModeEnter()); 224 FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnOverviewModeEnter());
209 225
210 // Re-stack all windows in the order defined by window_list_provider_. 226 // Re-stack all windows in the order defined by window_list_provider_.
211 aura::Window::Windows window_list = window_list_provider_->GetWindowList(); 227 aura::Window::Windows window_list = window_list_provider_->GetWindowList();
212 aura::Window::Windows::iterator it; 228 aura::Window::Windows::iterator it;
213 for (it = window_list.begin(); it != window_list.end(); ++it) 229 for (it = window_list.begin(); it != window_list.end(); ++it)
214 container_->StackChildAtTop(*it); 230 container_->StackChildAtTop(*it);
(...skipping 23 matching lines...) Expand all
238 254
239 void WindowManagerImpl::RemoveObserver(WindowManagerObserver* observer) { 255 void WindowManagerImpl::RemoveObserver(WindowManagerObserver* observer) {
240 observers_.RemoveObserver(observer); 256 observers_.RemoveObserver(observer);
241 } 257 }
242 258
243 void WindowManagerImpl::ToggleSplitViewForTest() { 259 void WindowManagerImpl::ToggleSplitViewForTest() {
244 ToggleSplitView(); 260 ToggleSplitView();
245 } 261 }
246 262
247 void WindowManagerImpl::OnSelectWindow(aura::Window* window) { 263 void WindowManagerImpl::OnSelectWindow(aura::Window* window) {
264 base::AutoReset<bool> selecting_window(&selecting_window_, true);
265 SetInOverview(false);
266
267 window->Show();
268 wm::ActivateWindow(window);
269
248 if (split_view_controller_->IsSplitViewModeActive()) { 270 if (split_view_controller_->IsSplitViewModeActive()) {
249 split_view_controller_->DeactivateSplitMode(); 271 split_view_controller_->DeactivateSplitMode();
250 FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnSplitViewModeExit()); 272 FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnSplitViewModeExit());
251 } 273 }
252 wm::ActivateWindow(window);
253 SetInOverview(false);
254 // If |window| does not have the size of the work-area, then make sure it is 274 // If |window| does not have the size of the work-area, then make sure it is
255 // resized. 275 // resized.
256 const gfx::Size work_area = 276 const gfx::Size work_area =
257 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area().size(); 277 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area().size();
258 if (window->GetTargetBounds().size() != work_area) { 278 if (window->GetTargetBounds().size() != work_area) {
259 const gfx::Rect& window_bounds = window->bounds(); 279 const gfx::Rect& window_bounds = window->bounds();
260 const gfx::Rect desired_bounds(work_area); 280 const gfx::Rect desired_bounds(work_area);
261 gfx::Transform transform; 281 gfx::Transform transform;
262 transform.Translate(desired_bounds.x() - window_bounds.x(), 282 transform.Translate(desired_bounds.x() - window_bounds.x(),
263 desired_bounds.y() - window_bounds.y()); 283 desired_bounds.y() - window_bounds.y());
264 transform.Scale(desired_bounds.width() / window_bounds.width(), 284 transform.Scale(desired_bounds.width() / window_bounds.width(),
265 desired_bounds.height() / window_bounds.height()); 285 desired_bounds.height() / window_bounds.height());
266 window->layer()->GetAnimator()->AbortAllAnimations();
pkotwicz 2014/09/08 19:39:24 We do not want to abort the opacity animation star
267 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); 286 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator());
268 settings.SetPreemptionStrategy( 287 settings.SetPreemptionStrategy(
269 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 288 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
270 settings.AddObserver( 289 settings.AddObserver(
271 new ui::ClosureAnimationObserver(base::Bind(&SetWindowState, 290 new ui::ClosureAnimationObserver(base::Bind(&SetWindowState,
272 base::Unretained(window), 291 base::Unretained(window),
273 desired_bounds, 292 desired_bounds,
274 gfx::Transform()))); 293 gfx::Transform())));
275 window->SetTransform(transform); 294 window->SetTransform(transform);
276 } 295 }
277 } 296 }
278 297
279 void WindowManagerImpl::OnSplitViewMode(aura::Window* left, 298 void WindowManagerImpl::OnSelectSplitViewWindow(aura::Window* left,
280 aura::Window* right) { 299 aura::Window* right,
300 aura::Window* to_activate) {
301 base::AutoReset<bool> selecting_window(&selecting_window_, true);
281 SetInOverview(false); 302 SetInOverview(false);
303
304 to_activate->Show();
305 wm::ActivateWindow(to_activate);
282 FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnSplitViewModeEnter()); 306 FOR_EACH_OBSERVER(WindowManagerObserver, observers_, OnSplitViewModeEnter());
283 if (right)
284 wm::ActivateWindow(right);
285 else
286 wm::ActivateWindow(left);
287 split_view_controller_->ActivateSplitMode(left, right); 307 split_view_controller_->ActivateSplitMode(left, right);
288 } 308 }
289 309
290 void WindowManagerImpl::OnWindowAdded(aura::Window* new_window) {
291 // TODO(oshima): Creating a new window should updates the ovewview mode
292 // instead of exitting.
293 if (new_window->type() == ui::wm::WINDOW_TYPE_NORMAL)
294 SetInOverview(false);
295 }
296
297 void WindowManagerImpl::OnWindowDestroying(aura::Window* window) { 310 void WindowManagerImpl::OnWindowDestroying(aura::Window* window) {
298 if (window == container_) 311 if (window == container_)
299 container_.reset(); 312 container_.reset();
300 } 313 }
301 314
302 bool WindowManagerImpl::IsCommandEnabled(int command_id) const { 315 bool WindowManagerImpl::IsCommandEnabled(int command_id) const {
303 return true; 316 return true;
304 } 317 }
305 318
306 bool WindowManagerImpl::OnAcceleratorFired(int command_id, 319 bool WindowManagerImpl::OnAcceleratorFired(int command_id,
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 DCHECK(!instance); 423 DCHECK(!instance);
411 } 424 }
412 425
413 // static 426 // static
414 WindowManager* WindowManager::GetInstance() { 427 WindowManager* WindowManager::GetInstance() {
415 DCHECK(instance); 428 DCHECK(instance);
416 return instance; 429 return instance;
417 } 430 }
418 431
419 } // namespace athena 432 } // namespace athena
OLDNEW
« no previous file with comments | « athena/wm/window_manager_impl.h ('k') | athena/wm/window_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698