OLD | NEW |
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 | 8 |
9 #include "ash/ash_switches.h" | 9 #include "ash/ash_switches.h" |
10 #include "ash/display/display_manager.h" | 10 #include "ash/display/display_manager.h" |
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 } | 450 } |
451 | 451 |
452 void DisplayController::SetDefaultDisplayLayout(const DisplayLayout& layout) { | 452 void DisplayController::SetDefaultDisplayLayout(const DisplayLayout& layout) { |
453 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 453 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
454 if (!command_line->HasSwitch(switches::kAshSecondaryDisplayLayout) && | 454 if (!command_line->HasSwitch(switches::kAshSecondaryDisplayLayout) && |
455 (default_display_layout_.position != layout.position || | 455 (default_display_layout_.position != layout.position || |
456 default_display_layout_.offset != layout.offset)) { | 456 default_display_layout_.offset != layout.offset)) { |
457 default_display_layout_ = layout; | 457 default_display_layout_ = layout; |
458 NotifyDisplayConfigurationChanging(); | 458 NotifyDisplayConfigurationChanging(); |
459 UpdateDisplayBoundsForLayout(); | 459 UpdateDisplayBoundsForLayout(); |
| 460 NotifyDisplayConfigurationChanged(); |
460 } | 461 } |
461 } | 462 } |
462 | 463 |
463 void DisplayController::RegisterLayoutForDisplayIdPair( | 464 void DisplayController::RegisterLayoutForDisplayIdPair( |
464 int64 id1, | 465 int64 id1, |
465 int64 id2, | 466 int64 id2, |
466 const DisplayLayout& layout) { | 467 const DisplayLayout& layout) { |
467 RegisterLayoutForDisplayIdPairInternal(id1, id2, layout, true); | 468 RegisterLayoutForDisplayIdPairInternal(id1, id2, layout, true); |
468 } | 469 } |
469 | 470 |
(...skipping 21 matching lines...) Expand all Loading... |
491 // Invert if the primary was swapped. | 492 // Invert if the primary was swapped. |
492 DisplayLayout to_set = pair.first == primary.id() ? | 493 DisplayLayout to_set = pair.first == primary.id() ? |
493 layout_relative_to_primary : layout_relative_to_primary.Invert(); | 494 layout_relative_to_primary : layout_relative_to_primary.Invert(); |
494 | 495 |
495 const DisplayLayout& current_layout = paired_layouts_[pair]; | 496 const DisplayLayout& current_layout = paired_layouts_[pair]; |
496 if (to_set.position != current_layout.position || | 497 if (to_set.position != current_layout.position || |
497 to_set.offset != current_layout.offset) { | 498 to_set.offset != current_layout.offset) { |
498 paired_layouts_[pair] = to_set; | 499 paired_layouts_[pair] = to_set; |
499 NotifyDisplayConfigurationChanging(); | 500 NotifyDisplayConfigurationChanging(); |
500 UpdateDisplayBoundsForLayout(); | 501 UpdateDisplayBoundsForLayout(); |
| 502 NotifyDisplayConfigurationChanged(); |
501 } | 503 } |
502 } | 504 } |
503 | 505 |
504 DisplayLayout DisplayController::GetCurrentDisplayLayout() const { | 506 DisplayLayout DisplayController::GetCurrentDisplayLayout() const { |
505 DCHECK_EQ(2U, GetDisplayManager()->GetNumDisplays()); | 507 DCHECK_EQ(2U, GetDisplayManager()->GetNumDisplays()); |
506 // Invert if the primary was swapped. | 508 // Invert if the primary was swapped. |
507 if (GetDisplayManager()->GetNumDisplays() > 1) { | 509 if (GetDisplayManager()->GetNumDisplays() > 1) { |
508 DisplayIdPair pair = GetCurrentDisplayIdPair(); | 510 DisplayIdPair pair = GetCurrentDisplayIdPair(); |
509 DisplayLayout layout = GetRegisteredDisplayLayout(pair); | 511 DisplayLayout layout = GetRegisteredDisplayLayout(pair); |
510 const gfx::Display& primary = GetPrimaryDisplay(); | 512 const gfx::Display& primary = GetPrimaryDisplay(); |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
663 display_manager->GetDisplayAt(1) : display_manager->GetDisplayAt(0); | 665 display_manager->GetDisplayAt(1) : display_manager->GetDisplayAt(0); |
664 } | 666 } |
665 | 667 |
666 void DisplayController::OnDisplayBoundsChanged(const gfx::Display& display) { | 668 void DisplayController::OnDisplayBoundsChanged(const gfx::Display& display) { |
667 if (limiter_.get()) | 669 if (limiter_.get()) |
668 limiter_->SetThrottleTimeout(kAfterDisplayChangeThrottleTimeoutMs); | 670 limiter_->SetThrottleTimeout(kAfterDisplayChangeThrottleTimeoutMs); |
669 const internal::DisplayInfo& display_info = | 671 const internal::DisplayInfo& display_info = |
670 GetDisplayManager()->GetDisplayInfo(display); | 672 GetDisplayManager()->GetDisplayInfo(display); |
671 DCHECK(!display_info.bounds_in_pixel().IsEmpty()); | 673 DCHECK(!display_info.bounds_in_pixel().IsEmpty()); |
672 | 674 |
673 NotifyDisplayConfigurationChanging(); | |
674 UpdateDisplayBoundsForLayout(); | 675 UpdateDisplayBoundsForLayout(); |
675 aura::RootWindow* root = root_windows_[display.id()]; | 676 aura::RootWindow* root = root_windows_[display.id()]; |
676 root->SetHostBoundsAndInsetsAndRootWindowScale( | 677 root->SetHostBoundsAndInsetsAndRootWindowScale( |
677 display_info.bounds_in_pixel(), | 678 display_info.bounds_in_pixel(), |
678 display_info.GetOverscanInsetsInPixel(), | 679 display_info.GetOverscanInsetsInPixel(), |
679 display_info.ui_scale()); | 680 display_info.ui_scale()); |
680 SetDisplayPropertiesOnHostWindow(root, display); | 681 SetDisplayPropertiesOnHostWindow(root, display); |
681 } | 682 } |
682 | 683 |
683 void DisplayController::OnDisplayAdded(const gfx::Display& display) { | 684 void DisplayController::OnDisplayAdded(const gfx::Display& display) { |
684 if (limiter_.get()) | 685 if (limiter_.get()) |
685 limiter_->SetThrottleTimeout(kAfterDisplayChangeThrottleTimeoutMs); | 686 limiter_->SetThrottleTimeout(kAfterDisplayChangeThrottleTimeoutMs); |
686 | 687 |
687 NotifyDisplayConfigurationChanging(); | |
688 if (primary_root_window_for_replace_) { | 688 if (primary_root_window_for_replace_) { |
689 DCHECK(root_windows_.empty()); | 689 DCHECK(root_windows_.empty()); |
690 primary_display_id = display.id(); | 690 primary_display_id = display.id(); |
691 root_windows_[display.id()] = primary_root_window_for_replace_; | 691 root_windows_[display.id()] = primary_root_window_for_replace_; |
692 primary_root_window_for_replace_->SetProperty( | 692 primary_root_window_for_replace_->SetProperty( |
693 internal::kDisplayIdKey, display.id()); | 693 internal::kDisplayIdKey, display.id()); |
694 primary_root_window_for_replace_ = NULL; | 694 primary_root_window_for_replace_ = NULL; |
695 UpdateDisplayBoundsForLayout(); | 695 UpdateDisplayBoundsForLayout(); |
696 const internal::DisplayInfo& display_info = | 696 const internal::DisplayInfo& display_info = |
697 GetDisplayManager()->GetDisplayInfo(display); | 697 GetDisplayManager()->GetDisplayInfo(display); |
(...skipping 10 matching lines...) Expand all Loading... |
708 Shell::GetInstance()->InitRootWindowForSecondaryDisplay(root); | 708 Shell::GetInstance()->InitRootWindowForSecondaryDisplay(root); |
709 } | 709 } |
710 } | 710 } |
711 | 711 |
712 void DisplayController::OnDisplayRemoved(const gfx::Display& display) { | 712 void DisplayController::OnDisplayRemoved(const gfx::Display& display) { |
713 if (limiter_.get()) | 713 if (limiter_.get()) |
714 limiter_->SetThrottleTimeout(kAfterDisplayChangeThrottleTimeoutMs); | 714 limiter_->SetThrottleTimeout(kAfterDisplayChangeThrottleTimeoutMs); |
715 | 715 |
716 aura::RootWindow* root_to_delete = root_windows_[display.id()]; | 716 aura::RootWindow* root_to_delete = root_windows_[display.id()]; |
717 DCHECK(root_to_delete) << display.ToString(); | 717 DCHECK(root_to_delete) << display.ToString(); |
718 NotifyDisplayConfigurationChanging(); | |
719 | 718 |
720 // Display for root window will be deleted when the Primary RootWindow | 719 // Display for root window will be deleted when the Primary RootWindow |
721 // is deleted by the Shell. | 720 // is deleted by the Shell. |
722 root_windows_.erase(display.id()); | 721 root_windows_.erase(display.id()); |
723 | 722 |
724 // When the primary root window's display is removed, move the primary | 723 // When the primary root window's display is removed, move the primary |
725 // root to the other display. | 724 // root to the other display. |
726 if (primary_display_id == display.id()) { | 725 if (primary_display_id == display.id()) { |
727 // Temporarily store the primary root window in | 726 // Temporarily store the primary root window in |
728 // |primary_root_window_for_replace_| when replacing the display. | 727 // |primary_root_window_for_replace_| when replacing the display. |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
839 gfx::Insets insets = secondary_display->GetWorkAreaInsets(); | 838 gfx::Insets insets = secondary_display->GetWorkAreaInsets(); |
840 secondary_display->set_bounds( | 839 secondary_display->set_bounds( |
841 gfx::Rect(new_secondary_origin, secondary_bounds.size())); | 840 gfx::Rect(new_secondary_origin, secondary_bounds.size())); |
842 secondary_display->UpdateWorkAreaFromInsets(insets); | 841 secondary_display->UpdateWorkAreaFromInsets(insets); |
843 } | 842 } |
844 | 843 |
845 void DisplayController::NotifyDisplayConfigurationChanging() { | 844 void DisplayController::NotifyDisplayConfigurationChanging() { |
846 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanging()); | 845 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanging()); |
847 } | 846 } |
848 | 847 |
| 848 void DisplayController::NotifyDisplayConfigurationChanged() { |
| 849 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanged()); |
| 850 } |
| 851 |
849 void DisplayController::RegisterLayoutForDisplayIdPairInternal( | 852 void DisplayController::RegisterLayoutForDisplayIdPairInternal( |
850 int64 id1, | 853 int64 id1, |
851 int64 id2, | 854 int64 id2, |
852 const DisplayLayout& layout, | 855 const DisplayLayout& layout, |
853 bool override) { | 856 bool override) { |
854 DisplayIdPair pair; | 857 DisplayIdPair pair; |
855 pair.first = id1; | 858 pair.first = id1; |
856 pair.second = id2; | 859 pair.second = id2; |
857 if (override || paired_layouts_.find(pair) == paired_layouts_.end()) | 860 if (override || paired_layouts_.find(pair) == paired_layouts_.end()) |
858 paired_layouts_[pair] = layout; | 861 paired_layouts_[pair] = layout; |
859 } | 862 } |
860 | 863 |
861 void DisplayController::OnFadeOutForSwapDisplayFinished() { | 864 void DisplayController::OnFadeOutForSwapDisplayFinished() { |
862 #if defined(OS_CHROMEOS) | 865 #if defined(OS_CHROMEOS) |
863 SetPrimaryDisplay(ScreenAsh::GetSecondaryDisplay()); | 866 SetPrimaryDisplay(ScreenAsh::GetSecondaryDisplay()); |
864 Shell::GetInstance()->output_configurator_animation()->StartFadeInAnimation(); | 867 Shell::GetInstance()->output_configurator_animation()->StartFadeInAnimation(); |
865 #endif | 868 #endif |
866 } | 869 } |
867 | 870 |
868 } // namespace ash | 871 } // namespace ash |
OLD | NEW |