// 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 #include #include #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 class JSONValueConverter; } namespace ash { // An identifier used to manage display layout in DisplayManager / // DisplayLayoutStore. using DisplayIdList = std::vector; using DisplayList = std::vector; // 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* 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* converter); // Validates the layout object. static bool Validate(const DisplayIdList& list, const DisplayLayout& layout); ScopedVector 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 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; // Returns the DisplayPlacement entry in |placement_list| matching // |display_id| if it exists, otherwise returns nullptr. const DisplayPlacement* FindPlacementById(int64_t display_id) const; private: DISALLOW_COPY_AND_ASSIGN(DisplayLayout); }; } // namespace ash #endif