blob: 3f173780662ed810b7bd8a4937b4dcf38b8323c3 [file] [log] [blame]
// 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.
#ifndef UI_DISPLAY_DISPLAY_LAYOUT_H_
#define UI_DISPLAY_DISPLAY_LAYOUT_H_
#include <stdint.h>
#include <memory>
#include <string>
#include <vector>
#include "base/macros.h"
#include "base/strings/string_piece.h"
#include "ui/display/display_export.h"
namespace gfx {
class Rect;
}
namespace display {
class Display;
// An identifier used to manage display layout in DisplayManager /
// DisplayLayoutStore.
using DisplayIdList = std::vector<int64_t>;
using Displays = std::vector<Display>;
// DisplayPlacement specifies where the display (D) is placed relative to
// parent (P) display. In the following example, D given by |display_id| is
// placed at the left side of P given by |parent_display_id|, with a negative
// offset and a top-left offset reference.
//
// + +--------+
// offset | | |
// + | D +--------+
// | | |
// +--------+ P |
// | |
// +--------+
//
struct DISPLAY_EXPORT DisplayPlacement {
// The id of the display this placement will be applied to.
int64_t display_id;
// The parent display id to which the above display is placed.
int64_t parent_display_id;
// To which side the parent display the display is positioned.
enum Position { TOP, RIGHT, BOTTOM, LEFT };
Position position;
// The offset of the position with respect to the parent.
int offset;
// Determines if the offset is relative to the TOP_LEFT or the BOTTOM_RIGHT.
// Defaults to TOP_LEFT.
enum OffsetReference { TOP_LEFT, BOTTOM_RIGHT };
OffsetReference offset_reference;
DisplayPlacement();
DisplayPlacement(Position position, int offset);
DisplayPlacement(Position position,
int offset,
OffsetReference offset_reference);
DisplayPlacement(int64_t display_id,
int64_t parent_display_id,
Position position,
int offset,
OffsetReference offset_reference);
DisplayPlacement(const DisplayPlacement& placement);
bool operator==(const DisplayPlacement& other) const;
bool operator!=(const DisplayPlacement& other) const;
DisplayPlacement& Swap();
std::string ToString() const;
static std::string PositionToString(Position position);
static bool StringToPosition(const base::StringPiece& string,
Position* position);
};
class DISPLAY_EXPORT DisplayLayout final {
public:
DisplayLayout();
~DisplayLayout();
// Applies the layout to the displays in |display_list|.
// |updated_ids| (optional) contains the ids for displays whose bounds have
// changed. |minimum_offset_overlap| represents the minimum required overlap
// between displays. Any overlap between displays will be fixed, and the
// display placement will be fixed.
void ApplyToDisplayList(Displays* display_list,
std::vector<int64_t>* updated_ids,
int minimum_offset_overlap);
// Validates the layout object.
static bool Validate(const DisplayIdList& list, const DisplayLayout& layout);
std::vector<DisplayPlacement> placement_list;
// True if multi displays should default to unified mode.
bool default_unified;
// The id of the display used as a primary display.
int64_t primary_id;
std::unique_ptr<DisplayLayout> Copy() const;
// Swaps the primary display so it is |new_primary_id|. This modifies the
// display placements such so they are anchored on |new_primary_id|.
void SwapPrimaryDisplay(int64_t new_primary_id);
// Test if the |layout| has the same placement list. Other fields such
// as mirrored, primary_id are ignored.
bool HasSamePlacementList(const DisplayLayout& layout) const;
// Returns string representation of the layout for debugging/testing.
std::string ToString() const;
// Returns the DisplayPlacement entry matching |display_id| if it exists,
// otherwise returns a DisplayPlacement with an invalid display id.
DisplayPlacement FindPlacementById(int64_t display_id) const;
// Creates a display::DisplayPlacement value for |rectangle| relative to the
// |reference| rectangle.
static DisplayPlacement CreatePlacementForRectangles(
const gfx::Rect& reference,
const gfx::Rect& rectangle);
private:
// Apply the display placement to |display_list|.
// Returns true if the display bounds were updated.
static bool ApplyDisplayPlacement(const DisplayPlacement& placement,
Displays* display_list,
int minimum_offset_overlap);
DISALLOW_COPY_AND_ASSIGN(DisplayLayout);
};
} // namespace display
#endif // UI_DISPLAY_DISPLAY_LAYOUT_H_