// 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

#include "xf86vidmode.h"

#include <xcb/xcb.h>
#include <xcb/xcbext.h>

#include "base/logging.h"
#include "base/posix/eintr_wrapper.h"
#include "ui/gfx/x/xproto_internal.h"

namespace x11 {

XF86VidMode::XF86VidMode(Connection* connection,
                         const x11::QueryExtensionReply& info)
    : connection_(connection), info_(info) {}

std::string XF86VidMode::BadClockError::ToString() const {
  std::stringstream ss_;
  ss_ << "XF86VidMode::BadClockError{";
  ss_ << ".sequence = " << static_cast<uint64_t>(sequence);
  ss_ << "}";
  return ss_.str();
}

template <>
void ReadError<XF86VidMode::BadClockError>(XF86VidMode::BadClockError* error_,
                                           ReadBuffer* buffer) {
  auto& buf = *buffer;

  auto& sequence = (*error_).sequence;

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // error_code
  uint8_t error_code;
  Read(&error_code, &buf);

  // sequence
  Read(&sequence, &buf);

  DCHECK_LE(buf.offset, 32ul);
}
std::string XF86VidMode::BadHTimingsError::ToString() const {
  std::stringstream ss_;
  ss_ << "XF86VidMode::BadHTimingsError{";
  ss_ << ".sequence = " << static_cast<uint64_t>(sequence);
  ss_ << "}";
  return ss_.str();
}

template <>
void ReadError<XF86VidMode::BadHTimingsError>(
    XF86VidMode::BadHTimingsError* error_,
    ReadBuffer* buffer) {
  auto& buf = *buffer;

  auto& sequence = (*error_).sequence;

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // error_code
  uint8_t error_code;
  Read(&error_code, &buf);

  // sequence
  Read(&sequence, &buf);

  DCHECK_LE(buf.offset, 32ul);
}
std::string XF86VidMode::BadVTimingsError::ToString() const {
  std::stringstream ss_;
  ss_ << "XF86VidMode::BadVTimingsError{";
  ss_ << ".sequence = " << static_cast<uint64_t>(sequence);
  ss_ << "}";
  return ss_.str();
}

template <>
void ReadError<XF86VidMode::BadVTimingsError>(
    XF86VidMode::BadVTimingsError* error_,
    ReadBuffer* buffer) {
  auto& buf = *buffer;

  auto& sequence = (*error_).sequence;

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // error_code
  uint8_t error_code;
  Read(&error_code, &buf);

  // sequence
  Read(&sequence, &buf);

  DCHECK_LE(buf.offset, 32ul);
}
std::string XF86VidMode::ModeUnsuitableError::ToString() const {
  std::stringstream ss_;
  ss_ << "XF86VidMode::ModeUnsuitableError{";
  ss_ << ".sequence = " << static_cast<uint64_t>(sequence);
  ss_ << "}";
  return ss_.str();
}

template <>
void ReadError<XF86VidMode::ModeUnsuitableError>(
    XF86VidMode::ModeUnsuitableError* error_,
    ReadBuffer* buffer) {
  auto& buf = *buffer;

  auto& sequence = (*error_).sequence;

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // error_code
  uint8_t error_code;
  Read(&error_code, &buf);

  // sequence
  Read(&sequence, &buf);

  DCHECK_LE(buf.offset, 32ul);
}
std::string XF86VidMode::ExtensionDisabledError::ToString() const {
  std::stringstream ss_;
  ss_ << "XF86VidMode::ExtensionDisabledError{";
  ss_ << ".sequence = " << static_cast<uint64_t>(sequence);
  ss_ << "}";
  return ss_.str();
}

template <>
void ReadError<XF86VidMode::ExtensionDisabledError>(
    XF86VidMode::ExtensionDisabledError* error_,
    ReadBuffer* buffer) {
  auto& buf = *buffer;

  auto& sequence = (*error_).sequence;

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // error_code
  uint8_t error_code;
  Read(&error_code, &buf);

  // sequence
  Read(&sequence, &buf);

  DCHECK_LE(buf.offset, 32ul);
}
std::string XF86VidMode::ClientNotLocalError::ToString() const {
  std::stringstream ss_;
  ss_ << "XF86VidMode::ClientNotLocalError{";
  ss_ << ".sequence = " << static_cast<uint64_t>(sequence);
  ss_ << "}";
  return ss_.str();
}

template <>
void ReadError<XF86VidMode::ClientNotLocalError>(
    XF86VidMode::ClientNotLocalError* error_,
    ReadBuffer* buffer) {
  auto& buf = *buffer;

  auto& sequence = (*error_).sequence;

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // error_code
  uint8_t error_code;
  Read(&error_code, &buf);

  // sequence
  Read(&sequence, &buf);

  DCHECK_LE(buf.offset, 32ul);
}
std::string XF86VidMode::ZoomLockedError::ToString() const {
  std::stringstream ss_;
  ss_ << "XF86VidMode::ZoomLockedError{";
  ss_ << ".sequence = " << static_cast<uint64_t>(sequence);
  ss_ << "}";
  return ss_.str();
}

template <>
void ReadError<XF86VidMode::ZoomLockedError>(
    XF86VidMode::ZoomLockedError* error_,
    ReadBuffer* buffer) {
  auto& buf = *buffer;

  auto& sequence = (*error_).sequence;

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // error_code
  uint8_t error_code;
  Read(&error_code, &buf);

  // sequence
  Read(&sequence, &buf);

  DCHECK_LE(buf.offset, 32ul);
}
Future<XF86VidMode::QueryVersionReply> XF86VidMode::QueryVersion(
    const XF86VidMode::QueryVersionRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 0;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  Align(&buf, 4);

  return connection_->SendRequest<XF86VidMode::QueryVersionReply>(
      &buf, "XF86VidMode::QueryVersion", false);
}

Future<XF86VidMode::QueryVersionReply> XF86VidMode::QueryVersion() {
  return XF86VidMode::QueryVersion(XF86VidMode::QueryVersionRequest{});
}

template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<XF86VidMode::QueryVersionReply> detail::ReadReply<
    XF86VidMode::QueryVersionReply>(ReadBuffer* buffer) {
  auto& buf = *buffer;
  auto reply = std::make_unique<XF86VidMode::QueryVersionReply>();

  auto& sequence = (*reply).sequence;
  auto& major_version = (*reply).major_version;
  auto& minor_version = (*reply).minor_version;

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // pad0
  Pad(&buf, 1);

  // sequence
  Read(&sequence, &buf);

  // length
  uint32_t length;
  Read(&length, &buf);

  // major_version
  Read(&major_version, &buf);

  // minor_version
  Read(&minor_version, &buf);

  Align(&buf, 4);
  DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);

