// Copyright 2021 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.

// This file was automatically generated with:
// ../../ui/gfx/x/gen_xproto.py \
//    ../../third_party/xcbproto/src \
//    gen/ui/gfx/x \
//    bigreq \
//    composite \
//    damage \
//    dpms \
//    dri2 \
//    dri3 \
//    ge \
//    glx \
//    present \
//    randr \
//    record \
//    render \
//    res \
//    screensaver \
//    shape \
//    shm \
//    sync \
//    xc_misc \
//    xevie \
//    xf86dri \
//    xf86vidmode \
//    xfixes \
//    xinerama \
//    xinput \
//    xkb \
//    xprint \
//    xproto \
//    xselinux \
//    xtest \
//    xv \
//    xvmc

#ifndef UI_GFX_X_GENERATED_PROTOS_RANDR_H_
#define UI_GFX_X_GENERATED_PROTOS_RANDR_H_

#include <array>
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <vector>

#include "base/component_export.h"
#include "base/files/scoped_file.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_refptr.h"
#include "render.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/x/error.h"
#include "ui/gfx/x/ref_counted_fd.h"
#include "xproto.h"

namespace x11 {

class Connection;

template <typename Reply>
struct Response;

template <typename Reply>
class Future;

class COMPONENT_EXPORT(X11) RandR {
 public:
  static constexpr unsigned major_version = 1;
  static constexpr unsigned minor_version = 6;

  RandR(Connection* connection, const x11::QueryExtensionReply& info);

  uint8_t present() const { return info_.present; }
  uint8_t major_opcode() const { return info_.major_opcode; }
  uint8_t first_event() const { return info_.first_event; }
  uint8_t first_error() const { return info_.first_error; }

  Connection* connection() const { return connection_; }

  enum class Mode : uint32_t {};

  enum class Crtc : uint32_t {};

  enum class Output : uint32_t {};

  enum class Provider : uint32_t {};

  enum class Lease : uint32_t {};

  enum class Rotation : int {
    Rotate_0 = 1 << 0,
    Rotate_90 = 1 << 1,
    Rotate_180 = 1 << 2,
    Rotate_270 = 1 << 3,
    Reflect_X = 1 << 4,
    Reflect_Y = 1 << 5,
  };

  enum class SetConfig : int {
    Success = 0,
    InvalidConfigTime = 1,
    InvalidTime = 2,
    Failed = 3,
  };

  enum class NotifyMask : int {
    ScreenChange = 1 << 0,
    CrtcChange = 1 << 1,
    OutputChange = 1 << 2,
    OutputProperty = 1 << 3,
    ProviderChange = 1 << 4,
    ProviderProperty = 1 << 5,
    ResourceChange = 1 << 6,
    Lease = 1 << 7,
  };

  enum class ModeFlag : int {
    HsyncPositive = 1 << 0,
    HsyncNegative = 1 << 1,
    VsyncPositive = 1 << 2,
    VsyncNegative = 1 << 3,
    Interlace = 1 << 4,
    DoubleScan = 1 << 5,
    Csync = 1 << 6,
    CsyncPositive = 1 << 7,
    CsyncNegative = 1 << 8,
    HskewPresent = 1 << 9,
    Bcast = 1 << 10,
    PixelMultiplex = 1 << 11,
    DoubleClock = 1 << 12,
    HalveClock = 1 << 13,
  };

  enum class RandRConnection : int {
    Connected = 0,
    Disconnected = 1,
    Unknown = 2,
  };

  enum class Transform : int {
    Unit = 1 << 0,
    ScaleUp = 1 << 1,
    ScaleDown = 1 << 2,
    Projective = 1 << 3,
  };

  enum class ProviderCapability : int {
    SourceOutput = 1 << 0,
    SinkOutput = 1 << 1,
    SourceOffload = 1 << 2,
    SinkOffload = 1 << 3,
  };

  enum class Notify : int {
    CrtcChange = 0,
    OutputChange = 1,
    OutputProperty = 2,
    ProviderChange = 3,
    ProviderProperty = 4,
    ResourceChange = 5,
    Lease = 6,
  };

  struct BadOutputError : public x11::Error {
    uint16_t sequence{};

    std::string ToString() const override;
  };

  struct BadCrtcError : public x11::Error {
    uint16_t sequence{};

    std::string ToString() const override;
  };

  struct BadModeError : public x11::Error {
    uint16_t sequence{};

    std::string ToString() const override;
  };

  struct BadProviderError : public x11::Error {
    uint16_t sequence{};

    std::string ToString() const override;
  };

  struct ScreenSize {
    uint16_t width{};
    uint16_t height{};
    uint16_t mwidth{};
    uint16_t mheight{};
  };

  struct RefreshRates {
    std::vector<uint16_t> rates{};
  };

