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

Unified Diff: ui/display/chromeos/display_configurator.cc

Issue 1456623002: Add support for virtual displays (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Integrate latest review feedback Created 5 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/display/chromeos/display_configurator.h ('k') | ui/display/chromeos/display_configurator_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « ui/display/chromeos/display_configurator.h ('k') | ui/display/chromeos/display_configurator_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698