  return reply;
}

Future<XF86VidMode::GetModeLineReply> XF86VidMode::GetModeLine(
    const XF86VidMode::GetModeLineRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 1;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // pad0
  Pad(&buf, 2);

  Align(&buf, 4);

  return connection_->SendRequest<XF86VidMode::GetModeLineReply>(
      &buf, "XF86VidMode::GetModeLine", false);
}

Future<XF86VidMode::GetModeLineReply> XF86VidMode::GetModeLine(
    const uint16_t& screen) {
  return XF86VidMode::GetModeLine(XF86VidMode::GetModeLineRequest{screen});
}

template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<XF86VidMode::GetModeLineReply> detail::ReadReply<
    XF86VidMode::GetModeLineReply>(ReadBuffer* buffer) {
  auto& buf = *buffer;
  auto reply = std::make_unique<XF86VidMode::GetModeLineReply>();

  auto& sequence = (*reply).sequence;
  auto& dotclock = (*reply).dotclock;
  auto& hdisplay = (*reply).hdisplay;
  auto& hsyncstart = (*reply).hsyncstart;
  auto& hsyncend = (*reply).hsyncend;
  auto& htotal = (*reply).htotal;
  auto& hskew = (*reply).hskew;
  auto& vdisplay = (*reply).vdisplay;
  auto& vsyncstart = (*reply).vsyncstart;
  auto& vsyncend = (*reply).vsyncend;
  auto& vtotal = (*reply).vtotal;
  auto& flags = (*reply).flags;
  uint32_t privsize{};
  auto& c_private = (*reply).c_private;
  size_t c_private_len = c_private.size();

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // pad0
  Pad(&buf, 1);

  // sequence
  Read(&sequence, &buf);

  // length
  uint32_t length;
  Read(&length, &buf);

  // dotclock
  Read(&dotclock, &buf);

  // hdisplay
  Read(&hdisplay, &buf);

  // hsyncstart
  Read(&hsyncstart, &buf);

  // hsyncend
  Read(&hsyncend, &buf);

  // htotal
  Read(&htotal, &buf);

  // hskew
  Read(&hskew, &buf);

  // vdisplay
  Read(&vdisplay, &buf);

  // vsyncstart
  Read(&vsyncstart, &buf);

  // vsyncend
  Read(&vsyncend, &buf);

  // vtotal
  Read(&vtotal, &buf);

  // pad1
  Pad(&buf, 2);

  // flags
  uint32_t tmp0;
  Read(&tmp0, &buf);
  flags = static_cast<XF86VidMode::ModeFlag>(tmp0);

  // pad2
  Pad(&buf, 12);

  // privsize
  Read(&privsize, &buf);

  // c_private
  c_private.resize(privsize);
  for (auto& c_private_elem : c_private) {
    // c_private_elem
    Read(&c_private_elem, &buf);
  }

  Align(&buf, 4);
  DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);

  return reply;
}

Future<void> XF86VidMode::ModModeLine(
    const XF86VidMode::ModModeLineRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;
  auto& hdisplay = request.hdisplay;
  auto& hsyncstart = request.hsyncstart;
  auto& hsyncend = request.hsyncend;
  auto& htotal = request.htotal;
  auto& hskew = request.hskew;
  auto& vdisplay = request.vdisplay;
  auto& vsyncstart = request.vsyncstart;
  auto& vsyncend = request.vsyncend;
  auto& vtotal = request.vtotal;
  auto& flags = request.flags;
  uint32_t privsize{};
  auto& c_private = request.c_private;
  size_t c_private_len = c_private.size();

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 2;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // hdisplay
  buf.Write(&hdisplay);

  // hsyncstart
  buf.Write(&hsyncstart);

  // hsyncend
  buf.Write(&hsyncend);

  // htotal
  buf.Write(&htotal);

  // hskew
  buf.Write(&hskew);

  // vdisplay
  buf.Write(&vdisplay);

  // vsyncstart
  buf.Write(&vsyncstart);

  // vsyncend
  buf.Write(&vsyncend);

  // vtotal
  buf.Write(&vtotal);

  // pad0
  Pad(&buf, 2);

  // flags
  uint32_t tmp1;
  tmp1 = static_cast<uint32_t>(flags);
  buf.Write(&tmp1);

  // pad1
  Pad(&buf, 12);

  // privsize
  privsize = c_private.size();
  buf.Write(&privsize);

  // c_private
  DCHECK_EQ(static_cast<size_t>(privsize), c_private.size());
  for (auto& c_private_elem : c_private) {
    // c_private_elem
    buf.Write(&c_private_elem);
  }

  Align(&buf, 4);

  return connection_->SendRequest<void>(&buf, "XF86VidMode::ModModeLine",
                                        false);
}

Future<void> XF86VidMode::ModModeLine(const uint32_t& screen,
                                      const uint16_t& hdisplay,
                                      const uint16_t& hsyncstart,
                                      const uint16_t& hsyncend,
                                      const uint16_t& htotal,
                                      const uint16_t& hskew,
                                      const uint16_t& vdisplay,
                                      const uint16_t& vsyncstart,
                                      const uint16_t& vsyncend,
                                      const uint16_t& vtotal,
                                      const ModeFlag& flags,
                                      const std::vector<uint8_t>& c_private) {
  return XF86VidMode::ModModeLine(XF86VidMode::ModModeLineRequest{
      screen, hdisplay, hsyncstart, hsyncend, htotal, hskew, vdisplay,
      vsyncstart, vsyncend, vtotal, flags, c_private});
}

