| 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
|
| index 664402847e820bc95fc30949302f3d1bd3e3c5b6..127fcd8f90ff2b9eb9f541e49c1b074d00587fb7 100644
|
| --- a/services/ui/display/platform_screen_ozone.cc
|
| +++ b/services/ui/display/platform_screen_ozone.cc
|
| @@ -86,6 +86,7 @@ void PlatformScreenOzone::Init(PlatformScreenDelegate* delegate) {
|
| // 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);
|
| }
|
| @@ -112,7 +113,7 @@ void PlatformScreenOzone::ToggleAddRemoveDisplay() {
|
| return;
|
|
|
| if (cached_displays_.size() == 1) {
|
| - const gfx::Size& pixel_size = cached_displays_[0].pixel_size;
|
| + const gfx::Size& pixel_size = cached_displays_[0].metrics.pixel_size;
|
| wait_for_display_config_update_ =
|
| fake_display_controller_->AddDisplay(pixel_size) !=
|
| Display::kInvalidDisplayID;
|
| @@ -124,6 +125,24 @@ void PlatformScreenOzone::ToggleAddRemoveDisplay() {
|
| }
|
| }
|
|
|
| +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)
|
| @@ -158,11 +177,24 @@ void PlatformScreenOzone::SetDisplayWorkArea(int64_t display_id,
|
| }
|
|
|
| DisplayInfo& display_info = *iter;
|
| - if (display_info.bounds.size() == size) {
|
| - // TODO(kylechar): Change workarea and update ws::DisplayManager.
|
| + 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;
|
| @@ -196,11 +228,12 @@ void PlatformScreenOzone::ProcessModifiedDisplays(
|
| auto iter = GetCachedDisplayIterator(snapshot->display_id());
|
| if (iter != cached_displays_.end()) {
|
| DisplayInfo& display_info = *iter;
|
| - DisplayInfo new_info = DisplayInfoFromSnapshot(*snapshot);
|
| + ViewportMetrics new_metrics =
|
| + MetricsFromSnapshot(*snapshot, display_info.metrics.bounds.origin());
|
| + new_metrics.work_area.Inset(display_info.last_work_area_insets);
|
|
|
| - if (new_info.bounds.size() != display_info.bounds.size() ||
|
| - new_info.device_scale_factor != display_info.device_scale_factor) {
|
| - display_info = new_info;
|
| + if (new_metrics != display_info.metrics) {
|
| + display_info.metrics = new_metrics;
|
| display_info.modified = true;
|
| }
|
| }
|
| @@ -220,18 +253,17 @@ void PlatformScreenOzone::UpdateCachedDisplays() {
|
| iter = cached_displays_.erase(iter);
|
| } else {
|
| // Check if the display origin needs to be updated.
|
| - if (next_display_origin_ != display_info.bounds.origin()) {
|
| - display_info.bounds.set_origin(next_display_origin_);
|
| + 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.bounds.width(), 0);
|
| + 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.bounds,
|
| - display_info.pixel_size,
|
| - display_info.device_scale_factor);
|
| + delegate_->OnDisplayModified(display_info.id, display_info.metrics);
|
| }
|
| ++iter;
|
| }
|
| @@ -251,15 +283,22 @@ void PlatformScreenOzone::AddNewDisplays(
|
| if (primary_display_id_ == Display::kInvalidDisplayID)
|
| primary_display_id_ = id;
|
|
|
| - DisplayInfo display_info = DisplayInfoFromSnapshot(*snapshot);
|
| + 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.bounds.width(), 0);
|
| + next_display_origin_.Offset(display_info.metrics.bounds.width(), 0);
|
|
|
| cached_displays_.push_back(display_info);
|
| - delegate_->OnDisplayAdded(display_info.id, display_info.bounds,
|
| - display_info.pixel_size,
|
| - display_info.device_scale_factor);
|
| + delegate_->OnDisplayAdded(display_info.id, display_info.metrics);
|
| }
|
| }
|
|
|
| @@ -271,22 +310,23 @@ PlatformScreenOzone::GetCachedDisplayIterator(int64_t display_id) {
|
| });
|
| }
|
|
|
| -PlatformScreenOzone::DisplayInfo PlatformScreenOzone::DisplayInfoFromSnapshot(
|
| - const ui::DisplaySnapshot& snapshot) {
|
| +ViewportMetrics PlatformScreenOzone::MetricsFromSnapshot(
|
| + const ui::DisplaySnapshot& snapshot,
|
| + const gfx::Point& origin) {
|
| const ui::DisplayMode* current_mode = snapshot.current_mode();
|
| DCHECK(current_mode);
|
|
|
| - DisplayInfo display_info;
|
| - display_info.id = snapshot.display_id();
|
| - display_info.pixel_size = current_mode->size();
|
| - display_info.device_scale_factor = FindDeviceScaleFactor(
|
| + 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 / display_info.device_scale_factor);
|
| - display_info.bounds = gfx::Rect(next_display_origin_, scaled_size);
|
| - return display_info;
|
| + 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(
|
| @@ -311,6 +351,25 @@ void PlatformScreenOzone::Create(
|
| 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) {
|
|
|