blob: 3b7b4d081f4b4f1a978b86ac5cd55330f39a71bb [file] [log] [blame]
// Copyright (c) 2013 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 ASH_DISPLAY_DISPLAY_LAYOUT_H_
#define ASH_DISPLAY_DISPLAY_LAYOUT_H_
#include <stdint.h>
#include <string>
#include <vector>
#include "ash/ash_export.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
namespace gfx {
class Display;
}
namespace base {
class Value;
template <typename T> class JSONValueConverter;
}
namespace ash {
// An identifier used to manage display layout in DisplayManager /
// DisplayLayoutStore.
using DisplayIdList = std::vector<int64_t>;
using DisplayList = std::vector<gfx::Display>;
// DisplayPlacement specifies where the display (D) is placed relative
// to parent (P) display. In the following example, the display (D)
// given by |display_id| is placed at the left side of the parent
// display (P) given by |parent_display_id|, with a negative offset.
//
// + +--------+
// offset | | |
// + | D +--------+
// | | |
// +--------+ P |
// | |
// +--------+
//
struct ASH_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 of the secondary display. The offset is
// based on the top/left edge of the primary display.
int offset;
explicit DisplayPlacement(const DisplayPlacement& placement);
DisplayPlacement(Position position, int offset);
DisplayPlacement();
DisplayPlacement& Swap();
std::string ToString() const;
// Used by JSONValueConverter to generate DisplayPlacement from a
// JSON value. See json_value_converter.h.
static void RegisterJSONConverter(
base::JSONValueConverter<DisplayPlacement>* converter);
};
class ASH_EXPORT DisplayLayout final {
public:
DisplayLayout();
~DisplayLayout();
// Converter functions to/from base::Value.
static bool ConvertFromValue(const base::Value& value, DisplayLayout* layout);
static bool ConvertToValue(const DisplayLayout& layout, base::Value* value);
// Used by JSONValueConverter to generate DisplayLayout from a
// JSON value. See json_value_converter.h.
static void RegisterJSONConverter(
base::JSONValueConverter<DisplayLayout>* converter);
// Validates the layout object.
static bool Validate(const DisplayIdList& list, const DisplayLayout& layout);
ScopedVector<DisplayPlacement> placement_list;
// True if displays are mirrored.
bool mirrored;
// 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;
scoped_ptr<DisplayLayout> Copy() const;
// 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;
private:
DISALLOW_COPY_AND_ASSIGN(DisplayLayout);
};
} // namespace ash
#endif