Future<void> XF86VidMode::SwitchMode(
    const XF86VidMode::SwitchModeRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;
  auto& zoom = request.zoom;

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 3;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // zoom
  buf.Write(&zoom);

  Align(&buf, 4);

  return connection_->SendRequest<void>(&buf, "XF86VidMode::SwitchMode", false);
}

Future<void> XF86VidMode::SwitchMode(const uint16_t& screen,
                                     const uint16_t& zoom) {
  return XF86VidMode::SwitchMode(XF86VidMode::SwitchModeRequest{screen, zoom});
}

Future<XF86VidMode::GetMonitorReply> XF86VidMode::GetMonitor(
    const XF86VidMode::GetMonitorRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 4;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // pad0
  Pad(&buf, 2);

  Align(&buf, 4);

  return connection_->SendRequest<XF86VidMode::GetMonitorReply>(
      &buf, "XF86VidMode::GetMonitor", false);
}

Future<XF86VidMode::GetMonitorReply> XF86VidMode::GetMonitor(
    const uint16_t& screen) {
  return XF86VidMode::GetMonitor(XF86VidMode::GetMonitorRequest{screen});
}

template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<XF86VidMode::GetMonitorReply> detail::ReadReply<
    XF86VidMode::GetMonitorReply>(ReadBuffer* buffer) {
  auto& buf = *buffer;
  auto reply = std::make_unique<XF86VidMode::GetMonitorReply>();

  auto& sequence = (*reply).sequence;
  uint8_t vendor_length{};
  uint8_t model_length{};
  uint8_t num_hsync{};
  uint8_t num_vsync{};
  auto& hsync = (*reply).hsync;
  size_t hsync_len = hsync.size();
  auto& vsync = (*reply).vsync;
  size_t vsync_len = vsync.size();
  auto& vendor = (*reply).vendor;
  size_t vendor_len = vendor.size();
  auto& alignment_pad = (*reply).alignment_pad;
  size_t alignment_pad_len = alignment_pad ? alignment_pad->size() : 0;
  auto& model = (*reply).model;
  size_t model_len = model.size();

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // pad0
  Pad(&buf, 1);

  // sequence
  Read(&sequence, &buf);

  // length
  uint32_t length;
  Read(&length, &buf);

  // vendor_length
  Read(&vendor_length, &buf);

  // model_length
  Read(&model_length, &buf);

  // num_hsync
  Read(&num_hsync, &buf);

  // num_vsync
  Read(&num_vsync, &buf);

  // pad1
  Pad(&buf, 20);

  // hsync
  hsync.resize(num_hsync);
  for (auto& hsync_elem : hsync) {
    // hsync_elem
    Read(&hsync_elem, &buf);
  }

  // vsync
  vsync.resize(num_vsync);
  for (auto& vsync_elem : vsync) {
    // vsync_elem
    Read(&vsync_elem, &buf);
  }

  // vendor
  vendor.resize(vendor_length);
  for (auto& vendor_elem : vendor) {
    // vendor_elem
    Read(&vendor_elem, &buf);
  }

  // alignment_pad
  alignment_pad = buffer->ReadAndAdvance(
      (BitAnd((vendor_length) + (3), BitNot(3))) - (vendor_length));

  // model
  model.resize(model_length);
  for (auto& model_elem : model) {
    // model_elem
    Read(&model_elem, &buf);
  }

  Align(&buf, 4);
  DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);

  return reply;
}

Future<void> XF86VidMode::LockModeSwitch(
    const XF86VidMode::LockModeSwitchRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;
  auto& lock = request.lock;

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 5;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // lock
  buf.Write(&lock);

  Align(&buf, 4);

  return connection_->SendRequest<void>(&buf, "XF86VidMode::LockModeSwitch",
                                        false);
}

Future<void> XF86VidMode::LockModeSwitch(const uint16_t& screen,
                                         const uint16_t& lock) {
  return XF86VidMode::LockModeSwitch(
      XF86VidMode::LockModeSwitchRequest{screen, lock});
}

Future<XF86VidMode::GetAllModeLinesReply> XF86VidMode::GetAllModeLines(
    const XF86VidMode::GetAllModeLinesRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 6;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // pad0
  Pad(&buf, 2);

  Align(&buf, 4);

  return connection_->SendRequest<XF86VidMode::GetAllModeLinesReply>(
      &buf, "XF86VidMode::GetAllModeLines", false);
}

Future<XF86VidMode::GetAllModeLinesReply> XF86VidMode::GetAllModeLines(
    const uint16_t& screen) {
  return XF86VidMode::GetAllModeLines(
      XF86VidMode::GetAllModeLinesRequest{screen});
}

