blob: ccd5427838fb49d015f62d41ac4e770bb772e145 [file] [log] [blame]
// 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_