| Index: ui/display/fake_display_delegate.cc
|
| diff --git a/ui/display/fake_display_delegate.cc b/ui/display/fake_display_delegate.cc
|
| index b1fda156787f78b0db57989708a5fe7acc0b54a0..8f02397c2c9efb9885ca16622b83e5b12371edca 100644
|
| --- a/ui/display/fake_display_delegate.cc
|
| +++ b/ui/display/fake_display_delegate.cc
|
| @@ -5,6 +5,7 @@
|
| #include "ui/display/fake_display_delegate.h"
|
|
|
| #include <string>
|
| +#include <utility>
|
|
|
| #include "base/command_line.h"
|
| #include "base/hash.h"
|
| @@ -34,30 +35,52 @@ FakeDisplayDelegate::FakeDisplayDelegate() {}
|
| FakeDisplayDelegate::~FakeDisplayDelegate() {}
|
|
|
| int64_t FakeDisplayDelegate::AddDisplay(const gfx::Size& display_size) {
|
| + DCHECK(!display_size.IsEmpty());
|
| +
|
| if (next_display_id_ == 0xFF) {
|
| LOG(ERROR) << "Exceeded display id limit";
|
| - return display::Display::kInvalidDisplayID;
|
| + return Display::kInvalidDisplayID;
|
| }
|
|
|
| int64_t id = GenerateDisplayID(kReservedManufacturerID, kProductCodeHash,
|
| ++next_display_id_);
|
| +
|
| + FakeDisplaySnapshot::Builder builder;
|
| + builder.SetId(id).SetNativeMode(display_size);
|
| + builder.SetName(base::StringPrintf("Fake Display %d", next_display_id_));
|
| +
|
| // Add the first display as internal.
|
| - ui::DisplayConnectionType type = displays_.empty()
|
| - ? ui::DISPLAY_CONNECTION_TYPE_INTERNAL
|
| - : ui::DISPLAY_CONNECTION_TYPE_UNKNOWN;
|
| - std::string name = base::StringPrintf("Fake Display %d", next_display_id_);
|
| + if (displays_.empty())
|
| + builder.SetType(ui::DISPLAY_CONNECTION_TYPE_INTERNAL);
|
| +
|
| + return AddDisplay(builder.Build()) ? id : Display::kInvalidDisplayID;
|
| +}
|
| +
|
| +bool FakeDisplayDelegate::AddDisplay(
|
| + std::unique_ptr<ui::DisplaySnapshot> display) {
|
| + DCHECK(display);
|
|
|
| - displays_.push_back(
|
| - base::MakeUnique<FakeDisplaySnapshot>(id, display_size, type, name));
|
| + int64_t display_id = display->display_id();
|
| + // Check there is no existing display with the same id.
|
| + for (auto& existing_display : displays_) {
|
| + if (existing_display->display_id() == display_id) {
|
| + LOG(ERROR) << "Display with id " << display_id << " already exists";
|
| + return false;
|
| + }
|
| + }
|
| +
|
| + DVLOG(1) << "Added display " << display->ToString();
|
| + displays_.push_back(std::move(display));
|
| OnConfigurationChanged();
|
|
|
| - return id;
|
| + return true;
|
| }
|
|
|
| bool FakeDisplayDelegate::RemoveDisplay(int64_t display_id) {
|
| // Find display snapshot with matching id and remove it.
|
| for (auto iter = displays_.begin(); iter != displays_.end(); ++iter) {
|
| if ((*iter)->display_id() == display_id) {
|
| + DVLOG(1) << "Removed display " << (*iter)->ToString();
|
| displays_.erase(iter);
|
| OnConfigurationChanged();
|
| return true;
|
| @@ -69,10 +92,9 @@ bool FakeDisplayDelegate::RemoveDisplay(int64_t display_id) {
|
|
|
| void FakeDisplayDelegate::Initialize() {
|
| DCHECK(!initialized_);
|
| - InitFromCommandLine();
|
|
|
| // If no command line flags are provided then initialize a default display.
|
| - if (displays_.empty())
|
| + if (!InitFromCommandLine())
|
| AddDisplay(gfx::Size(1024, 768));
|
|
|
| initialized_ = true;
|
| @@ -162,26 +184,59 @@ FakeDisplayController* FakeDisplayDelegate::GetFakeDisplayController() {
|
| return static_cast<FakeDisplayController*>(this);
|
| }
|
|
|
| -void FakeDisplayDelegate::InitFromCommandLine() {
|
| +bool FakeDisplayDelegate::InitFromCommandLine() {
|
| base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
|
| if (!command_line->HasSwitch(switches::kScreenConfig))
|
| - return;
|
| + return false;
|
|
|
| const std::string command_string =
|
| command_line->GetSwitchValueASCII(switches::kScreenConfig);
|
|
|
| + // Start without any displays.
|
| + if (command_string == "none")
|
| + return true;
|
| +
|
| // Split on commas and parse each display string.
|
| for (std::string part : base::SplitString(
|
| command_string, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) {
|
| - int width = 0;
|
| - int height = 0;
|
| - if (sscanf(part.c_str(), "%dx%d", &width, &height) >= 2) {
|
| - gfx::Size display_size(width, height);
|
| - AddDisplay(display_size);
|
| + std::unique_ptr<ui::DisplaySnapshot> snapshot =
|
| + CreateSnapshotFromSpec(part);
|
| + if (snapshot) {
|
| + AddDisplay(std::move(snapshot));
|
| } else {
|
| LOG(ERROR) << "Failed to parse display \"" << part << "\"";
|
| }
|
| }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +std::unique_ptr<ui::DisplaySnapshot>
|
| +FakeDisplayDelegate::CreateSnapshotFromSpec(const std::string& spec) {
|
| + int width = 0;
|
| + int height = 0;
|
| + int dpi = 0;
|
| +
|
| + // Width and height are required but DPI is optional.
|
| + int found = sscanf(spec.c_str(), "%dx%d^%d", &width, &height, &dpi);
|
| + if (found < 2)
|
| + return nullptr;
|
| +
|
| + int64_t id = GenerateDisplayID(kReservedManufacturerID, kProductCodeHash,
|
| + ++next_display_id_);
|
| +
|
| + FakeDisplaySnapshot::Builder builder;
|
| + builder.SetId(id).SetNativeMode(gfx::Size(width, height));
|
| + builder.SetName(base::StringPrintf("Fake Display %d", next_display_id_));
|
| +
|
| + if (found >= 3)
|
| + builder.SetDPI(dpi);
|
| +
|
| + // TODO(kylechar): Add type to the spec string.
|
| + if (displays_.empty())
|
| + builder.SetType(ui::DISPLAY_CONNECTION_TYPE_INTERNAL);
|
| +
|
| + return builder.Build();
|
| }
|
|
|
| void FakeDisplayDelegate::OnConfigurationChanged() {
|
|
|