template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<XF86VidMode::GetAllModeLinesReply> detail::ReadReply<
    XF86VidMode::GetAllModeLinesReply>(ReadBuffer* buffer) {
  auto& buf = *buffer;
  auto reply = std::make_unique<XF86VidMode::GetAllModeLinesReply>();

  auto& sequence = (*reply).sequence;
  uint32_t modecount{};
  auto& modeinfo = (*reply).modeinfo;
  size_t modeinfo_len = modeinfo.size();

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // pad0
  Pad(&buf, 1);

  // sequence
  Read(&sequence, &buf);

  // length
  uint32_t length;
  Read(&length, &buf);

  // modecount
  Read(&modecount, &buf);

  // pad1
  Pad(&buf, 20);

  // modeinfo
  modeinfo.resize(modecount);
  for (auto& modeinfo_elem : modeinfo) {
    // modeinfo_elem
    {
      auto& dotclock = modeinfo_elem.dotclock;
      auto& hdisplay = modeinfo_elem.hdisplay;
      auto& hsyncstart = modeinfo_elem.hsyncstart;
      auto& hsyncend = modeinfo_elem.hsyncend;
      auto& htotal = modeinfo_elem.htotal;
      auto& hskew = modeinfo_elem.hskew;
      auto& vdisplay = modeinfo_elem.vdisplay;
      auto& vsyncstart = modeinfo_elem.vsyncstart;
      auto& vsyncend = modeinfo_elem.vsyncend;
      auto& vtotal = modeinfo_elem.vtotal;
      auto& flags = modeinfo_elem.flags;
      auto& privsize = modeinfo_elem.privsize;

      // dotclock
      Read(&dotclock, &buf);

      // hdisplay
      Read(&hdisplay, &buf);

      // hsyncstart
      Read(&hsyncstart, &buf);

      // hsyncend
      Read(&hsyncend, &buf);

      // htotal
      Read(&htotal, &buf);

      // hskew
      Read(&hskew, &buf);

      // vdisplay
      Read(&vdisplay, &buf);

      // vsyncstart
      Read(&vsyncstart, &buf);

      // vsyncend
      Read(&vsyncend, &buf);

      // vtotal
      Read(&vtotal, &buf);

      // pad0
      Pad(&buf, 4);

      // flags
      uint32_t tmp2;
      Read(&tmp2, &buf);
      flags = static_cast<XF86VidMode::ModeFlag>(tmp2);

      // pad1
      Pad(&buf, 12);

      // privsize
      Read(&privsize, &buf);
    }
  }

  Align(&buf, 4);
  DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);

  return reply;
}

Future<void> XF86VidMode::AddModeLine(
    const XF86VidMode::AddModeLineRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;
  auto& dotclock = request.dotclock;
  auto& hdisplay = request.hdisplay;
  auto& hsyncstart = request.hsyncstart;
  auto& hsyncend = request.hsyncend;
  auto& htotal = request.htotal;
  auto& hskew = request.hskew;
  auto& vdisplay = request.vdisplay;
  auto& vsyncstart = request.vsyncstart;
  auto& vsyncend = request.vsyncend;
  auto& vtotal = request.vtotal;
  auto& flags = request.flags;
  uint32_t privsize{};
  auto& after_dotclock = request.after_dotclock;
  auto& after_hdisplay = request.after_hdisplay;
  auto& after_hsyncstart = request.after_hsyncstart;
  auto& after_hsyncend = request.after_hsyncend;
  auto& after_htotal = request.after_htotal;
  auto& after_hskew = request.after_hskew;
  auto& after_vdisplay = request.after_vdisplay;
  auto& after_vsyncstart = request.after_vsyncstart;
  auto& after_vsyncend = request.after_vsyncend;
  auto& after_vtotal = request.after_vtotal;
  auto& after_flags = request.after_flags;
  auto& c_private = request.c_private;
  size_t c_private_len = c_private.size();

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 7;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // dotclock
  buf.Write(&dotclock);

  // hdisplay
  buf.Write(&hdisplay);

  // hsyncstart
  buf.Write(&hsyncstart);

  // hsyncend
  buf.Write(&hsyncend);

  // htotal
  buf.Write(&htotal);

  // hskew
  buf.Write(&hskew);

  // vdisplay
  buf.Write(&vdisplay);

  // vsyncstart
  buf.Write(&vsyncstart);

  // vsyncend
  buf.Write(&vsyncend);

  // vtotal
  buf.Write(&vtotal);

  // pad0
  Pad(&buf, 2);

  // flags
  uint32_t tmp3;
  tmp3 = static_cast<uint32_t>(flags);
  buf.Write(&tmp3);

  // pad1
  Pad(&buf, 12);

  // privsize
  privsize = c_private.size();
  buf.Write(&privsize);

  // after_dotclock
  buf.Write(&after_dotclock);

  // after_hdisplay
  buf.Write(&after_hdisplay);

  // after_hsyncstart
  buf.Write(&after_hsyncstart);

  // after_hsyncend
  buf.Write(&after_hsyncend);

  // after_htotal
  buf.Write(&after_htotal);

  // after_hskew
  buf.Write(&after_hskew);

  // after_vdisplay
  buf.Write(&after_vdisplay);

  // after_vsyncstart
  buf.Write(&after_vsyncstart);

  // after_vsyncend
  buf.Write(&after_vsyncend);

  // after_vtotal
  buf.Write(&after_vtotal);

  // pad2
  Pad(&buf, 2);

  // after_flags
  uint32_t tmp4;
  tmp4 = static_cast<uint32_t>(after_flags);
  buf.Write(&tmp4);

  // pad3
  Pad(&buf, 12);

  // c_private
  DCHECK_EQ(static_cast<size_t>(privsize), c_private.size());
  for (auto& c_private_elem : c_private) {
    // c_private_elem
    buf.Write(&c_private_elem);
  }

  Align(&buf, 4);

  return connection_->SendRequest<void>(&buf, "XF86VidMode::AddModeLine",
                                        false);
}

Future<void> XF86VidMode::AddModeLine(const uint32_t& screen,
                                      const DotClock& dotclock,
                                      const uint16_t& hdisplay,
                                      const uint16_t& hsyncstart,
                                      const uint16_t& hsyncend,
                                      const uint16_t& htotal,
                                      const uint16_t& hskew,
                                      const uint16_t& vdisplay,
                                      const uint16_t& vsyncstart,
                                      const uint16_t& vsyncend,
                                      const uint16_t& vtotal,
                                      const ModeFlag& flags,
                                      const DotClock& after_dotclock,
                                      const uint16_t& after_hdisplay,
                                      const uint16_t& after_hsyncstart,
                                      const uint16_t& after_hsyncend,
                                      const uint16_t& after_htotal,
                                      const uint16_t& after_hskew,
                                      const uint16_t& after_vdisplay,
                                      const uint16_t& after_vsyncstart,
                                      const uint16_t& after_vsyncend,
                                      const uint16_t& after_vtotal,
                                      const ModeFlag& after_flags,
                                      const std::vector<uint8_t>& c_private) {
  return XF86VidMode::AddModeLine(XF86VidMode::AddModeLineRequest{
      screen,         dotclock,         hdisplay,
      hsyncstart,     hsyncend,         htotal,
      hskew,          vdisplay,         vsyncstart,
      vsyncend,       vtotal,           flags,
      after_dotclock, after_hdisplay,   after_hsyncstart,
      after_hsyncend, after_htotal,     after_hskew,
      after_vdisplay, after_vsyncstart, after_vsyncend,
      after_vtotal,   after_flags,      c_private});
}

