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

Unified Diff: services/ui/display/platform_screen_ozone.cc

Issue 2549503002: Rename PlatformScreen to ScreenManager. (Closed)
Patch Set: Rebase. Created 4 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 | « services/ui/display/platform_screen_ozone.h ('k') | services/ui/display/platform_screen_ozone_unittests.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: services/ui/display/platform_screen_ozone.cc
diff --git a/services/ui/display/platform_screen_ozone.cc b/services/ui/display/platform_screen_ozone.cc
deleted file mode 100644
index 6ffb7aad482f0db2714044c4062b736bad9d5983..0000000000000000000000000000000000000000
--- a/services/ui/display/platform_screen_ozone.cc
+++ /dev/null
@@ -1,389 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/ui/display/platform_screen_ozone.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/command_line.h"
-#include "base/memory/ptr_util.h"
-#include "base/sys_info.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "services/service_manager/public/cpp/interface_registry.h"
-#include "third_party/skia/include/core/SkColor.h"
-#include "ui/display/types/display_snapshot.h"
-#include "ui/display/types/native_display_delegate.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/ozone/public/ozone_platform.h"
-
-namespace display {
-namespace {
-
-// Needed for DisplayConfigurator::ForceInitialConfigure.
-const SkColor kChromeOsBootColor = SkColorSetRGB(0xfe, 0xfe, 0xfe);
-
-const float kInchInMm = 25.4f;
-
-float ComputeDisplayDPI(const gfx::Size& pixel_size,
- const gfx::Size& physical_size) {
- // The physical_size is broken for some devices, return standard DPI. See
- // crbug.com/669554.
- if (physical_size.IsEmpty()) {
- LOG(ERROR) << "Display has empty phsical_size";
- return 96.0f;
- }
-
- return (pixel_size.width() / static_cast<float>(physical_size.width())) *
- kInchInMm;
-}
-
-// Finds the device scale factor based on the display DPI. Will use forced
-// device scale factor if provided via command line.
-float FindDeviceScaleFactor(float dpi) {
- if (Display::HasForceDeviceScaleFactor())
- return Display::GetForcedDeviceScaleFactor();
-
- // TODO(kylechar): If dpi > 150 then ash uses 1.25 now. Ignoring that for now.
- if (dpi > 200.0)
- return 2.0f;
- else
- return 1.0f;
-}
-
-} // namespace
-
-// static
-std::unique_ptr<PlatformScreen> PlatformScreen::Create() {
- return base::MakeUnique<PlatformScreenOzone>();
-}
-
-PlatformScreenOzone::PlatformScreenOzone() {}
-
-PlatformScreenOzone::~PlatformScreenOzone() {
- // We are shutting down and don't want to make anymore display changes.
- fake_display_controller_ = nullptr;
- display_configurator_.RemoveObserver(this);
-}
-
-void PlatformScreenOzone::AddInterfaces(
- service_manager::InterfaceRegistry* registry) {
- registry->AddInterface<mojom::DisplayController>(this);
- registry->AddInterface<mojom::TestDisplayController>(this);
-}
-
-void PlatformScreenOzone::Init(PlatformScreenDelegate* delegate) {
- DCHECK(delegate);
- delegate_ = delegate;
-
- std::unique_ptr<ui::NativeDisplayDelegate> native_display_delegate =
- ui::OzonePlatform::GetInstance()->CreateNativeDisplayDelegate();
-
- // The FakeDisplayController gives us a way to make the NativeDisplayDelegate
- // pretend something display related has happened.
- if (!base::SysInfo::IsRunningOnChromeOS()) {
- fake_display_controller_ =
- native_display_delegate->GetFakeDisplayController();
- }
-
- // We want display configuration to happen even off device to keep the control
- // flow similar.
- display_configurator_.set_configure_display(true);
- display_configurator_.AddObserver(this);
- display_configurator_.set_state_controller(this);
- display_configurator_.Init(std::move(native_display_delegate), false);
- display_configurator_.ForceInitialConfigure(kChromeOsBootColor);
-}
-
-void PlatformScreenOzone::RequestCloseDisplay(int64_t display_id) {
- if (!fake_display_controller_ || wait_for_display_config_update_)
- return;
-
- CachedDisplayIterator iter = GetCachedDisplayIterator(display_id);
- if (iter != cached_displays_.end()) {
- // Tell the NDD to remove the display. PlatformScreen will get an update
- // that the display configuration has changed and the display will be gone.
- wait_for_display_config_update_ =
- fake_display_controller_->RemoveDisplay(iter->id);
- }
-}
-
-int64_t PlatformScreenOzone::GetPrimaryDisplayId() const {
- return primary_display_id_;
-}
-
-void PlatformScreenOzone::ToggleAddRemoveDisplay() {
- if (!fake_display_controller_ || wait_for_display_config_update_)
- return;
-
- if (cached_displays_.size() == 1) {
- const gfx::Size& pixel_size = cached_displays_[0].metrics.pixel_size;
- wait_for_display_config_update_ =
- fake_display_controller_->AddDisplay(pixel_size) != kInvalidDisplayId;
- } else if (cached_displays_.size() > 1) {
- wait_for_display_config_update_ =
- fake_display_controller_->RemoveDisplay(cached_displays_.back().id);
- } else {
- NOTREACHED();
- }
-}
-
-void PlatformScreenOzone::ToggleDisplayResolution() {
- DisplayInfo& display = cached_displays_[0];
-
- // Toggle the display size to use.
- size_t num_sizes = display.supported_sizes.size();
- for (size_t i = 0; i < num_sizes; i++) {
- if (display.supported_sizes[i] == display.requested_size) {
- if (i + 1 == num_sizes)
- display.requested_size = display.supported_sizes[0];
- else
- display.requested_size = display.supported_sizes[i + 1];
- break;
- }
- }
-
- display_configurator_.OnConfigurationChanged();
-}
-
-void PlatformScreenOzone::SwapPrimaryDisplay() {
- const size_t num_displays = cached_displays_.size();
- if (num_displays <= 1)
- return;
-
- // Find index of current primary display.
- size_t primary_display_index = 0;
- for (size_t i = 0; i < num_displays; i++) {
- if (cached_displays_[i].id == primary_display_id_) {
- primary_display_index = i;
- break;
- }
- }
-
- // Set next display index as primary, or loop back to first display if last.
- if (primary_display_index + 1 == num_displays) {
- primary_display_id_ = cached_displays_[0].id;
- } else {
- primary_display_id_ = cached_displays_[primary_display_index + 1].id;
- }
-
- delegate_->OnPrimaryDisplayChanged(primary_display_id_);
-}
-
-void PlatformScreenOzone::SetDisplayWorkArea(int64_t display_id,
- const gfx::Size& size,
- const gfx::Insets& insets) {
- CachedDisplayIterator iter = GetCachedDisplayIterator(display_id);
- if (iter == cached_displays_.end()) {
- NOTREACHED() << display_id;
- return;
- }
-
- DisplayInfo& display_info = *iter;
- if (display_info.metrics.bounds.size() == size) {
- gfx::Rect new_work_area = display_info.metrics.bounds;
- new_work_area.Inset(insets);
-
- if (new_work_area != display_info.metrics.work_area) {
- display_info.last_work_area_insets = insets;
- display_info.metrics.work_area = new_work_area;
- display_info.modified = true;
- UpdateCachedDisplays();
- }
- }
-}
-
-PlatformScreenOzone::DisplayInfo::DisplayInfo() = default;
-PlatformScreenOzone::DisplayInfo::DisplayInfo(const DisplayInfo& other) =
- default;
-PlatformScreenOzone::DisplayInfo::~DisplayInfo() = default;
-
-void PlatformScreenOzone::ProcessRemovedDisplays(
- const ui::DisplayConfigurator::DisplayStateList& snapshots) {
- std::vector<int64_t> current_ids;
- for (ui::DisplaySnapshot* snapshot : snapshots)
- current_ids.push_back(snapshot->display_id());
-
- // Find cached displays with no matching snapshot and mark as removed.
- for (DisplayInfo& display : cached_displays_) {
- if (std::find(current_ids.begin(), current_ids.end(), display.id) ==
- current_ids.end()) {
- display.removed = true;
- if (primary_display_id_ == display.id)
- primary_display_id_ = kInvalidDisplayId;
- }
- }
-}
-
-void PlatformScreenOzone::ProcessModifiedDisplays(
- const ui::DisplayConfigurator::DisplayStateList& snapshots) {
- for (ui::DisplaySnapshot* snapshot : snapshots) {
- auto iter = GetCachedDisplayIterator(snapshot->display_id());
- if (iter != cached_displays_.end()) {
- DisplayInfo& display_info = *iter;
- ViewportMetrics new_metrics =
- MetricsFromSnapshot(*snapshot, display_info.metrics.bounds.origin());
- new_metrics.work_area.Inset(display_info.last_work_area_insets);
-
- if (new_metrics != display_info.metrics) {
- display_info.metrics = new_metrics;
- display_info.modified = true;
- }
- }
- }
-}
-
-void PlatformScreenOzone::UpdateCachedDisplays() {
- // Walk through cached displays after processing the snapshots to find any
- // removed or modified displays. This ensures that we only send one update per
- // display to the delegate.
- next_display_origin_.SetPoint(0, 0);
- for (auto iter = cached_displays_.begin(); iter != cached_displays_.end();) {
- DisplayInfo& display_info = *iter;
- if (display_info.removed) {
- // Update delegate and remove from cache.
- delegate_->OnDisplayRemoved(display_info.id);
- iter = cached_displays_.erase(iter);
- } else {
- // Check if the display origin needs to be updated.
- if (next_display_origin_ != display_info.metrics.bounds.origin()) {
- display_info.metrics.bounds.set_origin(next_display_origin_);
- display_info.metrics.work_area.set_origin(next_display_origin_);
- display_info.modified = true;
- }
- next_display_origin_.Offset(display_info.metrics.bounds.width(), 0);
-
- // Check if the window bounds have changed and update delegate.
- if (display_info.modified) {
- display_info.modified = false;
- delegate_->OnDisplayModified(display_info.id, display_info.metrics);
- }
- ++iter;
- }
- }
-}
-
-void PlatformScreenOzone::AddNewDisplays(
- const ui::DisplayConfigurator::DisplayStateList& snapshots) {
- for (ui::DisplaySnapshot* snapshot : snapshots) {
- const int64_t id = snapshot->display_id();
-
- // Check if display already exists and skip.
- if (GetCachedDisplayIterator(id) != cached_displays_.end())
- continue;
-
- DisplayInfo display_info;
- display_info.id = snapshot->display_id();
- display_info.metrics = MetricsFromSnapshot(*snapshot, next_display_origin_);
-
- // Store the display mode sizes so we can toggle through them.
- for (auto& mode : snapshot->modes()) {
- display_info.supported_sizes.push_back(mode->size());
- if (mode.get() == snapshot->current_mode())
- display_info.requested_size = mode->size();
- }
-
- // Move the origin so that next display is to the right of current display.
- next_display_origin_.Offset(display_info.metrics.bounds.width(), 0);
-
- cached_displays_.push_back(display_info);
- delegate_->OnDisplayAdded(display_info.id, display_info.metrics);
-
- // If we have no primary display then this one should be it.
- if (primary_display_id_ == kInvalidDisplayId) {
- primary_display_id_ = id;
- delegate_->OnPrimaryDisplayChanged(primary_display_id_);
- }
- }
-}
-
-PlatformScreenOzone::CachedDisplayIterator
-PlatformScreenOzone::GetCachedDisplayIterator(int64_t display_id) {
- return std::find_if(cached_displays_.begin(), cached_displays_.end(),
- [display_id](const DisplayInfo& display_info) {
- return display_info.id == display_id;
- });
-}
-
-ViewportMetrics PlatformScreenOzone::MetricsFromSnapshot(
- const ui::DisplaySnapshot& snapshot,
- const gfx::Point& origin) {
- const ui::DisplayMode* current_mode = snapshot.current_mode();
- DCHECK(current_mode);
-
- ViewportMetrics metrics;
- metrics.pixel_size = current_mode->size();
- metrics.device_scale_factor = FindDeviceScaleFactor(
- ComputeDisplayDPI(current_mode->size(), snapshot.physical_size()));
- // Get DIP size based on device scale factor. We are assuming the
- // ui scale factor is always 1.0 here for now.
- gfx::Size scaled_size = gfx::ScaleToRoundedSize(
- current_mode->size(), 1.0f / metrics.device_scale_factor);
- metrics.bounds = gfx::Rect(origin, scaled_size);
- metrics.work_area = metrics.bounds;
- return metrics;
-}
-
-void PlatformScreenOzone::OnDisplayModeChanged(
- const ui::DisplayConfigurator::DisplayStateList& displays) {
- ProcessRemovedDisplays(displays);
- ProcessModifiedDisplays(displays);
-
- // If the primary display is marked as removed we'll try to find a new primary
- // display and update the delegate before removing the old primary display.
- if (primary_display_id_ == kInvalidDisplayId) {
- for (const DisplayInfo& display : cached_displays_) {
- if (!display.removed) {
- primary_display_id_ = display.id;
- delegate_->OnPrimaryDisplayChanged(primary_display_id_);
- break;
- }
- }
- }
-
- UpdateCachedDisplays();
- AddNewDisplays(displays);
-
- wait_for_display_config_update_ = false;
-}
-
-void PlatformScreenOzone::OnDisplayModeChangeFailed(
- const ui::DisplayConfigurator::DisplayStateList& displays,
- ui::MultipleDisplayState failed_new_state) {
- LOG(ERROR) << "OnDisplayModeChangeFailed from DisplayConfigurator";
- wait_for_display_config_update_ = false;
-}
-
-void PlatformScreenOzone::Create(
- const service_manager::Identity& remote_identity,
- mojom::DisplayControllerRequest request) {
- controller_bindings_.AddBinding(this, std::move(request));
-}
-
-ui::MultipleDisplayState PlatformScreenOzone::GetStateForDisplayIds(
- const ui::DisplayConfigurator::DisplayStateList& display_states) const {
- return (display_states.size() == 1
- ? ui::MULTIPLE_DISPLAY_STATE_SINGLE
- : ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED);
-}
-
-bool PlatformScreenOzone::GetResolutionForDisplayId(int64_t display_id,
- gfx::Size* size) const {
- for (const DisplayInfo& display : cached_displays_) {
- if (display.id == display_id) {
- *size = display.requested_size;
- return true;
- }
- }
-
- return false;
-}
-
-void PlatformScreenOzone::Create(
- const service_manager::Identity& remote_identity,
- mojom::TestDisplayControllerRequest request) {
- test_bindings_.AddBinding(this, std::move(request));
-}
-
-} // namespace display
« no previous file with comments | « services/ui/display/platform_screen_ozone.h ('k') | services/ui/display/platform_screen_ozone_unittests.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698