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

Side by Side Diff: ash/display/display_controller.cc

Issue 201573015: Introdcue AshWindowTreeHost and move ash/chrome specific code in WTH to ash. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « ash/display/display_controller.h ('k') | ash/display/mirror_window_controller.h » ('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 (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/display/display_controller.h" 5 #include "ash/display/display_controller.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <map> 9 #include <map>
10 10
11 #include "ash/ash_switches.h" 11 #include "ash/ash_switches.h"
12 #include "ash/display/cursor_window_controller.h" 12 #include "ash/display/cursor_window_controller.h"
13 #include "ash/display/display_layout_store.h" 13 #include "ash/display/display_layout_store.h"
14 #include "ash/display/display_manager.h" 14 #include "ash/display/display_manager.h"
15 #include "ash/display/mirror_window_controller.h" 15 #include "ash/display/mirror_window_controller.h"
16 #include "ash/display/root_window_transformers.h" 16 #include "ash/display/root_window_transformers.h"
17 #include "ash/display/virtual_keyboard_window_controller.h" 17 #include "ash/display/virtual_keyboard_window_controller.h"
18 #include "ash/host/window_tree_host_factory.h" 18 #include "ash/host/ash_window_tree_host.h"
19 #include "ash/host/root_window_transformer.h"
19 #include "ash/root_window_controller.h" 20 #include "ash/root_window_controller.h"
20 #include "ash/root_window_settings.h" 21 #include "ash/root_window_settings.h"
21 #include "ash/screen_util.h" 22 #include "ash/screen_util.h"
22 #include "ash/shell.h" 23 #include "ash/shell.h"
23 #include "ash/shell_delegate.h" 24 #include "ash/shell_delegate.h"
24 #include "ash/wm/coordinate_conversion.h" 25 #include "ash/wm/coordinate_conversion.h"
25 #include "base/command_line.h" 26 #include "base/command_line.h"
26 #include "base/strings/stringprintf.h" 27 #include "base/strings/stringprintf.h"
27 #include "ui/aura/client/capture_client.h" 28 #include "ui/aura/client/capture_client.h"
28 #include "ui/aura/client/focus_client.h" 29 #include "ui/aura/client/focus_client.h"
29 #include "ui/aura/client/screen_position_client.h" 30 #include "ui/aura/client/screen_position_client.h"
30 #include "ui/aura/root_window_transformer.h"
31 #include "ui/aura/window.h" 31 #include "ui/aura/window.h"
32 #include "ui/aura/window_event_dispatcher.h" 32 #include "ui/aura/window_event_dispatcher.h"
33 #include "ui/aura/window_property.h" 33 #include "ui/aura/window_property.h"
34 #include "ui/aura/window_tracker.h" 34 #include "ui/aura/window_tracker.h"
35 #include "ui/aura/window_tree_host.h"
35 #include "ui/compositor/compositor.h" 36 #include "ui/compositor/compositor.h"
36 #include "ui/compositor/compositor_vsync_manager.h" 37 #include "ui/compositor/compositor_vsync_manager.h"
37 #include "ui/gfx/display.h" 38 #include "ui/gfx/display.h"
38 #include "ui/gfx/screen.h" 39 #include "ui/gfx/screen.h"
39 #include "ui/wm/public/activation_client.h" 40 #include "ui/wm/public/activation_client.h"
40 41
41 #if defined(OS_CHROMEOS) 42 #if defined(OS_CHROMEOS)
42 #include "ash/display/output_configurator_animation.h" 43 #include "ash/display/output_configurator_animation.h"
43 #include "base/sys_info.h" 44 #include "base/sys_info.h"
44 #include "base/time/time.h" 45 #include "base/time/time.h"
(...skipping 24 matching lines...) Expand all
69 // displays. It will be overriden by |kAfterDisplayChangeThrottleTimeoutMs| 70 // displays. It will be overriden by |kAfterDisplayChangeThrottleTimeoutMs|
70 // when the display change happens, so the actual timeout is much shorter. 71 // when the display change happens, so the actual timeout is much shorter.
71 const int64 kAfterDisplayChangeThrottleTimeoutMs = 500; 72 const int64 kAfterDisplayChangeThrottleTimeoutMs = 500;
72 const int64 kCycleDisplayThrottleTimeoutMs = 4000; 73 const int64 kCycleDisplayThrottleTimeoutMs = 4000;
73 const int64 kSwapDisplayThrottleTimeoutMs = 500; 74 const int64 kSwapDisplayThrottleTimeoutMs = 500;
74 75
75 DisplayManager* GetDisplayManager() { 76 DisplayManager* GetDisplayManager() {
76 return Shell::GetInstance()->display_manager(); 77 return Shell::GetInstance()->display_manager();
77 } 78 }
78 79
79 void SetDisplayPropertiesOnHost(aura::WindowTreeHost* host, 80 void SetDisplayPropertiesOnHost(AshWindowTreeHost* ash_host,
80 const gfx::Display& display) { 81 const gfx::Display& display) {
81 DisplayInfo info = GetDisplayManager()->GetDisplayInfo(display.id()); 82 DisplayInfo info = GetDisplayManager()->GetDisplayInfo(display.id());
83 aura::WindowTreeHost* host = ash_host->AsWindowTreeHost();
82 #if defined(OS_CHROMEOS) && defined(USE_X11) 84 #if defined(OS_CHROMEOS) && defined(USE_X11)
83 // Native window property (Atom in X11) that specifies the display's 85 // Native window property (Atom in X11) that specifies the display's
84 // rotation, scale factor and if it's internal display. They are 86 // rotation, scale factor and if it's internal display. They are
85 // read and used by touchpad/mouse driver directly on X (contact 87 // read and used by touchpad/mouse driver directly on X (contact
86 // adlr@ for more details on touchpad/mouse driver side). The value 88 // adlr@ for more details on touchpad/mouse driver side). The value
87 // of the rotation is one of 0 (normal), 1 (90 degrees clockwise), 2 89 // of the rotation is one of 0 (normal), 1 (90 degrees clockwise), 2
88 // (180 degree) or 3 (270 degrees clockwise). The value of the 90 // (180 degree) or 3 (270 degrees clockwise). The value of the
89 // scale factor is in percent (100, 140, 200 etc). 91 // scale factor is in percent (100, 140, 200 etc).
90 const char kRotationProp[] = "_CHROME_DISPLAY_ROTATION"; 92 const char kRotationProp[] = "_CHROME_DISPLAY_ROTATION";
91 const char kScaleFactorProp[] = "_CHROME_DISPLAY_SCALE_FACTOR"; 93 const char kScaleFactorProp[] = "_CHROME_DISPLAY_SCALE_FACTOR";
(...skipping 17 matching lines...) Expand all
109 111
110 int internal = display.IsInternal() ? 1 : 0; 112 int internal = display.IsInternal() ? 1 : 0;
111 gfx::AcceleratedWidget xwindow = host->GetAcceleratedWidget(); 113 gfx::AcceleratedWidget xwindow = host->GetAcceleratedWidget();
112 ui::SetIntProperty(xwindow, kInternalProp, kCARDINAL, internal); 114 ui::SetIntProperty(xwindow, kInternalProp, kCARDINAL, internal);
113 ui::SetIntProperty(xwindow, kRotationProp, kCARDINAL, xrandr_rotation); 115 ui::SetIntProperty(xwindow, kRotationProp, kCARDINAL, xrandr_rotation);
114 ui::SetIntProperty(xwindow, 116 ui::SetIntProperty(xwindow,
115 kScaleFactorProp, 117 kScaleFactorProp,
116 kCARDINAL, 118 kCARDINAL,
117 100 * display.device_scale_factor()); 119 100 * display.device_scale_factor());
118 #endif 120 #endif
119 scoped_ptr<aura::RootWindowTransformer> transformer( 121 scoped_ptr<RootWindowTransformer> transformer(
120 CreateRootWindowTransformerForDisplay(host->window(), display)); 122 CreateRootWindowTransformerForDisplay(host->window(), display));
121 host->SetRootWindowTransformer(transformer.Pass()); 123 ash_host->SetRootWindowTransformer(transformer.Pass());
122 124
123 DisplayMode mode; 125 DisplayMode mode;
124 if (GetDisplayManager()->GetSelectedModeForDisplayId(display.id(), &mode) && 126 if (GetDisplayManager()->GetSelectedModeForDisplayId(display.id(), &mode) &&
125 mode.refresh_rate > 0.0f) { 127 mode.refresh_rate > 0.0f) {
126 host->compositor()->vsync_manager()->SetAuthoritativeVSyncInterval( 128 host->compositor()->vsync_manager()->SetAuthoritativeVSyncInterval(
127 base::TimeDelta::FromMicroseconds( 129 base::TimeDelta::FromMicroseconds(
128 base::Time::kMicrosecondsPerSecond / mode.refresh_rate)); 130 base::Time::kMicrosecondsPerSecond / mode.refresh_rate));
129 } 131 }
130 } 132 }
131 133
134 aura::Window* GetWindow(AshWindowTreeHost* ash_host) {
135 return ash_host->AsWindowTreeHost()->window();
136 }
137
132 } // namespace 138 } // namespace
133 139
134 // A utility class to store/restore focused/active window 140 // A utility class to store/restore focused/active window
135 // when the display configuration has changed. 141 // when the display configuration has changed.
136 class FocusActivationStore { 142 class FocusActivationStore {
137 public: 143 public:
138 FocusActivationStore() 144 FocusActivationStore()
139 : activation_client_(NULL), 145 : activation_client_(NULL),
140 capture_client_(NULL), 146 capture_client_(NULL),
141 focus_client_(NULL), 147 focus_client_(NULL),
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 } 217 }
212 218
213 bool DisplayController::DisplayChangeLimiter::IsThrottled() const { 219 bool DisplayController::DisplayChangeLimiter::IsThrottled() const {
214 return base::Time::Now() < throttle_timeout_; 220 return base::Time::Now() < throttle_timeout_;
215 } 221 }
216 222
217 //////////////////////////////////////////////////////////////////////////////// 223 ////////////////////////////////////////////////////////////////////////////////
218 // DisplayController 224 // DisplayController
219 225
220 DisplayController::DisplayController() 226 DisplayController::DisplayController()
221 : primary_root_window_for_replace_(NULL), 227 : primary_tree_host_for_replace_(NULL),
222 focus_activation_store_(new FocusActivationStore()), 228 focus_activation_store_(new FocusActivationStore()),
223 cursor_window_controller_(new CursorWindowController()), 229 cursor_window_controller_(new CursorWindowController()),
224 mirror_window_controller_(new MirrorWindowController()) { 230 mirror_window_controller_(new MirrorWindowController()) {
225 #if defined(OS_CHROMEOS) 231 #if defined(OS_CHROMEOS)
226 if (base::SysInfo::IsRunningOnChromeOS()) 232 if (base::SysInfo::IsRunningOnChromeOS())
227 limiter_.reset(new DisplayChangeLimiter); 233 limiter_.reset(new DisplayChangeLimiter);
228 #endif 234 #endif
229 // Reset primary display to make sure that tests don't use 235 // Reset primary display to make sure that tests don't use
230 // stale display info from previous tests. 236 // stale display info from previous tests.
231 primary_display_id = gfx::Display::kInvalidDisplayID; 237 primary_display_id = gfx::Display::kInvalidDisplayID;
(...skipping 18 matching lines...) Expand all
250 // DisplayManager outlives DisplayController. 256 // DisplayManager outlives DisplayController.
251 Shell::GetInstance()->display_manager()->set_delegate(NULL); 257 Shell::GetInstance()->display_manager()->set_delegate(NULL);
252 258
253 cursor_window_controller_.reset(); 259 cursor_window_controller_.reset();
254 mirror_window_controller_.reset(); 260 mirror_window_controller_.reset();
255 virtual_keyboard_window_controller_.reset(); 261 virtual_keyboard_window_controller_.reset();
256 262
257 Shell::GetScreen()->RemoveObserver(this); 263 Shell::GetScreen()->RemoveObserver(this);
258 // Delete all root window controllers, which deletes root window 264 // Delete all root window controllers, which deletes root window
259 // from the last so that the primary root window gets deleted last. 265 // from the last so that the primary root window gets deleted last.
260 for (std::map<int64, aura::Window*>::const_reverse_iterator it = 266 for (WindowTreeHostMap::const_reverse_iterator it =
261 root_windows_.rbegin(); it != root_windows_.rend(); ++it) { 267 window_tree_hosts_.rbegin();
262 RootWindowController* controller = GetRootWindowController(it->second); 268 it != window_tree_hosts_.rend();
269 ++it) {
270 RootWindowController* controller =
271 GetRootWindowController(GetWindow(it->second));
263 DCHECK(controller); 272 DCHECK(controller);
264 delete controller; 273 delete controller;
265 } 274 }
266 } 275 }
267 276
268 void DisplayController::InitPrimaryDisplay() { 277 void DisplayController::CreatePrimaryHost() {
269 const gfx::Display& primary_candidate = 278 const gfx::Display& primary_candidate =
270 GetDisplayManager()->GetPrimaryDisplayCandidate(); 279 GetDisplayManager()->GetPrimaryDisplayCandidate();
271 primary_display_id = primary_candidate.id(); 280 primary_display_id = primary_candidate.id();
272 AddWindowTreeHostForDisplay(primary_candidate); 281 AddWindowTreeHostForDisplay(primary_candidate);
273 } 282 }
274 283
275 void DisplayController::InitSecondaryDisplays() { 284 void DisplayController::InitDisplays() {
285 RootWindowController::CreateForPrimaryDisplay(
286 window_tree_hosts_[primary_display_id]);
287
276 DisplayManager* display_manager = GetDisplayManager(); 288 DisplayManager* display_manager = GetDisplayManager();
277 for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) { 289 for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
278 const gfx::Display& display = display_manager->GetDisplayAt(i); 290 const gfx::Display& display = display_manager->GetDisplayAt(i);
279 if (primary_display_id != display.id()) { 291 if (primary_display_id != display.id()) {
280 aura::WindowTreeHost* host = AddWindowTreeHostForDisplay(display); 292 AshWindowTreeHost* ash_host = AddWindowTreeHostForDisplay(display);
281 RootWindowController::CreateForSecondaryDisplay(host); 293 RootWindowController::CreateForSecondaryDisplay(ash_host);
282 } 294 }
283 } 295 }
284 UpdateHostWindowNames(); 296 UpdateHostWindowNames();
285 } 297 }
286 298
287 void DisplayController::AddObserver(Observer* observer) { 299 void DisplayController::AddObserver(Observer* observer) {
288 observers_.AddObserver(observer); 300 observers_.AddObserver(observer);
289 } 301 }
290 302
291 void DisplayController::RemoveObserver(Observer* observer) { 303 void DisplayController::RemoveObserver(Observer* observer) {
292 observers_.RemoveObserver(observer); 304 observers_.RemoveObserver(observer);
293 } 305 }
294 306
295 // static 307 // static
296 int64 DisplayController::GetPrimaryDisplayId() { 308 int64 DisplayController::GetPrimaryDisplayId() {
297 return primary_display_id; 309 return primary_display_id;
298 } 310 }
299 311
300 aura::Window* DisplayController::GetPrimaryRootWindow() { 312 aura::Window* DisplayController::GetPrimaryRootWindow() {
301 DCHECK(!root_windows_.empty()); 313 return GetRootWindowForDisplayId(primary_display_id);
302 return root_windows_[primary_display_id];
303 } 314 }
304 315
305 aura::Window* DisplayController::GetRootWindowForDisplayId(int64 id) { 316 aura::Window* DisplayController::GetRootWindowForDisplayId(int64 id) {
306 return root_windows_[id]; 317 DCHECK_EQ(1u, window_tree_hosts_.count(id));
318 return GetWindow(window_tree_hosts_[id]);
307 } 319 }
308 320
309 void DisplayController::CloseChildWindows() { 321 void DisplayController::CloseChildWindows() {
310 for (std::map<int64, aura::Window*>::const_iterator it = 322 for (WindowTreeHostMap::const_iterator it = window_tree_hosts_.begin();
311 root_windows_.begin(); it != root_windows_.end(); ++it) { 323 it != window_tree_hosts_.end();
312 aura::Window* root_window = it->second; 324 ++it) {
325 aura::Window* root_window = GetWindow(it->second);
313 RootWindowController* controller = GetRootWindowController(root_window); 326 RootWindowController* controller = GetRootWindowController(root_window);
314 if (controller) { 327 if (controller) {
315 controller->CloseChildWindows(); 328 controller->CloseChildWindows();
316 } else { 329 } else {
317 while (!root_window->children().empty()) { 330 while (!root_window->children().empty()) {
318 aura::Window* child = root_window->children()[0]; 331 aura::Window* child = root_window->children()[0];
319 delete child; 332 delete child;
320 } 333 }
321 } 334 }
322 } 335 }
323 } 336 }
324 337
325 aura::Window::Windows DisplayController::GetAllRootWindows() { 338 aura::Window::Windows DisplayController::GetAllRootWindows() {
326 aura::Window::Windows windows; 339 aura::Window::Windows windows;
327 for (std::map<int64, aura::Window*>::const_iterator it = 340 for (WindowTreeHostMap::const_iterator it = window_tree_hosts_.begin();
328 root_windows_.begin(); it != root_windows_.end(); ++it) { 341 it != window_tree_hosts_.end();
342 ++it) {
329 DCHECK(it->second); 343 DCHECK(it->second);
330 if (GetRootWindowController(it->second)) 344 if (GetRootWindowController(GetWindow(it->second)))
331 windows.push_back(it->second); 345 windows.push_back(GetWindow(it->second));
332 } 346 }
333 return windows; 347 return windows;
334 } 348 }
335 349
336 gfx::Insets DisplayController::GetOverscanInsets(int64 display_id) const { 350 gfx::Insets DisplayController::GetOverscanInsets(int64 display_id) const {
337 return GetDisplayManager()->GetOverscanInsets(display_id); 351 return GetDisplayManager()->GetOverscanInsets(display_id);
338 } 352 }
339 353
340 void DisplayController::SetOverscanInsets(int64 display_id, 354 void DisplayController::SetOverscanInsets(int64 display_id,
341 const gfx::Insets& insets_in_dip) { 355 const gfx::Insets& insets_in_dip) {
342 GetDisplayManager()->SetOverscanInsets(display_id, insets_in_dip); 356 GetDisplayManager()->SetOverscanInsets(display_id, insets_in_dip);
343 } 357 }
344 358
345 std::vector<RootWindowController*> 359 std::vector<RootWindowController*>
346 DisplayController::GetAllRootWindowControllers() { 360 DisplayController::GetAllRootWindowControllers() {
347 std::vector<RootWindowController*> controllers; 361 std::vector<RootWindowController*> controllers;
348 for (std::map<int64, aura::Window*>::const_iterator it = 362 for (WindowTreeHostMap::const_iterator it = window_tree_hosts_.begin();
349 root_windows_.begin(); it != root_windows_.end(); ++it) { 363 it != window_tree_hosts_.end();
350 RootWindowController* controller = GetRootWindowController(it->second); 364 ++it) {
365 RootWindowController* controller =
366 GetRootWindowController(GetWindow(it->second));
351 if (controller) 367 if (controller)
352 controllers.push_back(controller); 368 controllers.push_back(controller);
353 } 369 }
354 return controllers; 370 return controllers;
355 } 371 }
356 372
357 void DisplayController::ToggleMirrorMode() { 373 void DisplayController::ToggleMirrorMode() {
358 DisplayManager* display_manager = GetDisplayManager(); 374 DisplayManager* display_manager = GetDisplayManager();
359 if (display_manager->num_connected_displays() <= 1) 375 if (display_manager->num_connected_displays() <= 1)
360 return; 376 return;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 DCHECK(display_manager->IsActiveDisplay(new_primary_display)); 432 DCHECK(display_manager->IsActiveDisplay(new_primary_display));
417 433
418 if (!new_primary_display.is_valid() || 434 if (!new_primary_display.is_valid() ||
419 !display_manager->IsActiveDisplay(new_primary_display)) { 435 !display_manager->IsActiveDisplay(new_primary_display)) {
420 LOG(ERROR) << "Invalid or non-existent display is requested:" 436 LOG(ERROR) << "Invalid or non-existent display is requested:"
421 << new_primary_display.ToString(); 437 << new_primary_display.ToString();
422 return; 438 return;
423 } 439 }
424 440
425 if (primary_display_id == new_primary_display.id() || 441 if (primary_display_id == new_primary_display.id() ||
426 root_windows_.size() < 2) { 442 window_tree_hosts_.size() < 2) {
427 return; 443 return;
428 } 444 }
429 445
430 aura::Window* non_primary_root = root_windows_[new_primary_display.id()]; 446 AshWindowTreeHost* non_primary_host =
431 LOG_IF(ERROR, !non_primary_root) 447 window_tree_hosts_[new_primary_display.id()];
448 LOG_IF(ERROR, !non_primary_host)
432 << "Unknown display is requested in SetPrimaryDisplay: id=" 449 << "Unknown display is requested in SetPrimaryDisplay: id="
433 << new_primary_display.id(); 450 << new_primary_display.id();
434 if (!non_primary_root) 451 if (!non_primary_host)
435 return; 452 return;
436 453
437 gfx::Display old_primary_display = Shell::GetScreen()->GetPrimaryDisplay(); 454 gfx::Display old_primary_display = Shell::GetScreen()->GetPrimaryDisplay();
438 455
439 // Swap root windows between current and new primary display. 456 // Swap root windows between current and new primary display.
440 aura::Window* primary_root = root_windows_[primary_display_id]; 457 AshWindowTreeHost* primary_host = window_tree_hosts_[primary_display_id];
441 DCHECK(primary_root); 458 DCHECK(primary_host);
442 DCHECK_NE(primary_root, non_primary_root); 459 DCHECK_NE(primary_host, non_primary_host);
443 460
444 root_windows_[new_primary_display.id()] = primary_root; 461 window_tree_hosts_[new_primary_display.id()] = primary_host;
445 GetRootWindowSettings(primary_root)->display_id = new_primary_display.id(); 462 GetRootWindowSettings(GetWindow(primary_host))->display_id =
463 new_primary_display.id();
446 464
447 root_windows_[old_primary_display.id()] = non_primary_root; 465 window_tree_hosts_[old_primary_display.id()] = non_primary_host;
448 GetRootWindowSettings(non_primary_root)->display_id = 466 GetRootWindowSettings(GetWindow(non_primary_host))->display_id =
449 old_primary_display.id(); 467 old_primary_display.id();
450 468
451 primary_display_id = new_primary_display.id(); 469 primary_display_id = new_primary_display.id();
452 GetDisplayManager()->layout_store()->UpdatePrimaryDisplayId( 470 GetDisplayManager()->layout_store()->UpdatePrimaryDisplayId(
453 display_manager->GetCurrentDisplayIdPair(), primary_display_id); 471 display_manager->GetCurrentDisplayIdPair(), primary_display_id);
454 472
455 UpdateWorkAreaOfDisplayNearestWindow( 473 UpdateWorkAreaOfDisplayNearestWindow(GetWindow(primary_host),
456 primary_root, old_primary_display.GetWorkAreaInsets()); 474 old_primary_display.GetWorkAreaInsets());
457 UpdateWorkAreaOfDisplayNearestWindow( 475 UpdateWorkAreaOfDisplayNearestWindow(GetWindow(non_primary_host),
458 non_primary_root, new_primary_display.GetWorkAreaInsets()); 476 new_primary_display.GetWorkAreaInsets());
459 477
460 // Update the dispay manager with new display info. 478 // Update the dispay manager with new display info.
461 std::vector<DisplayInfo> display_info_list; 479 std::vector<DisplayInfo> display_info_list;
462 display_info_list.push_back(display_manager->GetDisplayInfo( 480 display_info_list.push_back(display_manager->GetDisplayInfo(
463 primary_display_id)); 481 primary_display_id));
464 display_info_list.push_back(display_manager->GetDisplayInfo( 482 display_info_list.push_back(display_manager->GetDisplayInfo(
465 ScreenUtil::GetSecondaryDisplay().id())); 483 ScreenUtil::GetSecondaryDisplay().id()));
466 GetDisplayManager()->set_force_bounds_changed(true); 484 GetDisplayManager()->set_force_bounds_changed(true);
467 GetDisplayManager()->UpdateDisplays(display_info_list); 485 GetDisplayManager()->UpdateDisplays(display_info_list);
468 GetDisplayManager()->set_force_bounds_changed(false); 486 GetDisplayManager()->set_force_bounds_changed(false);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 int64 id = GetRootWindowSettings(root_window)->display_id; 540 int64 id = GetRootWindowSettings(root_window)->display_id;
523 // if id is |kInvaildDisplayID|, it's being deleted. 541 // if id is |kInvaildDisplayID|, it's being deleted.
524 DCHECK(id != gfx::Display::kInvalidDisplayID); 542 DCHECK(id != gfx::Display::kInvalidDisplayID);
525 return GetDisplayManager()->UpdateWorkAreaOfDisplay(id, insets); 543 return GetDisplayManager()->UpdateWorkAreaOfDisplay(id, insets);
526 } 544 }
527 545
528 void DisplayController::OnDisplayBoundsChanged(const gfx::Display& display) { 546 void DisplayController::OnDisplayBoundsChanged(const gfx::Display& display) {
529 const DisplayInfo& display_info = 547 const DisplayInfo& display_info =
530 GetDisplayManager()->GetDisplayInfo(display.id()); 548 GetDisplayManager()->GetDisplayInfo(display.id());
531 DCHECK(!display_info.bounds_in_native().IsEmpty()); 549 DCHECK(!display_info.bounds_in_native().IsEmpty());
532 aura::WindowTreeHost* host = root_windows_[display.id()]->GetHost(); 550 AshWindowTreeHost* ash_host = window_tree_hosts_[display.id()];
533 host->SetBounds(display_info.bounds_in_native()); 551 ash_host->AsWindowTreeHost()->SetBounds(display_info.bounds_in_native());
534 SetDisplayPropertiesOnHost(host, display); 552 SetDisplayPropertiesOnHost(ash_host, display);
535 } 553 }
536 554
537 void DisplayController::OnDisplayAdded(const gfx::Display& display) { 555 void DisplayController::OnDisplayAdded(const gfx::Display& display) {
538 if (primary_root_window_for_replace_) { 556 if (primary_tree_host_for_replace_) {
539 DCHECK(root_windows_.empty()); 557 DCHECK(window_tree_hosts_.empty());
540 primary_display_id = display.id(); 558 primary_display_id = display.id();
541 root_windows_[display.id()] = primary_root_window_for_replace_; 559 window_tree_hosts_[display.id()] = primary_tree_host_for_replace_;
542 GetRootWindowSettings(primary_root_window_for_replace_)->display_id = 560 GetRootWindowSettings(GetWindow(primary_tree_host_for_replace_))
543 display.id(); 561 ->display_id = display.id();
544 primary_root_window_for_replace_ = NULL; 562 primary_tree_host_for_replace_ = NULL;
545 const DisplayInfo& display_info = 563 const DisplayInfo& display_info =
546 GetDisplayManager()->GetDisplayInfo(display.id()); 564 GetDisplayManager()->GetDisplayInfo(display.id());
547 aura::WindowTreeHost* host = root_windows_[display.id()]->GetHost(); 565 AshWindowTreeHost* ash_host = window_tree_hosts_[display.id()];
548 host->SetBounds(display_info.bounds_in_native()); 566 ash_host->AsWindowTreeHost()->SetBounds(display_info.bounds_in_native());
549 SetDisplayPropertiesOnHost(host, display); 567 SetDisplayPropertiesOnHost(ash_host, display);
550 } else { 568 } else {
551 if (primary_display_id == gfx::Display::kInvalidDisplayID) 569 if (primary_display_id == gfx::Display::kInvalidDisplayID)
552 primary_display_id = display.id(); 570 primary_display_id = display.id();
553 DCHECK(!root_windows_.empty()); 571 DCHECK(!window_tree_hosts_.empty());
554 aura::WindowTreeHost* host = AddWindowTreeHostForDisplay(display); 572 AshWindowTreeHost* ash_host = AddWindowTreeHostForDisplay(display);
555 RootWindowController::CreateForSecondaryDisplay(host); 573 RootWindowController::CreateForSecondaryDisplay(ash_host);
556 } 574 }
557 } 575 }
558 576
559 void DisplayController::OnDisplayRemoved(const gfx::Display& display) { 577 void DisplayController::OnDisplayRemoved(const gfx::Display& display) {
560 aura::Window* root_to_delete = root_windows_[display.id()]; 578 AshWindowTreeHost* host_to_delete = window_tree_hosts_[display.id()];
561 DCHECK(root_to_delete) << display.ToString(); 579 DCHECK(host_to_delete) << display.ToString();
562 580
563 // Display for root window will be deleted when the Primary RootWindow 581 // Display for root window will be deleted when the Primary RootWindow
564 // is deleted by the Shell. 582 // is deleted by the Shell.
565 root_windows_.erase(display.id()); 583 window_tree_hosts_.erase(display.id());
566 584
567 // When the primary root window's display is removed, move the primary 585 // When the primary root window's display is removed, move the primary
568 // root to the other display. 586 // root to the other display.
569 if (primary_display_id == display.id()) { 587 if (primary_display_id == display.id()) {
570 // Temporarily store the primary root window in 588 // Temporarily store the primary root window in
571 // |primary_root_window_for_replace_| when replacing the display. 589 // |primary_root_window_for_replace_| when replacing the display.
572 if (root_windows_.size() == 0) { 590 if (window_tree_hosts_.size() == 0) {
573 primary_display_id = gfx::Display::kInvalidDisplayID; 591 primary_display_id = gfx::Display::kInvalidDisplayID;
574 primary_root_window_for_replace_ = root_to_delete; 592 primary_tree_host_for_replace_ = host_to_delete;
575 return; 593 return;
576 } 594 }
577 DCHECK_EQ(1U, root_windows_.size()); 595 DCHECK_EQ(1U, window_tree_hosts_.size());
578 primary_display_id = ScreenUtil::GetSecondaryDisplay().id(); 596 primary_display_id = ScreenUtil::GetSecondaryDisplay().id();
579 aura::Window* primary_root = root_to_delete; 597 AshWindowTreeHost* primary_host = host_to_delete;
580 598
581 // Delete the other root instead. 599 // Delete the other host instead.
582 root_to_delete = root_windows_[primary_display_id]; 600 host_to_delete = window_tree_hosts_[primary_display_id];
583 GetRootWindowSettings(root_to_delete)->display_id = display.id(); 601 GetRootWindowSettings(GetWindow(host_to_delete))->display_id = display.id();
584 602
585 // Setup primary root. 603 // Setup primary root.
586 root_windows_[primary_display_id] = primary_root; 604 window_tree_hosts_[primary_display_id] = primary_host;
587 GetRootWindowSettings(primary_root)->display_id = primary_display_id; 605 GetRootWindowSettings(GetWindow(primary_host))->display_id =
606 primary_display_id;
588 607
589 OnDisplayBoundsChanged( 608 OnDisplayBoundsChanged(
590 GetDisplayManager()->GetDisplayForId(primary_display_id)); 609 GetDisplayManager()->GetDisplayForId(primary_display_id));
591 } 610 }
592 RootWindowController* controller = GetRootWindowController(root_to_delete); 611 RootWindowController* controller =
612 GetRootWindowController(GetWindow(host_to_delete));
593 DCHECK(controller); 613 DCHECK(controller);
594 controller->MoveWindowsTo(GetPrimaryRootWindow()); 614 controller->MoveWindowsTo(GetPrimaryRootWindow());
595 // Delete most of root window related objects, but don't delete 615 // Delete most of root window related objects, but don't delete
596 // root window itself yet because the stack may be using it. 616 // root window itself yet because the stack may be using it.
597 controller->Shutdown(); 617 controller->Shutdown();
598 base::MessageLoop::current()->DeleteSoon(FROM_HERE, controller); 618 base::MessageLoop::current()->DeleteSoon(FROM_HERE, controller);
599 } 619 }
600 620
601 void DisplayController::OnHostResized(const aura::WindowTreeHost* host) { 621 void DisplayController::OnHostResized(const aura::WindowTreeHost* host) {
602 gfx::Display display = Shell::GetScreen()->GetDisplayNearestWindow( 622 gfx::Display display = Shell::GetScreen()->GetDisplayNearestWindow(
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 // set to the same and didn't update it. 692 // set to the same and didn't update it.
673 layout_store->UpdatePrimaryDisplayId( 693 layout_store->UpdatePrimaryDisplayId(
674 pair, Shell::GetScreen()->GetPrimaryDisplay().id()); 694 pair, Shell::GetScreen()->GetPrimaryDisplay().id());
675 } 695 }
676 } 696 }
677 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanged()); 697 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanged());
678 UpdateHostWindowNames(); 698 UpdateHostWindowNames();
679 EnsurePointerInDisplays(); 699 EnsurePointerInDisplays();
680 } 700 }
681 701
682 aura::WindowTreeHost* DisplayController::AddWindowTreeHostForDisplay( 702 AshWindowTreeHost* DisplayController::AddWindowTreeHostForDisplay(
683 const gfx::Display& display) { 703 const gfx::Display& display) {
684 static int host_count = 0; 704 static int host_count = 0;
685 const DisplayInfo& display_info = 705 const DisplayInfo& display_info =
686 GetDisplayManager()->GetDisplayInfo(display.id()); 706 GetDisplayManager()->GetDisplayInfo(display.id());
687 const gfx::Rect& bounds_in_native = display_info.bounds_in_native(); 707 const gfx::Rect& bounds_in_native = display_info.bounds_in_native();
688 aura::WindowTreeHost* host = 708 AshWindowTreeHost* ash_host = AshWindowTreeHost::Create(bounds_in_native);
689 Shell::GetInstance()->window_tree_host_factory()->CreateWindowTreeHost( 709 aura::WindowTreeHost* host = ash_host->AsWindowTreeHost();
690 bounds_in_native); 710
691 host->window()->SetName(base::StringPrintf("RootWindow-%d", host_count++)); 711 host->window()->SetName(base::StringPrintf("RootWindow-%d", host_count++));
692 host->compositor()->SetBackgroundColor(SK_ColorBLACK); 712 host->compositor()->SetBackgroundColor(SK_ColorBLACK);
693 // No need to remove our observer observer because the DisplayController 713 // No need to remove our observer observer because the DisplayController
694 // outlives the host. 714 // outlives the host.
695 host->AddObserver(this); 715 host->AddObserver(this);
696 InitRootWindowSettings(host->window())->display_id = display.id(); 716 InitRootWindowSettings(host->window())->display_id = display.id();
697 host->InitHost(); 717 host->InitHost();
698 718
699 root_windows_[display.id()] = host->window(); 719 window_tree_hosts_[display.id()] = ash_host;
700 SetDisplayPropertiesOnHost(host, display); 720 SetDisplayPropertiesOnHost(ash_host, display);
701 721
702 #if defined(OS_CHROMEOS) 722 #if defined(OS_CHROMEOS)
703 static bool force_constrain_pointer_to_root = 723 static bool force_constrain_pointer_to_root =
704 CommandLine::ForCurrentProcess()->HasSwitch( 724 CommandLine::ForCurrentProcess()->HasSwitch(
705 switches::kAshConstrainPointerToRoot); 725 switches::kAshConstrainPointerToRoot);
706 if (base::SysInfo::IsRunningOnChromeOS() || force_constrain_pointer_to_root) 726 if (base::SysInfo::IsRunningOnChromeOS() || force_constrain_pointer_to_root)
707 host->ConfineCursorToRootWindow(); 727 ash_host->ConfineCursorToRootWindow();
708 #endif 728 #endif
709 return host; 729 return ash_host;
710 } 730 }
711 731
712 void DisplayController::OnFadeOutForSwapDisplayFinished() { 732 void DisplayController::OnFadeOutForSwapDisplayFinished() {
713 #if defined(OS_CHROMEOS) 733 #if defined(OS_CHROMEOS)
714 SetPrimaryDisplay(ScreenUtil::GetSecondaryDisplay()); 734 SetPrimaryDisplay(ScreenUtil::GetSecondaryDisplay());
715 Shell::GetInstance()->output_configurator_animation()->StartFadeInAnimation(); 735 Shell::GetInstance()->output_configurator_animation()->StartFadeInAnimation();
716 #endif 736 #endif
717 } 737 }
718 738
719 void DisplayController::UpdateHostWindowNames() { 739 void DisplayController::UpdateHostWindowNames() {
720 #if defined(USE_X11) 740 #if defined(USE_X11)
721 // crbug.com/120229 - set the window title for the primary dislpay 741 // crbug.com/120229 - set the window title for the primary dislpay
722 // to "aura_root_0" so gtalk can find the primary root window to broadcast. 742 // to "aura_root_0" so gtalk can find the primary root window to broadcast.
723 // TODO(jhorwich) Remove this once Chrome supports window-based broadcasting. 743 // TODO(jhorwich) Remove this once Chrome supports window-based broadcasting.
724 aura::Window* primary = Shell::GetPrimaryRootWindow(); 744 aura::Window* primary = Shell::GetPrimaryRootWindow();
725 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); 745 aura::Window::Windows root_windows = Shell::GetAllRootWindows();
726 for (size_t i = 0; i < root_windows.size(); ++i) { 746 for (size_t i = 0; i < root_windows.size(); ++i) {
727 std::string name = 747 std::string name =
728 root_windows[i] == primary ? "aura_root_0" : "aura_root_x"; 748 root_windows[i] == primary ? "aura_root_0" : "aura_root_x";
729 gfx::AcceleratedWidget xwindow = 749 gfx::AcceleratedWidget xwindow =
730 root_windows[i]->GetHost()->GetAcceleratedWidget(); 750 root_windows[i]->GetHost()->GetAcceleratedWidget();
731 XStoreName(gfx::GetXDisplay(), xwindow, name.c_str()); 751 XStoreName(gfx::GetXDisplay(), xwindow, name.c_str());
732 } 752 }
733 #endif 753 #endif
734 } 754 }
735 755
736 } // namespace ash 756 } // namespace ash
OLDNEW
« no previous file with comments | « ash/display/display_controller.h ('k') | ash/display/mirror_window_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698