| // Copyright 2019 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 COMPONENTS_EXO_WAYLAND_WAYLAND_POSITIONER_H_ |
| #define COMPONENTS_EXO_WAYLAND_WAYLAND_POSITIONER_H_ |
| |
| #include <xdg-shell-server-protocol.h> |
| |
| #include "base/macros.h" |
| #include "ui/gfx/geometry/point.h" |
| #include "ui/gfx/geometry/rect.h" |
| #include "ui/gfx/geometry/size.h" |
| #include "ui/gfx/geometry/vector2d.h" |
| |
| namespace exo { |
| namespace wayland { |
| |
| class WaylandPositioner { |
| public: |
| // Holds the result of window positioning. |
| struct Result { |
| gfx::Point origin; |
| gfx::Size size; |
| bool x_flipped; |
| bool y_flipped; |
| }; |
| |
| // Represents the 1-dimensional projection of the gravity/anchor values. |
| enum Direction { kNegative = -1, kNeutral = 0, kPositive = 1 }; |
| |
| // Controls whether anchor and gravity are set using the unstable bitfields or |
| // the stable enums. |
| enum Version { UNSTABLE, STABLE }; |
| |
| WaylandPositioner(Version v) : version_(v) {} |
| |
| // Calculate and return position from current state. |
| Result CalculatePosition(const gfx::Rect& work_area, |
| bool flip_x, |
| bool flip_y) const; |
| |
| void SetSize(gfx::Size size) { size_ = std::move(size); } |
| |
| void SetAnchorRect(gfx::Rect anchor_rect) { |
| anchor_rect_ = std::move(anchor_rect); |
| } |
| |
| void SetAnchor(uint32_t anchor); |
| |
| void SetGravity(uint32_t gravity); |
| |
| void SetAdjustment(uint32_t adjustment) { adjustment_ = adjustment; } |
| |
| void SetOffset(gfx::Vector2d offset) { offset_ = std::move(offset); } |
| |
| private: |
| Version version_; |
| |
| gfx::Size size_; |
| |
| gfx::Rect anchor_rect_; |
| |
| Direction anchor_x_ = kNeutral; |
| Direction anchor_y_ = kNeutral; |
| |
| Direction gravity_x_ = kNeutral; |
| Direction gravity_y_ = kNeutral; |
| |
| // A bitmask that defines the subset of modifications to the position/size |
| // that are allowed, see zxdg_positioner.constraint_adjustment() for more |
| // details. |
| uint32_t adjustment_ = XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_NONE; |
| |
| // Defines an absolute translation (i.e. unaffected by flipping, scaling or |
| // resizing) for the placement of the window relative to the |anchor_rect_|. |
| // See zxdg_positioner.set_offset() for more details. |
| gfx::Vector2d offset_; |
| |
| DISALLOW_COPY_AND_ASSIGN(WaylandPositioner); |
| }; |
| |
| } // namespace wayland |
| } // namespace exo |
| |
| #endif // COMPONENTS_EXO_WAYLAND_WAYLAND_POSITIONER_H_ |