  struct ModeInfo {
    uint32_t id{};
    uint16_t width{};
    uint16_t height{};
    uint32_t dot_clock{};
    uint16_t hsync_start{};
    uint16_t hsync_end{};
    uint16_t htotal{};
    uint16_t hskew{};
    uint16_t vsync_start{};
    uint16_t vsync_end{};
    uint16_t vtotal{};
    uint16_t name_len{};
    ModeFlag mode_flags{};
  };

  struct ScreenChangeNotifyEvent {
    static constexpr int type_id = 11;
    static constexpr uint8_t opcode = 0;
    bool send_event{};
    Rotation rotation{};
    uint16_t sequence{};
    Time timestamp{};
    Time config_timestamp{};
    Window root{};
    Window request_window{};
    uint16_t sizeID{};
    Render::SubPixel subpixel_order{};
    uint16_t width{};
    uint16_t height{};
    uint16_t mwidth{};
    uint16_t mheight{};

    x11::Window* GetWindow() {
      return reinterpret_cast<x11::Window*>(&request_window);
    }
  };

  struct MonitorInfo {
    Atom name{};
    uint8_t primary{};
    uint8_t automatic{};
    int16_t x{};
    int16_t y{};
    uint16_t width{};
    uint16_t height{};
    uint32_t width_in_millimeters{};
    uint32_t height_in_millimeters{};
    std::vector<Output> outputs{};
  };

  struct NotifyEvent {
    static constexpr int type_id = 12;
    static constexpr uint8_t opcode = 1;
    bool send_event{};
    uint16_t sequence{};
    struct Cc {
      Time timestamp{};
      Window window{};
      Crtc crtc{};
      Mode mode{};
      Rotation rotation{};
      int16_t x{};
      int16_t y{};
      uint16_t width{};
      uint16_t height{};
    };
    struct Oc {
      Time timestamp{};
      Time config_timestamp{};
      Window window{};
      Output output{};
      Crtc crtc{};
      Mode mode{};
      Rotation rotation{};
      RandRConnection connection{};
      Render::SubPixel subpixel_order{};
    };
    struct Op {
      Window window{};
      Output output{};
      Atom atom{};
      Time timestamp{};
      Property status{};
    };
    struct Pc {
      Time timestamp{};
      Window window{};
      Provider provider{};
    };
    struct Pp {
      Window window{};
      Provider provider{};
      Atom atom{};
      Time timestamp{};
      uint8_t state{};
    };
    struct Rc {
      Time timestamp{};
      Window window{};
    };
    struct Lc {
      Time timestamp{};
      Window window{};
      Lease lease{};
      uint8_t created{};
    };
    absl::optional<Cc> cc{};
    absl::optional<Oc> oc{};
    absl::optional<Op> op{};
    absl::optional<Pc> pc{};
    absl::optional<Pp> pp{};
    absl::optional<Rc> rc{};
    absl::optional<Lc> lc{};

    x11::Window* GetWindow() { return nullptr; }
  };

  struct QueryVersionRequest {
    uint32_t major_version{};
    uint32_t minor_version{};
  };

  struct QueryVersionReply {
    uint16_t sequence{};
    uint32_t major_version{};
    uint32_t minor_version{};
  };

  using QueryVersionResponse = Response<QueryVersionReply>;

  Future<QueryVersionReply> QueryVersion(const QueryVersionRequest& request);

  Future<QueryVersionReply> QueryVersion(const uint32_t& major_version = {},
                                         const uint32_t& minor_version = {});

  struct SetScreenConfigRequest {
    Window window{};
    Time timestamp{};
    Time config_timestamp{};
    uint16_t sizeID{};
    Rotation rotation{};
    uint16_t rate{};
  };

  struct SetScreenConfigReply {
    SetConfig status{};
    uint16_t sequence{};
    Time new_timestamp{};
    Time config_timestamp{};
    Window root{};
    Render::SubPixel subpixel_order{};
  };

  using SetScreenConfigResponse = Response<SetScreenConfigReply>;

  Future<SetScreenConfigReply> SetScreenConfig(
      const SetScreenConfigRequest& request);

  Future<SetScreenConfigReply> SetScreenConfig(
      const Window& window = {},
      const Time& timestamp = {},
      const Time& config_timestamp = {},
      const uint16_t& sizeID = {},
      const Rotation& rotation = {},
      const uint16_t& rate = {});

  struct SelectInputRequest {
    Window window{};
    NotifyMask enable{};
  };

  using SelectInputResponse = Response<void>;

  Future<void> SelectInput(const SelectInputRequest& request);

  Future<void> SelectInput(const Window& window = {},
                           const NotifyMask& enable = {});

  struct GetScreenInfoRequest {
    Window window{};
  };

  struct GetScreenInfoReply {
    Rotation rotations{};
    uint16_t sequence{};
    Window root{};
    Time timestamp{};
    Time config_timestamp{};
    uint16_t sizeID{};
    Rotation rotation{};
    uint16_t rate{};
    uint16_t nInfo{};
    std::vector<ScreenSize> sizes{};
    std::vector<RefreshRates> rates{};
  };

  using GetScreenInfoResponse = Response<GetScreenInfoReply>;