Future<void> XF86VidMode::DeleteModeLine(
    const XF86VidMode::DeleteModeLineRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;
  auto& dotclock = request.dotclock;
  auto& hdisplay = request.hdisplay;
  auto& hsyncstart = request.hsyncstart;
  auto& hsyncend = request.hsyncend;
  auto& htotal = request.htotal;
  auto& hskew = request.hskew;
  auto& vdisplay = request.vdisplay;
  auto& vsyncstart = request.vsyncstart;
  auto& vsyncend = request.vsyncend;
  auto& vtotal = request.vtotal;
  auto& flags = request.flags;
  uint32_t privsize{};
  auto& c_private = request.c_private;
  size_t c_private_len = c_private.size();

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 8;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // dotclock
  buf.Write(&dotclock);

  // hdisplay
  buf.Write(&hdisplay);

  // hsyncstart
  buf.Write(&hsyncstart);

  // hsyncend
  buf.Write(&hsyncend);

  // htotal
  buf.Write(&htotal);

  // hskew
  buf.Write(&hskew);

  // vdisplay
  buf.Write(&vdisplay);

  // vsyncstart
  buf.Write(&vsyncstart);

  // vsyncend
  buf.Write(&vsyncend);

  // vtotal
  buf.Write(&vtotal);

  // pad0
  Pad(&buf, 2);

  // flags
  uint32_t tmp5;
  tmp5 = static_cast<uint32_t>(flags);
  buf.Write(&tmp5);

  // pad1
  Pad(&buf, 12);

  // privsize
  privsize = c_private.size();
  buf.Write(&privsize);

  // c_private
  DCHECK_EQ(static_cast<size_t>(privsize), c_private.size());
  for (auto& c_private_elem : c_private) {
    // c_private_elem
    buf.Write(&c_private_elem);
  }

  Align(&buf, 4);

  return connection_->SendRequest<void>(&buf, "XF86VidMode::DeleteModeLine",
                                        false);
}

Future<void> XF86VidMode::DeleteModeLine(
    const uint32_t& screen,
    const DotClock& dotclock,
    const uint16_t& hdisplay,
    const uint16_t& hsyncstart,
    const uint16_t& hsyncend,
    const uint16_t& htotal,
    const uint16_t& hskew,
    const uint16_t& vdisplay,
    const uint16_t& vsyncstart,
    const uint16_t& vsyncend,
    const uint16_t& vtotal,
    const ModeFlag& flags,
    const std::vector<uint8_t>& c_private) {
  return XF86VidMode::DeleteModeLine(XF86VidMode::DeleteModeLineRequest{
      screen, dotclock, hdisplay, hsyncstart, hsyncend, htotal, hskew, vdisplay,
      vsyncstart, vsyncend, vtotal, flags, c_private});
}

Future<XF86VidMode::ValidateModeLineReply> XF86VidMode::ValidateModeLine(
    const XF86VidMode::ValidateModeLineRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;
  auto& dotclock = request.dotclock;
  auto& hdisplay = request.hdisplay;
  auto& hsyncstart = request.hsyncstart;
  auto& hsyncend = request.hsyncend;
  auto& htotal = request.htotal;
  auto& hskew = request.hskew;
  auto& vdisplay = request.vdisplay;
  auto& vsyncstart = request.vsyncstart;
  auto& vsyncend = request.vsyncend;
  auto& vtotal = request.vtotal;
  auto& flags = request.flags;
  uint32_t privsize{};
  auto& c_private = request.c_private;
  size_t c_private_len = c_private.size();

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 9;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // dotclock
  buf.Write(&dotclock);

  // hdisplay
  buf.Write(&hdisplay);

  // hsyncstart
  buf.Write(&hsyncstart);

  // hsyncend
  buf.Write(&hsyncend);

  // htotal
  buf.Write(&htotal);

  // hskew
  buf.Write(&hskew);

  // vdisplay
  buf.Write(&vdisplay);

  // vsyncstart
  buf.Write(&vsyncstart);

  // vsyncend
  buf.Write(&vsyncend);

  // vtotal
  buf.Write(&vtotal);

  // pad0
  Pad(&buf, 2);

  // flags
  uint32_t tmp6;
  tmp6 = static_cast<uint32_t>(flags);
  buf.Write(&tmp6);

  // pad1
  Pad(&buf, 12);

  // privsize
  privsize = c_private.size();
  buf.Write(&privsize);

  // c_private
  DCHECK_EQ(static_cast<size_t>(privsize), c_private.size());
  for (auto& c_private_elem : c_private) {
    // c_private_elem
    buf.Write(&c_private_elem);
  }

  Align(&buf, 4);

  return connection_->SendRequest<XF86VidMode::ValidateModeLineReply>(
      &buf, "XF86VidMode::ValidateModeLine", false);
}

