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

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

Issue 138003007: [Cleanup] Screen cleanup (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: make sure screen_for_shutdown is reset everytime Created 6 years, 11 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/display_controller_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 (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/display_layout_store.h" 12 #include "ash/display/display_layout_store.h"
13 #include "ash/display/display_manager.h" 13 #include "ash/display/display_manager.h"
14 #include "ash/display/mirror_window_controller.h" 14 #include "ash/display/mirror_window_controller.h"
15 #include "ash/display/root_window_transformers.h" 15 #include "ash/display/root_window_transformers.h"
16 #include "ash/display/virtual_keyboard_window_controller.h" 16 #include "ash/display/virtual_keyboard_window_controller.h"
17 #include "ash/host/root_window_host_factory.h" 17 #include "ash/host/root_window_host_factory.h"
18 #include "ash/root_window_controller.h" 18 #include "ash/root_window_controller.h"
19 #include "ash/root_window_settings.h" 19 #include "ash/root_window_settings.h"
20 #include "ash/screen_ash.h" 20 #include "ash/screen_util.h"
21 #include "ash/shell.h" 21 #include "ash/shell.h"
22 #include "ash/shell_delegate.h" 22 #include "ash/shell_delegate.h"
23 #include "ash/wm/coordinate_conversion.h" 23 #include "ash/wm/coordinate_conversion.h"
24 #include "base/command_line.h" 24 #include "base/command_line.h"
25 #include "base/strings/stringprintf.h" 25 #include "base/strings/stringprintf.h"
26 #include "third_party/skia/include/utils/SkMatrix44.h"
27 #include "ui/aura/client/activation_client.h" 26 #include "ui/aura/client/activation_client.h"
28 #include "ui/aura/client/capture_client.h" 27 #include "ui/aura/client/capture_client.h"
29 #include "ui/aura/client/cursor_client.h"
30 #include "ui/aura/client/focus_client.h" 28 #include "ui/aura/client/focus_client.h"
31 #include "ui/aura/client/screen_position_client.h" 29 #include "ui/aura/client/screen_position_client.h"
32 #include "ui/aura/root_window.h" 30 #include "ui/aura/root_window.h"
33 #include "ui/aura/root_window_transformer.h" 31 #include "ui/aura/root_window_transformer.h"
34 #include "ui/aura/window.h" 32 #include "ui/aura/window.h"
35 #include "ui/aura/window_property.h" 33 #include "ui/aura/window_property.h"
36 #include "ui/aura/window_tracker.h" 34 #include "ui/aura/window_tracker.h"
37 #include "ui/compositor/compositor.h" 35 #include "ui/compositor/compositor.h"
38 #include "ui/compositor/dip_util.h"
39 #include "ui/gfx/display.h" 36 #include "ui/gfx/display.h"
40 #include "ui/gfx/screen.h" 37 #include "ui/gfx/screen.h"
41 38
42 #if defined(OS_CHROMEOS) 39 #if defined(OS_CHROMEOS)
43 #include "base/sys_info.h" 40 #include "base/sys_info.h"
44 #include "base/time/time.h" 41 #include "base/time/time.h"
45 #if defined(USE_X11) 42 #if defined(USE_X11)
46 #include "ash/display/output_configurator_animation.h" 43 #include "ash/display/output_configurator_animation.h"
47 #include "chromeos/display/output_configurator.h" 44 #include "chromeos/display/output_configurator.h"
48 #include "ui/base/x/x11_util.h" 45 #include "ui/base/x/x11_util.h"
49 #include "ui/gfx/x/x11_types.h" 46 #include "ui/gfx/x/x11_types.h"
50 47
51 // Including this at the bottom to avoid other 48 // Including this at the bottom to avoid other
52 // potential conflict with chrome headers. 49 // potential conflict with chrome headers.
53 #include <X11/extensions/Xrandr.h> 50 #include <X11/extensions/Xrandr.h>
54 #undef RootWindow 51 #undef RootWindow
55 #endif // defined(USE_X11) 52 #endif // defined(USE_X11)
56 #endif // defined(OS_CHROMEOS) 53 #endif // defined(OS_CHROMEOS)
57 54
58 namespace ash { 55 namespace ash {
59 namespace { 56 namespace {
60 57
61 // Primary display stored in global object as it can be 58 // Primary display stored in global object as it can be
62 // accessed after Shell is deleted. A separate display instance is created 59 // accessed after Shell is deleted. A separate display instance is created
63 // during the shutdown instead of always keeping two display instances 60 // during the shutdown instead of always keeping two display instances
64 // (one here and another one in display_manager) in sync, which is error prone. 61 // (one here and another one in display_manager) in sync, which is error prone.
65 int64 primary_display_id = gfx::Display::kInvalidDisplayID; 62 int64 primary_display_id = gfx::Display::kInvalidDisplayID;
66 gfx::Display* primary_display_for_shutdown = NULL;
67 // Keeps the number of displays during the shutdown after
68 // ash::Shell:: is deleted.
69 int num_displays_for_shutdown = -1;
70 63
71 // Specifies how long the display change should have been disabled 64 // Specifies how long the display change should have been disabled
72 // after each display change operations. 65 // after each display change operations.
73 // |kCycleDisplayThrottleTimeoutMs| is set to be longer to avoid 66 // |kCycleDisplayThrottleTimeoutMs| is set to be longer to avoid
74 // changing the settings while the system is still configurating 67 // changing the settings while the system is still configurating
75 // displays. It will be overriden by |kAfterDisplayChangeThrottleTimeoutMs| 68 // displays. It will be overriden by |kAfterDisplayChangeThrottleTimeoutMs|
76 // when the display change happens, so the actual timeout is much shorter. 69 // when the display change happens, so the actual timeout is much shorter.
77 const int64 kAfterDisplayChangeThrottleTimeoutMs = 500; 70 const int64 kAfterDisplayChangeThrottleTimeoutMs = 500;
78 const int64 kCycleDisplayThrottleTimeoutMs = 4000; 71 const int64 kCycleDisplayThrottleTimeoutMs = 4000;
79 const int64 kSwapDisplayThrottleTimeoutMs = 500; 72 const int64 kSwapDisplayThrottleTimeoutMs = 500;
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 new internal::VirtualKeyboardWindowController) { 221 new internal::VirtualKeyboardWindowController) {
229 #if defined(OS_CHROMEOS) 222 #if defined(OS_CHROMEOS)
230 CommandLine* command_line = CommandLine::ForCurrentProcess(); 223 CommandLine* command_line = CommandLine::ForCurrentProcess();
231 if (!command_line->HasSwitch(switches::kAshDisableDisplayChangeLimiter) && 224 if (!command_line->HasSwitch(switches::kAshDisableDisplayChangeLimiter) &&
232 base::SysInfo::IsRunningOnChromeOS()) 225 base::SysInfo::IsRunningOnChromeOS())
233 limiter_.reset(new DisplayChangeLimiter); 226 limiter_.reset(new DisplayChangeLimiter);
234 #endif 227 #endif
235 // Reset primary display to make sure that tests don't use 228 // Reset primary display to make sure that tests don't use
236 // stale display info from previous tests. 229 // stale display info from previous tests.
237 primary_display_id = gfx::Display::kInvalidDisplayID; 230 primary_display_id = gfx::Display::kInvalidDisplayID;
238 delete primary_display_for_shutdown;
239 primary_display_for_shutdown = NULL;
240 num_displays_for_shutdown = -1;
241 } 231 }
242 232
243 DisplayController::~DisplayController() { 233 DisplayController::~DisplayController() {
244 DCHECK(primary_display_for_shutdown);
245 } 234 }
246 235
247 void DisplayController::Start() { 236 void DisplayController::Start() {
248 Shell::GetScreen()->AddObserver(this); 237 Shell::GetScreen()->AddObserver(this);
249 Shell::GetInstance()->display_manager()->set_delegate(this); 238 Shell::GetInstance()->display_manager()->set_delegate(this);
250 239
251 if (Shell::GetInstance()->delegate()->IsFirstRunAfterBoot()) { 240 if (Shell::GetInstance()->delegate()->IsFirstRunAfterBoot()) {
252 // Update the display pref with the initial power state. 241 // Update the display pref with the initial power state.
253 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanging()); 242 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanging());
254 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanged()); 243 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanged());
255 } 244 }
256 } 245 }
257 246
258 void DisplayController::Shutdown() { 247 void DisplayController::Shutdown() {
259 // Unset the display manager's delegate here because 248 // Unset the display manager's delegate here because
260 // DisplayManager outlives DisplayController. 249 // DisplayManager outlives DisplayController.
261 Shell::GetInstance()->display_manager()->set_delegate(NULL); 250 Shell::GetInstance()->display_manager()->set_delegate(NULL);
262 251
263 mirror_window_controller_.reset(); 252 mirror_window_controller_.reset();
264 virtual_keyboard_window_controller_.reset(); 253 virtual_keyboard_window_controller_.reset();
265 254
266 DCHECK(!primary_display_for_shutdown);
267 primary_display_for_shutdown = new gfx::Display(
268 GetDisplayManager()->GetDisplayForId(primary_display_id));
269 num_displays_for_shutdown = GetDisplayManager()->GetNumDisplays();
270
271 Shell::GetScreen()->RemoveObserver(this); 255 Shell::GetScreen()->RemoveObserver(this);
272 // Delete all root window controllers, which deletes root window 256 // Delete all root window controllers, which deletes root window
273 // from the last so that the primary root window gets deleted last. 257 // from the last so that the primary root window gets deleted last.
274 for (std::map<int64, aura::Window*>::const_reverse_iterator it = 258 for (std::map<int64, aura::Window*>::const_reverse_iterator it =
275 root_windows_.rbegin(); it != root_windows_.rend(); ++it) { 259 root_windows_.rbegin(); it != root_windows_.rend(); ++it) {
276 internal::RootWindowController* controller = 260 internal::RootWindowController* controller =
277 internal::GetRootWindowController(it->second); 261 internal::GetRootWindowController(it->second);
278 DCHECK(controller); 262 DCHECK(controller);
279 delete controller; 263 delete controller;
280 } 264 }
281 } 265 }
282 266
283 // static
284 const gfx::Display& DisplayController::GetPrimaryDisplay() {
285 DCHECK_NE(primary_display_id, gfx::Display::kInvalidDisplayID);
286 if (primary_display_for_shutdown)
287 return *primary_display_for_shutdown;
288 return GetDisplayManager()->GetDisplayForId(primary_display_id);
289 }
290
291 // static
292 int DisplayController::GetNumDisplays() {
293 if (num_displays_for_shutdown >= 0)
294 return num_displays_for_shutdown;
295 return GetDisplayManager()->GetNumDisplays();
296 }
297
298 void DisplayController::InitPrimaryDisplay() { 267 void DisplayController::InitPrimaryDisplay() {
299 const gfx::Display& primary_candidate = 268 const gfx::Display& primary_candidate =
300 GetDisplayManager()->GetPrimaryDisplayCandidate(); 269 GetDisplayManager()->GetPrimaryDisplayCandidate();
301 primary_display_id = primary_candidate.id(); 270 primary_display_id = primary_candidate.id();
302 AddRootWindowForDisplay(primary_candidate); 271 AddRootWindowForDisplay(primary_candidate);
303 } 272 }
304 273
305 void DisplayController::InitSecondaryDisplays() { 274 void DisplayController::InitSecondaryDisplays() {
306 internal::DisplayManager* display_manager = GetDisplayManager(); 275 internal::DisplayManager* display_manager = GetDisplayManager();
307 for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) { 276 for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
308 const gfx::Display& display = display_manager->GetDisplayAt(i); 277 const gfx::Display& display = display_manager->GetDisplayAt(i);
309 if (primary_display_id != display.id()) { 278 if (primary_display_id != display.id()) {
310 aura::RootWindow* root = AddRootWindowForDisplay(display); 279 aura::RootWindow* root = AddRootWindowForDisplay(display);
311 internal::RootWindowController::CreateForSecondaryDisplay(root); 280 internal::RootWindowController::CreateForSecondaryDisplay(root);
312 } 281 }
313 } 282 }
314 UpdateHostWindowNames(); 283 UpdateHostWindowNames();
315 } 284 }
316 285
317 void DisplayController::AddObserver(Observer* observer) { 286 void DisplayController::AddObserver(Observer* observer) {
318 observers_.AddObserver(observer); 287 observers_.AddObserver(observer);
319 } 288 }
320 289
321 void DisplayController::RemoveObserver(Observer* observer) { 290 void DisplayController::RemoveObserver(Observer* observer) {
322 observers_.RemoveObserver(observer); 291 observers_.RemoveObserver(observer);
323 } 292 }
324 293
294 // static
295 int64 DisplayController::GetPrimaryDisplayId() {
296 return primary_display_id;
297 }
298
325 aura::Window* DisplayController::GetPrimaryRootWindow() { 299 aura::Window* DisplayController::GetPrimaryRootWindow() {
326 DCHECK(!root_windows_.empty()); 300 DCHECK(!root_windows_.empty());
327 return root_windows_[primary_display_id]; 301 return root_windows_[primary_display_id];
328 } 302 }
329 303
330 aura::Window* DisplayController::GetRootWindowForDisplayId(int64 id) { 304 aura::Window* DisplayController::GetRootWindowForDisplayId(int64 id) {
331 return root_windows_[id]; 305 return root_windows_[id];
332 } 306 }
333 307
334 void DisplayController::CloseChildWindows() { 308 void DisplayController::CloseChildWindows() {
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 385
412 if (Shell::GetScreen()->GetNumDisplays() > 1) { 386 if (Shell::GetScreen()->GetNumDisplays() > 1) {
413 #if defined(OS_CHROMEOS) && defined(USE_X11) 387 #if defined(OS_CHROMEOS) && defined(USE_X11)
414 internal::OutputConfiguratorAnimation* animation = 388 internal::OutputConfiguratorAnimation* animation =
415 Shell::GetInstance()->output_configurator_animation(); 389 Shell::GetInstance()->output_configurator_animation();
416 if (animation) { 390 if (animation) {
417 animation->StartFadeOutAnimation(base::Bind( 391 animation->StartFadeOutAnimation(base::Bind(
418 &DisplayController::OnFadeOutForSwapDisplayFinished, 392 &DisplayController::OnFadeOutForSwapDisplayFinished,
419 base::Unretained(this))); 393 base::Unretained(this)));
420 } else { 394 } else {
421 SetPrimaryDisplay(ScreenAsh::GetSecondaryDisplay()); 395 SetPrimaryDisplay(ScreenUtil::GetSecondaryDisplay());
422 } 396 }
423 #else 397 #else
424 SetPrimaryDisplay(ScreenAsh::GetSecondaryDisplay()); 398 SetPrimaryDisplay(ScreenUtil::GetSecondaryDisplay());
425 #endif 399 #endif
426 } 400 }
427 } 401 }
428 402
429 void DisplayController::SetPrimaryDisplayId(int64 id) { 403 void DisplayController::SetPrimaryDisplayId(int64 id) {
430 DCHECK_NE(gfx::Display::kInvalidDisplayID, id); 404 DCHECK_NE(gfx::Display::kInvalidDisplayID, id);
431 if (id == gfx::Display::kInvalidDisplayID || primary_display_id == id) 405 if (id == gfx::Display::kInvalidDisplayID || primary_display_id == id)
432 return; 406 return;
433 407
434 const gfx::Display& display = GetDisplayManager()->GetDisplayForId(id); 408 const gfx::Display& display = GetDisplayManager()->GetDisplayForId(id);
(...skipping 19 matching lines...) Expand all
454 return; 428 return;
455 } 429 }
456 430
457 aura::Window* non_primary_root = root_windows_[new_primary_display.id()]; 431 aura::Window* non_primary_root = root_windows_[new_primary_display.id()];
458 LOG_IF(ERROR, !non_primary_root) 432 LOG_IF(ERROR, !non_primary_root)
459 << "Unknown display is requested in SetPrimaryDisplay: id=" 433 << "Unknown display is requested in SetPrimaryDisplay: id="
460 << new_primary_display.id(); 434 << new_primary_display.id();
461 if (!non_primary_root) 435 if (!non_primary_root)
462 return; 436 return;
463 437
464 gfx::Display old_primary_display = GetPrimaryDisplay(); 438 gfx::Display old_primary_display = Shell::GetScreen()->GetPrimaryDisplay();
465 439
466 // Swap root windows between current and new primary display. 440 // Swap root windows between current and new primary display.
467 aura::Window* primary_root = root_windows_[primary_display_id]; 441 aura::Window* primary_root = root_windows_[primary_display_id];
468 DCHECK(primary_root); 442 DCHECK(primary_root);
469 DCHECK_NE(primary_root, non_primary_root); 443 DCHECK_NE(primary_root, non_primary_root);
470 444
471 root_windows_[new_primary_display.id()] = primary_root; 445 root_windows_[new_primary_display.id()] = primary_root;
472 internal::GetRootWindowSettings(primary_root)->display_id = 446 internal::GetRootWindowSettings(primary_root)->display_id =
473 new_primary_display.id(); 447 new_primary_display.id();
474 448
475 root_windows_[old_primary_display.id()] = non_primary_root; 449 root_windows_[old_primary_display.id()] = non_primary_root;
476 internal::GetRootWindowSettings(non_primary_root)->display_id = 450 internal::GetRootWindowSettings(non_primary_root)->display_id =
477 old_primary_display.id(); 451 old_primary_display.id();
478 452
479 primary_display_id = new_primary_display.id(); 453 primary_display_id = new_primary_display.id();
480 GetDisplayManager()->layout_store()->UpdatePrimaryDisplayId( 454 GetDisplayManager()->layout_store()->UpdatePrimaryDisplayId(
481 display_manager->GetCurrentDisplayIdPair(), primary_display_id); 455 display_manager->GetCurrentDisplayIdPair(), primary_display_id);
482 456
483 UpdateWorkAreaOfDisplayNearestWindow( 457 UpdateWorkAreaOfDisplayNearestWindow(
484 primary_root, old_primary_display.GetWorkAreaInsets()); 458 primary_root, old_primary_display.GetWorkAreaInsets());
485 UpdateWorkAreaOfDisplayNearestWindow( 459 UpdateWorkAreaOfDisplayNearestWindow(
486 non_primary_root, new_primary_display.GetWorkAreaInsets()); 460 non_primary_root, new_primary_display.GetWorkAreaInsets());
487 461
488 // Update the dispay manager with new display info. 462 // Update the dispay manager with new display info.
489 std::vector<internal::DisplayInfo> display_info_list; 463 std::vector<internal::DisplayInfo> display_info_list;
490 display_info_list.push_back(display_manager->GetDisplayInfo( 464 display_info_list.push_back(display_manager->GetDisplayInfo(
491 primary_display_id)); 465 primary_display_id));
492 display_info_list.push_back(display_manager->GetDisplayInfo( 466 display_info_list.push_back(display_manager->GetDisplayInfo(
493 ScreenAsh::GetSecondaryDisplay().id())); 467 ScreenUtil::GetSecondaryDisplay().id()));
494 GetDisplayManager()->set_force_bounds_changed(true); 468 GetDisplayManager()->set_force_bounds_changed(true);
495 GetDisplayManager()->UpdateDisplays(display_info_list); 469 GetDisplayManager()->UpdateDisplays(display_info_list);
496 GetDisplayManager()->set_force_bounds_changed(false); 470 GetDisplayManager()->set_force_bounds_changed(false);
497 } 471 }
498 472
499 void DisplayController::EnsurePointerInDisplays() { 473 void DisplayController::EnsurePointerInDisplays() {
500 // If the mouse is currently on a display in native location, 474 // If the mouse is currently on a display in native location,
501 // use the same native location. Otherwise find the display closest 475 // use the same native location. Otherwise find the display closest
502 // to the current cursor location in screen coordinates. 476 // to the current cursor location in screen coordinates.
503 477
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
546 bool DisplayController::UpdateWorkAreaOfDisplayNearestWindow( 520 bool DisplayController::UpdateWorkAreaOfDisplayNearestWindow(
547 const aura::Window* window, 521 const aura::Window* window,
548 const gfx::Insets& insets) { 522 const gfx::Insets& insets) {
549 const aura::Window* root_window = window->GetRootWindow(); 523 const aura::Window* root_window = window->GetRootWindow();
550 int64 id = internal::GetRootWindowSettings(root_window)->display_id; 524 int64 id = internal::GetRootWindowSettings(root_window)->display_id;
551 // if id is |kInvaildDisplayID|, it's being deleted. 525 // if id is |kInvaildDisplayID|, it's being deleted.
552 DCHECK(id != gfx::Display::kInvalidDisplayID); 526 DCHECK(id != gfx::Display::kInvalidDisplayID);
553 return GetDisplayManager()->UpdateWorkAreaOfDisplay(id, insets); 527 return GetDisplayManager()->UpdateWorkAreaOfDisplay(id, insets);
554 } 528 }
555 529
556 const gfx::Display& DisplayController::GetDisplayNearestWindow(
557 const aura::Window* window) const {
558 if (!window)
559 return GetPrimaryDisplay();
560 const aura::Window* root_window = window->GetRootWindow();
561 if (!root_window)
562 return GetPrimaryDisplay();
563 int64 id = internal::GetRootWindowSettings(root_window)->display_id;
564 // if id is |kInvaildDisplayID|, it's being deleted.
565 DCHECK(id != gfx::Display::kInvalidDisplayID);
566
567 internal::DisplayManager* display_manager = GetDisplayManager();
568 // RootWindow needs Display to determine its device scale factor
569 // for non desktop display.
570 if (display_manager->non_desktop_display().id() == id)
571 return display_manager->non_desktop_display();
572 return display_manager->GetDisplayForId(id);
573 }
574
575 const gfx::Display& DisplayController::GetDisplayNearestPoint(
576 const gfx::Point& point) const {
577 const gfx::Display& display =
578 GetDisplayManager()->FindDisplayContainingPoint(point);
579 if (display.is_valid())
580 return display;
581
582 // Fallback to the display that has the shortest Manhattan distance from
583 // the |point|. This is correct in the only areas that matter, namely in the
584 // corners between the physical screens.
585 int min_distance = INT_MAX;
586 const gfx::Display* nearest_display = NULL;
587 for (size_t i = 0; i < GetDisplayManager()->GetNumDisplays(); ++i) {
588 const gfx::Display& display = GetDisplayManager()->GetDisplayAt(i);
589 int distance = display.bounds().ManhattanDistanceToPoint(point);
590 if (distance < min_distance) {
591 min_distance = distance;
592 nearest_display = &display;
593 }
594 }
595 // There should always be at least one display that is less than INT_MAX away.
596 DCHECK(nearest_display);
597 return *nearest_display;
598 }
599
600 const gfx::Display& DisplayController::GetDisplayMatching(
601 const gfx::Rect& rect) const {
602 if (rect.IsEmpty())
603 return GetDisplayNearestPoint(rect.origin());
604
605 int max_area = 0;
606 const gfx::Display* matching = NULL;
607 for (size_t i = 0; i < GetDisplayManager()->GetNumDisplays(); ++i) {
608 const gfx::Display& display = GetDisplayManager()->GetDisplayAt(i);
609 gfx::Rect intersect = gfx::IntersectRects(display.bounds(), rect);
610 int area = intersect.width() * intersect.height();
611 if (area > max_area) {
612 max_area = area;
613 matching = &display;
614 }
615 }
616 // Fallback to the primary display if there is no matching display.
617 return matching ? *matching : GetPrimaryDisplay();
618 }
619
620 void DisplayController::OnDisplayBoundsChanged(const gfx::Display& display) { 530 void DisplayController::OnDisplayBoundsChanged(const gfx::Display& display) {
621 const internal::DisplayInfo& display_info = 531 const internal::DisplayInfo& display_info =
622 GetDisplayManager()->GetDisplayInfo(display.id()); 532 GetDisplayManager()->GetDisplayInfo(display.id());
623 DCHECK(!display_info.bounds_in_native().IsEmpty()); 533 DCHECK(!display_info.bounds_in_native().IsEmpty());
624 aura::WindowEventDispatcher* dispatcher = 534 aura::WindowEventDispatcher* dispatcher =
625 root_windows_[display.id()]->GetDispatcher(); 535 root_windows_[display.id()]->GetDispatcher();
626 dispatcher->host()->SetBounds(display_info.bounds_in_native()); 536 dispatcher->host()->SetBounds(display_info.bounds_in_native());
627 SetDisplayPropertiesOnHostWindow(dispatcher, display); 537 SetDisplayPropertiesOnHostWindow(dispatcher, display);
628 } 538 }
629 539
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 // root to the other display. 572 // root to the other display.
663 if (primary_display_id == display.id()) { 573 if (primary_display_id == display.id()) {
664 // Temporarily store the primary root window in 574 // Temporarily store the primary root window in
665 // |primary_root_window_for_replace_| when replacing the display. 575 // |primary_root_window_for_replace_| when replacing the display.
666 if (root_windows_.size() == 0) { 576 if (root_windows_.size() == 0) {
667 primary_display_id = gfx::Display::kInvalidDisplayID; 577 primary_display_id = gfx::Display::kInvalidDisplayID;
668 primary_root_window_for_replace_ = root_to_delete; 578 primary_root_window_for_replace_ = root_to_delete;
669 return; 579 return;
670 } 580 }
671 DCHECK_EQ(1U, root_windows_.size()); 581 DCHECK_EQ(1U, root_windows_.size());
672 primary_display_id = ScreenAsh::GetSecondaryDisplay().id(); 582 primary_display_id = ScreenUtil::GetSecondaryDisplay().id();
673 aura::Window* primary_root = root_to_delete; 583 aura::Window* primary_root = root_to_delete;
674 584
675 // Delete the other root instead. 585 // Delete the other root instead.
676 root_to_delete = root_windows_[primary_display_id]; 586 root_to_delete = root_windows_[primary_display_id];
677 internal::GetRootWindowSettings(root_to_delete)->display_id = display.id(); 587 internal::GetRootWindowSettings(root_to_delete)->display_id = display.id();
678 588
679 // Setup primary root. 589 // Setup primary root.
680 root_windows_[primary_display_id] = primary_root; 590 root_windows_[primary_display_id] = primary_root;
681 internal::GetRootWindowSettings(primary_root)->display_id = 591 internal::GetRootWindowSettings(primary_root)->display_id =
682 primary_display_id; 592 primary_display_id;
683 593
684 OnDisplayBoundsChanged( 594 OnDisplayBoundsChanged(
685 GetDisplayManager()->GetDisplayForId(primary_display_id)); 595 GetDisplayManager()->GetDisplayForId(primary_display_id));
686 } 596 }
687 internal::RootWindowController* controller = 597 internal::RootWindowController* controller =
688 internal::GetRootWindowController(root_to_delete); 598 internal::GetRootWindowController(root_to_delete);
689 DCHECK(controller); 599 DCHECK(controller);
690 controller->MoveWindowsTo(GetPrimaryRootWindow()); 600 controller->MoveWindowsTo(GetPrimaryRootWindow());
691 // Delete most of root window related objects, but don't delete 601 // Delete most of root window related objects, but don't delete
692 // root window itself yet because the stack may be using it. 602 // root window itself yet because the stack may be using it.
693 controller->Shutdown(); 603 controller->Shutdown();
694 base::MessageLoop::current()->DeleteSoon(FROM_HERE, controller); 604 base::MessageLoop::current()->DeleteSoon(FROM_HERE, controller);
695 } 605 }
696 606
697 void DisplayController::OnWindowTreeHostResized(const aura::RootWindow* root) { 607 void DisplayController::OnWindowTreeHostResized(const aura::RootWindow* root) {
608 gfx::Display display = Shell::GetScreen()->GetDisplayNearestWindow(
609 const_cast<aura::Window*>(root->window()));
610
698 internal::DisplayManager* display_manager = GetDisplayManager(); 611 internal::DisplayManager* display_manager = GetDisplayManager();
699 gfx::Display display = GetDisplayNearestWindow(root->window());
700 if (display_manager->UpdateDisplayBounds( 612 if (display_manager->UpdateDisplayBounds(
701 display.id(), 613 display.id(),
702 root->host()->GetBounds())) { 614 root->host()->GetBounds())) {
703 mirror_window_controller_->UpdateWindow(); 615 mirror_window_controller_->UpdateWindow();
704 } 616 }
705 } 617 }
706 618
707 void DisplayController::CreateOrUpdateNonDesktopDisplay( 619 void DisplayController::CreateOrUpdateNonDesktopDisplay(
708 const internal::DisplayInfo& info) { 620 const internal::DisplayInfo& info) {
709 switch (GetDisplayManager()->second_display_mode()) { 621 switch (GetDisplayManager()->second_display_mode()) {
(...skipping 11 matching lines...) Expand all
721 } 633 }
722 634
723 void DisplayController::CloseNonDesktopDisplay() { 635 void DisplayController::CloseNonDesktopDisplay() {
724 mirror_window_controller_->Close(); 636 mirror_window_controller_->Close();
725 virtual_keyboard_window_controller_->Close(); 637 virtual_keyboard_window_controller_->Close();
726 } 638 }
727 639
728 void DisplayController::PreDisplayConfigurationChange(bool clear_focus) { 640 void DisplayController::PreDisplayConfigurationChange(bool clear_focus) {
729 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanging()); 641 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanging());
730 focus_activation_store_->Store(clear_focus); 642 focus_activation_store_->Store(clear_focus);
731 643 gfx::Screen* screen = Shell::GetScreen();
732 gfx::Point point_in_screen = Shell::GetScreen()->GetCursorScreenPoint(); 644 gfx::Point point_in_screen = screen->GetCursorScreenPoint();
733 gfx::Display display = GetDisplayNearestPoint(point_in_screen); 645 gfx::Display display = screen->GetDisplayNearestPoint(point_in_screen);
734 aura::Window* root_window = GetRootWindowForDisplayId(display.id()); 646 aura::Window* root_window = GetRootWindowForDisplayId(display.id());
735 647
736 aura::client::ScreenPositionClient* client = 648 aura::client::ScreenPositionClient* client =
737 aura::client::GetScreenPositionClient(root_window); 649 aura::client::GetScreenPositionClient(root_window);
738 client->ConvertPointFromScreen(root_window, &point_in_screen); 650 client->ConvertPointFromScreen(root_window, &point_in_screen);
739 root_window->GetDispatcher()->host()->ConvertPointToNativeScreen( 651 root_window->GetDispatcher()->host()->ConvertPointToNativeScreen(
740 &point_in_screen); 652 &point_in_screen);
741 cursor_location_in_native_coords_for_restore_ = point_in_screen; 653 cursor_location_in_native_coords_for_restore_ = point_in_screen;
742 } 654 }
743 655
(...skipping 12 matching lines...) Expand all
756 668
757 if (Shell::GetScreen()->GetNumDisplays() > 1 ) { 669 if (Shell::GetScreen()->GetNumDisplays() > 1 ) {
758 int64 primary_id = layout.primary_id; 670 int64 primary_id = layout.primary_id;
759 SetPrimaryDisplayId( 671 SetPrimaryDisplayId(
760 primary_id == gfx::Display::kInvalidDisplayID ? 672 primary_id == gfx::Display::kInvalidDisplayID ?
761 pair.first : primary_id); 673 pair.first : primary_id);
762 // Update the primary_id in case the above call is 674 // Update the primary_id in case the above call is
763 // ignored. Happens when a) default layout's primary id 675 // ignored. Happens when a) default layout's primary id
764 // doesn't exist, or b) the primary_id has already been 676 // doesn't exist, or b) the primary_id has already been
765 // set to the same and didn't update it. 677 // set to the same and didn't update it.
766 layout_store->UpdatePrimaryDisplayId(pair, GetPrimaryDisplay().id()); 678 layout_store->UpdatePrimaryDisplayId(
679 pair, Shell::GetScreen()->GetPrimaryDisplay().id());
767 } 680 }
768 } 681 }
769 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanged()); 682 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanged());
770 UpdateHostWindowNames(); 683 UpdateHostWindowNames();
771 EnsurePointerInDisplays(); 684 EnsurePointerInDisplays();
772 } 685 }
773 686
774 aura::RootWindow* DisplayController::AddRootWindowForDisplay( 687 aura::RootWindow* DisplayController::AddRootWindowForDisplay(
775 const gfx::Display& display) { 688 const gfx::Display& display) {
776 static int root_window_count = 0; 689 static int root_window_count = 0;
(...skipping 22 matching lines...) Expand all
799 CommandLine::ForCurrentProcess()->HasSwitch( 712 CommandLine::ForCurrentProcess()->HasSwitch(
800 switches::kAshConstrainPointerToRoot); 713 switches::kAshConstrainPointerToRoot);
801 if (base::SysInfo::IsRunningOnChromeOS() || force_constrain_pointer_to_root) 714 if (base::SysInfo::IsRunningOnChromeOS() || force_constrain_pointer_to_root)
802 root_window->host()->ConfineCursorToRootWindow(); 715 root_window->host()->ConfineCursorToRootWindow();
803 #endif 716 #endif
804 return root_window; 717 return root_window;
805 } 718 }
806 719
807 void DisplayController::OnFadeOutForSwapDisplayFinished() { 720 void DisplayController::OnFadeOutForSwapDisplayFinished() {
808 #if defined(OS_CHROMEOS) && defined(USE_X11) 721 #if defined(OS_CHROMEOS) && defined(USE_X11)
809 SetPrimaryDisplay(ScreenAsh::GetSecondaryDisplay()); 722 SetPrimaryDisplay(ScreenUtil::GetSecondaryDisplay());
810 Shell::GetInstance()->output_configurator_animation()->StartFadeInAnimation(); 723 Shell::GetInstance()->output_configurator_animation()->StartFadeInAnimation();
811 #endif 724 #endif
812 } 725 }
813 726
814 void DisplayController::UpdateHostWindowNames() { 727 void DisplayController::UpdateHostWindowNames() {
815 #if defined(USE_X11) 728 #if defined(USE_X11)
816 // crbug.com/120229 - set the window title for the primary dislpay 729 // crbug.com/120229 - set the window title for the primary dislpay
817 // to "aura_root_0" so gtalk can find the primary root window to broadcast. 730 // to "aura_root_0" so gtalk can find the primary root window to broadcast.
818 // TODO(jhorwich) Remove this once Chrome supports window-based broadcasting. 731 // TODO(jhorwich) Remove this once Chrome supports window-based broadcasting.
819 aura::Window* primary = Shell::GetPrimaryRootWindow(); 732 aura::Window* primary = Shell::GetPrimaryRootWindow();
820 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); 733 aura::Window::Windows root_windows = Shell::GetAllRootWindows();
821 for (size_t i = 0; i < root_windows.size(); ++i) { 734 for (size_t i = 0; i < root_windows.size(); ++i) {
822 std::string name = 735 std::string name =
823 root_windows[i] == primary ? "aura_root_0" : "aura_root_x"; 736 root_windows[i] == primary ? "aura_root_0" : "aura_root_x";
824 gfx::AcceleratedWidget xwindow = 737 gfx::AcceleratedWidget xwindow =
825 root_windows[i]->GetDispatcher()->host()->GetAcceleratedWidget(); 738 root_windows[i]->GetDispatcher()->host()->GetAcceleratedWidget();
826 XStoreName(gfx::GetXDisplay(), xwindow, name.c_str()); 739 XStoreName(gfx::GetXDisplay(), xwindow, name.c_str());
827 } 740 }
828 #endif 741 #endif
829 } 742 }
830 743
831 } // namespace ash 744 } // namespace ash
OLDNEW
« no previous file with comments | « ash/display/display_controller.h ('k') | ash/display/display_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698