  Future<GetScreenInfoReply> GetScreenInfo(const GetScreenInfoRequest& request);

  Future<GetScreenInfoReply> GetScreenInfo(const Window& window = {});

  struct GetScreenSizeRangeRequest {
    Window window{};
  };

  struct GetScreenSizeRangeReply {
    uint16_t sequence{};
    uint16_t min_width{};
    uint16_t min_height{};
    uint16_t max_width{};
    uint16_t max_height{};
  };

  using GetScreenSizeRangeResponse = Response<GetScreenSizeRangeReply>;

  Future<GetScreenSizeRangeReply> GetScreenSizeRange(
      const GetScreenSizeRangeRequest& request);

  Future<GetScreenSizeRangeReply> GetScreenSizeRange(const Window& window = {});

  struct SetScreenSizeRequest {
    Window window{};
    uint16_t width{};
    uint16_t height{};
    uint32_t mm_width{};
    uint32_t mm_height{};
  };

  using SetScreenSizeResponse = Response<void>;

  Future<void> SetScreenSize(const SetScreenSizeRequest& request);

  Future<void> SetScreenSize(const Window& window = {},
                             const uint16_t& width = {},
                             const uint16_t& height = {},
                             const uint32_t& mm_width = {},
                             const uint32_t& mm_height = {});

  struct GetScreenResourcesRequest {
    Window window{};
  };

  struct GetScreenResourcesReply {
    uint16_t sequence{};
    Time timestamp{};
    Time config_timestamp{};
    std::vector<Crtc> crtcs{};
    std::vector<Output> outputs{};
    std::vector<ModeInfo> modes{};
    std::vector<uint8_t> names{};
  };

  using GetScreenResourcesResponse = Response<GetScreenResourcesReply>;

  Future<GetScreenResourcesReply> GetScreenResources(
      const GetScreenResourcesRequest& request);

  Future<GetScreenResourcesReply> GetScreenResources(const Window& window = {});

  struct GetOutputInfoRequest {
    Output output{};
    Time config_timestamp{};
  };

  struct GetOutputInfoReply {
    SetConfig status{};
    uint16_t sequence{};
    Time timestamp{};
    Crtc crtc{};
    uint32_t mm_width{};
    uint32_t mm_height{};
    RandRConnection connection{};
    Render::SubPixel subpixel_order{};
    uint16_t num_preferred{};
    std::vector<Crtc> crtcs{};
    std::vector<Mode> modes{};
    std::vector<Output> clones{};
    std::vector<uint8_t> name{};
  };

  using GetOutputInfoResponse = Response<GetOutputInfoReply>;

  Future<GetOutputInfoReply> GetOutputInfo(const GetOutputInfoRequest& request);

  Future<GetOutputInfoReply> GetOutputInfo(const Output& output = {},
                                           const Time& config_timestamp = {});

  struct ListOutputPropertiesRequest {
    Output output{};
  };

  struct ListOutputPropertiesReply {
    uint16_t sequence{};
    std::vector<Atom> atoms{};
  };

  using ListOutputPropertiesResponse = Response<ListOutputPropertiesReply>;

  Future<ListOutputPropertiesReply> ListOutputProperties(
      const ListOutputPropertiesRequest& request);

  Future<ListOutputPropertiesReply> ListOutputProperties(
      const Output& output = {});

  struct QueryOutputPropertyRequest {
    Output output{};
    Atom property{};
  };

  struct QueryOutputPropertyReply {
    uint16_t sequence{};
    uint8_t pending{};
    uint8_t range{};
    uint8_t immutable{};
    std::vector<int32_t> validValues{};
  };

  using QueryOutputPropertyResponse = Response<QueryOutputPropertyReply>;

  Future<QueryOutputPropertyReply> QueryOutputProperty(
      const QueryOutputPropertyRequest& request);

  Future<QueryOutputPropertyReply> QueryOutputProperty(
      const Output& output = {},
      const Atom& property = {});

  struct ConfigureOutputPropertyRequest {
    Output output{};
    Atom property{};
    uint8_t pending{};
    uint8_t range{};
    std::vector<int32_t> values{};
  };

  using ConfigureOutputPropertyResponse = Response<void>;

  Future<void> ConfigureOutputProperty(
      const ConfigureOutputPropertyRequest& request);

  Future<void> ConfigureOutputProperty(const Output& output = {},
                                       const Atom& property = {},
                                       const uint8_t& pending = {},
                                       const uint8_t& range = {},
                                       const std::vector<int32_t>& values = {});

  struct ChangeOutputPropertyRequest {
    Output output{};
    Atom property{};
    Atom type{};
    uint8_t format{};
    PropMode mode{};
    uint32_t num_units{};
    scoped_refptr<base::RefCountedMemory> data{};
  };

  using ChangeOutputPropertyResponse = Response<void>;

  Future<void> ChangeOutputProperty(const ChangeOutputPropertyRequest& request);