Future<XF86VidMode::ValidateModeLineReply> XF86VidMode::ValidateModeLine(
    const uint32_t& screen,
    const DotClock& dotclock,
    const uint16_t& hdisplay,
    const uint16_t& hsyncstart,
    const uint16_t& hsyncend,
    const uint16_t& htotal,
    const uint16_t& hskew,
    const uint16_t& vdisplay,
    const uint16_t& vsyncstart,
    const uint16_t& vsyncend,
    const uint16_t& vtotal,
    const ModeFlag& flags,
    const std::vector<uint8_t>& c_private) {
  return XF86VidMode::ValidateModeLine(XF86VidMode::ValidateModeLineRequest{
      screen, dotclock, hdisplay, hsyncstart, hsyncend, htotal, hskew, vdisplay,
      vsyncstart, vsyncend, vtotal, flags, c_private});
}

template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<XF86VidMode::ValidateModeLineReply> detail::ReadReply<
    XF86VidMode::ValidateModeLineReply>(ReadBuffer* buffer) {
  auto& buf = *buffer;
  auto reply = std::make_unique<XF86VidMode::ValidateModeLineReply>();

  auto& sequence = (*reply).sequence;
  auto& status = (*reply).status;

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // pad0
  Pad(&buf, 1);

  // sequence
  Read(&sequence, &buf);

  // length
  uint32_t length;
  Read(&length, &buf);

  // status
  Read(&status, &buf);

  // pad1
  Pad(&buf, 20);

  Align(&buf, 4);
  DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);

  return reply;
}

Future<void> XF86VidMode::SwitchToMode(
    const XF86VidMode::SwitchToModeRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;
  auto& dotclock = request.dotclock;
  auto& hdisplay = request.hdisplay;
  auto& hsyncstart = request.hsyncstart;
  auto& hsyncend = request.hsyncend;
  auto& htotal = request.htotal;
  auto& hskew = request.hskew;
  auto& vdisplay = request.vdisplay;
  auto& vsyncstart = request.vsyncstart;
  auto& vsyncend = request.vsyncend;
  auto& vtotal = request.vtotal;
  auto& flags = request.flags;
  uint32_t privsize{};
  auto& c_private = request.c_private;
  size_t c_private_len = c_private.size();

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 10;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // dotclock
  buf.Write(&dotclock);

  // hdisplay
  buf.Write(&hdisplay);

  // hsyncstart
  buf.Write(&hsyncstart);

  // hsyncend
  buf.Write(&hsyncend);

  // htotal
  buf.Write(&htotal);

  // hskew
  buf.Write(&hskew);

  // vdisplay
  buf.Write(&vdisplay);

  // vsyncstart
  buf.Write(&vsyncstart);

  // vsyncend
  buf.Write(&vsyncend);

  // vtotal
  buf.Write(&vtotal);

  // pad0
  Pad(&buf, 2);

  // flags
  uint32_t tmp7;
  tmp7 = static_cast<uint32_t>(flags);
  buf.Write(&tmp7);

  // pad1
  Pad(&buf, 12);

  // privsize
  privsize = c_private.size();
  buf.Write(&privsize);

  // c_private
  DCHECK_EQ(static_cast<size_t>(privsize), c_private.size());
  for (auto& c_private_elem : c_private) {
    // c_private_elem
    buf.Write(&c_private_elem);
  }

  Align(&buf, 4);

  return connection_->SendRequest<void>(&buf, "XF86VidMode::SwitchToMode",
                                        false);
}

Future<void> XF86VidMode::SwitchToMode(const uint32_t& screen,
                                       const DotClock& dotclock,
                                       const uint16_t& hdisplay,
                                       const uint16_t& hsyncstart,
                                       const uint16_t& hsyncend,
                                       const uint16_t& htotal,
                                       const uint16_t& hskew,
                                       const uint16_t& vdisplay,
                                       const uint16_t& vsyncstart,
                                       const uint16_t& vsyncend,
                                       const uint16_t& vtotal,
                                       const ModeFlag& flags,
                                       const std::vector<uint8_t>& c_private) {
  return XF86VidMode::SwitchToMode(XF86VidMode::SwitchToModeRequest{
      screen, dotclock, hdisplay, hsyncstart, hsyncend, htotal, hskew, vdisplay,
      vsyncstart, vsyncend, vtotal, flags, c_private});
}

Future<XF86VidMode::GetViewPortReply> XF86VidMode::GetViewPort(
    const XF86VidMode::GetViewPortRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 11;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // pad0
  Pad(&buf, 2);

  Align(&buf, 4);

  return connection_->SendRequest<XF86VidMode::GetViewPortReply>(
      &buf, "XF86VidMode::GetViewPort", false);
}

Future<XF86VidMode::GetViewPortReply> XF86VidMode::GetViewPort(
    const uint16_t& screen) {
  return XF86VidMode::GetViewPort(XF86VidMode::GetViewPortRequest{screen});
}

template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<XF86VidMode::GetViewPortReply> detail::ReadReply<
    XF86VidMode::GetViewPortReply>(ReadBuffer* buffer) {
  auto& buf = *buffer;
  auto reply = std::make_unique<XF86VidMode::GetViewPortReply>();

  auto& sequence = (*reply).sequence;
  auto& x = (*reply).x;
  auto& y = (*reply).y;

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // pad0
  Pad(&buf, 1);

  // sequence
  Read(&sequence, &buf);

  // length
  uint32_t length;
  Read(&length, &buf);

  // x
  Read(&x, &buf);

  // y
  Read(&y, &buf);

  // pad1
  Pad(&buf, 16);

  Align(&buf, 4);
  DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);

  return reply;
}

Future<void> XF86VidMode::SetViewPort(
    const XF86VidMode::SetViewPortRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;
  auto& x = request.x;
  auto& y = request.y;

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 12;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // pad0
  Pad(&buf, 2);

  // x
  buf.Write(&x);

  // y
  buf.Write(&y);

  Align(&buf, 4);

  return connection_->SendRequest<void>(&buf, "XF86VidMode::SetViewPort",
                                        false);
}

Future<void> XF86VidMode::SetViewPort(const uint16_t& screen,
                                      const uint32_t& x,
                                      const uint32_t& y) {
  return XF86VidMode::SetViewPort(
      XF86VidMode::SetViewPortRequest{screen, x, y});
}

