// 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_PRESENT_H_
#define UI_GFX_X_GENERATED_PROTOS_PRESENT_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 "randr.h"
#include "sync.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 "xfixes.h"
#include "xproto.h"

namespace x11 {

class Connection;

template <typename Reply>
struct Response;

template <typename Reply>
class Future;

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

  Present(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 Event : uint32_t {
    ConfigureNotify = 0,
    CompleteNotify = 1,
    IdleNotify = 2,
    RedirectNotify = 3,
  };

  enum class EventMask : int {
    NoEvent = 0,
    ConfigureNotify = 1 << 0,
    CompleteNotify = 1 << 1,
    IdleNotify = 1 << 2,
    RedirectNotify = 1 << 3,
  };

  enum class Option : int {
    None = 0,
    Async = 1 << 0,
    Copy = 1 << 1,
    UST = 1 << 2,
    Suboptimal = 1 << 3,
  };

  enum class Capability : int {
    None = 0,
    Async = 1 << 0,
    Fence = 1 << 1,
    UST = 1 << 2,
  };

  enum class CompleteKind : int {
    Pixmap = 0,
    NotifyMSC = 1,
  };

  enum class CompleteMode : int {
    Copy = 0,
    Flip = 1,
    Skip = 2,
    SuboptimalCopy = 3,
  };

  struct Notify {
    Window window{};
    uint32_t serial{};
  };

  struct GenericEvent {
    static constexpr int type_id = 6;
    static constexpr uint8_t opcode = 0;
    bool send_event{};
    uint8_t extension{};
    uint16_t sequence{};
    uint32_t length{};
    uint16_t evtype{};
    Event event{};

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

  struct ConfigureNotifyEvent {
    static constexpr int type_id = 7;
    static constexpr uint8_t opcode = 0;
    bool send_event{};
    uint16_t sequence{};
    Event event{};
    Window window{};
    int16_t x{};
    int16_t y{};
    uint16_t width{};
    uint16_t height{};
    int16_t off_x{};
    int16_t off_y{};
    uint16_t pixmap_width{};
    uint16_t pixmap_height{};
    uint32_t pixmap_flags{};

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

  struct CompleteNotifyEvent {
    static constexpr int type_id = 8;
    static constexpr uint8_t opcode = 1;
    bool send_event{};
    uint16_t sequence{};
    CompleteKind kind{};
    CompleteMode mode{};
    Event event{};
    Window window{};
    uint32_t serial{};
    uint64_t ust{};
    uint64_t msc{};

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

  struct IdleNotifyEvent {
    static constexpr int type_id = 9;
    static constexpr uint8_t opcode = 2;
    bool send_event{};
    uint16_t sequence{};
    Event event{};
    Window window{};
    uint32_t serial{};
    Pixmap pixmap{};
    Sync::Fence idle_fence{};

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

  struct RedirectNotifyEvent {
    static constexpr int type_id = 10;
    static constexpr uint8_t opcode = 3;
    bool send_event{};
    uint16_t sequence{};
    uint8_t update_window{};
    Event event{};
    Window event_window{};
    Window window{};
    Pixmap pixmap{};
    uint32_t serial{};
    XFixes::Region valid_region{};
    XFixes::Region update_region{};
    Rectangle valid_rect{};
    Rectangle update_rect{};
    int16_t x_off{};
    int16_t y_off{};
    RandR::Crtc target_crtc{};
    Sync::Fence wait_fence{};
    Sync::Fence idle_fence{};
    uint32_t options{};
    uint64_t target_msc{};
    uint64_t divisor{};
    uint64_t remainder{};
    std::vector<Notify> notifies{};

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

  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 PresentPixmapRequest {
    Window window{};
    Pixmap pixmap{};
    uint32_t serial{};
    XFixes::Region valid{};
    XFixes::Region update{};
    int16_t x_off{};
    int16_t y_off{};
    RandR::Crtc target_crtc{};
    Sync::Fence wait_fence{};
    Sync::Fence idle_fence{};
    uint32_t options{};
    uint64_t target_msc{};
    uint64_t divisor{};
    uint64_t remainder{};
    std::vector<Notify> notifies{};
  };

  using PresentPixmapResponse = Response<void>;

  Future<void> PresentPixmap(const PresentPixmapRequest& request);

  Future<void> PresentPixmap(const Window& window = {},
                             const Pixmap& pixmap = {},
                             const uint32_t& serial = {},
                             const XFixes::Region& valid = {},
                             const XFixes::Region& update = {},
                             const int16_t& x_off = {},
                             const int16_t& y_off = {},
                             const RandR::Crtc& target_crtc = {},
                             const Sync::Fence& wait_fence = {},
                             const Sync::Fence& idle_fence = {},
                             const uint32_t& options = {},
                             const uint64_t& target_msc = {},
                             const uint64_t& divisor = {},
                             const uint64_t& remainder = {},
                             const std::vector<Notify>& notifies = {});

  struct NotifyMSCRequest {
    Window window{};
    uint32_t serial{};
    uint64_t target_msc{};
    uint64_t divisor{};
    uint64_t remainder{};
  };

  using NotifyMSCResponse = Response<void>;

  Future<void> NotifyMSC(const NotifyMSCRequest& request);

  Future<void> NotifyMSC(const Window& window = {},
                         const uint32_t& serial = {},
                         const uint64_t& target_msc = {},
                         const uint64_t& divisor = {},
                         const uint64_t& remainder = {});

  struct SelectInputRequest {
    Event eid{};
    Window window{};
    EventMask event_mask{};
  };

  using SelectInputResponse = Response<void>;

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

  Future<void> SelectInput(const Event& eid = {},
                           const Window& window = {},
                           const EventMask& event_mask = {});

  struct QueryCapabilitiesRequest {
    uint32_t target{};
  };

  struct QueryCapabilitiesReply {
    uint16_t sequence{};
    uint32_t capabilities{};
  };

  using QueryCapabilitiesResponse = Response<QueryCapabilitiesReply>;

  Future<QueryCapabilitiesReply> QueryCapabilities(
      const QueryCapabilitiesRequest& request);

  Future<QueryCapabilitiesReply> QueryCapabilities(const uint32_t& target = {});

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

}  // namespace x11

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

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

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

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

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

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

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

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

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

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

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

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

#endif  // UI_GFX_X_GENERATED_PROTOS_PRESENT_H_