  Future<void> ChangeOutputProperty(
      const Output& output = {},
      const Atom& property = {},
      const Atom& type = {},
      const uint8_t& format = {},
      const PropMode& mode = {},
      const uint32_t& num_units = {},
      const scoped_refptr<base::RefCountedMemory>& data = {});

  struct DeleteOutputPropertyRequest {
    Output output{};
    Atom property{};
  };

  using DeleteOutputPropertyResponse = Response<void>;

  Future<void> DeleteOutputProperty(const DeleteOutputPropertyRequest& request);

  Future<void> DeleteOutputProperty(const Output& output = {},
                                    const Atom& property = {});

  struct GetOutputPropertyRequest {
    Output output{};
    Atom property{};
    Atom type{};
    uint32_t long_offset{};
    uint32_t long_length{};
    uint8_t c_delete{};
    uint8_t pending{};
  };

  struct GetOutputPropertyReply {
    uint8_t format{};
    uint16_t sequence{};
    Atom type{};
    uint32_t bytes_after{};
    uint32_t num_items{};
    std::vector<uint8_t> data{};
  };

  using GetOutputPropertyResponse = Response<GetOutputPropertyReply>;

  Future<GetOutputPropertyReply> GetOutputProperty(
      const GetOutputPropertyRequest& request);

  Future<GetOutputPropertyReply> GetOutputProperty(
      const Output& output = {},
      const Atom& property = {},
      const Atom& type = {},
      const uint32_t& long_offset = {},
      const uint32_t& long_length = {},
      const uint8_t& c_delete = {},
      const uint8_t& pending = {});

  struct CreateModeRequest {
    Window window{};
    ModeInfo mode_info{};
    std::string name{};
  };

  struct CreateModeReply {
    uint16_t sequence{};
    Mode mode{};
  };

  using CreateModeResponse = Response<CreateModeReply>;

  Future<CreateModeReply> CreateMode(const CreateModeRequest& request);

  Future<CreateModeReply> CreateMode(
      const Window& window = {},
      const ModeInfo& mode_info =
          {{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}},
      const std::string& name = {});

  struct DestroyModeRequest {
    Mode mode{};
  };

  using DestroyModeResponse = Response<void>;

  Future<void> DestroyMode(const DestroyModeRequest& request);

  Future<void> DestroyMode(const Mode& mode = {});

  struct AddOutputModeRequest {
    Output output{};
    Mode mode{};
  };

  using AddOutputModeResponse = Response<void>;

  Future<void> AddOutputMode(const AddOutputModeRequest& request);

  Future<void> AddOutputMode(const Output& output = {}, const Mode& mode = {});

  struct DeleteOutputModeRequest {
    Output output{};
    Mode mode{};
  };

  using DeleteOutputModeResponse = Response<void>;

  Future<void> DeleteOutputMode(const DeleteOutputModeRequest& request);

  Future<void> DeleteOutputMode(const Output& output = {},
                                const Mode& mode = {});

  struct GetCrtcInfoRequest {
    Crtc crtc{};
    Time config_timestamp{};
  };

  struct GetCrtcInfoReply {
    SetConfig status{};
    uint16_t sequence{};
    Time timestamp{};
    int16_t x{};
    int16_t y{};
    uint16_t width{};
    uint16_t height{};
    Mode mode{};
    Rotation rotation{};
    Rotation rotations{};
    std::vector<Output> outputs{};
    std::vector<Output> possible{};
  };

  using GetCrtcInfoResponse = Response<GetCrtcInfoReply>;

  Future<GetCrtcInfoReply> GetCrtcInfo(const GetCrtcInfoRequest& request);

  Future<GetCrtcInfoReply> GetCrtcInfo(const Crtc& crtc = {},
                                       const Time& config_timestamp = {});

  struct SetCrtcConfigRequest {
    Crtc crtc{};
    Time timestamp{};
    Time config_timestamp{};
    int16_t x{};
    int16_t y{};
    Mode mode{};
    Rotation rotation{};
    std::vector<Output> outputs{};
  };

  struct SetCrtcConfigReply {
    SetConfig status{};
    uint16_t sequence{};
    Time timestamp{};
  };

  using SetCrtcConfigResponse = Response<SetCrtcConfigReply>;

  Future<SetCrtcConfigReply> SetCrtcConfig(const SetCrtcConfigRequest& request);

  Future<SetCrtcConfigReply> SetCrtcConfig(
      const Crtc& crtc = {},
      const Time& timestamp = {},
      const Time& config_timestamp = {},
      const int16_t& x = {},
      const int16_t& y = {},
      const Mode& mode = {},
      const Rotation& rotation = {},
      const std::vector<Output>& outputs = {});

  struct GetCrtcGammaSizeRequest {
    Crtc crtc{};
  };

  struct GetCrtcGammaSizeReply {
    uint16_t sequence{};
    uint16_t size{};
  };

  using GetCrtcGammaSizeResponse = Response<GetCrtcGammaSizeReply>;

