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 "ash/display/display_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 #include <set> | 9 #include <set> |
10 #include <string> | 10 #include <string> |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
317 } else { | 317 } else { |
318 info.set_clear_overscan_insets(false); | 318 info.set_clear_overscan_insets(false); |
319 info.SetOverscanInsets(insets_in_dip); | 319 info.SetOverscanInsets(insets_in_dip); |
320 } | 320 } |
321 update = true; | 321 update = true; |
322 } | 322 } |
323 display_info_list.push_back(info); | 323 display_info_list.push_back(info); |
324 } | 324 } |
325 if (update) { | 325 if (update) { |
326 AddMirrorDisplayInfoIfAny(&display_info_list); | 326 AddMirrorDisplayInfoIfAny(&display_info_list); |
327 UpdateDisplays(display_info_list); | 327 UpdateDisplaysWith(display_info_list); |
328 } else { | 328 } else { |
329 display_info_[display_id].SetOverscanInsets(insets_in_dip); | 329 display_info_[display_id].SetOverscanInsets(insets_in_dip); |
330 } | 330 } |
331 } | 331 } |
332 | 332 |
333 void DisplayManager::SetDisplayRotation(int64_t display_id, | 333 void DisplayManager::SetDisplayRotation(int64_t display_id, |
334 gfx::Display::Rotation rotation, | 334 gfx::Display::Rotation rotation, |
335 gfx::Display::RotationSource source) { | 335 gfx::Display::RotationSource source) { |
336 if (IsInUnifiedMode()) | 336 if (IsInUnifiedMode()) |
337 return; | 337 return; |
338 | 338 |
339 DisplayInfoList display_info_list; | 339 DisplayInfoList display_info_list; |
340 bool is_active = false; | 340 bool is_active = false; |
341 for (const auto& display : active_display_list_) { | 341 for (const auto& display : active_display_list_) { |
342 DisplayInfo info = GetDisplayInfo(display.id()); | 342 DisplayInfo info = GetDisplayInfo(display.id()); |
343 if (info.id() == display_id) { | 343 if (info.id() == display_id) { |
344 if (info.GetRotation(source) == rotation && | 344 if (info.GetRotation(source) == rotation && |
345 info.GetActiveRotation() == rotation) { | 345 info.GetActiveRotation() == rotation) { |
346 return; | 346 return; |
347 } | 347 } |
348 info.SetRotation(rotation, source); | 348 info.SetRotation(rotation, source); |
349 is_active = true; | 349 is_active = true; |
350 } | 350 } |
351 display_info_list.push_back(info); | 351 display_info_list.push_back(info); |
352 } | 352 } |
353 if (is_active) { | 353 if (is_active) { |
354 AddMirrorDisplayInfoIfAny(&display_info_list); | 354 AddMirrorDisplayInfoIfAny(&display_info_list); |
355 UpdateDisplays(display_info_list); | 355 UpdateDisplaysWith(display_info_list); |
356 } else if (display_info_.find(display_id) != display_info_.end()) { | 356 } else if (display_info_.find(display_id) != display_info_.end()) { |
357 // Inactive displays can reactivate, ensure they have been updated. | 357 // Inactive displays can reactivate, ensure they have been updated. |
358 display_info_[display_id].SetRotation(rotation, source); | 358 display_info_[display_id].SetRotation(rotation, source); |
359 } | 359 } |
360 } | 360 } |
361 | 361 |
362 bool DisplayManager::SetDisplayMode(int64_t display_id, | 362 bool DisplayManager::SetDisplayMode(int64_t display_id, |
363 const DisplayMode& display_mode) { | 363 const DisplayMode& display_mode) { |
364 bool change_ui_scale = GetDisplayIdForUIScaling() == display_id; | 364 bool change_ui_scale = GetDisplayIdForUIScaling() == display_id; |
365 | 365 |
(...skipping 24 matching lines...) Expand all Loading... |
390 if (info.device_scale_factor() != display_mode.device_scale_factor) { | 390 if (info.device_scale_factor() != display_mode.device_scale_factor) { |
391 info.set_device_scale_factor(display_mode.device_scale_factor); | 391 info.set_device_scale_factor(display_mode.device_scale_factor); |
392 display_property_changed = true; | 392 display_property_changed = true; |
393 } | 393 } |
394 } | 394 } |
395 } | 395 } |
396 display_info_list.push_back(info); | 396 display_info_list.push_back(info); |
397 } | 397 } |
398 if (display_property_changed) { | 398 if (display_property_changed) { |
399 AddMirrorDisplayInfoIfAny(&display_info_list); | 399 AddMirrorDisplayInfoIfAny(&display_info_list); |
400 UpdateDisplays(display_info_list); | 400 UpdateDisplaysWith(display_info_list); |
401 } | 401 } |
402 if (resolution_changed && IsInUnifiedMode()) { | 402 if (resolution_changed && IsInUnifiedMode()) { |
403 ReconfigureDisplays(); | 403 ReconfigureDisplays(); |
404 #if defined(OS_CHROMEOS) | 404 #if defined(OS_CHROMEOS) |
405 } else if (resolution_changed && base::SysInfo::IsRunningOnChromeOS()) { | 405 } else if (resolution_changed && base::SysInfo::IsRunningOnChromeOS()) { |
406 Shell::GetInstance()->display_configurator()->OnConfigurationChanged(); | 406 Shell::GetInstance()->display_configurator()->OnConfigurationChanged(); |
407 #endif | 407 #endif |
408 } | 408 } |
409 return resolution_changed || display_property_changed; | 409 return resolution_changed || display_property_changed; |
410 } | 410 } |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
625 DisplayIdPair pair = CreateDisplayIdPair(new_display_info_list[0].id(), | 625 DisplayIdPair pair = CreateDisplayIdPair(new_display_info_list[0].id(), |
626 new_display_info_list[1].id()); | 626 new_display_info_list[1].id()); |
627 DisplayLayout layout = layout_store_->GetRegisteredDisplayLayout(pair); | 627 DisplayLayout layout = layout_store_->GetRegisteredDisplayLayout(pair); |
628 // Mirror mode is set by DisplayConfigurator on the device. | 628 // Mirror mode is set by DisplayConfigurator on the device. |
629 // Emulate it when running on linux desktop. | 629 // Emulate it when running on linux desktop. |
630 if (layout.mirrored) | 630 if (layout.mirrored) |
631 SetMultiDisplayMode(MIRRORING); | 631 SetMultiDisplayMode(MIRRORING); |
632 } | 632 } |
633 #endif | 633 #endif |
634 | 634 |
635 UpdateDisplays(new_display_info_list); | 635 UpdateDisplaysWith(new_display_info_list); |
636 } | 636 } |
637 | 637 |
638 void DisplayManager::UpdateDisplays() { | 638 void DisplayManager::UpdateDisplays() { |
639 DisplayInfoList display_info_list; | 639 DisplayInfoList display_info_list; |
640 for (const auto& display : active_display_list_) | 640 for (const auto& display : active_display_list_) |
641 display_info_list.push_back(GetDisplayInfo(display.id())); | 641 display_info_list.push_back(GetDisplayInfo(display.id())); |
642 AddMirrorDisplayInfoIfAny(&display_info_list); | 642 AddMirrorDisplayInfoIfAny(&display_info_list); |
643 UpdateDisplays(display_info_list); | 643 UpdateDisplaysWith(display_info_list); |
644 } | 644 } |
645 | 645 |
646 void DisplayManager::UpdateDisplays( | 646 void DisplayManager::UpdateDisplaysWith( |
647 const std::vector<DisplayInfo>& updated_display_info_list) { | 647 const std::vector<DisplayInfo>& updated_display_info_list) { |
648 #if defined(OS_WIN) | 648 #if defined(OS_WIN) |
649 DCHECK_EQ(1u, updated_display_info_list.size()) << | 649 DCHECK_EQ(1u, updated_display_info_list.size()) << |
650 ": Multiple display test does not work on Windows bots. Please " | 650 ": Multiple display test does not work on Windows bots. Please " |
651 "skip (don't disable) the test using SupportsMultipleDisplays()"; | 651 "skip (don't disable) the test using SupportsMultipleDisplays()"; |
652 #endif | 652 #endif |
653 | 653 |
654 DisplayInfoList new_display_info_list = updated_display_info_list; | 654 DisplayInfoList new_display_info_list = updated_display_info_list; |
655 std::sort(active_display_list_.begin(), active_display_list_.end(), | 655 std::sort(active_display_list_.begin(), active_display_list_.end(), |
656 DisplaySortFunctor()); | 656 DisplaySortFunctor()); |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
964 // Layout the 2nd display below the primary as with the real device. | 964 // Layout the 2nd display below the primary as with the real device. |
965 gfx::Rect host_bounds = first_display.bounds_in_native(); | 965 gfx::Rect host_bounds = first_display.bounds_in_native(); |
966 new_display_info_list.push_back( | 966 new_display_info_list.push_back( |
967 DisplayInfo::CreateFromSpec(base::StringPrintf( | 967 DisplayInfo::CreateFromSpec(base::StringPrintf( |
968 "%d+%d-600x%d", host_bounds.x(), | 968 "%d+%d-600x%d", host_bounds.x(), |
969 host_bounds.bottom() + kVerticalOffsetPx, host_bounds.height()))); | 969 host_bounds.bottom() + kVerticalOffsetPx, host_bounds.height()))); |
970 } | 970 } |
971 num_connected_displays_ = new_display_info_list.size(); | 971 num_connected_displays_ = new_display_info_list.size(); |
972 mirroring_display_id_ = gfx::Display::kInvalidDisplayID; | 972 mirroring_display_id_ = gfx::Display::kInvalidDisplayID; |
973 software_mirroring_display_list_.clear(); | 973 software_mirroring_display_list_.clear(); |
974 UpdateDisplays(new_display_info_list); | 974 UpdateDisplaysWith(new_display_info_list); |
975 } | 975 } |
976 | 976 |
977 void DisplayManager::ToggleDisplayScaleFactor() { | 977 void DisplayManager::ToggleDisplayScaleFactor() { |
978 DCHECK(!active_display_list_.empty()); | 978 DCHECK(!active_display_list_.empty()); |
979 std::vector<DisplayInfo> new_display_info_list; | 979 std::vector<DisplayInfo> new_display_info_list; |
980 for (DisplayList::const_iterator iter = active_display_list_.begin(); | 980 for (DisplayList::const_iterator iter = active_display_list_.begin(); |
981 iter != active_display_list_.end(); ++iter) { | 981 iter != active_display_list_.end(); ++iter) { |
982 DisplayInfo display_info = GetDisplayInfo(iter->id()); | 982 DisplayInfo display_info = GetDisplayInfo(iter->id()); |
983 display_info.set_device_scale_factor( | 983 display_info.set_device_scale_factor( |
984 display_info.device_scale_factor() == 1.0f ? 2.0f : 1.0f); | 984 display_info.device_scale_factor() == 1.0f ? 2.0f : 1.0f); |
985 new_display_info_list.push_back(display_info); | 985 new_display_info_list.push_back(display_info); |
986 } | 986 } |
987 AddMirrorDisplayInfoIfAny(&new_display_info_list); | 987 AddMirrorDisplayInfoIfAny(&new_display_info_list); |
988 UpdateDisplays(new_display_info_list); | 988 UpdateDisplaysWith(new_display_info_list); |
989 } | 989 } |
990 | 990 |
991 #if defined(OS_CHROMEOS) | 991 #if defined(OS_CHROMEOS) |
992 void DisplayManager::SetSoftwareMirroring(bool enabled) { | 992 void DisplayManager::SetSoftwareMirroring(bool enabled) { |
993 SetMultiDisplayMode(enabled ? MIRRORING | 993 SetMultiDisplayMode(enabled ? MIRRORING |
994 : current_default_multi_display_mode_); | 994 : current_default_multi_display_mode_); |
995 } | 995 } |
996 | 996 |
997 bool DisplayManager::SoftwareMirroringEnabled() const { | 997 bool DisplayManager::SoftwareMirroringEnabled() const { |
998 return software_mirroring_enabled(); | 998 return software_mirroring_enabled(); |
(...skipping 19 matching lines...) Expand all Loading... |
1018 DisplayInfoList display_info_list; | 1018 DisplayInfoList display_info_list; |
1019 for (const gfx::Display& display : active_display_list_) { | 1019 for (const gfx::Display& display : active_display_list_) { |
1020 if (display.id() == kUnifiedDisplayId) | 1020 if (display.id() == kUnifiedDisplayId) |
1021 continue; | 1021 continue; |
1022 display_info_list.push_back(GetDisplayInfo(display.id())); | 1022 display_info_list.push_back(GetDisplayInfo(display.id())); |
1023 } | 1023 } |
1024 for (const gfx::Display& display : software_mirroring_display_list_) | 1024 for (const gfx::Display& display : software_mirroring_display_list_) |
1025 display_info_list.push_back(GetDisplayInfo(display.id())); | 1025 display_info_list.push_back(GetDisplayInfo(display.id())); |
1026 mirroring_display_id_ = gfx::Display::kInvalidDisplayID; | 1026 mirroring_display_id_ = gfx::Display::kInvalidDisplayID; |
1027 software_mirroring_display_list_.clear(); | 1027 software_mirroring_display_list_.clear(); |
1028 UpdateDisplays(display_info_list); | 1028 UpdateDisplaysWith(display_info_list); |
1029 } | 1029 } |
1030 | 1030 |
1031 bool DisplayManager::UpdateDisplayBounds(int64_t display_id, | 1031 bool DisplayManager::UpdateDisplayBounds(int64_t display_id, |
1032 const gfx::Rect& new_bounds) { | 1032 const gfx::Rect& new_bounds) { |
1033 if (change_display_upon_host_resize_) { | 1033 if (change_display_upon_host_resize_) { |
1034 display_info_[display_id].SetBounds(new_bounds); | 1034 display_info_[display_id].SetBounds(new_bounds); |
1035 // Don't notify observers if the mirrored window has changed. | 1035 // Don't notify observers if the mirrored window has changed. |
1036 if (software_mirroring_enabled() && mirroring_display_id_ == display_id) | 1036 if (software_mirroring_enabled() && mirroring_display_id_ == display_id) |
1037 return false; | 1037 return false; |
1038 gfx::Display* display = FindDisplayForId(display_id); | 1038 gfx::Display* display = FindDisplayForId(display_id); |
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1400 gfx::Rect(new_secondary_origin, secondary_bounds.size())); | 1400 gfx::Rect(new_secondary_origin, secondary_bounds.size())); |
1401 secondary_display->UpdateWorkAreaFromInsets(insets); | 1401 secondary_display->UpdateWorkAreaFromInsets(insets); |
1402 } | 1402 } |
1403 | 1403 |
1404 void DisplayManager::RunPendingTasksForTest() { | 1404 void DisplayManager::RunPendingTasksForTest() { |
1405 if (!software_mirroring_display_list_.empty()) | 1405 if (!software_mirroring_display_list_.empty()) |
1406 base::RunLoop().RunUntilIdle(); | 1406 base::RunLoop().RunUntilIdle(); |
1407 } | 1407 } |
1408 | 1408 |
1409 } // namespace ash | 1409 } // namespace ash |
OLD | NEW |