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

Unified Diff: ui/display/manager/display_layout.cc

Issue 2540313002: Split //ui/display and create //ui/display/manager. (Closed)
Patch Set: Cleanup export header. 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 | « ui/display/manager/display_layout.h ('k') | ui/display/manager/display_layout_builder.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/display/manager/display_layout.cc
diff --git a/ui/display/manager/display_layout.cc b/ui/display/manager/display_layout.cc
deleted file mode 100644
index bfee319bd4d955b16f1b95234dd15bd3bc21e1ac..0000000000000000000000000000000000000000
--- a/ui/display/manager/display_layout.cc
+++ /dev/null
@@ -1,370 +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 "ui/display/manager/display_layout.h"
-
-#include <algorithm>
-#include <set>
-#include <sstream>
-
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "base/values.h"
-#include "ui/display/display.h"
-#include "ui/gfx/geometry/insets.h"
-
-namespace display {
-namespace {
-
-// DisplayPlacement Positions
-const char kTop[] = "top";
-const char kRight[] = "right";
-const char kBottom[] = "bottom";
-const char kLeft[] = "left";
-const char kUnknown[] = "unknown";
-
-// The maximum value for 'offset' in DisplayLayout in case of outliers. Need
-// to change this value in case to support even larger displays.
-const int kMaxValidOffset = 10000;
-
-bool IsIdInList(int64_t id, const DisplayIdList& list) {
- const auto iter =
- std::find_if(list.begin(), list.end(),
- [id](int64_t display_id) { return display_id == id; });
- return iter != list.end();
-}
-
-Display* FindDisplayById(Displays* display_list, int64_t id) {
- auto iter =
- std::find_if(display_list->begin(), display_list->end(),
- [id](const Display& display) { return display.id() == id; });
- return &(*iter);
-}
-
-} // namespace
-
-////////////////////////////////////////////////////////////////////////////////
-// DisplayPlacement
-
-DisplayPlacement::DisplayPlacement()
- : DisplayPlacement(kInvalidDisplayId,
- kInvalidDisplayId,
- DisplayPlacement::RIGHT,
- 0,
- DisplayPlacement::TOP_LEFT) {}
-
-DisplayPlacement::DisplayPlacement(Position position, int offset)
- : DisplayPlacement(kInvalidDisplayId,
- kInvalidDisplayId,
- position,
- offset,
- DisplayPlacement::TOP_LEFT) {}
-
-DisplayPlacement::DisplayPlacement(Position position,
- int offset,
- OffsetReference offset_reference)
- : DisplayPlacement(kInvalidDisplayId,
- kInvalidDisplayId,
- position,
- offset,
- offset_reference) {}
-
-DisplayPlacement::DisplayPlacement(int64_t display_id,
- int64_t parent_display_id,
- Position position,
- int offset,
- OffsetReference offset_reference)
- : display_id(display_id),
- parent_display_id(parent_display_id),
- position(position),
- offset(offset),
- offset_reference(offset_reference) {
- DCHECK_LE(TOP, position);
- DCHECK_GE(LEFT, position);
- // Set the default value to |position| in case position is invalid. DCHECKs
- // above doesn't stop in Release builds.
- if (TOP > position || LEFT < position)
- this->position = RIGHT;
-
- DCHECK_GE(kMaxValidOffset, abs(offset));
-}
-
-DisplayPlacement::DisplayPlacement(const DisplayPlacement& placement)
- : display_id(placement.display_id),
- parent_display_id(placement.parent_display_id),
- position(placement.position),
- offset(placement.offset),
- offset_reference(placement.offset_reference) {}
-
-DisplayPlacement& DisplayPlacement::Swap() {
- switch (position) {
- case TOP:
- position = BOTTOM;
- break;
- case BOTTOM:
- position = TOP;
- break;
- case RIGHT:
- position = LEFT;
- break;
- case LEFT:
- position = RIGHT;
- break;
- }
- offset = -offset;
- std::swap(display_id, parent_display_id);
- return *this;
-}
-
-std::string DisplayPlacement::ToString() const {
- std::stringstream s;
- if (display_id != kInvalidDisplayId)
- s << "id=" << display_id << ", ";
- if (parent_display_id != kInvalidDisplayId)
- s << "parent=" << parent_display_id << ", ";
- s << PositionToString(position) << ", ";
- s << offset;
- return s.str();
-}
-
-// static
-std::string DisplayPlacement::PositionToString(Position position) {
- switch (position) {
- case TOP:
- return kTop;
- case RIGHT:
- return kRight;
- case BOTTOM:
- return kBottom;
- case LEFT:
- return kLeft;
- }
- return kUnknown;
-}
-
-// static
-bool DisplayPlacement::StringToPosition(const base::StringPiece& string,
- Position* position) {
- if (string == kTop) {
- *position = TOP;
- return true;
- }
-
- if (string == kRight) {
- *position = RIGHT;
- return true;
- }
-
- if (string == kBottom) {
- *position = BOTTOM;
- return true;
- }
-
- if (string == kLeft) {
- *position = LEFT;
- return true;
- }
-
- LOG(ERROR) << "Invalid position value:" << string;
-
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// DisplayLayout
-
-DisplayLayout::DisplayLayout()
- : mirrored(false), default_unified(true), primary_id(kInvalidDisplayId) {}
-
-DisplayLayout::~DisplayLayout() {}
-
-void DisplayLayout::ApplyToDisplayList(Displays* display_list,
- std::vector<int64_t>* updated_ids,
- int minimum_offset_overlap) const {
- // Layout from primary, then dependent displays.
- std::set<int64_t> parents;
- parents.insert(primary_id);
- while (parents.size()) {
- int64_t parent_id = *parents.begin();
- parents.erase(parent_id);
- for (const DisplayPlacement& placement : placement_list) {
- if (placement.parent_display_id == parent_id) {
- if (ApplyDisplayPlacement(placement,
- display_list,
- minimum_offset_overlap) &&
- updated_ids) {
- updated_ids->push_back(placement.display_id);
- }
- parents.insert(placement.display_id);
- }
- }
- }
-}
-
-// static
-bool DisplayLayout::Validate(const DisplayIdList& list,
- const DisplayLayout& layout) {
- // The primary display should be in the list.
- DCHECK(IsIdInList(layout.primary_id, list));
-
- // Unified mode, or mirror mode switched from unified mode,
- // may not have the placement yet.
- if (layout.placement_list.size() == 0u)
- return true;
-
- bool has_primary_as_parent = false;
- int64_t prev_id = std::numeric_limits<int64_t>::min();
- for (const auto& placement : layout.placement_list) {
- // Placements are sorted by display_id.
- if (prev_id >= placement.display_id) {
- LOG(ERROR) << "PlacementList must be sorted by display_id";
- return false;
- }
- prev_id = placement.display_id;
- if (placement.display_id == kInvalidDisplayId) {
- LOG(ERROR) << "display_id is not initialized";
- return false;
- }
- if (placement.parent_display_id == kInvalidDisplayId) {
- LOG(ERROR) << "display_parent_id is not initialized";
- return false;
- }
- if (placement.display_id == placement.parent_display_id) {
- LOG(ERROR) << "display_id must not be same as parent_display_id";
- return false;
- }
- if (!IsIdInList(placement.display_id, list)) {
- LOG(ERROR) << "display_id is not in the id list:" << placement.ToString();
- return false;
- }
-
- if (!IsIdInList(placement.parent_display_id, list)) {
- LOG(ERROR) << "parent_display_id is not in the id list:"
- << placement.ToString();
- return false;
- }
- has_primary_as_parent |= layout.primary_id == placement.parent_display_id;
- }
- if (!has_primary_as_parent)
- LOG(ERROR) << "At least, one placement must have the primary as a parent.";
- return has_primary_as_parent;
-}
-
-std::unique_ptr<DisplayLayout> DisplayLayout::Copy() const {
- std::unique_ptr<DisplayLayout> copy(new DisplayLayout);
- for (const auto& placement : placement_list)
- copy->placement_list.push_back(placement);
- copy->mirrored = mirrored;
- copy->default_unified = default_unified;
- copy->primary_id = primary_id;
- return copy;
-}
-
-bool DisplayLayout::HasSamePlacementList(const DisplayLayout& layout) const {
- if (placement_list.size() != layout.placement_list.size())
- return false;
- for (size_t index = 0; index < placement_list.size(); index++) {
- const DisplayPlacement& placement1 = placement_list[index];
- const DisplayPlacement& placement2 = layout.placement_list[index];
- if (placement1.position != placement2.position ||
- placement1.offset != placement2.offset ||
- placement1.display_id != placement2.display_id ||
- placement1.parent_display_id != placement2.parent_display_id) {
- return false;
- }
- }
- return true;
-}
-
-std::string DisplayLayout::ToString() const {
- std::stringstream s;
- s << "primary=" << primary_id;
- if (mirrored)
- s << ", mirrored";
- if (default_unified)
- s << ", default_unified";
- bool added = false;
- for (const auto& placement : placement_list) {
- s << (added ? "),(" : " [(");
- s << placement.ToString();
- added = true;
- }
- if (added)
- s << ")]";
- return s.str();
-}
-
-DisplayPlacement DisplayLayout::FindPlacementById(int64_t display_id) const {
- const auto iter =
- std::find_if(placement_list.begin(), placement_list.end(),
- [display_id](const DisplayPlacement& placement) {
- return placement.display_id == display_id;
- });
- return (iter == placement_list.end()) ? DisplayPlacement()
- : DisplayPlacement(*iter);
-}
-
-// static
-bool DisplayLayout::ApplyDisplayPlacement(const DisplayPlacement& placement,
- Displays* display_list,
- int minimum_offset_overlap) {
- const Display& parent_display =
- *FindDisplayById(display_list, placement.parent_display_id);
- DCHECK(parent_display.is_valid());
- Display* target_display = FindDisplayById(display_list, placement.display_id);
- gfx::Rect old_bounds(target_display->bounds());
- DCHECK(target_display);
-
- const gfx::Rect& parent_bounds = parent_display.bounds();
- const gfx::Rect& target_bounds = target_display->bounds();
- gfx::Point new_target_origin = parent_bounds.origin();
-
- DisplayPlacement::Position position = placement.position;
-
- // Ignore the offset in case the target display doesn't share edges with
- // the parent display.
- int offset = placement.offset;
- if (position == DisplayPlacement::TOP ||
- position == DisplayPlacement::BOTTOM) {
- if (placement.offset_reference == DisplayPlacement::BOTTOM_RIGHT)
- offset = parent_bounds.width() - offset - target_bounds.width();
-
- offset = std::min(
- offset, parent_bounds.width() - minimum_offset_overlap);
- offset = std::max(
- offset, -target_bounds.width() + minimum_offset_overlap);
- } else {
- if (placement.offset_reference == DisplayPlacement::BOTTOM_RIGHT)
- offset = parent_bounds.height() - offset - target_bounds.height();
-
- offset = std::min(
- offset, parent_bounds.height() - minimum_offset_overlap);
- offset = std::max(
- offset, -target_bounds.height() + minimum_offset_overlap);
- }
- switch (position) {
- case DisplayPlacement::TOP:
- new_target_origin.Offset(offset, -target_bounds.height());
- break;
- case DisplayPlacement::RIGHT:
- new_target_origin.Offset(parent_bounds.width(), offset);
- break;
- case DisplayPlacement::BOTTOM:
- new_target_origin.Offset(offset, parent_bounds.height());
- break;
- case DisplayPlacement::LEFT:
- new_target_origin.Offset(-target_bounds.width(), offset);
- break;
- }
-
- gfx::Insets insets = target_display->GetWorkAreaInsets();
- target_display->set_bounds(
- gfx::Rect(new_target_origin, target_bounds.size()));
- target_display->UpdateWorkAreaFromInsets(insets);
-
- return old_bounds != target_display->bounds();
-}
-
-} // namespace display
« no previous file with comments | « ui/display/manager/display_layout.h ('k') | ui/display/manager/display_layout_builder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698