  Future<GetCrtcGammaSizeReply> GetCrtcGammaSize(
      const GetCrtcGammaSizeRequest& request);

  Future<GetCrtcGammaSizeReply> GetCrtcGammaSize(const Crtc& crtc = {});

  struct GetCrtcGammaRequest {
    Crtc crtc{};
  };

  struct GetCrtcGammaReply {
    uint16_t sequence{};
    std::vector<uint16_t> red{};
    std::vector<uint16_t> green{};
    std::vector<uint16_t> blue{};
  };

  using GetCrtcGammaResponse = Response<GetCrtcGammaReply>;

  Future<GetCrtcGammaReply> GetCrtcGamma(const GetCrtcGammaRequest& request);

  Future<GetCrtcGammaReply> GetCrtcGamma(const Crtc& crtc = {});

  struct SetCrtcGammaRequest {
    Crtc crtc{};
    std::vector<uint16_t> red{};
    std::vector<uint16_t> green{};
    std::vector<uint16_t> blue{};
  };

  using SetCrtcGammaResponse = Response<void>;

  Future<void> SetCrtcGamma(const SetCrtcGammaRequest& request);

  Future<void> SetCrtcGamma(const Crtc& crtc = {},
                            const std::vector<uint16_t>& red = {},
                            const std::vector<uint16_t>& green = {},
                            const std::vector<uint16_t>& blue = {});

  struct GetScreenResourcesCurrentRequest {
    Window window{};
  };

  struct GetScreenResourcesCurrentReply {
    uint16_t sequence{};
    Time timestamp{};
    Time config_timestamp{};
    std::vector<Crtc> crtcs{};
    std::vector<Output> outputs{};
    std::vector<ModeInfo> modes{};
    std::vector<uint8_t> names{};
  };

  using GetScreenResourcesCurrentResponse =
      Response<GetScreenResourcesCurrentReply>;

  Future<GetScreenResourcesCurrentReply> GetScreenResourcesCurrent(
      const GetScreenResourcesCurrentRequest& request);

  Future<GetScreenResourcesCurrentReply> GetScreenResourcesCurrent(
      const Window& window = {});

  struct SetCrtcTransformRequest {
    Crtc crtc{};
    Render::Transform transform{};
    std::string filter_name{};
    std::vector<Render::Fixed> filter_params{};
  };

  using SetCrtcTransformResponse = Response<void>;

  Future<void> SetCrtcTransform(const SetCrtcTransformRequest& request);

  Future<void> SetCrtcTransform(
      const Crtc& crtc = {},
      const Render::Transform& transform = {{}, {}, {}, {}, {}, {}, {}, {}, {}},
      const std::string& filter_name = {},
      const std::vector<Render::Fixed>& filter_params = {});

  struct GetCrtcTransformRequest {
    Crtc crtc{};
  };

  struct GetCrtcTransformReply {
    uint16_t sequence{};
    Render::Transform pending_transform{};
    uint8_t has_transforms{};
    Render::Transform current_transform{};
    std::string pending_filter_name{};
    std::vector<Render::Fixed> pending_params{};
    std::string current_filter_name{};
    std::vector<Render::Fixed> current_params{};
  };

  using GetCrtcTransformResponse = Response<GetCrtcTransformReply>;

  Future<GetCrtcTransformReply> GetCrtcTransform(
      const GetCrtcTransformRequest& request);

  Future<GetCrtcTransformReply> GetCrtcTransform(const Crtc& crtc = {});

  struct GetPanningRequest {
    Crtc crtc{};
  };

  struct GetPanningReply {
    SetConfig status{};
    uint16_t sequence{};
    Time timestamp{};
    uint16_t left{};
    uint16_t top{};
    uint16_t width{};
    uint16_t height{};
    uint16_t track_left{};
    uint16_t track_top{};
    uint16_t track_width{};
    uint16_t track_height{};
    int16_t border_left{};
    int16_t border_top{};
    int16_t border_right{};
    int16_t border_bottom{};
  };

  using GetPanningResponse = Response<GetPanningReply>;

  Future<GetPanningReply> GetPanning(const GetPanningRequest& request);

  Future<GetPanningReply> GetPanning(const Crtc& crtc = {});

  struct SetPanningRequest {
    Crtc crtc{};
    Time timestamp{};
    uint16_t left{};
    uint16_t top{};
    uint16_t width{};
    uint16_t height{};
    uint16_t track_left{};
    uint16_t track_top{};
    uint16_t track_width{};
    uint16_t track_height{};
    int16_t border_left{};
    int16_t border_top{};
    int16_t border_right{};
    int16_t border_bottom{};
  };

  struct SetPanningReply {
    SetConfig status{};
    uint16_t sequence{};
    Time timestamp{};
  };

  using SetPanningResponse = Response<SetPanningReply>;

  Future<SetPanningReply> SetPanning(const SetPanningRequest& request);

