| // Copyright 2021 The Chromium Authors |
| // 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 "xtest.h" |
| |
| #include <unistd.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 { |
| |
| Test::Test(Connection* connection, const x11::QueryExtensionReply& info) |
| : connection_(connection), info_(info) {} |
| |
| Future<Test::GetVersionReply> Test::GetVersion( |
| const Test::GetVersionRequest& request) { |
| if (!connection_->Ready() || !present()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& major_version = request.major_version; |
| auto& minor_version = request.minor_version; |
| |
| // 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)); |
| |
| // major_version |
| buf.Write(&major_version); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // minor_version |
| buf.Write(&minor_version); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<Test::GetVersionReply>( |
| &buf, "Test::GetVersion", false); |
| } |
| |
| Future<Test::GetVersionReply> Test::GetVersion(const uint8_t& major_version, |
| const uint16_t& minor_version) { |
| return Test::GetVersion( |
| Test::GetVersionRequest{major_version, minor_version}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<Test::GetVersionReply> detail::ReadReply<Test::GetVersionReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<Test::GetVersionReply>(); |
| |
| auto& major_version = (*reply).major_version; |
| auto& sequence = (*reply).sequence; |
| auto& minor_version = (*reply).minor_version; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // major_version |
| Read(&major_version, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // minor_version |
| Read(&minor_version, &buf); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<Test::CompareCursorReply> Test::CompareCursor( |
| const Test::CompareCursorRequest& request) { |
| if (!connection_->Ready() || !present()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| auto& cursor = request.cursor; |
| |
| // 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)); |
| |
| // window |
| buf.Write(&window); |
| |
| // cursor |
| buf.Write(&cursor); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<Test::CompareCursorReply>( |
| &buf, "Test::CompareCursor", false); |
| } |
| |
| Future<Test::CompareCursorReply> Test::CompareCursor( |
| const Window& window, |
| const x11::Cursor& cursor) { |
| return Test::CompareCursor(Test::CompareCursorRequest{window, cursor}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<Test::CompareCursorReply> detail::ReadReply< |
| Test::CompareCursorReply>(ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<Test::CompareCursorReply>(); |
| |
| auto& same = (*reply).same; |
| auto& sequence = (*reply).sequence; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // same |
| Read(&same, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> Test::FakeInput(const Test::FakeInputRequest& request) { |
| if (!connection_->Ready() || !present()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& type = request.type; |
| auto& detail = request.detail; |
| auto& time = request.time; |
| auto& root = request.root; |
| auto& rootX = request.rootX; |
| auto& rootY = request.rootY; |
| auto& deviceid = request.deviceid; |
| |
| // 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)); |
| |
| // type |
| buf.Write(&type); |
| |
| // detail |
| buf.Write(&detail); |
| |
| // pad0 |
| Pad(&buf, 2); |
| |
| // time |
| buf.Write(&time); |
| |
| // root |
| buf.Write(&root); |
| |
| // pad1 |
| Pad(&buf, 8); |
| |
| // rootX |
| buf.Write(&rootX); |
| |
| // rootY |
| buf.Write(&rootY); |
| |
| // pad2 |
| Pad(&buf, 7); |
| |
| // deviceid |
| buf.Write(&deviceid); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "Test::FakeInput", false); |
| } |
| |
| Future<void> Test::FakeInput(const uint8_t& type, |
| const uint8_t& detail, |
| const uint32_t& time, |
| const Window& root, |
| const int16_t& rootX, |
| const int16_t& rootY, |
| const uint8_t& deviceid) { |
| return Test::FakeInput( |
| Test::FakeInputRequest{type, detail, time, root, rootX, rootY, deviceid}); |
| } |
| |
| Future<void> Test::GrabControl(const Test::GrabControlRequest& request) { |
| if (!connection_->Ready() || !present()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& impervious = request.impervious; |
| |
| // 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)); |
| |
| // impervious |
| buf.Write(&impervious); |
| |
| // pad0 |
| Pad(&buf, 3); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "Test::GrabControl", false); |
| } |
| |
| Future<void> Test::GrabControl(const uint8_t& impervious) { |
| return Test::GrabControl(Test::GrabControlRequest{impervious}); |
| } |
| |
| } // namespace x11 |