Future<XF86VidMode::GetDotClocksReply> XF86VidMode::GetDotClocks(
    const XF86VidMode::GetDotClocksRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 13;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // pad0
  Pad(&buf, 2);

  Align(&buf, 4);

  return connection_->SendRequest<XF86VidMode::GetDotClocksReply>(
      &buf, "XF86VidMode::GetDotClocks", false);
}

Future<XF86VidMode::GetDotClocksReply> XF86VidMode::GetDotClocks(
    const uint16_t& screen) {
  return XF86VidMode::GetDotClocks(XF86VidMode::GetDotClocksRequest{screen});
}

template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<XF86VidMode::GetDotClocksReply> detail::ReadReply<
    XF86VidMode::GetDotClocksReply>(ReadBuffer* buffer) {
  auto& buf = *buffer;
  auto reply = std::make_unique<XF86VidMode::GetDotClocksReply>();

  auto& sequence = (*reply).sequence;
  auto& flags = (*reply).flags;
  auto& clocks = (*reply).clocks;
  auto& maxclocks = (*reply).maxclocks;
  auto& clock = (*reply).clock;
  size_t clock_len = clock.size();

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // pad0
  Pad(&buf, 1);

  // sequence
  Read(&sequence, &buf);

  // length
  uint32_t length;
  Read(&length, &buf);

  // flags
  uint32_t tmp8;
  Read(&tmp8, &buf);
  flags = static_cast<XF86VidMode::ClockFlag>(tmp8);

  // clocks
  Read(&clocks, &buf);

  // maxclocks
  Read(&maxclocks, &buf);

  // pad1
  Pad(&buf, 12);

  // clock
  clock.resize(((1) - (BitAnd(flags, 1))) * (clocks));
  for (auto& clock_elem : clock) {
    // clock_elem
    Read(&clock_elem, &buf);
  }

  Align(&buf, 4);
  DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);

  return reply;
}

Future<void> XF86VidMode::SetClientVersion(
    const XF86VidMode::SetClientVersionRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& major = request.major;
  auto& minor = request.minor;

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 14;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // major
  buf.Write(&major);

  // minor
  buf.Write(&minor);

  Align(&buf, 4);

  return connection_->SendRequest<void>(&buf, "XF86VidMode::SetClientVersion",
                                        false);
}

Future<void> XF86VidMode::SetClientVersion(const uint16_t& major,
                                           const uint16_t& minor) {
  return XF86VidMode::SetClientVersion(
      XF86VidMode::SetClientVersionRequest{major, minor});
}

Future<void> XF86VidMode::SetGamma(
    const XF86VidMode::SetGammaRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;
  auto& red = request.red;
  auto& green = request.green;
  auto& blue = request.blue;

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 15;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // pad0
  Pad(&buf, 2);

  // red
  buf.Write(&red);

  // green
  buf.Write(&green);

  // blue
  buf.Write(&blue);

  // pad1
  Pad(&buf, 12);

  Align(&buf, 4);

  return connection_->SendRequest<void>(&buf, "XF86VidMode::SetGamma", false);
}

Future<void> XF86VidMode::SetGamma(const uint16_t& screen,
                                   const uint32_t& red,
                                   const uint32_t& green,
                                   const uint32_t& blue) {
  return XF86VidMode::SetGamma(
      XF86VidMode::SetGammaRequest{screen, red, green, blue});
}

Future<XF86VidMode::GetGammaReply> XF86VidMode::GetGamma(
    const XF86VidMode::GetGammaRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 16;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // pad0
  Pad(&buf, 26);

  Align(&buf, 4);

  return connection_->SendRequest<XF86VidMode::GetGammaReply>(
      &buf, "XF86VidMode::GetGamma", false);
}

Future<XF86VidMode::GetGammaReply> XF86VidMode::GetGamma(
    const uint16_t& screen) {
  return XF86VidMode::GetGamma(XF86VidMode::GetGammaRequest{screen});
}

template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<XF86VidMode::GetGammaReply> detail::ReadReply<
    XF86VidMode::GetGammaReply>(ReadBuffer* buffer) {
  auto& buf = *buffer;
  auto reply = std::make_unique<XF86VidMode::GetGammaReply>();

  auto& sequence = (*reply).sequence;
  auto& red = (*reply).red;
  auto& green = (*reply).green;
  auto& blue = (*reply).blue;

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // pad0
  Pad(&buf, 1);

  // sequence
  Read(&sequence, &buf);

  // length
  uint32_t length;
  Read(&length, &buf);

  // red
  Read(&red, &buf);

  // green
  Read(&green, &buf);

  // blue
  Read(&blue, &buf);

  // pad1
  Pad(&buf, 12);

  Align(&buf, 4);
  DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);

  return reply;
}

Future<XF86VidMode::GetGammaRampReply> XF86VidMode::GetGammaRamp(
    const XF86VidMode::GetGammaRampRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;
  auto& size = request.size;

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 17;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // size
  buf.Write(&size);

  Align(&buf, 4);

  return connection_->SendRequest<XF86VidMode::GetGammaRampReply>(
      &buf, "XF86VidMode::GetGammaRamp", false);
}

Future<XF86VidMode::GetGammaRampReply> XF86VidMode::GetGammaRamp(
    const uint16_t& screen,
    const uint16_t& size) {
  return XF86VidMode::GetGammaRamp(
      XF86VidMode::GetGammaRampRequest{screen, size});
}