  Future<SetPanningReply> SetPanning(const Crtc& crtc = {},
                                     const Time& timestamp = {},
                                     const uint16_t& left = {},
                                     const uint16_t& top = {},
                                     const uint16_t& width = {},
                                     const uint16_t& height = {},
                                     const uint16_t& track_left = {},
                                     const uint16_t& track_top = {},
                                     const uint16_t& track_width = {},
                                     const uint16_t& track_height = {},
                                     const int16_t& border_left = {},
                                     const int16_t& border_top = {},
                                     const int16_t& border_right = {},
                                     const int16_t& border_bottom = {});

  struct SetOutputPrimaryRequest {
    Window window{};
    Output output{};
  };

  using SetOutputPrimaryResponse = Response<void>;

  Future<void> SetOutputPrimary(const SetOutputPrimaryRequest& request);

  Future<void> SetOutputPrimary(const Window& window = {},
                                const Output& output = {});

  struct GetOutputPrimaryRequest {
    Window window{};
  };

  struct GetOutputPrimaryReply {
    uint16_t sequence{};
    Output output{};
  };

  using GetOutputPrimaryResponse = Response<GetOutputPrimaryReply>;

  Future<GetOutputPrimaryReply> GetOutputPrimary(
      const GetOutputPrimaryRequest& request);

  Future<GetOutputPrimaryReply> GetOutputPrimary(const Window& window = {});

  struct GetProvidersRequest {
    Window window{};
  };

  struct GetProvidersReply {
    uint16_t sequence{};
    Time timestamp{};
    std::vector<Provider> providers{};
  };

  using GetProvidersResponse = Response<GetProvidersReply>;

  Future<GetProvidersReply> GetProviders(const GetProvidersRequest& request);

  Future<GetProvidersReply> GetProviders(const Window& window = {});

  struct GetProviderInfoRequest {
    Provider provider{};
    Time config_timestamp{};
  };

  struct GetProviderInfoReply {
    uint8_t status{};
    uint16_t sequence{};
    Time timestamp{};
    ProviderCapability capabilities{};
    std::vector<Crtc> crtcs{};
    std::vector<Output> outputs{};
    std::vector<Provider> associated_providers{};
    std::vector<uint32_t> associated_capability{};
    std::string name{};
  };

  using GetProviderInfoResponse = Response<GetProviderInfoReply>;

  Future<GetProviderInfoReply> GetProviderInfo(
      const GetProviderInfoRequest& request);

  Future<GetProviderInfoReply> GetProviderInfo(
      const Provider& provider = {},
      const Time& config_timestamp = {});

  struct SetProviderOffloadSinkRequest {
    Provider provider{};
    Provider sink_provider{};
    Time config_timestamp{};
  };

  using SetProviderOffloadSinkResponse = Response<void>;

  Future<void> SetProviderOffloadSink(
      const SetProviderOffloadSinkRequest& request);

  Future<void> SetProviderOffloadSink(const Provider& provider = {},
                                      const Provider& sink_provider = {},
                                      const Time& config_timestamp = {});

  struct SetProviderOutputSourceRequest {
    Provider provider{};
    Provider source_provider{};
    Time config_timestamp{};
  };

  using SetProviderOutputSourceResponse = Response<void>;

  Future<void> SetProviderOutputSource(
      const SetProviderOutputSourceRequest& request);

  Future<void> SetProviderOutputSource(const Provider& provider = {},
                                       const Provider& source_provider = {},
                                       const Time& config_timestamp = {});

  struct ListProviderPropertiesRequest {
    Provider provider{};
  };

  struct ListProviderPropertiesReply {
    uint16_t sequence{};
    std::vector<Atom> atoms{};
  };

  using ListProviderPropertiesResponse = Response<ListProviderPropertiesReply>;

  Future<ListProviderPropertiesReply> ListProviderProperties(
      const ListProviderPropertiesRequest& request);

  Future<ListProviderPropertiesReply> ListProviderProperties(
      const Provider& provider = {});

  struct QueryProviderPropertyRequest {
    Provider provider{};
    Atom property{};
  };

  struct QueryProviderPropertyReply {
    uint16_t sequence{};
    uint8_t pending{};
    uint8_t range{};
    uint8_t immutable{};
    std::vector<int32_t> valid_values{};
  };

  using QueryProviderPropertyResponse = Response<QueryProviderPropertyReply>;

  Future<QueryProviderPropertyReply> QueryProviderProperty(
      const QueryProviderPropertyRequest& request);

  Future<QueryProviderPropertyReply> QueryProviderProperty(
      const Provider& provider = {},
      const Atom& property = {});

  struct ConfigureProviderPropertyRequest {
    Provider provider{};
    Atom property{};
    uint8_t pending{};
    uint8_t range{};
    std::vector<int32_t> values{};
  };

  using ConfigureProviderPropertyResponse = Response<void>;

  Future<void> ConfigureProviderProperty(
      const ConfigureProviderPropertyRequest& request);

  Future<void> ConfigureProviderProperty(
      const Provider& provider = {},
      const Atom& property = {},
      const uint8_t& pending = {},
      const uint8_t& range = {},
      const std::vector<int32_t>& values = {});

