Chromium Code Reviews| Index: ui/display/chromeos/display_configurator.cc |
| diff --git a/ui/display/chromeos/display_configurator.cc b/ui/display/chromeos/display_configurator.cc |
| index 68c026ea0c6f8d9d41cca7660f75f6e96b117d80..3dad590865534d63e3d9f3b6e92922336c5538ac 100644 |
| --- a/ui/display/chromeos/display_configurator.cc |
| +++ b/ui/display/chromeos/display_configurator.cc |
| @@ -11,12 +11,15 @@ |
| #include "base/time/time.h" |
| #include "ui/display/chromeos/apply_content_protection_task.h" |
| #include "ui/display/chromeos/display_layout_manager.h" |
| +#include "ui/display/chromeos/display_snapshot_virtual.h" |
| #include "ui/display/chromeos/display_util.h" |
| #include "ui/display/chromeos/update_display_configuration_task.h" |
| #include "ui/display/display_switches.h" |
| #include "ui/display/types/display_mode.h" |
| #include "ui/display/types/display_snapshot.h" |
| #include "ui/display/types/native_display_delegate.h" |
| +#include "ui/display/util/display_util.h" |
| +#include "ui/gfx/display.h" |
| namespace ui { |
| @@ -34,6 +37,9 @@ const int kConfigureDelayMs = 500; |
| // such that we read an up to date state. |
| const int kResumeDelayMs = 500; |
| +// The EDID specification marks the top bit of the manufacturer id as reserved. |
| +const int16_t kReservedManufacturerID = 1 << 15; |
| + |
| struct DisplayState { |
| DisplaySnapshot* display = nullptr; // Not owned. |
| @@ -661,6 +667,16 @@ void DisplayConfigurator::QueryContentProtectionStatus( |
| ContentProtectionClientId client_id, |
| int64_t display_id, |
| const QueryProtectionCallback& callback) { |
| + // Exclude virtual displays so that protected content will not be recaptured |
| + // through the cast stream. |
| + for (const DisplaySnapshot* display : cached_displays_) { |
| + if (display->display_id() == display_id && |
| + !IsPhysicalDisplayType(display->type())) { |
| + callback.Run(QueryProtectionResponse()); |
| + return; |
| + } |
| + } |
| + |
| if (!configure_display_ || display_externally_controlled_) { |
| callback.Run(QueryProtectionResponse()); |
| return; |
| @@ -779,7 +795,8 @@ DisplayConfigurator::GetAvailableColorCalibrationProfiles(int64_t display_id) { |
| if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kDisableDisplayColorCalibration)) { |
| for (const DisplaySnapshot* display : cached_displays_) { |
| - if (display->display_id() == display_id) { |
| + if (display->display_id() == display_id && |
| + IsPhysicalDisplayType(display->type())) { |
| return native_display_delegate_->GetAvailableColorCalibrationProfiles( |
| *display); |
| } |
| @@ -793,7 +810,8 @@ bool DisplayConfigurator::SetColorCalibrationProfile( |
| int64_t display_id, |
| ui::ColorCalibrationProfile new_profile) { |
| for (const DisplaySnapshot* display : cached_displays_) { |
| - if (display->display_id() == display_id) { |
| + if (display->display_id() == display_id && |
| + IsPhysicalDisplayType(display->type())) { |
| return native_display_delegate_->SetColorCalibrationProfile(*display, |
| new_profile); |
| } |
| @@ -964,6 +982,8 @@ void DisplayConfigurator::RunPendingConfiguration() { |
| requested_display_state_, requested_power_state_, requested_power_flags_, |
| 0, force_configure_, base::Bind(&DisplayConfigurator::OnConfigured, |
| weak_ptr_factory_.GetWeakPtr()))); |
| + configuration_task_->set_virtual_display_snapshots( |
| + virtual_display_snapshots_.get()); |
| // Reset the flags before running the task; otherwise it may end up scheduling |
| // another configuration. |
| @@ -1079,4 +1099,45 @@ void DisplayConfigurator::NotifyObservers( |
| } |
| } |
| +int64_t DisplayConfigurator::AddVirtualDisplay(gfx::Size display_size) { |
| + if (last_virtual_display_id_ == 0xff) { |
| + LOG(WARNING) << "Exceeded virtual display id limit"; |
| + return gfx::Display::kInvalidDisplayID; |
| + } |
| + |
| + DisplaySnapshotVirtual* virtual_snapshot = |
| + new DisplaySnapshotVirtual(GenerateDisplayID(kReservedManufacturerID, 0x0, |
| + ++last_virtual_display_id_), |
| + display_size); |
| + virtual_display_snapshots_.push_back(virtual_snapshot); |
| + ConfigureDisplays(); |
| + |
| + return virtual_snapshot->display_id(); |
| +} |
| + |
| +bool DisplayConfigurator::RemoveVirtualDisplay(int64_t display_id) { |
| + bool display_found = false; |
| + for (auto it = virtual_display_snapshots_.begin(); |
| + it != virtual_display_snapshots_.end(); ++it) { |
| + if ((*it)->display_id() == display_id) { |
| + virtual_display_snapshots_.erase(it); |
| + ConfigureDisplays(); |
| + display_found = true; |
| + break; |
| + } |
| + } |
| + |
| + if (!display_found) |
| + return false; |
| + |
| + int64_t highest_virtual_display_id = 0; |
| + for (const auto& display : virtual_display_snapshots_) { |
| + if (display->display_id() > highest_virtual_display_id) |
| + highest_virtual_display_id = display->display_id(); |
|
oshima
2015/12/03 18:54:07
optional: std::max if it fits in the single line (
|
| + } |
| + last_virtual_display_id_ = highest_virtual_display_id & 0xff; |
| + |
| + return true; |
| +} |
| + |
| } // namespace ui |