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

Side by Side Diff: ash/wm/workspace/workspace_layout_manager.cc

Issue 2861243003: chromeos: Converts WorkspaceLayoutManager to aura::LayoutManager (Closed)
Patch Set: feedback Created 3 years, 7 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/workspace/workspace_layout_manager.h" 5 #include "ash/wm/workspace/workspace_layout_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "ash/keyboard/keyboard_observer_register.h" 9 #include "ash/keyboard/keyboard_observer_register.h"
10 #include "ash/public/cpp/shell_window_ids.h" 10 #include "ash/public/cpp/shell_window_ids.h"
(...skipping 14 matching lines...) Expand all
25 #include "ash/wm/workspace/workspace_layout_manager_backdrop_delegate.h" 25 #include "ash/wm/workspace/workspace_layout_manager_backdrop_delegate.h"
26 #include "ash/wm_window.h" 26 #include "ash/wm_window.h"
27 #include "base/command_line.h" 27 #include "base/command_line.h"
28 #include "ui/aura/client/aura_constants.h" 28 #include "ui/aura/client/aura_constants.h"
29 #include "ui/base/ui_base_switches.h" 29 #include "ui/base/ui_base_switches.h"
30 #include "ui/compositor/layer.h" 30 #include "ui/compositor/layer.h"
31 #include "ui/display/display.h" 31 #include "ui/display/display.h"
32 #include "ui/display/screen.h" 32 #include "ui/display/screen.h"
33 #include "ui/keyboard/keyboard_controller.h" 33 #include "ui/keyboard/keyboard_controller.h"
34 #include "ui/keyboard/keyboard_controller_observer.h" 34 #include "ui/keyboard/keyboard_controller_observer.h"
35 #include "ui/wm/core/coordinate_conversion.h"
35 #include "ui/wm/public/activation_client.h" 36 #include "ui/wm/public/activation_client.h"
36 37
37 namespace ash { 38 namespace ash {
38 39
39 WorkspaceLayoutManager::WorkspaceLayoutManager(WmWindow* window) 40 WorkspaceLayoutManager::WorkspaceLayoutManager(aura::Window* window)
40 : window_(window), 41 : window_(window),
41 root_window_(window->GetRootWindow()), 42 root_window_(window->GetRootWindow()),
42 root_window_controller_(root_window_->GetRootWindowController()), 43 root_window_controller_(RootWindowController::ForWindow(root_window_)),
43 work_area_in_parent_( 44 work_area_in_parent_(
44 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_->aura_window())), 45 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_)),
45 is_fullscreen_(wm::GetWindowForFullscreenMode(window) != nullptr), 46 is_fullscreen_(wm::GetWindowForFullscreenMode(window) != nullptr),
46 keyboard_observer_(this) { 47 keyboard_observer_(this) {
47 Shell::Get()->AddShellObserver(this); 48 Shell::Get()->AddShellObserver(this);
48 Shell::Get()->activation_client()->AddObserver(this); 49 Shell::Get()->activation_client()->AddObserver(this);
49 root_window_->aura_window()->AddObserver(this); 50 root_window_->AddObserver(this);
50 display::Screen::GetScreen()->AddObserver(this); 51 display::Screen::GetScreen()->AddObserver(this);
51 DCHECK(window->aura_window()->GetProperty(kSnapChildrenToPixelBoundary)); 52 DCHECK(window->GetProperty(kSnapChildrenToPixelBoundary));
52 } 53 }
53 54
54 WorkspaceLayoutManager::~WorkspaceLayoutManager() { 55 WorkspaceLayoutManager::~WorkspaceLayoutManager() {
55 if (root_window_) 56 if (root_window_)
56 root_window_->aura_window()->RemoveObserver(this); 57 root_window_->RemoveObserver(this);
57 for (WmWindow* window : windows_) { 58 for (aura::Window* window : windows_) {
58 wm::WindowState* window_state = window->GetWindowState(); 59 wm::WindowState* window_state = wm::GetWindowState(window);
59 window_state->RemoveObserver(this); 60 window_state->RemoveObserver(this);
60 window->aura_window()->RemoveObserver(this); 61 window->RemoveObserver(this);
61 } 62 }
62 display::Screen::GetScreen()->RemoveObserver(this); 63 display::Screen::GetScreen()->RemoveObserver(this);
63 Shell::Get()->activation_client()->RemoveObserver(this); 64 Shell::Get()->activation_client()->RemoveObserver(this);
64 Shell::Get()->RemoveShellObserver(this); 65 Shell::Get()->RemoveShellObserver(this);
65 } 66 }
66 67
67 void WorkspaceLayoutManager::SetMaximizeBackdropDelegate( 68 void WorkspaceLayoutManager::SetMaximizeBackdropDelegate(
68 std::unique_ptr<WorkspaceLayoutManagerBackdropDelegate> delegate) { 69 std::unique_ptr<WorkspaceLayoutManagerBackdropDelegate> delegate) {
69 backdrop_delegate_ = std::move(delegate); 70 backdrop_delegate_ = std::move(delegate);
70 } 71 }
71 72
72 ////////////////////////////////////////////////////////////////////////////// 73 //////////////////////////////////////////////////////////////////////////////
73 // WorkspaceLayoutManager, aura::LayoutManager implementation: 74 // WorkspaceLayoutManager, aura::LayoutManager implementation:
74 75
75 void WorkspaceLayoutManager::OnWindowResized() {} 76 void WorkspaceLayoutManager::OnWindowResized() {}
76 77
77 void WorkspaceLayoutManager::OnWindowAddedToLayout(WmWindow* child) { 78 void WorkspaceLayoutManager::OnWindowAddedToLayout(aura::Window* child) {
78 wm::WindowState* window_state = child->GetWindowState(); 79 wm::WindowState* window_state = wm::GetWindowState(child);
79 wm::WMEvent event(wm::WM_EVENT_ADDED_TO_WORKSPACE); 80 wm::WMEvent event(wm::WM_EVENT_ADDED_TO_WORKSPACE);
80 window_state->OnWMEvent(&event); 81 window_state->OnWMEvent(&event);
81 windows_.insert(child); 82 windows_.insert(child);
82 child->aura_window()->AddObserver(this); 83 child->AddObserver(this);
83 window_state->AddObserver(this); 84 window_state->AddObserver(this);
84 UpdateShelfVisibility(); 85 UpdateShelfVisibility();
85 UpdateFullscreenState(); 86 UpdateFullscreenState();
86 if (backdrop_delegate_) 87 if (backdrop_delegate_)
87 backdrop_delegate_->OnWindowAddedToLayout(child); 88 backdrop_delegate_->OnWindowAddedToLayout(WmWindow::Get(child));
88 WindowPositioner::RearrangeVisibleWindowOnShow(child); 89 WindowPositioner::RearrangeVisibleWindowOnShow(WmWindow::Get(child));
89 if (Shell::Get()->screen_pinning_controller()->IsPinned()) 90 if (Shell::Get()->screen_pinning_controller()->IsPinned())
90 child->GetWindowState()->DisableAlwaysOnTop(nullptr); 91 wm::GetWindowState(child)->DisableAlwaysOnTop(nullptr);
91 } 92 }
92 93
93 void WorkspaceLayoutManager::OnWillRemoveWindowFromLayout(WmWindow* child) { 94 void WorkspaceLayoutManager::OnWillRemoveWindowFromLayout(aura::Window* child) {
94 windows_.erase(child); 95 windows_.erase(child);
95 child->aura_window()->RemoveObserver(this); 96 child->RemoveObserver(this);
96 child->GetWindowState()->RemoveObserver(this); 97 wm::GetWindowState(child)->RemoveObserver(this);
97 98
98 if (child->GetTargetVisibility()) 99 if (child->layer()->GetTargetVisibility())
99 WindowPositioner::RearrangeVisibleWindowOnHideOrRemove(child); 100 WindowPositioner::RearrangeVisibleWindowOnHideOrRemove(
101 WmWindow::Get(child));
100 } 102 }
101 103
102 void WorkspaceLayoutManager::OnWindowRemovedFromLayout(WmWindow* child) { 104 void WorkspaceLayoutManager::OnWindowRemovedFromLayout(aura::Window* child) {
103 UpdateShelfVisibility(); 105 UpdateShelfVisibility();
104 UpdateFullscreenState(); 106 UpdateFullscreenState();
105 if (backdrop_delegate_) 107 if (backdrop_delegate_)
106 backdrop_delegate_->OnWindowRemovedFromLayout(child); 108 backdrop_delegate_->OnWindowRemovedFromLayout(WmWindow::Get(child));
107 } 109 }
108 110
109 void WorkspaceLayoutManager::OnChildWindowVisibilityChanged(WmWindow* child, 111 void WorkspaceLayoutManager::OnChildWindowVisibilityChanged(aura::Window* child,
110 bool visible) { 112 bool visible) {
111 wm::WindowState* window_state = child->GetWindowState(); 113 wm::WindowState* window_state = wm::GetWindowState(child);
112 // Attempting to show a minimized window. Unminimize it. 114 // Attempting to show a minimized window. Unminimize it.
113 if (visible && window_state->IsMinimized()) 115 if (visible && window_state->IsMinimized())
114 window_state->Unminimize(); 116 window_state->Unminimize();
115 117
116 if (child->GetTargetVisibility()) 118 if (child->layer()->GetTargetVisibility())
117 WindowPositioner::RearrangeVisibleWindowOnShow(child); 119 WindowPositioner::RearrangeVisibleWindowOnShow(WmWindow::Get(child));
118 else 120 else
119 WindowPositioner::RearrangeVisibleWindowOnHideOrRemove(child); 121 WindowPositioner::RearrangeVisibleWindowOnHideOrRemove(
122 WmWindow::Get(child));
120 UpdateFullscreenState(); 123 UpdateFullscreenState();
121 UpdateShelfVisibility(); 124 UpdateShelfVisibility();
122 if (backdrop_delegate_) 125 if (backdrop_delegate_) {
123 backdrop_delegate_->OnChildWindowVisibilityChanged(child, visible); 126 backdrop_delegate_->OnChildWindowVisibilityChanged(WmWindow::Get(child),
127 visible);
128 }
124 } 129 }
125 130
126 void WorkspaceLayoutManager::SetChildBounds(WmWindow* child, 131 void WorkspaceLayoutManager::SetChildBounds(aura::Window* child,
127 const gfx::Rect& requested_bounds) { 132 const gfx::Rect& requested_bounds) {
128 wm::SetBoundsEvent event(wm::WM_EVENT_SET_BOUNDS, requested_bounds); 133 wm::SetBoundsEvent event(wm::WM_EVENT_SET_BOUNDS, requested_bounds);
129 child->GetWindowState()->OnWMEvent(&event); 134 wm::GetWindowState(child)->OnWMEvent(&event);
130 UpdateShelfVisibility(); 135 UpdateShelfVisibility();
131 } 136 }
132 137
133 ////////////////////////////////////////////////////////////////////////////// 138 //////////////////////////////////////////////////////////////////////////////
134 // WorkspaceLayoutManager, keyboard::KeyboardControllerObserver implementation: 139 // WorkspaceLayoutManager, keyboard::KeyboardControllerObserver implementation:
135 140
136 void WorkspaceLayoutManager::OnKeyboardBoundsChanging( 141 void WorkspaceLayoutManager::OnKeyboardBoundsChanging(
137 const gfx::Rect& new_bounds) { 142 const gfx::Rect& new_bounds) {
138 // If new window behavior flag enabled and in non-sticky mode, do not change 143 // If new window behavior flag enabled and in non-sticky mode, do not change
139 // the work area. 144 // the work area.
140 bool change_work_area = 145 bool change_work_area =
141 (!base::CommandLine::ForCurrentProcess()->HasSwitch( 146 (!base::CommandLine::ForCurrentProcess()->HasSwitch(
142 ::switches::kUseNewVirtualKeyboardBehavior) || 147 ::switches::kUseNewVirtualKeyboardBehavior) ||
143 keyboard::KeyboardController::GetInstance()->keyboard_locked()); 148 keyboard::KeyboardController::GetInstance()->keyboard_locked());
144 if (!change_work_area) 149 if (!change_work_area)
145 return; 150 return;
146 151
147 WmWindow* window = WmWindow::Get(wm::GetActiveWindow()); 152 aura::Window* window = wm::GetActiveWindow();
148 if (!window) 153 if (!window)
149 return; 154 return;
150 155
151 window = window->GetToplevelWindow(); 156 window = window->GetToplevelWindow();
152 if (!window_->Contains(window)) 157 if (!window_->Contains(window))
153 return; 158 return;
154 159
155 wm::WindowState* window_state = window->GetWindowState(); 160 wm::WindowState* window_state = wm::GetWindowState(window);
156 if (window_state->ignore_keyboard_bounds_change()) 161 if (window_state->ignore_keyboard_bounds_change())
157 return; 162 return;
158 163
159 if (!new_bounds.IsEmpty()) { 164 if (!new_bounds.IsEmpty()) {
160 // Store existing bounds to be restored before resizing for keyboard if it 165 // Store existing bounds to be restored before resizing for keyboard if it
161 // is not already stored. 166 // is not already stored.
162 if (!window_state->HasRestoreBounds()) 167 if (!window_state->HasRestoreBounds())
163 window_state->SaveCurrentBoundsForRestore(); 168 window_state->SaveCurrentBoundsForRestore();
164 169
165 gfx::Rect window_bounds = 170 gfx::Rect window_bounds(window->GetTargetBounds());
166 window_->ConvertRectToScreen(window->GetTargetBounds()); 171 ::wm::ConvertRectToScreen(window_, &window_bounds);
167 int vertical_displacement = 172 int vertical_displacement =
168 std::max(0, window_bounds.bottom() - new_bounds.y()); 173 std::max(0, window_bounds.bottom() - new_bounds.y());
169 int shift = std::min(vertical_displacement, 174 int shift = std::min(vertical_displacement,
170 window_bounds.y() - work_area_in_parent_.y()); 175 window_bounds.y() - work_area_in_parent_.y());
171 if (shift > 0) { 176 if (shift > 0) {
172 gfx::Point origin(window_bounds.x(), window_bounds.y() - shift); 177 gfx::Point origin(window_bounds.x(), window_bounds.y() - shift);
173 SetChildBounds(window, gfx::Rect(origin, window_bounds.size())); 178 SetChildBounds(window, gfx::Rect(origin, window_bounds.size()));
174 } 179 }
175 } else if (window_state->HasRestoreBounds()) { 180 } else if (window_state->HasRestoreBounds()) {
176 // Keyboard hidden, restore original bounds if they exist. If the user has 181 // Keyboard hidden, restore original bounds if they exist. If the user has
(...skipping 11 matching lines...) Expand all
188 ////////////////////////////////////////////////////////////////////////////// 193 //////////////////////////////////////////////////////////////////////////////
189 // WorkspaceLayoutManager, aura::WindowObserver implementation: 194 // WorkspaceLayoutManager, aura::WindowObserver implementation:
190 195
191 void WorkspaceLayoutManager::OnWindowHierarchyChanged( 196 void WorkspaceLayoutManager::OnWindowHierarchyChanged(
192 const HierarchyChangeParams& params) { 197 const HierarchyChangeParams& params) {
193 if (!wm::GetWindowState(params.target)->IsActive()) 198 if (!wm::GetWindowState(params.target)->IsActive())
194 return; 199 return;
195 // If the window is already tracked by the workspace this update would be 200 // If the window is already tracked by the workspace this update would be
196 // redundant as the fullscreen and shelf state would have been handled in 201 // redundant as the fullscreen and shelf state would have been handled in
197 // OnWindowAddedToLayout. 202 // OnWindowAddedToLayout.
198 if (windows_.find(WmWindow::Get(params.target)) != windows_.end()) 203 if (windows_.find(params.target) != windows_.end())
199 return; 204 return;
200 205
201 // If the active window has moved to this root window then update the 206 // If the active window has moved to this root window then update the
202 // fullscreen state. 207 // fullscreen state.
203 // TODO(flackr): Track the active window leaving this root window and update 208 // TODO(flackr): Track the active window leaving this root window and update
204 // the fullscreen state accordingly. 209 // the fullscreen state accordingly.
205 if (params.new_parent && 210 if (params.new_parent && params.new_parent->GetRootWindow() == root_window_) {
206 WmWindow::Get(params.new_parent->GetRootWindow()) == root_window_) {
207 UpdateFullscreenState(); 211 UpdateFullscreenState();
208 UpdateShelfVisibility(); 212 UpdateShelfVisibility();
209 } 213 }
210 } 214 }
211 215
212 void WorkspaceLayoutManager::OnWindowPropertyChanged(aura::Window* window, 216 void WorkspaceLayoutManager::OnWindowPropertyChanged(aura::Window* window,
213 const void* key, 217 const void* key,
214 intptr_t old) { 218 intptr_t old) {
215 if (key == aura::client::kAlwaysOnTopKey && 219 if (key == aura::client::kAlwaysOnTopKey &&
216 window->GetProperty(aura::client::kAlwaysOnTopKey)) { 220 window->GetProperty(aura::client::kAlwaysOnTopKey)) {
217 WmWindow* container = 221 aura::Window* container =
218 root_window_controller_->always_on_top_controller()->GetContainer( 222 root_window_controller_->always_on_top_controller()
219 WmWindow::Get(window)); 223 ->GetContainer(WmWindow::Get(window))
220 if (WmWindow::Get(window->parent()) != container) 224 ->aura_window();
221 container->AddChild(WmWindow::Get(window)); 225 if (window->parent() != container)
226 container->AddChild(window);
222 } 227 }
223 } 228 }
224 229
225 void WorkspaceLayoutManager::OnWindowStackingChanged(aura::Window* window) { 230 void WorkspaceLayoutManager::OnWindowStackingChanged(aura::Window* window) {
226 UpdateShelfVisibility(); 231 UpdateShelfVisibility();
227 UpdateFullscreenState(); 232 UpdateFullscreenState();
228 if (backdrop_delegate_) 233 if (backdrop_delegate_)
229 backdrop_delegate_->OnWindowStackingChanged(WmWindow::Get(window)); 234 backdrop_delegate_->OnWindowStackingChanged(WmWindow::Get(window));
230 } 235 }
231 236
232 void WorkspaceLayoutManager::OnWindowDestroying(aura::Window* window) { 237 void WorkspaceLayoutManager::OnWindowDestroying(aura::Window* window) {
233 if (root_window_ == WmWindow::Get(window)) { 238 if (root_window_ == window) {
234 root_window_->aura_window()->RemoveObserver(this); 239 root_window_->RemoveObserver(this);
235 root_window_ = nullptr; 240 root_window_ = nullptr;
236 } 241 }
237 } 242 }
238 243
239 void WorkspaceLayoutManager::OnWindowBoundsChanged( 244 void WorkspaceLayoutManager::OnWindowBoundsChanged(
240 aura::Window* window, 245 aura::Window* window,
241 const gfx::Rect& old_bounds, 246 const gfx::Rect& old_bounds,
242 const gfx::Rect& new_bounds) { 247 const gfx::Rect& new_bounds) {
243 if (root_window_ == WmWindow::Get(window)) { 248 if (root_window_ == window) {
244 const wm::WMEvent wm_event(wm::WM_EVENT_DISPLAY_BOUNDS_CHANGED); 249 const wm::WMEvent wm_event(wm::WM_EVENT_DISPLAY_BOUNDS_CHANGED);
245 AdjustAllWindowsBoundsForWorkAreaChange(&wm_event); 250 AdjustAllWindowsBoundsForWorkAreaChange(&wm_event);
246 } 251 }
247 } 252 }
248 253
249 ////////////////////////////////////////////////////////////////////////////// 254 //////////////////////////////////////////////////////////////////////////////
250 // WorkspaceLayoutManager, 255 // WorkspaceLayoutManager,
251 // aura::client::ActivationChangeObserver implementation: 256 // aura::client::ActivationChangeObserver implementation:
252 257
253 void WorkspaceLayoutManager::OnWindowActivated(ActivationReason reason, 258 void WorkspaceLayoutManager::OnWindowActivated(ActivationReason reason,
254 aura::Window* gained_active, 259 aura::Window* gained_active,
255 aura::Window* lost_active) { 260 aura::Window* lost_active) {
256 WmWindow* wm_gained_active = WmWindow::Get(gained_active);
257 wm::WindowState* window_state = 261 wm::WindowState* window_state =
258 wm_gained_active ? wm_gained_active->GetWindowState() : nullptr; 262 gained_active ? wm::GetWindowState(gained_active) : nullptr;
259 if (window_state && window_state->IsMinimized() && 263 if (window_state && window_state->IsMinimized() &&
260 !wm_gained_active->IsVisible()) { 264 !gained_active->IsVisible()) {
261 window_state->Unminimize(); 265 window_state->Unminimize();
262 DCHECK(!window_state->IsMinimized()); 266 DCHECK(!window_state->IsMinimized());
263 } 267 }
264 UpdateFullscreenState(); 268 UpdateFullscreenState();
265 UpdateShelfVisibility(); 269 UpdateShelfVisibility();
266 } 270 }
267 271
268 ////////////////////////////////////////////////////////////////////////////// 272 //////////////////////////////////////////////////////////////////////////////
269 // WorkspaceLayoutManager, wm::WindowStateObserver implementation: 273 // WorkspaceLayoutManager, wm::WindowStateObserver implementation:
270 274
(...skipping 10 matching lines...) Expand all
281 if (backdrop_delegate_) 285 if (backdrop_delegate_)
282 backdrop_delegate_->OnPostWindowStateTypeChange(window_state, old_type); 286 backdrop_delegate_->OnPostWindowStateTypeChange(window_state, old_type);
283 } 287 }
284 288
285 ////////////////////////////////////////////////////////////////////////////// 289 //////////////////////////////////////////////////////////////////////////////
286 // WorkspaceLayoutManager, display::DisplayObserver implementation: 290 // WorkspaceLayoutManager, display::DisplayObserver implementation:
287 291
288 void WorkspaceLayoutManager::OnDisplayMetricsChanged( 292 void WorkspaceLayoutManager::OnDisplayMetricsChanged(
289 const display::Display& display, 293 const display::Display& display,
290 uint32_t changed_metrics) { 294 uint32_t changed_metrics) {
291 if (window_->GetDisplayNearestWindow().id() != display.id()) 295 if (display::Screen::GetScreen()->GetDisplayNearestWindow(window_).id() !=
296 display.id()) {
292 return; 297 return;
298 }
293 299
294 const gfx::Rect work_area( 300 const gfx::Rect work_area(
295 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_->aura_window())); 301 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_));
296 if (work_area != work_area_in_parent_) { 302 if (work_area != work_area_in_parent_) {
297 const wm::WMEvent event(wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED); 303 const wm::WMEvent event(wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED);
298 AdjustAllWindowsBoundsForWorkAreaChange(&event); 304 AdjustAllWindowsBoundsForWorkAreaChange(&event);
299 } 305 }
300 } 306 }
301 307
302 ////////////////////////////////////////////////////////////////////////////// 308 //////////////////////////////////////////////////////////////////////////////
303 // WorkspaceLayoutManager, ShellObserver implementation: 309 // WorkspaceLayoutManager, ShellObserver implementation:
304 310
305 void WorkspaceLayoutManager::OnFullscreenStateChanged(bool is_fullscreen, 311 void WorkspaceLayoutManager::OnFullscreenStateChanged(bool is_fullscreen,
306 WmWindow* root_window) { 312 WmWindow* root_window) {
307 if (root_window != root_window_ || is_fullscreen_ == is_fullscreen) 313 if (root_window->aura_window() != root_window_ ||
314 is_fullscreen_ == is_fullscreen) {
308 return; 315 return;
316 }
309 317
310 is_fullscreen_ = is_fullscreen; 318 is_fullscreen_ = is_fullscreen;
311 if (Shell::Get()->screen_pinning_controller()->IsPinned()) { 319 if (Shell::Get()->screen_pinning_controller()->IsPinned()) {
312 // If this is in pinned mode, then this event does not trigger the 320 // If this is in pinned mode, then this event does not trigger the
313 // always-on-top state change, because it is kept disabled regardless of 321 // always-on-top state change, because it is kept disabled regardless of
314 // the fullscreen state change. 322 // the fullscreen state change.
315 return; 323 return;
316 } 324 }
317 325
318 UpdateAlwaysOnTop(is_fullscreen_ ? wm::GetWindowForFullscreenMode(window_) 326 UpdateAlwaysOnTop(is_fullscreen_ ? wm::GetWindowForFullscreenMode(window_)
319 : nullptr); 327 : nullptr);
320 } 328 }
321 329
322 void WorkspaceLayoutManager::OnPinnedStateChanged(WmWindow* pinned_window) { 330 void WorkspaceLayoutManager::OnPinnedStateChanged(WmWindow* pinned_window) {
323 const bool is_pinned = Shell::Get()->screen_pinning_controller()->IsPinned(); 331 const bool is_pinned = Shell::Get()->screen_pinning_controller()->IsPinned();
324 if (!is_pinned && is_fullscreen_) { 332 if (!is_pinned && is_fullscreen_) {
325 // On exiting from pinned mode, if the workspace is still in fullscreen 333 // On exiting from pinned mode, if the workspace is still in fullscreen
326 // mode, then this event does not trigger the restoring yet. On exiting 334 // mode, then this event does not trigger the restoring yet. On exiting
327 // from fullscreen, the temporarily disabled always-on-top property will be 335 // from fullscreen, the temporarily disabled always-on-top property will be
328 // restored. 336 // restored.
329 return; 337 return;
330 } 338 }
331 339
332 UpdateAlwaysOnTop(is_pinned ? pinned_window : nullptr); 340 UpdateAlwaysOnTop(is_pinned ? pinned_window->aura_window() : nullptr);
333 } 341 }
334 342
335 void WorkspaceLayoutManager::OnVirtualKeyboardStateChanged( 343 void WorkspaceLayoutManager::OnVirtualKeyboardStateChanged(
336 bool activated, 344 bool activated,
337 WmWindow* root_window) { 345 WmWindow* root_window) {
338 UpdateKeyboardObserverFromStateChanged(activated, root_window, root_window_, 346 UpdateKeyboardObserverFromStateChanged(
339 &keyboard_observer_); 347 activated, root_window, WmWindow::Get(root_window_), &keyboard_observer_);
340 } 348 }
341 349
342 ////////////////////////////////////////////////////////////////////////////// 350 //////////////////////////////////////////////////////////////////////////////
343 // WorkspaceLayoutManager, private: 351 // WorkspaceLayoutManager, private:
344 352
345 void WorkspaceLayoutManager::AdjustAllWindowsBoundsForWorkAreaChange( 353 void WorkspaceLayoutManager::AdjustAllWindowsBoundsForWorkAreaChange(
346 const wm::WMEvent* event) { 354 const wm::WMEvent* event) {
347 DCHECK(event->type() == wm::WM_EVENT_DISPLAY_BOUNDS_CHANGED || 355 DCHECK(event->type() == wm::WM_EVENT_DISPLAY_BOUNDS_CHANGED ||
348 event->type() == wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED); 356 event->type() == wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED);
349 357
350 work_area_in_parent_ = 358 work_area_in_parent_ = ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_);
351 ScreenUtil::GetDisplayWorkAreaBoundsInParent(window_->aura_window());
352 359
353 // Don't do any adjustments of the insets while we are in screen locked mode. 360 // Don't do any adjustments of the insets while we are in screen locked mode.
354 // This would happen if the launcher was auto hidden before the login screen 361 // This would happen if the launcher was auto hidden before the login screen
355 // was shown and then gets shown when the login screen gets presented. 362 // was shown and then gets shown when the login screen gets presented.
356 if (event->type() == wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED && 363 if (event->type() == wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED &&
357 Shell::Get()->session_controller()->IsScreenLocked()) 364 Shell::Get()->session_controller()->IsScreenLocked())
358 return; 365 return;
359 366
360 // If a user plugs an external display into a laptop running Aura the 367 // If a user plugs an external display into a laptop running Aura the
361 // display size will change. Maximized windows need to resize to match. 368 // display size will change. Maximized windows need to resize to match.
362 // We also do this when developers running Aura on a desktop manually resize 369 // We also do this when developers running Aura on a desktop manually resize
363 // the host window. 370 // the host window.
364 // We also need to do this when the work area insets changes. 371 // We also need to do this when the work area insets changes.
365 for (WmWindow* window : windows_) 372 for (aura::Window* window : windows_)
366 window->GetWindowState()->OnWMEvent(event); 373 wm::GetWindowState(window)->OnWMEvent(event);
367 } 374 }
368 375
369 void WorkspaceLayoutManager::UpdateShelfVisibility() { 376 void WorkspaceLayoutManager::UpdateShelfVisibility() {
370 if (root_window_controller_->HasShelf()) 377 if (root_window_controller_->HasShelf())
371 root_window_controller_->GetShelf()->UpdateVisibilityState(); 378 root_window_controller_->GetShelf()->UpdateVisibilityState();
372 } 379 }
373 380
374 void WorkspaceLayoutManager::UpdateFullscreenState() { 381 void WorkspaceLayoutManager::UpdateFullscreenState() {
375 // TODO(flackr): The fullscreen state is currently tracked per workspace 382 // TODO(flackr): The fullscreen state is currently tracked per workspace
376 // but the shell notification implies a per root window state. Currently 383 // but the shell notification implies a per root window state. Currently
377 // only windows in the default workspace container will go fullscreen but 384 // only windows in the default workspace container will go fullscreen but
378 // this should really be tracked by the RootWindowController since 385 // this should really be tracked by the RootWindowController since
379 // technically any container could get a fullscreen window. 386 // technically any container could get a fullscreen window.
380 if (window_->aura_window()->id() != kShellWindowId_DefaultContainer) 387 if (window_->id() != kShellWindowId_DefaultContainer)
381 return; 388 return;
382 bool is_fullscreen = wm::GetWindowForFullscreenMode(window_) != nullptr; 389 bool is_fullscreen = wm::GetWindowForFullscreenMode(window_) != nullptr;
383 if (is_fullscreen != is_fullscreen_) { 390 if (is_fullscreen != is_fullscreen_) {
384 Shell::Get()->NotifyFullscreenStateChanged(is_fullscreen, root_window_); 391 Shell::Get()->NotifyFullscreenStateChanged(is_fullscreen,
392 WmWindow::Get(root_window_));
385 is_fullscreen_ = is_fullscreen; 393 is_fullscreen_ = is_fullscreen;
386 } 394 }
387 } 395 }
388 396
389 void WorkspaceLayoutManager::UpdateAlwaysOnTop(WmWindow* window_on_top) { 397 void WorkspaceLayoutManager::UpdateAlwaysOnTop(aura::Window* window_on_top) {
390 // Changing always on top state may change window's parent. Iterate on a copy 398 // Changing always on top state may change window's parent. Iterate on a copy
391 // of |windows_| to avoid invalidating an iterator. Since both workspace and 399 // of |windows_| to avoid invalidating an iterator. Since both workspace and
392 // always_on_top containers' layouts are managed by this class all the 400 // always_on_top containers' layouts are managed by this class all the
393 // appropriate windows will be included in the iteration. 401 // appropriate windows will be included in the iteration.
394 WindowSet windows(windows_); 402 WindowSet windows(windows_);
395 for (auto* window : windows) { 403 for (aura::Window* window : windows) {
396 wm::WindowState* window_state = window->GetWindowState(); 404 wm::WindowState* window_state = wm::GetWindowState(window);
397 if (window_on_top) 405 if (window_on_top)
398 window_state->DisableAlwaysOnTop(window_on_top); 406 window_state->DisableAlwaysOnTop(WmWindow::Get(window_on_top));
399 else 407 else
400 window_state->RestoreAlwaysOnTop(); 408 window_state->RestoreAlwaysOnTop();
401 } 409 }
402 } 410 }
403 411
404 } // namespace ash 412 } // namespace ash
OLDNEW
« no previous file with comments | « ash/wm/workspace/workspace_layout_manager.h ('k') | ash/wm/workspace/workspace_layout_manager_keyboard_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698