  struct ChangeProviderPropertyRequest {
    Provider provider{};
    Atom property{};
    Atom type{};
    uint8_t format{};
    uint8_t mode{};
    uint32_t num_items{};
    scoped_refptr<base::RefCountedMemory> data{};
  };

  using ChangeProviderPropertyResponse = Response<void>;

  Future<void> ChangeProviderProperty(
      const ChangeProviderPropertyRequest& request);

  Future<void> ChangeProviderProperty(
      const Provider& provider = {},
      const Atom& property = {},
      const Atom& type = {},
      const uint8_t& format = {},
      const uint8_t& mode = {},
      const uint32_t& num_items = {},
      const scoped_refptr<base::RefCountedMemory>& data = {});

  struct DeleteProviderPropertyRequest {
    Provider provider{};
    Atom property{};
  };

  using DeleteProviderPropertyResponse = Response<void>;

  Future<void> DeleteProviderProperty(
      const DeleteProviderPropertyRequest& request);

  Future<void> DeleteProviderProperty(const Provider& provider = {},
                                      const Atom& property = {});

  struct GetProviderPropertyRequest {
    Provider provider{};
    Atom property{};
    Atom type{};
    uint32_t long_offset{};
    uint32_t long_length{};
    uint8_t c_delete{};
    uint8_t pending{};
  };

  struct GetProviderPropertyReply {
    uint8_t format{};
    uint16_t sequence{};
    Atom type{};
    uint32_t bytes_after{};
    uint32_t num_items{};
    scoped_refptr<base::RefCountedMemory> data{};
  };

  using GetProviderPropertyResponse = Response<GetProviderPropertyReply>;

  Future<GetProviderPropertyReply> GetProviderProperty(
      const GetProviderPropertyRequest& request);

  Future<GetProviderPropertyReply> GetProviderProperty(
      const Provider& provider = {},
      const Atom& property = {},
      const Atom& type = {},
      const uint32_t& long_offset = {},
      const uint32_t& long_length = {},
      const uint8_t& c_delete = {},
      const uint8_t& pending = {});

  struct GetMonitorsRequest {
    Window window{};
    uint8_t get_active{};
  };

  struct GetMonitorsReply {
    uint16_t sequence{};
    Time timestamp{};
    uint32_t nOutputs{};
    std::vector<MonitorInfo> monitors{};
  };

  using GetMonitorsResponse = Response<GetMonitorsReply>;

  Future<GetMonitorsReply> GetMonitors(const GetMonitorsRequest& request);

  Future<GetMonitorsReply> GetMonitors(const Window& window = {},
                                       const uint8_t& get_active = {});

  struct SetMonitorRequest {
    Window window{};
    MonitorInfo monitorinfo{};
  };

  using SetMonitorResponse = Response<void>;

  Future<void> SetMonitor(const SetMonitorRequest& request);

  Future<void> SetMonitor(const Window& window = {},
                          const MonitorInfo& monitorinfo =
                              {{}, {}, {}, {}, {}, {}, {}, {}, {}, {}});

  struct DeleteMonitorRequest {
    Window window{};
    Atom name{};
  };

  using DeleteMonitorResponse = Response<void>;

  Future<void> DeleteMonitor(const DeleteMonitorRequest& request);

  Future<void> DeleteMonitor(const Window& window = {}, const Atom& name = {});

  struct CreateLeaseRequest {
    Window window{};
    Lease lid{};
    std::vector<Crtc> crtcs{};
    std::vector<Output> outputs{};
  };

  struct CreateLeaseReply {
    uint8_t nfd{};
    uint16_t sequence{};
    RefCountedFD master_fd{};
  };

  using CreateLeaseResponse = Response<CreateLeaseReply>;

  Future<CreateLeaseReply> CreateLease(const CreateLeaseRequest& request);

  Future<CreateLeaseReply> CreateLease(const Window& window = {},
                                       const Lease& lid = {},
                                       const std::vector<Crtc>& crtcs = {},
                                       const std::vector<Output>& outputs = {});

  struct FreeLeaseRequest {
    Lease lid{};
    uint8_t terminate{};
  };

  using FreeLeaseResponse = Response<void>;

  Future<void> FreeLease(const FreeLeaseRequest& request);

  Future<void> FreeLease(const Lease& lid = {}, const uint8_t& terminate = {});

 private:
  Connection* const connection_;
  x11::QueryExtensionReply info_{};
};

}  // namespace x11

inline constexpr x11::RandR::Rotation operator|(x11::RandR::Rotation l,
                                                x11::RandR::Rotation r) {
  using T = std::underlying_type_t<x11::RandR::Rotation>;
  return static_cast<x11::RandR::Rotation>(static_cast<T>(l) |
                                           static_cast<T>(r));
}

inline constexpr x11::RandR::Rotation operator&(x11::RandR::Rotation l,
                                                x11::RandR::Rotation r) {
  using T = std::underlying_type_t<x11::RandR::Rotation>;
  return static_cast<x11::RandR::Rotation>(static_cast<T>(l) &
                                           static_cast<T>(r));
}