template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<XF86VidMode::GetGammaRampReply> detail::ReadReply<
    XF86VidMode::GetGammaRampReply>(ReadBuffer* buffer) {
  auto& buf = *buffer;
  auto reply = std::make_unique<XF86VidMode::GetGammaRampReply>();

  auto& sequence = (*reply).sequence;
  auto& size = (*reply).size;
  auto& red = (*reply).red;
  size_t red_len = red.size();
  auto& green = (*reply).green;
  size_t green_len = green.size();
  auto& blue = (*reply).blue;
  size_t blue_len = blue.size();

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // pad0
  Pad(&buf, 1);

  // sequence
  Read(&sequence, &buf);

  // length
  uint32_t length;
  Read(&length, &buf);

  // size
  Read(&size, &buf);

  // pad1
  Pad(&buf, 22);

  // red
  red.resize(BitAnd((size) + (1), BitNot(1)));
  for (auto& red_elem : red) {
    // red_elem
    Read(&red_elem, &buf);
  }

  // green
  green.resize(BitAnd((size) + (1), BitNot(1)));
  for (auto& green_elem : green) {
    // green_elem
    Read(&green_elem, &buf);
  }

  // blue
  blue.resize(BitAnd((size) + (1), BitNot(1)));
  for (auto& blue_elem : blue) {
    // blue_elem
    Read(&blue_elem, &buf);
  }

  Align(&buf, 4);
  DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);

  return reply;
}

Future<void> XF86VidMode::SetGammaRamp(
    const XF86VidMode::SetGammaRampRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;
  auto& size = request.size;
  auto& red = request.red;
  size_t red_len = red.size();
  auto& green = request.green;
  size_t green_len = green.size();
  auto& blue = request.blue;
  size_t blue_len = blue.size();

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 18;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // size
  buf.Write(&size);

  // red
  DCHECK_EQ(static_cast<size_t>(BitAnd((size) + (1), BitNot(1))), red.size());
  for (auto& red_elem : red) {
    // red_elem
    buf.Write(&red_elem);
  }

  // green
  DCHECK_EQ(static_cast<size_t>(BitAnd((size) + (1), BitNot(1))), green.size());
  for (auto& green_elem : green) {
    // green_elem
    buf.Write(&green_elem);
  }

  // blue
  DCHECK_EQ(static_cast<size_t>(BitAnd((size) + (1), BitNot(1))), blue.size());
  for (auto& blue_elem : blue) {
    // blue_elem
    buf.Write(&blue_elem);
  }

  Align(&buf, 4);

  return connection_->SendRequest<void>(&buf, "XF86VidMode::SetGammaRamp",
                                        false);
}

Future<void> XF86VidMode::SetGammaRamp(const uint16_t& screen,
                                       const uint16_t& size,
                                       const std::vector<uint16_t>& red,
                                       const std::vector<uint16_t>& green,
                                       const std::vector<uint16_t>& blue) {
  return XF86VidMode::SetGammaRamp(
      XF86VidMode::SetGammaRampRequest{screen, size, red, green, blue});
}

Future<XF86VidMode::GetGammaRampSizeReply> XF86VidMode::GetGammaRampSize(
    const XF86VidMode::GetGammaRampSizeRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 19;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // pad0
  Pad(&buf, 2);

  Align(&buf, 4);

  return connection_->SendRequest<XF86VidMode::GetGammaRampSizeReply>(
      &buf, "XF86VidMode::GetGammaRampSize", false);
}

Future<XF86VidMode::GetGammaRampSizeReply> XF86VidMode::GetGammaRampSize(
    const uint16_t& screen) {
  return XF86VidMode::GetGammaRampSize(
      XF86VidMode::GetGammaRampSizeRequest{screen});
}

template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<XF86VidMode::GetGammaRampSizeReply> detail::ReadReply<
    XF86VidMode::GetGammaRampSizeReply>(ReadBuffer* buffer) {
  auto& buf = *buffer;
  auto reply = std::make_unique<XF86VidMode::GetGammaRampSizeReply>();

  auto& sequence = (*reply).sequence;
  auto& size = (*reply).size;

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // pad0
  Pad(&buf, 1);

  // sequence
  Read(&sequence, &buf);

  // length
  uint32_t length;
  Read(&length, &buf);

  // size
  Read(&size, &buf);

  // pad1
  Pad(&buf, 22);

  Align(&buf, 4);
  DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);

  return reply;
}

Future<XF86VidMode::GetPermissionsReply> XF86VidMode::GetPermissions(
    const XF86VidMode::GetPermissionsRequest& request) {
  if (!connection_->Ready() || !present())
    return {};

  WriteBuffer buf;

  auto& screen = request.screen;

  // major_opcode
  uint8_t major_opcode = info_.major_opcode;
  buf.Write(&major_opcode);

  // minor_opcode
  uint8_t minor_opcode = 20;
  buf.Write(&minor_opcode);

  // length
  // Caller fills in length for writes.
  Pad(&buf, sizeof(uint16_t));

  // screen
  buf.Write(&screen);

  // pad0
  Pad(&buf, 2);

  Align(&buf, 4);

  return connection_->SendRequest<XF86VidMode::GetPermissionsReply>(
      &buf, "XF86VidMode::GetPermissions", false);
}

Future<XF86VidMode::GetPermissionsReply> XF86VidMode::GetPermissions(
    const uint16_t& screen) {
  return XF86VidMode::GetPermissions(
      XF86VidMode::GetPermissionsRequest{screen});
}

template <>
COMPONENT_EXPORT(X11)
std::unique_ptr<XF86VidMode::GetPermissionsReply> detail::ReadReply<
    XF86VidMode::GetPermissionsReply>(ReadBuffer* buffer) {
  auto& buf = *buffer;
  auto reply = std::make_unique<XF86VidMode::GetPermissionsReply>();

  auto& sequence = (*reply).sequence;
  auto& permissions = (*reply).permissions;

  // response_type
  uint8_t response_type;
  Read(&response_type, &buf);

  // pad0
  Pad(&buf, 1);

  // sequence
  Read(&sequence, &buf);

  // length
  uint32_t length;
  Read(&length, &buf);

  // permissions
  uint32_t tmp9;
  Read(&tmp9, &buf);
  permissions = static_cast<XF86VidMode::Permission>(tmp9);

  // pad1
  Pad(&buf, 20);

  Align(&buf, 4);
  DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length);

  return reply;
}

}  // namespace x11
