| 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_manager.h" | 5 #include "ui/display/manager/display_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <map> | 10 #include <map> |
| 11 #include <set> | 11 #include <set> |
| 12 #include <string> | 12 #include <string> |
| 13 #include <utility> | 13 #include <utility> |
| 14 #include <vector> | 14 #include <vector> |
| 15 | 15 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 29 #include "ui/display/display_observer.h" | 29 #include "ui/display/display_observer.h" |
| 30 #include "ui/display/display_switches.h" | 30 #include "ui/display/display_switches.h" |
| 31 #include "ui/display/manager/display_layout_store.h" | 31 #include "ui/display/manager/display_layout_store.h" |
| 32 #include "ui/display/manager/display_manager_utilities.h" | 32 #include "ui/display/manager/display_manager_utilities.h" |
| 33 #include "ui/display/manager/managed_display_info.h" | 33 #include "ui/display/manager/managed_display_info.h" |
| 34 #include "ui/display/screen.h" | 34 #include "ui/display/screen.h" |
| 35 #include "ui/gfx/font_render_params.h" | 35 #include "ui/gfx/font_render_params.h" |
| 36 #include "ui/gfx/geometry/rect.h" | 36 #include "ui/gfx/geometry/rect.h" |
| 37 #include "ui/gfx/geometry/size_conversions.h" | 37 #include "ui/gfx/geometry/size_conversions.h" |
| 38 | 38 |
| 39 #if defined(USE_X11) | |
| 40 #include "ui/base/x/x11_util.h" // nogncheck | |
| 41 #endif | |
| 42 | |
| 43 #if defined(OS_CHROMEOS) | 39 #if defined(OS_CHROMEOS) |
| 44 #include "base/sys_info.h" | 40 #include "base/sys_info.h" |
| 45 #endif | 41 #endif |
| 46 | 42 |
| 47 #if defined(OS_WIN) | 43 #if defined(OS_WIN) |
| 48 #include "base/win/windows_version.h" | 44 #include "base/win/windows_version.h" |
| 49 #endif | 45 #endif |
| 50 | 46 |
| 51 namespace ash { | 47 namespace display { |
| 52 | 48 |
| 53 namespace { | 49 namespace { |
| 54 | 50 |
| 55 // The number of pixels to overlap between the primary and secondary displays, | 51 // The number of pixels to overlap between the primary and secondary displays, |
| 56 // in case that the offset value is too large. | 52 // in case that the offset value is too large. |
| 57 const int kMinimumOverlapForInvalidOffset = 100; | 53 const int kMinimumOverlapForInvalidOffset = 100; |
| 58 | 54 |
| 59 struct DisplaySortFunctor { | 55 struct DisplaySortFunctor { |
| 60 bool operator()(const display::Display& a, const display::Display& b) { | 56 bool operator()(const display::Display& a, const display::Display& b) { |
| 61 return display::CompareDisplayIds(a.id(), b.id()); | 57 return display::CompareDisplayIds(a.id(), b.id()); |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 ApplyDisplayLayout(GetCurrentDisplayLayout(), &active_display_list_, | 260 ApplyDisplayLayout(GetCurrentDisplayLayout(), &active_display_list_, |
| 265 &updated_ids); | 261 &updated_ids); |
| 266 for (int64_t id : updated_ids) { | 262 for (int64_t id : updated_ids) { |
| 267 NotifyMetricsChanged( | 263 NotifyMetricsChanged( |
| 268 GetDisplayForId(id), | 264 GetDisplayForId(id), |
| 269 display::DisplayObserver::DISPLAY_METRIC_BOUNDS | | 265 display::DisplayObserver::DISPLAY_METRIC_BOUNDS | |
| 270 display::DisplayObserver::DISPLAY_METRIC_WORK_AREA); | 266 display::DisplayObserver::DISPLAY_METRIC_WORK_AREA); |
| 271 } | 267 } |
| 272 | 268 |
| 273 if (delegate_) | 269 if (delegate_) |
| 274 delegate_->PostDisplayConfigurationChange(); | 270 delegate_->PostDisplayConfigurationChange(false); |
| 275 } | 271 } |
| 276 | 272 |
| 277 const display::Display& DisplayManager::GetDisplayForId(int64_t id) const { | 273 const display::Display& DisplayManager::GetDisplayForId(int64_t id) const { |
| 278 display::Display* display = | 274 display::Display* display = |
| 279 const_cast<DisplayManager*>(this)->FindDisplayForId(id); | 275 const_cast<DisplayManager*>(this)->FindDisplayForId(id); |
| 280 return display ? *display : GetInvalidDisplay(); | 276 return display ? *display : GetInvalidDisplay(); |
| 281 } | 277 } |
| 282 | 278 |
| 283 const display::Display& DisplayManager::FindDisplayContainingPoint( | 279 const display::Display& DisplayManager::FindDisplayContainingPoint( |
| 284 const gfx::Point& point_in_screen) const { | 280 const gfx::Point& point_in_screen) const { |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 } | 469 } |
| 474 | 470 |
| 475 void DisplayManager::RegisterDisplayRotationProperties( | 471 void DisplayManager::RegisterDisplayRotationProperties( |
| 476 bool rotation_lock, | 472 bool rotation_lock, |
| 477 display::Display::Rotation rotation) { | 473 display::Display::Rotation rotation) { |
| 478 if (delegate_) | 474 if (delegate_) |
| 479 delegate_->PreDisplayConfigurationChange(false); | 475 delegate_->PreDisplayConfigurationChange(false); |
| 480 registered_internal_display_rotation_lock_ = rotation_lock; | 476 registered_internal_display_rotation_lock_ = rotation_lock; |
| 481 registered_internal_display_rotation_ = rotation; | 477 registered_internal_display_rotation_ = rotation; |
| 482 if (delegate_) | 478 if (delegate_) |
| 483 delegate_->PostDisplayConfigurationChange(); | 479 delegate_->PostDisplayConfigurationChange(false); |
| 484 } | 480 } |
| 485 | 481 |
| 486 scoped_refptr<display::ManagedDisplayMode> | 482 scoped_refptr<display::ManagedDisplayMode> |
| 487 DisplayManager::GetSelectedModeForDisplayId(int64_t id) const { | 483 DisplayManager::GetSelectedModeForDisplayId(int64_t id) const { |
| 488 std::map<int64_t, scoped_refptr<display::ManagedDisplayMode>>::const_iterator | 484 std::map<int64_t, scoped_refptr<display::ManagedDisplayMode>>::const_iterator |
| 489 iter = display_modes_.find(id); | 485 iter = display_modes_.find(id); |
| 490 if (iter == display_modes_.end()) | 486 if (iter == display_modes_.end()) |
| 491 return scoped_refptr<display::ManagedDisplayMode>(); | 487 return scoped_refptr<display::ManagedDisplayMode>(); |
| 492 return iter->second; | 488 return iter->second; |
| 493 } | 489 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 514 delegate_->PreDisplayConfigurationChange(false); | 510 delegate_->PreDisplayConfigurationChange(false); |
| 515 // Just sets color profile if it's not running on ChromeOS (like tests). | 511 // Just sets color profile if it's not running on ChromeOS (like tests). |
| 516 if (!base::SysInfo::IsRunningOnChromeOS() || | 512 if (!base::SysInfo::IsRunningOnChromeOS() || |
| 517 delegate_->display_configurator()->SetColorCalibrationProfile(display_id, | 513 delegate_->display_configurator()->SetColorCalibrationProfile(display_id, |
| 518 profile)) { | 514 profile)) { |
| 519 display_info_[display_id].SetColorProfile(profile); | 515 display_info_[display_id].SetColorProfile(profile); |
| 520 UMA_HISTOGRAM_ENUMERATION("ChromeOS.Display.ColorProfile", profile, | 516 UMA_HISTOGRAM_ENUMERATION("ChromeOS.Display.ColorProfile", profile, |
| 521 ui::NUM_COLOR_PROFILES); | 517 ui::NUM_COLOR_PROFILES); |
| 522 } | 518 } |
| 523 if (delegate_) | 519 if (delegate_) |
| 524 delegate_->PostDisplayConfigurationChange(); | 520 delegate_->PostDisplayConfigurationChange(false); |
| 525 #endif | 521 #endif |
| 526 } | 522 } |
| 527 | 523 |
| 528 void DisplayManager::OnNativeDisplaysChanged( | 524 void DisplayManager::OnNativeDisplaysChanged( |
| 529 const DisplayInfoList& updated_displays) { | 525 const DisplayInfoList& updated_displays) { |
| 530 if (updated_displays.empty()) { | 526 if (updated_displays.empty()) { |
| 531 VLOG(1) << "OnNativeDisplaysChanged(0): # of current displays=" | 527 VLOG(1) << "OnNativeDisplaysChanged(0): # of current displays=" |
| 532 << active_display_list_.size(); | 528 << active_display_list_.size(); |
| 533 // If the device is booted without display, or chrome is started | 529 // If the device is booted without display, or chrome is started |
| 534 // without --ash-host-window-bounds on linux desktop, use the | 530 // without --ash-host-window-bounds on linux desktop, use the |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 792 display_changes[updated_index] = metrics; | 788 display_changes[updated_index] = metrics; |
| 793 } | 789 } |
| 794 } | 790 } |
| 795 | 791 |
| 796 active_display_list_ = new_displays; | 792 active_display_list_ = new_displays; |
| 797 active_only_display_list_ = active_display_list_; | 793 active_only_display_list_ = active_display_list_; |
| 798 | 794 |
| 799 RefreshFontParams(); | 795 RefreshFontParams(); |
| 800 base::AutoReset<bool> resetter(&change_display_upon_host_resize_, false); | 796 base::AutoReset<bool> resetter(&change_display_upon_host_resize_, false); |
| 801 | 797 |
| 802 int active_display_list_size = active_display_list_.size(); | 798 size_t active_display_list_size = active_display_list_.size(); |
| 803 is_updating_display_list_ = true; | 799 is_updating_display_list_ = true; |
| 804 // Temporarily add displays to be removed because display object | 800 // Temporarily add displays to be removed because display object |
| 805 // being removed are accessed during shutting down the root. | 801 // being removed are accessed during shutting down the root. |
| 806 active_display_list_.insert(active_display_list_.end(), | 802 active_display_list_.insert(active_display_list_.end(), |
| 807 removed_displays.begin(), removed_displays.end()); | 803 removed_displays.begin(), removed_displays.end()); |
| 808 | 804 |
| 809 for (const auto& display : removed_displays) | 805 for (const auto& display : removed_displays) |
| 810 NotifyDisplayRemoved(display); | 806 NotifyDisplayRemoved(display); |
| 811 | 807 |
| 812 for (size_t index : added_display_indices) | 808 for (size_t index : added_display_indices) |
| (...skipping 28 matching lines...) Expand all Loading... |
| 841 metrics |= (display::DisplayObserver::DISPLAY_METRIC_BOUNDS | | 837 metrics |= (display::DisplayObserver::DISPLAY_METRIC_BOUNDS | |
| 842 display::DisplayObserver::DISPLAY_METRIC_WORK_AREA); | 838 display::DisplayObserver::DISPLAY_METRIC_WORK_AREA); |
| 843 } | 839 } |
| 844 if (primary.device_scale_factor() != old_primary.device_scale_factor()) | 840 if (primary.device_scale_factor() != old_primary.device_scale_factor()) |
| 845 metrics |= display::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR; | 841 metrics |= display::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR; |
| 846 | 842 |
| 847 NotifyMetricsChanged(primary, metrics); | 843 NotifyMetricsChanged(primary, metrics); |
| 848 } | 844 } |
| 849 } | 845 } |
| 850 | 846 |
| 847 bool must_clear_window = false; |
| 848 #if defined(USE_X11) && defined(OS_CHROMEOS) |
| 849 must_clear_window = |
| 850 !display_changes.empty() && base::SysInfo::IsRunningOnChromeOS(); |
| 851 #endif |
| 852 |
| 851 if (delegate_) | 853 if (delegate_) |
| 852 delegate_->PostDisplayConfigurationChange(); | 854 delegate_->PostDisplayConfigurationChange(must_clear_window); |
| 853 | |
| 854 #if defined(USE_X11) && defined(OS_CHROMEOS) | |
| 855 if (!display_changes.empty() && base::SysInfo::IsRunningOnChromeOS()) | |
| 856 ui::ClearX11DefaultRootWindow(); | |
| 857 #endif | |
| 858 | 855 |
| 859 // Create the mirroring window asynchronously after all displays | 856 // Create the mirroring window asynchronously after all displays |
| 860 // are added so that it can mirror the display newly added. This can | 857 // are added so that it can mirror the display newly added. This can |
| 861 // happen when switching from dock mode to software mirror mode. | 858 // happen when switching from dock mode to software mirror mode. |
| 862 CreateMirrorWindowAsyncIfAny(); | 859 CreateMirrorWindowAsyncIfAny(); |
| 863 } | 860 } |
| 864 | 861 |
| 865 const display::Display& DisplayManager::GetDisplayAt(size_t index) const { | 862 const display::Display& DisplayManager::GetDisplayAt(size_t index) const { |
| 866 DCHECK_LT(index, active_display_list_.size()); | 863 DCHECK_LT(index, active_display_list_.size()); |
| 867 return active_display_list_[index]; | 864 return active_display_list_[index]; |
| (...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1428 } | 1425 } |
| 1429 | 1426 |
| 1430 const display::Display& DisplayManager::GetSecondaryDisplay() const { | 1427 const display::Display& DisplayManager::GetSecondaryDisplay() const { |
| 1431 CHECK_LE(2U, GetNumDisplays()); | 1428 CHECK_LE(2U, GetNumDisplays()); |
| 1432 return GetDisplayAt(0).id() == | 1429 return GetDisplayAt(0).id() == |
| 1433 display::Screen::GetScreen()->GetPrimaryDisplay().id() | 1430 display::Screen::GetScreen()->GetPrimaryDisplay().id() |
| 1434 ? GetDisplayAt(1) | 1431 ? GetDisplayAt(1) |
| 1435 : GetDisplayAt(0); | 1432 : GetDisplayAt(0); |
| 1436 } | 1433 } |
| 1437 | 1434 |
| 1438 } // namespace ash | 1435 } // namespace display |
| OLD | NEW |