inline constexpr x11::RandR::SetConfig operator|(x11::RandR::SetConfig l,
                                                 x11::RandR::SetConfig r) {
  using T = std::underlying_type_t<x11::RandR::SetConfig>;
  return static_cast<x11::RandR::SetConfig>(static_cast<T>(l) |
                                            static_cast<T>(r));
}

inline constexpr x11::RandR::SetConfig operator&(x11::RandR::SetConfig l,
                                                 x11::RandR::SetConfig r) {
  using T = std::underlying_type_t<x11::RandR::SetConfig>;
  return static_cast<x11::RandR::SetConfig>(static_cast<T>(l) &
                                            static_cast<T>(r));
}

inline constexpr x11::RandR::NotifyMask operator|(x11::RandR::NotifyMask l,
                                                  x11::RandR::NotifyMask r) {
  using T = std::underlying_type_t<x11::RandR::NotifyMask>;
  return static_cast<x11::RandR::NotifyMask>(static_cast<T>(l) |
                                             static_cast<T>(r));
}

inline constexpr x11::RandR::NotifyMask operator&(x11::RandR::NotifyMask l,
                                                  x11::RandR::NotifyMask r) {
  using T = std::underlying_type_t<x11::RandR::NotifyMask>;
  return static_cast<x11::RandR::NotifyMask>(static_cast<T>(l) &
                                             static_cast<T>(r));
}

inline constexpr x11::RandR::ModeFlag operator|(x11::RandR::ModeFlag l,
                                                x11::RandR::ModeFlag r) {
  using T = std::underlying_type_t<x11::RandR::ModeFlag>;
  return static_cast<x11::RandR::ModeFlag>(static_cast<T>(l) |
                                           static_cast<T>(r));
}

inline constexpr x11::RandR::ModeFlag operator&(x11::RandR::ModeFlag l,
                                                x11::RandR::ModeFlag r) {
  using T = std::underlying_type_t<x11::RandR::ModeFlag>;
  return static_cast<x11::RandR::ModeFlag>(static_cast<T>(l) &
                                           static_cast<T>(r));
}

inline constexpr x11::RandR::RandRConnection operator|(
    x11::RandR::RandRConnection l,
    x11::RandR::RandRConnection r) {
  using T = std::underlying_type_t<x11::RandR::RandRConnection>;
  return static_cast<x11::RandR::RandRConnection>(static_cast<T>(l) |
                                                  static_cast<T>(r));
}

inline constexpr x11::RandR::RandRConnection operator&(
    x11::RandR::RandRConnection l,
    x11::RandR::RandRConnection r) {
  using T = std::underlying_type_t<x11::RandR::RandRConnection>;
  return static_cast<x11::RandR::RandRConnection>(static_cast<T>(l) &
                                                  static_cast<T>(r));
}

inline constexpr x11::RandR::Transform operator|(x11::RandR::Transform l,
                                                 x11::RandR::Transform r) {
  using T = std::underlying_type_t<x11::RandR::Transform>;
  return static_cast<x11::RandR::Transform>(static_cast<T>(l) |
                                            static_cast<T>(r));
}

inline constexpr x11::RandR::Transform operator&(x11::RandR::Transform l,
                                                 x11::RandR::Transform r) {
  using T = std::underlying_type_t<x11::RandR::Transform>;
  return static_cast<x11::RandR::Transform>(static_cast<T>(l) &
                                            static_cast<T>(r));
}

inline constexpr x11::RandR::ProviderCapability operator|(
    x11::RandR::ProviderCapability l,
    x11::RandR::ProviderCapability r) {
  using T = std::underlying_type_t<x11::RandR::ProviderCapability>;
  return static_cast<x11::RandR::ProviderCapability>(static_cast<T>(l) |
                                                     static_cast<T>(r));
}

inline constexpr x11::RandR::ProviderCapability operator&(
    x11::RandR::ProviderCapability l,
    x11::RandR::ProviderCapability r) {
  using T = std::underlying_type_t<x11::RandR::ProviderCapability>;
  return static_cast<x11::RandR::ProviderCapability>(static_cast<T>(l) &
                                                     static_cast<T>(r));
}

inline constexpr x11::RandR::Notify operator|(x11::RandR::Notify l,
                                              x11::RandR::Notify r) {
  using T = std::underlying_type_t<x11::RandR::Notify>;
  return static_cast<x11::RandR::Notify>(static_cast<T>(l) | static_cast<T>(r));
}

inline constexpr x11::RandR::Notify operator&(x11::RandR::Notify l,
                                              x11::RandR::Notify r) {
  using T = std::underlying_type_t<x11::RandR::Notify>;
  return static_cast<x11::RandR::Notify>(static_cast<T>(l) & static_cast<T>(r));
}

#endif  // UI_GFX_X_GENERATED_PROTOS_RANDR_H_
