| // 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 "xproto.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 { |
| |
| XProto::XProto(Connection* connection) : connection_(connection) {} |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| Setup Read<Setup>(ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| Setup obj; |
| |
| auto& status = obj.status; |
| auto& protocol_major_version = obj.protocol_major_version; |
| auto& protocol_minor_version = obj.protocol_minor_version; |
| auto& length = obj.length; |
| auto& release_number = obj.release_number; |
| auto& resource_id_base = obj.resource_id_base; |
| auto& resource_id_mask = obj.resource_id_mask; |
| auto& motion_buffer_size = obj.motion_buffer_size; |
| uint16_t vendor_len{}; |
| auto& maximum_request_length = obj.maximum_request_length; |
| uint8_t roots_len{}; |
| uint8_t pixmap_formats_len{}; |
| auto& image_byte_order = obj.image_byte_order; |
| auto& bitmap_format_bit_order = obj.bitmap_format_bit_order; |
| auto& bitmap_format_scanline_unit = obj.bitmap_format_scanline_unit; |
| auto& bitmap_format_scanline_pad = obj.bitmap_format_scanline_pad; |
| auto& min_keycode = obj.min_keycode; |
| auto& max_keycode = obj.max_keycode; |
| auto& vendor = obj.vendor; |
| auto& pixmap_formats = obj.pixmap_formats; |
| auto& roots = obj.roots; |
| |
| // status |
| Read(&status, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // protocol_major_version |
| Read(&protocol_major_version, &buf); |
| |
| // protocol_minor_version |
| Read(&protocol_minor_version, &buf); |
| |
| // length |
| Read(&length, &buf); |
| |
| // release_number |
| Read(&release_number, &buf); |
| |
| // resource_id_base |
| Read(&resource_id_base, &buf); |
| |
| // resource_id_mask |
| Read(&resource_id_mask, &buf); |
| |
| // motion_buffer_size |
| Read(&motion_buffer_size, &buf); |
| |
| // vendor_len |
| Read(&vendor_len, &buf); |
| |
| // maximum_request_length |
| Read(&maximum_request_length, &buf); |
| |
| // roots_len |
| Read(&roots_len, &buf); |
| |
| // pixmap_formats_len |
| Read(&pixmap_formats_len, &buf); |
| |
| // image_byte_order |
| uint8_t tmp0; |
| Read(&tmp0, &buf); |
| image_byte_order = static_cast<ImageOrder>(tmp0); |
| |
| // bitmap_format_bit_order |
| uint8_t tmp1; |
| Read(&tmp1, &buf); |
| bitmap_format_bit_order = static_cast<ImageOrder>(tmp1); |
| |
| // bitmap_format_scanline_unit |
| Read(&bitmap_format_scanline_unit, &buf); |
| |
| // bitmap_format_scanline_pad |
| Read(&bitmap_format_scanline_pad, &buf); |
| |
| // min_keycode |
| Read(&min_keycode, &buf); |
| |
| // max_keycode |
| Read(&max_keycode, &buf); |
| |
| // pad1 |
| Pad(&buf, 4); |
| |
| // vendor |
| vendor.resize(vendor_len); |
| for (auto& vendor_elem : vendor) { |
| // vendor_elem |
| Read(&vendor_elem, &buf); |
| } |
| |
| // pad2 |
| Align(&buf, 4); |
| |
| // pixmap_formats |
| pixmap_formats.resize(pixmap_formats_len); |
| for (auto& pixmap_formats_elem : pixmap_formats) { |
| // pixmap_formats_elem |
| { |
| auto& depth = pixmap_formats_elem.depth; |
| auto& bits_per_pixel = pixmap_formats_elem.bits_per_pixel; |
| auto& scanline_pad = pixmap_formats_elem.scanline_pad; |
| |
| // depth |
| Read(&depth, &buf); |
| |
| // bits_per_pixel |
| Read(&bits_per_pixel, &buf); |
| |
| // scanline_pad |
| Read(&scanline_pad, &buf); |
| |
| // pad0 |
| Pad(&buf, 5); |
| } |
| } |
| |
| // roots |
| roots.resize(roots_len); |
| for (auto& roots_elem : roots) { |
| // roots_elem |
| { |
| auto& root = roots_elem.root; |
| auto& default_colormap = roots_elem.default_colormap; |
| auto& white_pixel = roots_elem.white_pixel; |
| auto& black_pixel = roots_elem.black_pixel; |
| auto& current_input_masks = roots_elem.current_input_masks; |
| auto& width_in_pixels = roots_elem.width_in_pixels; |
| auto& height_in_pixels = roots_elem.height_in_pixels; |
| auto& width_in_millimeters = roots_elem.width_in_millimeters; |
| auto& height_in_millimeters = roots_elem.height_in_millimeters; |
| auto& min_installed_maps = roots_elem.min_installed_maps; |
| auto& max_installed_maps = roots_elem.max_installed_maps; |
| auto& root_visual = roots_elem.root_visual; |
| auto& backing_stores = roots_elem.backing_stores; |
| auto& save_unders = roots_elem.save_unders; |
| auto& root_depth = roots_elem.root_depth; |
| uint8_t allowed_depths_len{}; |
| auto& allowed_depths = roots_elem.allowed_depths; |
| |
| // root |
| Read(&root, &buf); |
| |
| // default_colormap |
| Read(&default_colormap, &buf); |
| |
| // white_pixel |
| Read(&white_pixel, &buf); |
| |
| // black_pixel |
| Read(&black_pixel, &buf); |
| |
| // current_input_masks |
| uint32_t tmp2; |
| Read(&tmp2, &buf); |
| current_input_masks = static_cast<EventMask>(tmp2); |
| |
| // width_in_pixels |
| Read(&width_in_pixels, &buf); |
| |
| // height_in_pixels |
| Read(&height_in_pixels, &buf); |
| |
| // width_in_millimeters |
| Read(&width_in_millimeters, &buf); |
| |
| // height_in_millimeters |
| Read(&height_in_millimeters, &buf); |
| |
| // min_installed_maps |
| Read(&min_installed_maps, &buf); |
| |
| // max_installed_maps |
| Read(&max_installed_maps, &buf); |
| |
| // root_visual |
| Read(&root_visual, &buf); |
| |
| // backing_stores |
| uint8_t tmp3; |
| Read(&tmp3, &buf); |
| backing_stores = static_cast<BackingStore>(tmp3); |
| |
| // save_unders |
| Read(&save_unders, &buf); |
| |
| // root_depth |
| Read(&root_depth, &buf); |
| |
| // allowed_depths_len |
| Read(&allowed_depths_len, &buf); |
| |
| // allowed_depths |
| allowed_depths.resize(allowed_depths_len); |
| for (auto& allowed_depths_elem : allowed_depths) { |
| // allowed_depths_elem |
| { |
| auto& depth = allowed_depths_elem.depth; |
| uint16_t visuals_len{}; |
| auto& visuals = allowed_depths_elem.visuals; |
| |
| // depth |
| Read(&depth, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // visuals_len |
| Read(&visuals_len, &buf); |
| |
| // pad1 |
| Pad(&buf, 4); |
| |
| // visuals |
| visuals.resize(visuals_len); |
| for (auto& visuals_elem : visuals) { |
| // visuals_elem |
| { |
| auto& visual_id = visuals_elem.visual_id; |
| auto& c_class = visuals_elem.c_class; |
| auto& bits_per_rgb_value = visuals_elem.bits_per_rgb_value; |
| auto& colormap_entries = visuals_elem.colormap_entries; |
| auto& red_mask = visuals_elem.red_mask; |
| auto& green_mask = visuals_elem.green_mask; |
| auto& blue_mask = visuals_elem.blue_mask; |
| |
| // visual_id |
| Read(&visual_id, &buf); |
| |
| // c_class |
| uint8_t tmp4; |
| Read(&tmp4, &buf); |
| c_class = static_cast<VisualClass>(tmp4); |
| |
| // bits_per_rgb_value |
| Read(&bits_per_rgb_value, &buf); |
| |
| // colormap_entries |
| Read(&colormap_entries, &buf); |
| |
| // red_mask |
| Read(&red_mask, &buf); |
| |
| // green_mask |
| Read(&green_mask, &buf); |
| |
| // blue_mask |
| Read(&blue_mask, &buf); |
| |
| // pad0 |
| Pad(&buf, 4); |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| return obj; |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| WriteBuffer Write<KeyEvent>(const KeyEvent& obj) { |
| WriteBuffer buf; |
| |
| auto& detail = obj.detail; |
| auto& sequence = obj.sequence; |
| auto& time = obj.time; |
| auto& root = obj.root; |
| auto& event = obj.event; |
| auto& child = obj.child; |
| auto& root_x = obj.root_x; |
| auto& root_y = obj.root_y; |
| auto& event_x = obj.event_x; |
| auto& event_y = obj.event_y; |
| auto& state = obj.state; |
| auto& same_screen = obj.same_screen; |
| |
| // response_type |
| uint8_t response_type = obj.opcode; |
| buf.Write(&response_type); |
| |
| // detail |
| buf.Write(&detail); |
| |
| // sequence |
| buf.Write(&sequence); |
| |
| // time |
| buf.Write(&time); |
| |
| // root |
| buf.Write(&root); |
| |
| // event |
| buf.Write(&event); |
| |
| // child |
| buf.Write(&child); |
| |
| // root_x |
| buf.Write(&root_x); |
| |
| // root_y |
| buf.Write(&root_y); |
| |
| // event_x |
| buf.Write(&event_x); |
| |
| // event_y |
| buf.Write(&event_y); |
| |
| // state |
| uint16_t tmp5; |
| tmp5 = static_cast<uint16_t>(state); |
| buf.Write(&tmp5); |
| |
| // same_screen |
| buf.Write(&same_screen); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| return buf; |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<KeyEvent>(KeyEvent* event_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& detail = (*event_).detail; |
| auto& sequence = (*event_).sequence; |
| auto& time = (*event_).time; |
| auto& root = (*event_).root; |
| auto& event = (*event_).event; |
| auto& child = (*event_).child; |
| auto& root_x = (*event_).root_x; |
| auto& root_y = (*event_).root_y; |
| auto& event_x = (*event_).event_x; |
| auto& event_y = (*event_).event_y; |
| auto& state = (*event_).state; |
| auto& same_screen = (*event_).same_screen; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // detail |
| Read(&detail, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // time |
| Read(&time, &buf); |
| |
| // root |
| Read(&root, &buf); |
| |
| // event |
| Read(&event, &buf); |
| |
| // child |
| Read(&child, &buf); |
| |
| // root_x |
| Read(&root_x, &buf); |
| |
| // root_y |
| Read(&root_y, &buf); |
| |
| // event_x |
| Read(&event_x, &buf); |
| |
| // event_y |
| Read(&event_y, &buf); |
| |
| // state |
| uint16_t tmp6; |
| Read(&tmp6, &buf); |
| state = static_cast<KeyButMask>(tmp6); |
| |
| // same_screen |
| Read(&same_screen, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| WriteBuffer Write<ButtonEvent>(const ButtonEvent& obj) { |
| WriteBuffer buf; |
| |
| auto& detail = obj.detail; |
| auto& sequence = obj.sequence; |
| auto& time = obj.time; |
| auto& root = obj.root; |
| auto& event = obj.event; |
| auto& child = obj.child; |
| auto& root_x = obj.root_x; |
| auto& root_y = obj.root_y; |
| auto& event_x = obj.event_x; |
| auto& event_y = obj.event_y; |
| auto& state = obj.state; |
| auto& same_screen = obj.same_screen; |
| |
| // response_type |
| uint8_t response_type = obj.opcode; |
| buf.Write(&response_type); |
| |
| // detail |
| buf.Write(&detail); |
| |
| // sequence |
| buf.Write(&sequence); |
| |
| // time |
| buf.Write(&time); |
| |
| // root |
| buf.Write(&root); |
| |
| // event |
| buf.Write(&event); |
| |
| // child |
| buf.Write(&child); |
| |
| // root_x |
| buf.Write(&root_x); |
| |
| // root_y |
| buf.Write(&root_y); |
| |
| // event_x |
| buf.Write(&event_x); |
| |
| // event_y |
| buf.Write(&event_y); |
| |
| // state |
| uint16_t tmp7; |
| tmp7 = static_cast<uint16_t>(state); |
| buf.Write(&tmp7); |
| |
| // same_screen |
| buf.Write(&same_screen); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| return buf; |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<ButtonEvent>(ButtonEvent* event_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& detail = (*event_).detail; |
| auto& sequence = (*event_).sequence; |
| auto& time = (*event_).time; |
| auto& root = (*event_).root; |
| auto& event = (*event_).event; |
| auto& child = (*event_).child; |
| auto& root_x = (*event_).root_x; |
| auto& root_y = (*event_).root_y; |
| auto& event_x = (*event_).event_x; |
| auto& event_y = (*event_).event_y; |
| auto& state = (*event_).state; |
| auto& same_screen = (*event_).same_screen; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // detail |
| Read(&detail, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // time |
| Read(&time, &buf); |
| |
| // root |
| Read(&root, &buf); |
| |
| // event |
| Read(&event, &buf); |
| |
| // child |
| Read(&child, &buf); |
| |
| // root_x |
| Read(&root_x, &buf); |
| |
| // root_y |
| Read(&root_y, &buf); |
| |
| // event_x |
| Read(&event_x, &buf); |
| |
| // event_y |
| Read(&event_y, &buf); |
| |
| // state |
| uint16_t tmp8; |
| Read(&tmp8, &buf); |
| state = static_cast<KeyButMask>(tmp8); |
| |
| // same_screen |
| Read(&same_screen, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| WriteBuffer Write<MotionNotifyEvent>(const MotionNotifyEvent& obj) { |
| WriteBuffer buf; |
| |
| auto& detail = obj.detail; |
| auto& sequence = obj.sequence; |
| auto& time = obj.time; |
| auto& root = obj.root; |
| auto& event = obj.event; |
| auto& child = obj.child; |
| auto& root_x = obj.root_x; |
| auto& root_y = obj.root_y; |
| auto& event_x = obj.event_x; |
| auto& event_y = obj.event_y; |
| auto& state = obj.state; |
| auto& same_screen = obj.same_screen; |
| |
| // response_type |
| uint8_t response_type = 6; |
| buf.Write(&response_type); |
| |
| // detail |
| uint8_t tmp9; |
| tmp9 = static_cast<uint8_t>(detail); |
| buf.Write(&tmp9); |
| |
| // sequence |
| buf.Write(&sequence); |
| |
| // time |
| buf.Write(&time); |
| |
| // root |
| buf.Write(&root); |
| |
| // event |
| buf.Write(&event); |
| |
| // child |
| buf.Write(&child); |
| |
| // root_x |
| buf.Write(&root_x); |
| |
| // root_y |
| buf.Write(&root_y); |
| |
| // event_x |
| buf.Write(&event_x); |
| |
| // event_y |
| buf.Write(&event_y); |
| |
| // state |
| uint16_t tmp10; |
| tmp10 = static_cast<uint16_t>(state); |
| buf.Write(&tmp10); |
| |
| // same_screen |
| buf.Write(&same_screen); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| return buf; |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<MotionNotifyEvent>(MotionNotifyEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& detail = (*event_).detail; |
| auto& sequence = (*event_).sequence; |
| auto& time = (*event_).time; |
| auto& root = (*event_).root; |
| auto& event = (*event_).event; |
| auto& child = (*event_).child; |
| auto& root_x = (*event_).root_x; |
| auto& root_y = (*event_).root_y; |
| auto& event_x = (*event_).event_x; |
| auto& event_y = (*event_).event_y; |
| auto& state = (*event_).state; |
| auto& same_screen = (*event_).same_screen; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // detail |
| uint8_t tmp11; |
| Read(&tmp11, &buf); |
| detail = static_cast<Motion>(tmp11); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // time |
| Read(&time, &buf); |
| |
| // root |
| Read(&root, &buf); |
| |
| // event |
| Read(&event, &buf); |
| |
| // child |
| Read(&child, &buf); |
| |
| // root_x |
| Read(&root_x, &buf); |
| |
| // root_y |
| Read(&root_y, &buf); |
| |
| // event_x |
| Read(&event_x, &buf); |
| |
| // event_y |
| Read(&event_y, &buf); |
| |
| // state |
| uint16_t tmp12; |
| Read(&tmp12, &buf); |
| state = static_cast<KeyButMask>(tmp12); |
| |
| // same_screen |
| Read(&same_screen, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<CrossingEvent>(CrossingEvent* event_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& detail = (*event_).detail; |
| auto& sequence = (*event_).sequence; |
| auto& time = (*event_).time; |
| auto& root = (*event_).root; |
| auto& event = (*event_).event; |
| auto& child = (*event_).child; |
| auto& root_x = (*event_).root_x; |
| auto& root_y = (*event_).root_y; |
| auto& event_x = (*event_).event_x; |
| auto& event_y = (*event_).event_y; |
| auto& state = (*event_).state; |
| auto& mode = (*event_).mode; |
| auto& same_screen_focus = (*event_).same_screen_focus; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // detail |
| uint8_t tmp13; |
| Read(&tmp13, &buf); |
| detail = static_cast<NotifyDetail>(tmp13); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // time |
| Read(&time, &buf); |
| |
| // root |
| Read(&root, &buf); |
| |
| // event |
| Read(&event, &buf); |
| |
| // child |
| Read(&child, &buf); |
| |
| // root_x |
| Read(&root_x, &buf); |
| |
| // root_y |
| Read(&root_y, &buf); |
| |
| // event_x |
| Read(&event_x, &buf); |
| |
| // event_y |
| Read(&event_y, &buf); |
| |
| // state |
| uint16_t tmp14; |
| Read(&tmp14, &buf); |
| state = static_cast<KeyButMask>(tmp14); |
| |
| // mode |
| uint8_t tmp15; |
| Read(&tmp15, &buf); |
| mode = static_cast<NotifyMode>(tmp15); |
| |
| // same_screen_focus |
| Read(&same_screen_focus, &buf); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<FocusEvent>(FocusEvent* event_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& detail = (*event_).detail; |
| auto& sequence = (*event_).sequence; |
| auto& event = (*event_).event; |
| auto& mode = (*event_).mode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // detail |
| uint8_t tmp16; |
| Read(&tmp16, &buf); |
| detail = static_cast<NotifyDetail>(tmp16); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // event |
| Read(&event, &buf); |
| |
| // mode |
| uint8_t tmp17; |
| Read(&tmp17, &buf); |
| mode = static_cast<NotifyMode>(tmp17); |
| |
| // pad0 |
| Pad(&buf, 3); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<KeymapNotifyEvent>(KeymapNotifyEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& keys = (*event_).keys; |
| size_t keys_len = keys.size(); |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // keys |
| for (auto& keys_elem : keys) { |
| // keys_elem |
| Read(&keys_elem, &buf); |
| } |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| WriteBuffer Write<ExposeEvent>(const ExposeEvent& obj) { |
| WriteBuffer buf; |
| |
| auto& sequence = obj.sequence; |
| auto& window = obj.window; |
| auto& x = obj.x; |
| auto& y = obj.y; |
| auto& width = obj.width; |
| auto& height = obj.height; |
| auto& count = obj.count; |
| |
| // response_type |
| uint8_t response_type = 12; |
| buf.Write(&response_type); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| buf.Write(&sequence); |
| |
| // window |
| buf.Write(&window); |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| |
| // width |
| buf.Write(&width); |
| |
| // height |
| buf.Write(&height); |
| |
| // count |
| buf.Write(&count); |
| |
| // pad1 |
| Pad(&buf, 2); |
| |
| return buf; |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<ExposeEvent>(ExposeEvent* event_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& window = (*event_).window; |
| auto& x = (*event_).x; |
| auto& y = (*event_).y; |
| auto& width = (*event_).width; |
| auto& height = (*event_).height; |
| auto& count = (*event_).count; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| // x |
| Read(&x, &buf); |
| |
| // y |
| Read(&y, &buf); |
| |
| // width |
| Read(&width, &buf); |
| |
| // height |
| Read(&height, &buf); |
| |
| // count |
| Read(&count, &buf); |
| |
| // pad1 |
| Pad(&buf, 2); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<GraphicsExposureEvent>(GraphicsExposureEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& drawable = (*event_).drawable; |
| auto& x = (*event_).x; |
| auto& y = (*event_).y; |
| auto& width = (*event_).width; |
| auto& height = (*event_).height; |
| auto& minor_opcode = (*event_).minor_opcode; |
| auto& count = (*event_).count; |
| auto& major_opcode = (*event_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // drawable |
| Read(&drawable, &buf); |
| |
| // x |
| Read(&x, &buf); |
| |
| // y |
| Read(&y, &buf); |
| |
| // width |
| Read(&width, &buf); |
| |
| // height |
| Read(&height, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // count |
| Read(&count, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad1 |
| Pad(&buf, 3); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<NoExposureEvent>(NoExposureEvent* event_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& drawable = (*event_).drawable; |
| auto& minor_opcode = (*event_).minor_opcode; |
| auto& major_opcode = (*event_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // drawable |
| Read(&drawable, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad1 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<VisibilityNotifyEvent>(VisibilityNotifyEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& window = (*event_).window; |
| auto& state = (*event_).state; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| // state |
| uint8_t tmp18; |
| Read(&tmp18, &buf); |
| state = static_cast<Visibility>(tmp18); |
| |
| // pad1 |
| Pad(&buf, 3); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<CreateNotifyEvent>(CreateNotifyEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& parent = (*event_).parent; |
| auto& window = (*event_).window; |
| auto& x = (*event_).x; |
| auto& y = (*event_).y; |
| auto& width = (*event_).width; |
| auto& height = (*event_).height; |
| auto& border_width = (*event_).border_width; |
| auto& override_redirect = (*event_).override_redirect; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // parent |
| Read(&parent, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| // x |
| Read(&x, &buf); |
| |
| // y |
| Read(&y, &buf); |
| |
| // width |
| Read(&width, &buf); |
| |
| // height |
| Read(&height, &buf); |
| |
| // border_width |
| Read(&border_width, &buf); |
| |
| // override_redirect |
| Read(&override_redirect, &buf); |
| |
| // pad1 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<DestroyNotifyEvent>(DestroyNotifyEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& event = (*event_).event; |
| auto& window = (*event_).window; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // event |
| Read(&event, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| WriteBuffer Write<UnmapNotifyEvent>(const UnmapNotifyEvent& obj) { |
| WriteBuffer buf; |
| |
| auto& sequence = obj.sequence; |
| auto& event = obj.event; |
| auto& window = obj.window; |
| auto& from_configure = obj.from_configure; |
| |
| // response_type |
| uint8_t response_type = 18; |
| buf.Write(&response_type); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| buf.Write(&sequence); |
| |
| // event |
| buf.Write(&event); |
| |
| // window |
| buf.Write(&window); |
| |
| // from_configure |
| buf.Write(&from_configure); |
| |
| // pad1 |
| Pad(&buf, 3); |
| |
| return buf; |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<UnmapNotifyEvent>(UnmapNotifyEvent* event_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& event = (*event_).event; |
| auto& window = (*event_).window; |
| auto& from_configure = (*event_).from_configure; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // event |
| Read(&event, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| // from_configure |
| Read(&from_configure, &buf); |
| |
| // pad1 |
| Pad(&buf, 3); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<MapNotifyEvent>(MapNotifyEvent* event_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& event = (*event_).event; |
| auto& window = (*event_).window; |
| auto& override_redirect = (*event_).override_redirect; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // event |
| Read(&event, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| // override_redirect |
| Read(&override_redirect, &buf); |
| |
| // pad1 |
| Pad(&buf, 3); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<MapRequestEvent>(MapRequestEvent* event_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& parent = (*event_).parent; |
| auto& window = (*event_).window; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // parent |
| Read(&parent, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<ReparentNotifyEvent>(ReparentNotifyEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& event = (*event_).event; |
| auto& window = (*event_).window; |
| auto& parent = (*event_).parent; |
| auto& x = (*event_).x; |
| auto& y = (*event_).y; |
| auto& override_redirect = (*event_).override_redirect; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // event |
| Read(&event, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| // parent |
| Read(&parent, &buf); |
| |
| // x |
| Read(&x, &buf); |
| |
| // y |
| Read(&y, &buf); |
| |
| // override_redirect |
| Read(&override_redirect, &buf); |
| |
| // pad1 |
| Pad(&buf, 3); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<ConfigureNotifyEvent>(ConfigureNotifyEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& event = (*event_).event; |
| auto& window = (*event_).window; |
| auto& above_sibling = (*event_).above_sibling; |
| auto& x = (*event_).x; |
| auto& y = (*event_).y; |
| auto& width = (*event_).width; |
| auto& height = (*event_).height; |
| auto& border_width = (*event_).border_width; |
| auto& override_redirect = (*event_).override_redirect; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // event |
| Read(&event, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| // above_sibling |
| Read(&above_sibling, &buf); |
| |
| // x |
| Read(&x, &buf); |
| |
| // y |
| Read(&y, &buf); |
| |
| // width |
| Read(&width, &buf); |
| |
| // height |
| Read(&height, &buf); |
| |
| // border_width |
| Read(&border_width, &buf); |
| |
| // override_redirect |
| Read(&override_redirect, &buf); |
| |
| // pad1 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<ConfigureRequestEvent>(ConfigureRequestEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& stack_mode = (*event_).stack_mode; |
| auto& sequence = (*event_).sequence; |
| auto& parent = (*event_).parent; |
| auto& window = (*event_).window; |
| auto& sibling = (*event_).sibling; |
| auto& x = (*event_).x; |
| auto& y = (*event_).y; |
| auto& width = (*event_).width; |
| auto& height = (*event_).height; |
| auto& border_width = (*event_).border_width; |
| auto& value_mask = (*event_).value_mask; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // stack_mode |
| uint8_t tmp19; |
| Read(&tmp19, &buf); |
| stack_mode = static_cast<StackMode>(tmp19); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // parent |
| Read(&parent, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| // sibling |
| Read(&sibling, &buf); |
| |
| // x |
| Read(&x, &buf); |
| |
| // y |
| Read(&y, &buf); |
| |
| // width |
| Read(&width, &buf); |
| |
| // height |
| Read(&height, &buf); |
| |
| // border_width |
| Read(&border_width, &buf); |
| |
| // value_mask |
| uint16_t tmp20; |
| Read(&tmp20, &buf); |
| value_mask = static_cast<ConfigWindow>(tmp20); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<GravityNotifyEvent>(GravityNotifyEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& event = (*event_).event; |
| auto& window = (*event_).window; |
| auto& x = (*event_).x; |
| auto& y = (*event_).y; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // event |
| Read(&event, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| // x |
| Read(&x, &buf); |
| |
| // y |
| Read(&y, &buf); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<ResizeRequestEvent>(ResizeRequestEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& window = (*event_).window; |
| auto& width = (*event_).width; |
| auto& height = (*event_).height; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| // width |
| Read(&width, &buf); |
| |
| // height |
| Read(&height, &buf); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<CirculateEvent>(CirculateEvent* event_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& event = (*event_).event; |
| auto& window = (*event_).window; |
| auto& place = (*event_).place; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // event |
| Read(&event, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| // pad1 |
| Pad(&buf, 4); |
| |
| // place |
| uint8_t tmp21; |
| Read(&tmp21, &buf); |
| place = static_cast<Place>(tmp21); |
| |
| // pad2 |
| Pad(&buf, 3); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| WriteBuffer Write<PropertyNotifyEvent>(const PropertyNotifyEvent& obj) { |
| WriteBuffer buf; |
| |
| auto& sequence = obj.sequence; |
| auto& window = obj.window; |
| auto& atom = obj.atom; |
| auto& time = obj.time; |
| auto& state = obj.state; |
| |
| // response_type |
| uint8_t response_type = 28; |
| buf.Write(&response_type); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| buf.Write(&sequence); |
| |
| // window |
| buf.Write(&window); |
| |
| // atom |
| buf.Write(&atom); |
| |
| // time |
| buf.Write(&time); |
| |
| // state |
| uint8_t tmp22; |
| tmp22 = static_cast<uint8_t>(state); |
| buf.Write(&tmp22); |
| |
| // pad1 |
| Pad(&buf, 3); |
| |
| return buf; |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<PropertyNotifyEvent>(PropertyNotifyEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& window = (*event_).window; |
| auto& atom = (*event_).atom; |
| auto& time = (*event_).time; |
| auto& state = (*event_).state; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| // atom |
| Read(&atom, &buf); |
| |
| // time |
| Read(&time, &buf); |
| |
| // state |
| uint8_t tmp23; |
| Read(&tmp23, &buf); |
| state = static_cast<Property>(tmp23); |
| |
| // pad1 |
| Pad(&buf, 3); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<SelectionClearEvent>(SelectionClearEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& time = (*event_).time; |
| auto& owner = (*event_).owner; |
| auto& selection = (*event_).selection; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // time |
| Read(&time, &buf); |
| |
| // owner |
| Read(&owner, &buf); |
| |
| // selection |
| Read(&selection, &buf); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<SelectionRequestEvent>(SelectionRequestEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& time = (*event_).time; |
| auto& owner = (*event_).owner; |
| auto& requestor = (*event_).requestor; |
| auto& selection = (*event_).selection; |
| auto& target = (*event_).target; |
| auto& property = (*event_).property; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // time |
| Read(&time, &buf); |
| |
| // owner |
| Read(&owner, &buf); |
| |
| // requestor |
| Read(&requestor, &buf); |
| |
| // selection |
| Read(&selection, &buf); |
| |
| // target |
| Read(&target, &buf); |
| |
| // property |
| Read(&property, &buf); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| WriteBuffer Write<SelectionNotifyEvent>(const SelectionNotifyEvent& obj) { |
| WriteBuffer buf; |
| |
| auto& sequence = obj.sequence; |
| auto& time = obj.time; |
| auto& requestor = obj.requestor; |
| auto& selection = obj.selection; |
| auto& target = obj.target; |
| auto& property = obj.property; |
| |
| // response_type |
| uint8_t response_type = 31; |
| buf.Write(&response_type); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| buf.Write(&sequence); |
| |
| // time |
| buf.Write(&time); |
| |
| // requestor |
| buf.Write(&requestor); |
| |
| // selection |
| buf.Write(&selection); |
| |
| // target |
| buf.Write(&target); |
| |
| // property |
| buf.Write(&property); |
| |
| return buf; |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<SelectionNotifyEvent>(SelectionNotifyEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& time = (*event_).time; |
| auto& requestor = (*event_).requestor; |
| auto& selection = (*event_).selection; |
| auto& target = (*event_).target; |
| auto& property = (*event_).property; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // time |
| Read(&time, &buf); |
| |
| // requestor |
| Read(&requestor, &buf); |
| |
| // selection |
| Read(&selection, &buf); |
| |
| // target |
| Read(&target, &buf); |
| |
| // property |
| Read(&property, &buf); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<ColormapNotifyEvent>(ColormapNotifyEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& window = (*event_).window; |
| auto& colormap = (*event_).colormap; |
| auto& c_new = (*event_).c_new; |
| auto& state = (*event_).state; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| // colormap |
| Read(&colormap, &buf); |
| |
| // c_new |
| Read(&c_new, &buf); |
| |
| // state |
| uint8_t tmp24; |
| Read(&tmp24, &buf); |
| state = static_cast<ColormapState>(tmp24); |
| |
| // pad1 |
| Pad(&buf, 2); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| WriteBuffer Write<ClientMessageEvent>(const ClientMessageEvent& obj) { |
| WriteBuffer buf; |
| |
| auto& format = obj.format; |
| auto& sequence = obj.sequence; |
| auto& window = obj.window; |
| auto& type = obj.type; |
| auto& data = obj.data; |
| |
| // response_type |
| uint8_t response_type = 33; |
| buf.Write(&response_type); |
| |
| // format |
| buf.Write(&format); |
| |
| // sequence |
| buf.Write(&sequence); |
| |
| // window |
| buf.Write(&window); |
| |
| // type |
| buf.Write(&type); |
| |
| // data |
| buf.Write(&data); |
| |
| return buf; |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<ClientMessageEvent>(ClientMessageEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& format = (*event_).format; |
| auto& sequence = (*event_).sequence; |
| auto& window = (*event_).window; |
| auto& type = (*event_).type; |
| auto& data = (*event_).data; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // format |
| Read(&format, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // window |
| Read(&window, &buf); |
| |
| // type |
| Read(&type, &buf); |
| |
| // data |
| Read(&data, &buf); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<MappingNotifyEvent>(MappingNotifyEvent* event_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| auto& request = (*event_).request; |
| auto& first_keycode = (*event_).first_keycode; |
| auto& count = (*event_).count; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // request |
| uint8_t tmp25; |
| Read(&tmp25, &buf); |
| request = static_cast<Mapping>(tmp25); |
| |
| // first_keycode |
| Read(&first_keycode, &buf); |
| |
| // count |
| Read(&count, &buf); |
| |
| // pad1 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| void ReadEvent<GeGenericEvent>(GeGenericEvent* event_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*event_).sequence; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // extension |
| uint8_t extension; |
| Read(&extension, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // event_type |
| uint16_t event_type; |
| Read(&event_type, &buf); |
| |
| // pad0 |
| Pad(&buf, 22); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset, 32 + 4 * length); |
| } |
| |
| std::string RequestError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "RequestError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<RequestError>(RequestError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string ValueError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "ValueError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<ValueError>(ValueError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string WindowError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "WindowError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<WindowError>(WindowError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string PixmapError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "PixmapError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<PixmapError>(PixmapError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string AtomError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "AtomError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<AtomError>(AtomError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string CursorError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "CursorError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<CursorError>(CursorError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string FontError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "FontError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<FontError>(FontError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string MatchError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "MatchError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<MatchError>(MatchError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string DrawableError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "DrawableError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<DrawableError>(DrawableError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string AccessError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "AccessError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<AccessError>(AccessError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string AllocError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "AllocError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<AllocError>(AllocError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string ColormapError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "ColormapError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<ColormapError>(ColormapError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string GContextError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "GContextError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<GContextError>(GContextError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string IDChoiceError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "IDChoiceError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<IDChoiceError>(IDChoiceError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string NameError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "NameError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<NameError>(NameError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string LengthError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "LengthError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<LengthError>(LengthError* error_, ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| std::string ImplementationError::ToString() const { |
| std::stringstream ss_; |
| ss_ << "ImplementationError{"; |
| ss_ << ".sequence = " << static_cast<uint64_t>(sequence) << ", "; |
| ss_ << ".bad_value = " << static_cast<uint64_t>(bad_value) << ", "; |
| ss_ << ".minor_opcode = " << static_cast<uint64_t>(minor_opcode) << ", "; |
| ss_ << ".major_opcode = " << static_cast<uint64_t>(major_opcode); |
| ss_ << "}"; |
| return ss_.str(); |
| } |
| |
| template <> |
| void ReadError<ImplementationError>(ImplementationError* error_, |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| |
| auto& sequence = (*error_).sequence; |
| auto& bad_value = (*error_).bad_value; |
| auto& minor_opcode = (*error_).minor_opcode; |
| auto& major_opcode = (*error_).major_opcode; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // error_code |
| uint8_t error_code; |
| Read(&error_code, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // bad_value |
| Read(&bad_value, &buf); |
| |
| // minor_opcode |
| Read(&minor_opcode, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| DCHECK_LE(buf.offset, 32ul); |
| } |
| Future<void> XProto::CreateWindow(const CreateWindowRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& depth = request.depth; |
| auto& wid = request.wid; |
| auto& parent = request.parent; |
| auto& x = request.x; |
| auto& y = request.y; |
| auto& width = request.width; |
| auto& height = request.height; |
| auto& border_width = request.border_width; |
| auto& c_class = request.c_class; |
| auto& visual = request.visual; |
| CreateWindowAttribute value_mask{}; |
| auto& value_list = request; |
| |
| // major_opcode |
| uint8_t major_opcode = 1; |
| buf.Write(&major_opcode); |
| |
| // depth |
| buf.Write(&depth); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // wid |
| buf.Write(&wid); |
| |
| // parent |
| buf.Write(&parent); |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| |
| // width |
| buf.Write(&width); |
| |
| // height |
| buf.Write(&height); |
| |
| // border_width |
| buf.Write(&border_width); |
| |
| // c_class |
| uint16_t tmp26; |
| tmp26 = static_cast<uint16_t>(c_class); |
| buf.Write(&tmp26); |
| |
| // visual |
| buf.Write(&visual); |
| |
| // value_mask |
| SwitchVar(CreateWindowAttribute::BackPixmap, |
| value_list.background_pixmap.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::BackPixel, |
| value_list.background_pixel.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::BorderPixmap, |
| value_list.border_pixmap.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::BorderPixel, |
| value_list.border_pixel.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::BitGravity, |
| value_list.bit_gravity.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::WinGravity, |
| value_list.win_gravity.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::BackingStore, |
| value_list.backing_store.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::BackingPlanes, |
| value_list.backing_planes.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::BackingPixel, |
| value_list.backing_pixel.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::OverrideRedirect, |
| value_list.override_redirect.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::SaveUnder, value_list.save_under.has_value(), |
| true, &value_mask); |
| SwitchVar(CreateWindowAttribute::EventMask, value_list.event_mask.has_value(), |
| true, &value_mask); |
| SwitchVar(CreateWindowAttribute::DontPropagate, |
| value_list.do_not_propogate_mask.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::Colormap, value_list.colormap.has_value(), |
| true, &value_mask); |
| SwitchVar(CreateWindowAttribute::Cursor, value_list.cursor.has_value(), true, |
| &value_mask); |
| uint32_t tmp27; |
| tmp27 = static_cast<uint32_t>(value_mask); |
| buf.Write(&tmp27); |
| |
| // value_list |
| auto value_list_expr = value_mask; |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BackPixmap)) { |
| auto& background_pixmap = *value_list.background_pixmap; |
| |
| // background_pixmap |
| buf.Write(&background_pixmap); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BackPixel)) { |
| auto& background_pixel = *value_list.background_pixel; |
| |
| // background_pixel |
| buf.Write(&background_pixel); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BorderPixmap)) { |
| auto& border_pixmap = *value_list.border_pixmap; |
| |
| // border_pixmap |
| buf.Write(&border_pixmap); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BorderPixel)) { |
| auto& border_pixel = *value_list.border_pixel; |
| |
| // border_pixel |
| buf.Write(&border_pixel); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BitGravity)) { |
| auto& bit_gravity = *value_list.bit_gravity; |
| |
| // bit_gravity |
| uint32_t tmp28; |
| tmp28 = static_cast<uint32_t>(bit_gravity); |
| buf.Write(&tmp28); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::WinGravity)) { |
| auto& win_gravity = *value_list.win_gravity; |
| |
| // win_gravity |
| uint32_t tmp29; |
| tmp29 = static_cast<uint32_t>(win_gravity); |
| buf.Write(&tmp29); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BackingStore)) { |
| auto& backing_store = *value_list.backing_store; |
| |
| // backing_store |
| uint32_t tmp30; |
| tmp30 = static_cast<uint32_t>(backing_store); |
| buf.Write(&tmp30); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BackingPlanes)) { |
| auto& backing_planes = *value_list.backing_planes; |
| |
| // backing_planes |
| buf.Write(&backing_planes); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BackingPixel)) { |
| auto& backing_pixel = *value_list.backing_pixel; |
| |
| // backing_pixel |
| buf.Write(&backing_pixel); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::OverrideRedirect)) { |
| auto& override_redirect = *value_list.override_redirect; |
| |
| // override_redirect |
| buf.Write(&override_redirect); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::SaveUnder)) { |
| auto& save_under = *value_list.save_under; |
| |
| // save_under |
| buf.Write(&save_under); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::EventMask)) { |
| auto& event_mask = *value_list.event_mask; |
| |
| // event_mask |
| uint32_t tmp31; |
| tmp31 = static_cast<uint32_t>(event_mask); |
| buf.Write(&tmp31); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::DontPropagate)) { |
| auto& do_not_propogate_mask = *value_list.do_not_propogate_mask; |
| |
| // do_not_propogate_mask |
| uint32_t tmp32; |
| tmp32 = static_cast<uint32_t>(do_not_propogate_mask); |
| buf.Write(&tmp32); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::Colormap)) { |
| auto& colormap = *value_list.colormap; |
| |
| // colormap |
| buf.Write(&colormap); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::Cursor)) { |
| auto& cursor = *value_list.cursor; |
| |
| // cursor |
| buf.Write(&cursor); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "CreateWindow", false); |
| } |
| |
| Future<void> XProto::CreateWindow( |
| const uint8_t& depth, |
| const Window& wid, |
| const Window& parent, |
| const int16_t& x, |
| const int16_t& y, |
| const uint16_t& width, |
| const uint16_t& height, |
| const uint16_t& border_width, |
| const WindowClass& c_class, |
| const VisualId& visual, |
| const absl::optional<Pixmap>& background_pixmap, |
| const absl::optional<uint32_t>& background_pixel, |
| const absl::optional<Pixmap>& border_pixmap, |
| const absl::optional<uint32_t>& border_pixel, |
| const absl::optional<Gravity>& bit_gravity, |
| const absl::optional<Gravity>& win_gravity, |
| const absl::optional<BackingStore>& backing_store, |
| const absl::optional<uint32_t>& backing_planes, |
| const absl::optional<uint32_t>& backing_pixel, |
| const absl::optional<Bool32>& override_redirect, |
| const absl::optional<Bool32>& save_under, |
| const absl::optional<EventMask>& event_mask, |
| const absl::optional<EventMask>& do_not_propogate_mask, |
| const absl::optional<ColorMap>& colormap, |
| const absl::optional<Cursor>& cursor) { |
| return XProto::CreateWindow(CreateWindowRequest{depth, |
| wid, |
| parent, |
| x, |
| y, |
| width, |
| height, |
| border_width, |
| c_class, |
| visual, |
| background_pixmap, |
| background_pixel, |
| border_pixmap, |
| border_pixel, |
| bit_gravity, |
| win_gravity, |
| backing_store, |
| backing_planes, |
| backing_pixel, |
| override_redirect, |
| save_under, |
| event_mask, |
| do_not_propogate_mask, |
| colormap, |
| cursor}); |
| } |
| |
| Future<void> XProto::ChangeWindowAttributes( |
| const ChangeWindowAttributesRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| CreateWindowAttribute value_mask{}; |
| auto& value_list = request; |
| |
| // major_opcode |
| uint8_t major_opcode = 2; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| // value_mask |
| SwitchVar(CreateWindowAttribute::BackPixmap, |
| value_list.background_pixmap.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::BackPixel, |
| value_list.background_pixel.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::BorderPixmap, |
| value_list.border_pixmap.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::BorderPixel, |
| value_list.border_pixel.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::BitGravity, |
| value_list.bit_gravity.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::WinGravity, |
| value_list.win_gravity.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::BackingStore, |
| value_list.backing_store.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::BackingPlanes, |
| value_list.backing_planes.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::BackingPixel, |
| value_list.backing_pixel.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::OverrideRedirect, |
| value_list.override_redirect.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::SaveUnder, value_list.save_under.has_value(), |
| true, &value_mask); |
| SwitchVar(CreateWindowAttribute::EventMask, value_list.event_mask.has_value(), |
| true, &value_mask); |
| SwitchVar(CreateWindowAttribute::DontPropagate, |
| value_list.do_not_propogate_mask.has_value(), true, &value_mask); |
| SwitchVar(CreateWindowAttribute::Colormap, value_list.colormap.has_value(), |
| true, &value_mask); |
| SwitchVar(CreateWindowAttribute::Cursor, value_list.cursor.has_value(), true, |
| &value_mask); |
| uint32_t tmp33; |
| tmp33 = static_cast<uint32_t>(value_mask); |
| buf.Write(&tmp33); |
| |
| // value_list |
| auto value_list_expr = value_mask; |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BackPixmap)) { |
| auto& background_pixmap = *value_list.background_pixmap; |
| |
| // background_pixmap |
| buf.Write(&background_pixmap); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BackPixel)) { |
| auto& background_pixel = *value_list.background_pixel; |
| |
| // background_pixel |
| buf.Write(&background_pixel); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BorderPixmap)) { |
| auto& border_pixmap = *value_list.border_pixmap; |
| |
| // border_pixmap |
| buf.Write(&border_pixmap); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BorderPixel)) { |
| auto& border_pixel = *value_list.border_pixel; |
| |
| // border_pixel |
| buf.Write(&border_pixel); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BitGravity)) { |
| auto& bit_gravity = *value_list.bit_gravity; |
| |
| // bit_gravity |
| uint32_t tmp34; |
| tmp34 = static_cast<uint32_t>(bit_gravity); |
| buf.Write(&tmp34); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::WinGravity)) { |
| auto& win_gravity = *value_list.win_gravity; |
| |
| // win_gravity |
| uint32_t tmp35; |
| tmp35 = static_cast<uint32_t>(win_gravity); |
| buf.Write(&tmp35); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BackingStore)) { |
| auto& backing_store = *value_list.backing_store; |
| |
| // backing_store |
| uint32_t tmp36; |
| tmp36 = static_cast<uint32_t>(backing_store); |
| buf.Write(&tmp36); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BackingPlanes)) { |
| auto& backing_planes = *value_list.backing_planes; |
| |
| // backing_planes |
| buf.Write(&backing_planes); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::BackingPixel)) { |
| auto& backing_pixel = *value_list.backing_pixel; |
| |
| // backing_pixel |
| buf.Write(&backing_pixel); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::OverrideRedirect)) { |
| auto& override_redirect = *value_list.override_redirect; |
| |
| // override_redirect |
| buf.Write(&override_redirect); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::SaveUnder)) { |
| auto& save_under = *value_list.save_under; |
| |
| // save_under |
| buf.Write(&save_under); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::EventMask)) { |
| auto& event_mask = *value_list.event_mask; |
| |
| // event_mask |
| uint32_t tmp37; |
| tmp37 = static_cast<uint32_t>(event_mask); |
| buf.Write(&tmp37); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::DontPropagate)) { |
| auto& do_not_propogate_mask = *value_list.do_not_propogate_mask; |
| |
| // do_not_propogate_mask |
| uint32_t tmp38; |
| tmp38 = static_cast<uint32_t>(do_not_propogate_mask); |
| buf.Write(&tmp38); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::Colormap)) { |
| auto& colormap = *value_list.colormap; |
| |
| // colormap |
| buf.Write(&colormap); |
| } |
| if (CaseAnd(value_list_expr, CreateWindowAttribute::Cursor)) { |
| auto& cursor = *value_list.cursor; |
| |
| // cursor |
| buf.Write(&cursor); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ChangeWindowAttributes", false); |
| } |
| |
| Future<void> XProto::ChangeWindowAttributes( |
| const Window& window, |
| const absl::optional<Pixmap>& background_pixmap, |
| const absl::optional<uint32_t>& background_pixel, |
| const absl::optional<Pixmap>& border_pixmap, |
| const absl::optional<uint32_t>& border_pixel, |
| const absl::optional<Gravity>& bit_gravity, |
| const absl::optional<Gravity>& win_gravity, |
| const absl::optional<BackingStore>& backing_store, |
| const absl::optional<uint32_t>& backing_planes, |
| const absl::optional<uint32_t>& backing_pixel, |
| const absl::optional<Bool32>& override_redirect, |
| const absl::optional<Bool32>& save_under, |
| const absl::optional<EventMask>& event_mask, |
| const absl::optional<EventMask>& do_not_propogate_mask, |
| const absl::optional<ColorMap>& colormap, |
| const absl::optional<Cursor>& cursor) { |
| return XProto::ChangeWindowAttributes(ChangeWindowAttributesRequest{ |
| window, background_pixmap, background_pixel, border_pixmap, border_pixel, |
| bit_gravity, win_gravity, backing_store, backing_planes, backing_pixel, |
| override_redirect, save_under, event_mask, do_not_propogate_mask, |
| colormap, cursor}); |
| } |
| |
| Future<GetWindowAttributesReply> XProto::GetWindowAttributes( |
| const GetWindowAttributesRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| |
| // major_opcode |
| uint8_t major_opcode = 3; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GetWindowAttributesReply>( |
| &buf, "GetWindowAttributes", false); |
| } |
| |
| Future<GetWindowAttributesReply> XProto::GetWindowAttributes( |
| const Window& window) { |
| return XProto::GetWindowAttributes(GetWindowAttributesRequest{window}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GetWindowAttributesReply> detail::ReadReply< |
| GetWindowAttributesReply>(ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GetWindowAttributesReply>(); |
| |
| auto& backing_store = (*reply).backing_store; |
| auto& sequence = (*reply).sequence; |
| auto& visual = (*reply).visual; |
| auto& c_class = (*reply).c_class; |
| auto& bit_gravity = (*reply).bit_gravity; |
| auto& win_gravity = (*reply).win_gravity; |
| auto& backing_planes = (*reply).backing_planes; |
| auto& backing_pixel = (*reply).backing_pixel; |
| auto& save_under = (*reply).save_under; |
| auto& map_is_installed = (*reply).map_is_installed; |
| auto& map_state = (*reply).map_state; |
| auto& override_redirect = (*reply).override_redirect; |
| auto& colormap = (*reply).colormap; |
| auto& all_event_masks = (*reply).all_event_masks; |
| auto& your_event_mask = (*reply).your_event_mask; |
| auto& do_not_propagate_mask = (*reply).do_not_propagate_mask; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // backing_store |
| uint8_t tmp39; |
| Read(&tmp39, &buf); |
| backing_store = static_cast<BackingStore>(tmp39); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // visual |
| Read(&visual, &buf); |
| |
| // c_class |
| uint16_t tmp40; |
| Read(&tmp40, &buf); |
| c_class = static_cast<WindowClass>(tmp40); |
| |
| // bit_gravity |
| uint8_t tmp41; |
| Read(&tmp41, &buf); |
| bit_gravity = static_cast<Gravity>(tmp41); |
| |
| // win_gravity |
| uint8_t tmp42; |
| Read(&tmp42, &buf); |
| win_gravity = static_cast<Gravity>(tmp42); |
| |
| // backing_planes |
| Read(&backing_planes, &buf); |
| |
| // backing_pixel |
| Read(&backing_pixel, &buf); |
| |
| // save_under |
| Read(&save_under, &buf); |
| |
| // map_is_installed |
| Read(&map_is_installed, &buf); |
| |
| // map_state |
| uint8_t tmp43; |
| Read(&tmp43, &buf); |
| map_state = static_cast<MapState>(tmp43); |
| |
| // override_redirect |
| Read(&override_redirect, &buf); |
| |
| // colormap |
| Read(&colormap, &buf); |
| |
| // all_event_masks |
| uint32_t tmp44; |
| Read(&tmp44, &buf); |
| all_event_masks = static_cast<EventMask>(tmp44); |
| |
| // your_event_mask |
| uint32_t tmp45; |
| Read(&tmp45, &buf); |
| your_event_mask = static_cast<EventMask>(tmp45); |
| |
| // do_not_propagate_mask |
| uint16_t tmp46; |
| Read(&tmp46, &buf); |
| do_not_propagate_mask = static_cast<EventMask>(tmp46); |
| |
| // pad0 |
| Pad(&buf, 2); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::DestroyWindow(const DestroyWindowRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| |
| // major_opcode |
| uint8_t major_opcode = 4; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "DestroyWindow", false); |
| } |
| |
| Future<void> XProto::DestroyWindow(const Window& window) { |
| return XProto::DestroyWindow(DestroyWindowRequest{window}); |
| } |
| |
| Future<void> XProto::DestroySubwindows( |
| const DestroySubwindowsRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| |
| // major_opcode |
| uint8_t major_opcode = 5; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "DestroySubwindows", false); |
| } |
| |
| Future<void> XProto::DestroySubwindows(const Window& window) { |
| return XProto::DestroySubwindows(DestroySubwindowsRequest{window}); |
| } |
| |
| Future<void> XProto::ChangeSaveSet(const ChangeSaveSetRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& mode = request.mode; |
| auto& window = request.window; |
| |
| // major_opcode |
| uint8_t major_opcode = 6; |
| buf.Write(&major_opcode); |
| |
| // mode |
| uint8_t tmp47; |
| tmp47 = static_cast<uint8_t>(mode); |
| buf.Write(&tmp47); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ChangeSaveSet", false); |
| } |
| |
| Future<void> XProto::ChangeSaveSet(const SetMode& mode, const Window& window) { |
| return XProto::ChangeSaveSet(ChangeSaveSetRequest{mode, window}); |
| } |
| |
| Future<void> XProto::ReparentWindow(const ReparentWindowRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| auto& parent = request.parent; |
| auto& x = request.x; |
| auto& y = request.y; |
| |
| // major_opcode |
| uint8_t major_opcode = 7; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| // parent |
| buf.Write(&parent); |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ReparentWindow", false); |
| } |
| |
| Future<void> XProto::ReparentWindow(const Window& window, |
| const Window& parent, |
| const int16_t& x, |
| const int16_t& y) { |
| return XProto::ReparentWindow(ReparentWindowRequest{window, parent, x, y}); |
| } |
| |
| Future<void> XProto::MapWindow(const MapWindowRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| |
| // major_opcode |
| uint8_t major_opcode = 8; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "MapWindow", false); |
| } |
| |
| Future<void> XProto::MapWindow(const Window& window) { |
| return XProto::MapWindow(MapWindowRequest{window}); |
| } |
| |
| Future<void> XProto::MapSubwindows(const MapSubwindowsRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| |
| // major_opcode |
| uint8_t major_opcode = 9; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "MapSubwindows", false); |
| } |
| |
| Future<void> XProto::MapSubwindows(const Window& window) { |
| return XProto::MapSubwindows(MapSubwindowsRequest{window}); |
| } |
| |
| Future<void> XProto::UnmapWindow(const UnmapWindowRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| |
| // major_opcode |
| uint8_t major_opcode = 10; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "UnmapWindow", false); |
| } |
| |
| Future<void> XProto::UnmapWindow(const Window& window) { |
| return XProto::UnmapWindow(UnmapWindowRequest{window}); |
| } |
| |
| Future<void> XProto::UnmapSubwindows(const UnmapSubwindowsRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| |
| // major_opcode |
| uint8_t major_opcode = 11; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "UnmapSubwindows", false); |
| } |
| |
| Future<void> XProto::UnmapSubwindows(const Window& window) { |
| return XProto::UnmapSubwindows(UnmapSubwindowsRequest{window}); |
| } |
| |
| Future<void> XProto::ConfigureWindow(const ConfigureWindowRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| ConfigWindow value_mask{}; |
| auto& value_list = request; |
| |
| // major_opcode |
| uint8_t major_opcode = 12; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| // value_mask |
| SwitchVar(ConfigWindow::X, value_list.x.has_value(), true, &value_mask); |
| SwitchVar(ConfigWindow::Y, value_list.y.has_value(), true, &value_mask); |
| SwitchVar(ConfigWindow::Width, value_list.width.has_value(), true, |
| &value_mask); |
| SwitchVar(ConfigWindow::Height, value_list.height.has_value(), true, |
| &value_mask); |
| SwitchVar(ConfigWindow::BorderWidth, value_list.border_width.has_value(), |
| true, &value_mask); |
| SwitchVar(ConfigWindow::Sibling, value_list.sibling.has_value(), true, |
| &value_mask); |
| SwitchVar(ConfigWindow::StackMode, value_list.stack_mode.has_value(), true, |
| &value_mask); |
| uint16_t tmp48; |
| tmp48 = static_cast<uint16_t>(value_mask); |
| buf.Write(&tmp48); |
| |
| // pad1 |
| Pad(&buf, 2); |
| |
| // value_list |
| auto value_list_expr = value_mask; |
| if (CaseAnd(value_list_expr, ConfigWindow::X)) { |
| auto& x = *value_list.x; |
| |
| // x |
| buf.Write(&x); |
| } |
| if (CaseAnd(value_list_expr, ConfigWindow::Y)) { |
| auto& y = *value_list.y; |
| |
| // y |
| buf.Write(&y); |
| } |
| if (CaseAnd(value_list_expr, ConfigWindow::Width)) { |
| auto& width = *value_list.width; |
| |
| // width |
| buf.Write(&width); |
| } |
| if (CaseAnd(value_list_expr, ConfigWindow::Height)) { |
| auto& height = *value_list.height; |
| |
| // height |
| buf.Write(&height); |
| } |
| if (CaseAnd(value_list_expr, ConfigWindow::BorderWidth)) { |
| auto& border_width = *value_list.border_width; |
| |
| // border_width |
| buf.Write(&border_width); |
| } |
| if (CaseAnd(value_list_expr, ConfigWindow::Sibling)) { |
| auto& sibling = *value_list.sibling; |
| |
| // sibling |
| buf.Write(&sibling); |
| } |
| if (CaseAnd(value_list_expr, ConfigWindow::StackMode)) { |
| auto& stack_mode = *value_list.stack_mode; |
| |
| // stack_mode |
| uint32_t tmp49; |
| tmp49 = static_cast<uint32_t>(stack_mode); |
| buf.Write(&tmp49); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ConfigureWindow", false); |
| } |
| |
| Future<void> XProto::ConfigureWindow( |
| const Window& window, |
| const absl::optional<int32_t>& x, |
| const absl::optional<int32_t>& y, |
| const absl::optional<uint32_t>& width, |
| const absl::optional<uint32_t>& height, |
| const absl::optional<uint32_t>& border_width, |
| const absl::optional<Window>& sibling, |
| const absl::optional<StackMode>& stack_mode) { |
| return XProto::ConfigureWindow(ConfigureWindowRequest{ |
| window, x, y, width, height, border_width, sibling, stack_mode}); |
| } |
| |
| Future<void> XProto::CirculateWindow(const CirculateWindowRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& direction = request.direction; |
| auto& window = request.window; |
| |
| // major_opcode |
| uint8_t major_opcode = 13; |
| buf.Write(&major_opcode); |
| |
| // direction |
| uint8_t tmp50; |
| tmp50 = static_cast<uint8_t>(direction); |
| buf.Write(&tmp50); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "CirculateWindow", false); |
| } |
| |
| Future<void> XProto::CirculateWindow(const Circulate& direction, |
| const Window& window) { |
| return XProto::CirculateWindow(CirculateWindowRequest{direction, window}); |
| } |
| |
| Future<GetGeometryReply> XProto::GetGeometry( |
| const GetGeometryRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& drawable = request.drawable; |
| |
| // major_opcode |
| uint8_t major_opcode = 14; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GetGeometryReply>(&buf, "GetGeometry", false); |
| } |
| |
| Future<GetGeometryReply> XProto::GetGeometry(const Drawable& drawable) { |
| return XProto::GetGeometry(GetGeometryRequest{drawable}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GetGeometryReply> detail::ReadReply<GetGeometryReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GetGeometryReply>(); |
| |
| auto& depth = (*reply).depth; |
| auto& sequence = (*reply).sequence; |
| auto& root = (*reply).root; |
| auto& x = (*reply).x; |
| auto& y = (*reply).y; |
| auto& width = (*reply).width; |
| auto& height = (*reply).height; |
| auto& border_width = (*reply).border_width; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // depth |
| Read(&depth, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // root |
| Read(&root, &buf); |
| |
| // x |
| Read(&x, &buf); |
| |
| // y |
| Read(&y, &buf); |
| |
| // width |
| Read(&width, &buf); |
| |
| // height |
| Read(&height, &buf); |
| |
| // border_width |
| Read(&border_width, &buf); |
| |
| // pad0 |
| Pad(&buf, 2); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<QueryTreeReply> XProto::QueryTree(const QueryTreeRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| |
| // major_opcode |
| uint8_t major_opcode = 15; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<QueryTreeReply>(&buf, "QueryTree", false); |
| } |
| |
| Future<QueryTreeReply> XProto::QueryTree(const Window& window) { |
| return XProto::QueryTree(QueryTreeRequest{window}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<QueryTreeReply> detail::ReadReply<QueryTreeReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<QueryTreeReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| auto& root = (*reply).root; |
| auto& parent = (*reply).parent; |
| uint16_t children_len{}; |
| auto& children = (*reply).children; |
| |
| // 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); |
| |
| // root |
| Read(&root, &buf); |
| |
| // parent |
| Read(&parent, &buf); |
| |
| // children_len |
| Read(&children_len, &buf); |
| |
| // pad1 |
| Pad(&buf, 14); |
| |
| // children |
| children.resize(children_len); |
| for (auto& children_elem : children) { |
| // children_elem |
| Read(&children_elem, &buf); |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<InternAtomReply> XProto::InternAtom(const InternAtomRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& only_if_exists = request.only_if_exists; |
| uint16_t name_len{}; |
| auto& name = request.name; |
| |
| // major_opcode |
| uint8_t major_opcode = 16; |
| buf.Write(&major_opcode); |
| |
| // only_if_exists |
| buf.Write(&only_if_exists); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // name_len |
| name_len = name.size(); |
| buf.Write(&name_len); |
| |
| // pad0 |
| Pad(&buf, 2); |
| |
| // name |
| DCHECK_EQ(static_cast<size_t>(name_len), name.size()); |
| for (auto& name_elem : name) { |
| // name_elem |
| buf.Write(&name_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<InternAtomReply>(&buf, "InternAtom", false); |
| } |
| |
| Future<InternAtomReply> XProto::InternAtom(const uint8_t& only_if_exists, |
| const std::string& name) { |
| return XProto::InternAtom(InternAtomRequest{only_if_exists, name}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<InternAtomReply> detail::ReadReply<InternAtomReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<InternAtomReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| auto& atom = (*reply).atom; |
| |
| // 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); |
| |
| // atom |
| Read(&atom, &buf); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<GetAtomNameReply> XProto::GetAtomName( |
| const GetAtomNameRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& atom = request.atom; |
| |
| // major_opcode |
| uint8_t major_opcode = 17; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // atom |
| buf.Write(&atom); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GetAtomNameReply>(&buf, "GetAtomName", false); |
| } |
| |
| Future<GetAtomNameReply> XProto::GetAtomName(const Atom& atom) { |
| return XProto::GetAtomName(GetAtomNameRequest{atom}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GetAtomNameReply> detail::ReadReply<GetAtomNameReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GetAtomNameReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| uint16_t name_len{}; |
| auto& name = (*reply).name; |
| |
| // 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); |
| |
| // name_len |
| Read(&name_len, &buf); |
| |
| // pad1 |
| Pad(&buf, 22); |
| |
| // name |
| name.resize(name_len); |
| for (auto& name_elem : name) { |
| // name_elem |
| Read(&name_elem, &buf); |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::ChangeProperty(const ChangePropertyRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& mode = request.mode; |
| auto& window = request.window; |
| auto& property = request.property; |
| auto& type = request.type; |
| auto& format = request.format; |
| auto& data_len = request.data_len; |
| auto& data = request.data; |
| |
| // major_opcode |
| uint8_t major_opcode = 18; |
| buf.Write(&major_opcode); |
| |
| // mode |
| uint8_t tmp51; |
| tmp51 = static_cast<uint8_t>(mode); |
| buf.Write(&tmp51); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| // property |
| buf.Write(&property); |
| |
| // type |
| buf.Write(&type); |
| |
| // format |
| buf.Write(&format); |
| |
| // pad0 |
| Pad(&buf, 3); |
| |
| // data_len |
| buf.Write(&data_len); |
| |
| // data |
| buf.AppendBuffer(data, ((data_len) * (format)) / (8)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ChangeProperty", false); |
| } |
| |
| Future<void> XProto::ChangeProperty( |
| const PropMode& mode, |
| const Window& window, |
| const Atom& property, |
| const Atom& type, |
| const uint8_t& format, |
| const uint32_t& data_len, |
| const scoped_refptr<base::RefCountedMemory>& data) { |
| return XProto::ChangeProperty(ChangePropertyRequest{ |
| mode, window, property, type, format, data_len, data}); |
| } |
| |
| Future<void> XProto::DeleteProperty(const DeletePropertyRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| auto& property = request.property; |
| |
| // major_opcode |
| uint8_t major_opcode = 19; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| // property |
| buf.Write(&property); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "DeleteProperty", false); |
| } |
| |
| Future<void> XProto::DeleteProperty(const Window& window, |
| const Atom& property) { |
| return XProto::DeleteProperty(DeletePropertyRequest{window, property}); |
| } |
| |
| Future<GetPropertyReply> XProto::GetProperty( |
| const GetPropertyRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& c_delete = request.c_delete; |
| auto& window = request.window; |
| auto& property = request.property; |
| auto& type = request.type; |
| auto& long_offset = request.long_offset; |
| auto& long_length = request.long_length; |
| |
| // major_opcode |
| uint8_t major_opcode = 20; |
| buf.Write(&major_opcode); |
| |
| // c_delete |
| buf.Write(&c_delete); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| // property |
| buf.Write(&property); |
| |
| // type |
| buf.Write(&type); |
| |
| // long_offset |
| buf.Write(&long_offset); |
| |
| // long_length |
| buf.Write(&long_length); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GetPropertyReply>(&buf, "GetProperty", false); |
| } |
| |
| Future<GetPropertyReply> XProto::GetProperty(const uint8_t& c_delete, |
| const Window& window, |
| const Atom& property, |
| const Atom& type, |
| const uint32_t& long_offset, |
| const uint32_t& long_length) { |
| return XProto::GetProperty(GetPropertyRequest{ |
| c_delete, window, property, type, long_offset, long_length}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GetPropertyReply> detail::ReadReply<GetPropertyReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GetPropertyReply>(); |
| |
| auto& format = (*reply).format; |
| auto& sequence = (*reply).sequence; |
| auto& type = (*reply).type; |
| auto& bytes_after = (*reply).bytes_after; |
| auto& value_len = (*reply).value_len; |
| auto& value = (*reply).value; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // format |
| Read(&format, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // type |
| Read(&type, &buf); |
| |
| // bytes_after |
| Read(&bytes_after, &buf); |
| |
| // value_len |
| Read(&value_len, &buf); |
| |
| // pad0 |
| Pad(&buf, 12); |
| |
| // value |
| value = buffer->ReadAndAdvance((value_len) * ((format) / (8))); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<ListPropertiesReply> XProto::ListProperties( |
| const ListPropertiesRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| |
| // major_opcode |
| uint8_t major_opcode = 21; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<ListPropertiesReply>(&buf, "ListProperties", |
| false); |
| } |
| |
| Future<ListPropertiesReply> XProto::ListProperties(const Window& window) { |
| return XProto::ListProperties(ListPropertiesRequest{window}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<ListPropertiesReply> detail::ReadReply<ListPropertiesReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<ListPropertiesReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| uint16_t atoms_len{}; |
| auto& atoms = (*reply).atoms; |
| |
| // 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); |
| |
| // atoms_len |
| Read(&atoms_len, &buf); |
| |
| // pad1 |
| Pad(&buf, 22); |
| |
| // atoms |
| atoms.resize(atoms_len); |
| for (auto& atoms_elem : atoms) { |
| // atoms_elem |
| Read(&atoms_elem, &buf); |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::SetSelectionOwner( |
| const SetSelectionOwnerRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& owner = request.owner; |
| auto& selection = request.selection; |
| auto& time = request.time; |
| |
| // major_opcode |
| uint8_t major_opcode = 22; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // owner |
| buf.Write(&owner); |
| |
| // selection |
| buf.Write(&selection); |
| |
| // time |
| buf.Write(&time); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "SetSelectionOwner", false); |
| } |
| |
| Future<void> XProto::SetSelectionOwner(const Window& owner, |
| const Atom& selection, |
| const Time& time) { |
| return XProto::SetSelectionOwner( |
| SetSelectionOwnerRequest{owner, selection, time}); |
| } |
| |
| Future<GetSelectionOwnerReply> XProto::GetSelectionOwner( |
| const GetSelectionOwnerRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& selection = request.selection; |
| |
| // major_opcode |
| uint8_t major_opcode = 23; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // selection |
| buf.Write(&selection); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GetSelectionOwnerReply>( |
| &buf, "GetSelectionOwner", false); |
| } |
| |
| Future<GetSelectionOwnerReply> XProto::GetSelectionOwner( |
| const Atom& selection) { |
| return XProto::GetSelectionOwner(GetSelectionOwnerRequest{selection}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GetSelectionOwnerReply> detail::ReadReply< |
| GetSelectionOwnerReply>(ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GetSelectionOwnerReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| auto& owner = (*reply).owner; |
| |
| // 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); |
| |
| // owner |
| Read(&owner, &buf); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::ConvertSelection(const ConvertSelectionRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& requestor = request.requestor; |
| auto& selection = request.selection; |
| auto& target = request.target; |
| auto& property = request.property; |
| auto& time = request.time; |
| |
| // major_opcode |
| uint8_t major_opcode = 24; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // requestor |
| buf.Write(&requestor); |
| |
| // selection |
| buf.Write(&selection); |
| |
| // target |
| buf.Write(&target); |
| |
| // property |
| buf.Write(&property); |
| |
| // time |
| buf.Write(&time); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ConvertSelection", false); |
| } |
| |
| Future<void> XProto::ConvertSelection(const Window& requestor, |
| const Atom& selection, |
| const Atom& target, |
| const Atom& property, |
| const Time& time) { |
| return XProto::ConvertSelection( |
| ConvertSelectionRequest{requestor, selection, target, property, time}); |
| } |
| |
| Future<void> XProto::SendEvent(const SendEventRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& propagate = request.propagate; |
| auto& destination = request.destination; |
| auto& event_mask = request.event_mask; |
| auto& event = request.event; |
| size_t event_len = event.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 25; |
| buf.Write(&major_opcode); |
| |
| // propagate |
| buf.Write(&propagate); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // destination |
| buf.Write(&destination); |
| |
| // event_mask |
| uint32_t tmp52; |
| tmp52 = static_cast<uint32_t>(event_mask); |
| buf.Write(&tmp52); |
| |
| // event |
| for (auto& event_elem : event) { |
| // event_elem |
| buf.Write(&event_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "SendEvent", false); |
| } |
| |
| Future<void> XProto::SendEvent(const uint8_t& propagate, |
| const Window& destination, |
| const EventMask& event_mask, |
| const std::array<char, 32>& event) { |
| return XProto::SendEvent( |
| SendEventRequest{propagate, destination, event_mask, event}); |
| } |
| |
| Future<GrabPointerReply> XProto::GrabPointer( |
| const GrabPointerRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& owner_events = request.owner_events; |
| auto& grab_window = request.grab_window; |
| auto& event_mask = request.event_mask; |
| auto& pointer_mode = request.pointer_mode; |
| auto& keyboard_mode = request.keyboard_mode; |
| auto& confine_to = request.confine_to; |
| auto& cursor = request.cursor; |
| auto& time = request.time; |
| |
| // major_opcode |
| uint8_t major_opcode = 26; |
| buf.Write(&major_opcode); |
| |
| // owner_events |
| buf.Write(&owner_events); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // grab_window |
| buf.Write(&grab_window); |
| |
| // event_mask |
| uint16_t tmp53; |
| tmp53 = static_cast<uint16_t>(event_mask); |
| buf.Write(&tmp53); |
| |
| // pointer_mode |
| uint8_t tmp54; |
| tmp54 = static_cast<uint8_t>(pointer_mode); |
| buf.Write(&tmp54); |
| |
| // keyboard_mode |
| uint8_t tmp55; |
| tmp55 = static_cast<uint8_t>(keyboard_mode); |
| buf.Write(&tmp55); |
| |
| // confine_to |
| buf.Write(&confine_to); |
| |
| // cursor |
| buf.Write(&cursor); |
| |
| // time |
| buf.Write(&time); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GrabPointerReply>(&buf, "GrabPointer", false); |
| } |
| |
| Future<GrabPointerReply> XProto::GrabPointer(const uint8_t& owner_events, |
| const Window& grab_window, |
| const EventMask& event_mask, |
| const GrabMode& pointer_mode, |
| const GrabMode& keyboard_mode, |
| const Window& confine_to, |
| const Cursor& cursor, |
| const Time& time) { |
| return XProto::GrabPointer( |
| GrabPointerRequest{owner_events, grab_window, event_mask, pointer_mode, |
| keyboard_mode, confine_to, cursor, time}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GrabPointerReply> detail::ReadReply<GrabPointerReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GrabPointerReply>(); |
| |
| auto& status = (*reply).status; |
| auto& sequence = (*reply).sequence; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // status |
| uint8_t tmp56; |
| Read(&tmp56, &buf); |
| status = static_cast<GrabStatus>(tmp56); |
| |
| // 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> XProto::UngrabPointer(const UngrabPointerRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& time = request.time; |
| |
| // major_opcode |
| uint8_t major_opcode = 27; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // time |
| buf.Write(&time); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "UngrabPointer", false); |
| } |
| |
| Future<void> XProto::UngrabPointer(const Time& time) { |
| return XProto::UngrabPointer(UngrabPointerRequest{time}); |
| } |
| |
| Future<void> XProto::GrabButton(const GrabButtonRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& owner_events = request.owner_events; |
| auto& grab_window = request.grab_window; |
| auto& event_mask = request.event_mask; |
| auto& pointer_mode = request.pointer_mode; |
| auto& keyboard_mode = request.keyboard_mode; |
| auto& confine_to = request.confine_to; |
| auto& cursor = request.cursor; |
| auto& button = request.button; |
| auto& modifiers = request.modifiers; |
| |
| // major_opcode |
| uint8_t major_opcode = 28; |
| buf.Write(&major_opcode); |
| |
| // owner_events |
| buf.Write(&owner_events); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // grab_window |
| buf.Write(&grab_window); |
| |
| // event_mask |
| uint16_t tmp57; |
| tmp57 = static_cast<uint16_t>(event_mask); |
| buf.Write(&tmp57); |
| |
| // pointer_mode |
| uint8_t tmp58; |
| tmp58 = static_cast<uint8_t>(pointer_mode); |
| buf.Write(&tmp58); |
| |
| // keyboard_mode |
| uint8_t tmp59; |
| tmp59 = static_cast<uint8_t>(keyboard_mode); |
| buf.Write(&tmp59); |
| |
| // confine_to |
| buf.Write(&confine_to); |
| |
| // cursor |
| buf.Write(&cursor); |
| |
| // button |
| uint8_t tmp60; |
| tmp60 = static_cast<uint8_t>(button); |
| buf.Write(&tmp60); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // modifiers |
| uint16_t tmp61; |
| tmp61 = static_cast<uint16_t>(modifiers); |
| buf.Write(&tmp61); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "GrabButton", false); |
| } |
| |
| Future<void> XProto::GrabButton(const uint8_t& owner_events, |
| const Window& grab_window, |
| const EventMask& event_mask, |
| const GrabMode& pointer_mode, |
| const GrabMode& keyboard_mode, |
| const Window& confine_to, |
| const Cursor& cursor, |
| const ButtonIndex& button, |
| const ModMask& modifiers) { |
| return XProto::GrabButton( |
| GrabButtonRequest{owner_events, grab_window, event_mask, pointer_mode, |
| keyboard_mode, confine_to, cursor, button, modifiers}); |
| } |
| |
| Future<void> XProto::UngrabButton(const UngrabButtonRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& button = request.button; |
| auto& grab_window = request.grab_window; |
| auto& modifiers = request.modifiers; |
| |
| // major_opcode |
| uint8_t major_opcode = 29; |
| buf.Write(&major_opcode); |
| |
| // button |
| uint8_t tmp62; |
| tmp62 = static_cast<uint8_t>(button); |
| buf.Write(&tmp62); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // grab_window |
| buf.Write(&grab_window); |
| |
| // modifiers |
| uint16_t tmp63; |
| tmp63 = static_cast<uint16_t>(modifiers); |
| buf.Write(&tmp63); |
| |
| // pad0 |
| Pad(&buf, 2); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "UngrabButton", false); |
| } |
| |
| Future<void> XProto::UngrabButton(const ButtonIndex& button, |
| const Window& grab_window, |
| const ModMask& modifiers) { |
| return XProto::UngrabButton( |
| UngrabButtonRequest{button, grab_window, modifiers}); |
| } |
| |
| Future<void> XProto::ChangeActivePointerGrab( |
| const ChangeActivePointerGrabRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& cursor = request.cursor; |
| auto& time = request.time; |
| auto& event_mask = request.event_mask; |
| |
| // major_opcode |
| uint8_t major_opcode = 30; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cursor |
| buf.Write(&cursor); |
| |
| // time |
| buf.Write(&time); |
| |
| // event_mask |
| uint16_t tmp64; |
| tmp64 = static_cast<uint16_t>(event_mask); |
| buf.Write(&tmp64); |
| |
| // pad1 |
| Pad(&buf, 2); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ChangeActivePointerGrab", false); |
| } |
| |
| Future<void> XProto::ChangeActivePointerGrab(const Cursor& cursor, |
| const Time& time, |
| const EventMask& event_mask) { |
| return XProto::ChangeActivePointerGrab( |
| ChangeActivePointerGrabRequest{cursor, time, event_mask}); |
| } |
| |
| Future<GrabKeyboardReply> XProto::GrabKeyboard( |
| const GrabKeyboardRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& owner_events = request.owner_events; |
| auto& grab_window = request.grab_window; |
| auto& time = request.time; |
| auto& pointer_mode = request.pointer_mode; |
| auto& keyboard_mode = request.keyboard_mode; |
| |
| // major_opcode |
| uint8_t major_opcode = 31; |
| buf.Write(&major_opcode); |
| |
| // owner_events |
| buf.Write(&owner_events); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // grab_window |
| buf.Write(&grab_window); |
| |
| // time |
| buf.Write(&time); |
| |
| // pointer_mode |
| uint8_t tmp65; |
| tmp65 = static_cast<uint8_t>(pointer_mode); |
| buf.Write(&tmp65); |
| |
| // keyboard_mode |
| uint8_t tmp66; |
| tmp66 = static_cast<uint8_t>(keyboard_mode); |
| buf.Write(&tmp66); |
| |
| // pad0 |
| Pad(&buf, 2); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GrabKeyboardReply>(&buf, "GrabKeyboard", |
| false); |
| } |
| |
| Future<GrabKeyboardReply> XProto::GrabKeyboard(const uint8_t& owner_events, |
| const Window& grab_window, |
| const Time& time, |
| const GrabMode& pointer_mode, |
| const GrabMode& keyboard_mode) { |
| return XProto::GrabKeyboard(GrabKeyboardRequest{ |
| owner_events, grab_window, time, pointer_mode, keyboard_mode}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GrabKeyboardReply> detail::ReadReply<GrabKeyboardReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GrabKeyboardReply>(); |
| |
| auto& status = (*reply).status; |
| auto& sequence = (*reply).sequence; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // status |
| uint8_t tmp67; |
| Read(&tmp67, &buf); |
| status = static_cast<GrabStatus>(tmp67); |
| |
| // 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> XProto::UngrabKeyboard(const UngrabKeyboardRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& time = request.time; |
| |
| // major_opcode |
| uint8_t major_opcode = 32; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // time |
| buf.Write(&time); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "UngrabKeyboard", false); |
| } |
| |
| Future<void> XProto::UngrabKeyboard(const Time& time) { |
| return XProto::UngrabKeyboard(UngrabKeyboardRequest{time}); |
| } |
| |
| Future<void> XProto::GrabKey(const GrabKeyRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& owner_events = request.owner_events; |
| auto& grab_window = request.grab_window; |
| auto& modifiers = request.modifiers; |
| auto& key = request.key; |
| auto& pointer_mode = request.pointer_mode; |
| auto& keyboard_mode = request.keyboard_mode; |
| |
| // major_opcode |
| uint8_t major_opcode = 33; |
| buf.Write(&major_opcode); |
| |
| // owner_events |
| buf.Write(&owner_events); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // grab_window |
| buf.Write(&grab_window); |
| |
| // modifiers |
| uint16_t tmp68; |
| tmp68 = static_cast<uint16_t>(modifiers); |
| buf.Write(&tmp68); |
| |
| // key |
| buf.Write(&key); |
| |
| // pointer_mode |
| uint8_t tmp69; |
| tmp69 = static_cast<uint8_t>(pointer_mode); |
| buf.Write(&tmp69); |
| |
| // keyboard_mode |
| uint8_t tmp70; |
| tmp70 = static_cast<uint8_t>(keyboard_mode); |
| buf.Write(&tmp70); |
| |
| // pad0 |
| Pad(&buf, 3); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "GrabKey", false); |
| } |
| |
| Future<void> XProto::GrabKey(const uint8_t& owner_events, |
| const Window& grab_window, |
| const ModMask& modifiers, |
| const KeyCode& key, |
| const GrabMode& pointer_mode, |
| const GrabMode& keyboard_mode) { |
| return XProto::GrabKey(GrabKeyRequest{owner_events, grab_window, modifiers, |
| key, pointer_mode, keyboard_mode}); |
| } |
| |
| Future<void> XProto::UngrabKey(const UngrabKeyRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& key = request.key; |
| auto& grab_window = request.grab_window; |
| auto& modifiers = request.modifiers; |
| |
| // major_opcode |
| uint8_t major_opcode = 34; |
| buf.Write(&major_opcode); |
| |
| // key |
| buf.Write(&key); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // grab_window |
| buf.Write(&grab_window); |
| |
| // modifiers |
| uint16_t tmp71; |
| tmp71 = static_cast<uint16_t>(modifiers); |
| buf.Write(&tmp71); |
| |
| // pad0 |
| Pad(&buf, 2); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "UngrabKey", false); |
| } |
| |
| Future<void> XProto::UngrabKey(const KeyCode& key, |
| const Window& grab_window, |
| const ModMask& modifiers) { |
| return XProto::UngrabKey(UngrabKeyRequest{key, grab_window, modifiers}); |
| } |
| |
| Future<void> XProto::AllowEvents(const AllowEventsRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& mode = request.mode; |
| auto& time = request.time; |
| |
| // major_opcode |
| uint8_t major_opcode = 35; |
| buf.Write(&major_opcode); |
| |
| // mode |
| uint8_t tmp72; |
| tmp72 = static_cast<uint8_t>(mode); |
| buf.Write(&tmp72); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // time |
| buf.Write(&time); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "AllowEvents", false); |
| } |
| |
| Future<void> XProto::AllowEvents(const Allow& mode, const Time& time) { |
| return XProto::AllowEvents(AllowEventsRequest{mode, time}); |
| } |
| |
| Future<void> XProto::GrabServer(const GrabServerRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| // major_opcode |
| uint8_t major_opcode = 36; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "GrabServer", false); |
| } |
| |
| Future<void> XProto::GrabServer() { |
| return XProto::GrabServer(GrabServerRequest{}); |
| } |
| |
| Future<void> XProto::UngrabServer(const UngrabServerRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| // major_opcode |
| uint8_t major_opcode = 37; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "UngrabServer", false); |
| } |
| |
| Future<void> XProto::UngrabServer() { |
| return XProto::UngrabServer(UngrabServerRequest{}); |
| } |
| |
| Future<QueryPointerReply> XProto::QueryPointer( |
| const QueryPointerRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| |
| // major_opcode |
| uint8_t major_opcode = 38; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<QueryPointerReply>(&buf, "QueryPointer", |
| false); |
| } |
| |
| Future<QueryPointerReply> XProto::QueryPointer(const Window& window) { |
| return XProto::QueryPointer(QueryPointerRequest{window}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<QueryPointerReply> detail::ReadReply<QueryPointerReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<QueryPointerReply>(); |
| |
| auto& same_screen = (*reply).same_screen; |
| auto& sequence = (*reply).sequence; |
| auto& root = (*reply).root; |
| auto& child = (*reply).child; |
| auto& root_x = (*reply).root_x; |
| auto& root_y = (*reply).root_y; |
| auto& win_x = (*reply).win_x; |
| auto& win_y = (*reply).win_y; |
| auto& mask = (*reply).mask; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // same_screen |
| Read(&same_screen, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // root |
| Read(&root, &buf); |
| |
| // child |
| Read(&child, &buf); |
| |
| // root_x |
| Read(&root_x, &buf); |
| |
| // root_y |
| Read(&root_y, &buf); |
| |
| // win_x |
| Read(&win_x, &buf); |
| |
| // win_y |
| Read(&win_y, &buf); |
| |
| // mask |
| uint16_t tmp73; |
| Read(&tmp73, &buf); |
| mask = static_cast<KeyButMask>(tmp73); |
| |
| // pad0 |
| Pad(&buf, 2); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<GetMotionEventsReply> XProto::GetMotionEvents( |
| const GetMotionEventsRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| auto& start = request.start; |
| auto& stop = request.stop; |
| |
| // major_opcode |
| uint8_t major_opcode = 39; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| // start |
| buf.Write(&start); |
| |
| // stop |
| buf.Write(&stop); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GetMotionEventsReply>(&buf, "GetMotionEvents", |
| false); |
| } |
| |
| Future<GetMotionEventsReply> XProto::GetMotionEvents(const Window& window, |
| const Time& start, |
| const Time& stop) { |
| return XProto::GetMotionEvents(GetMotionEventsRequest{window, start, stop}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GetMotionEventsReply> detail::ReadReply<GetMotionEventsReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GetMotionEventsReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| uint32_t events_len{}; |
| auto& events = (*reply).events; |
| |
| // 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); |
| |
| // events_len |
| Read(&events_len, &buf); |
| |
| // pad1 |
| Pad(&buf, 20); |
| |
| // events |
| events.resize(events_len); |
| for (auto& events_elem : events) { |
| // events_elem |
| { |
| auto& time = events_elem.time; |
| auto& x = events_elem.x; |
| auto& y = events_elem.y; |
| |
| // time |
| Read(&time, &buf); |
| |
| // x |
| Read(&x, &buf); |
| |
| // y |
| Read(&y, &buf); |
| } |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<TranslateCoordinatesReply> XProto::TranslateCoordinates( |
| const TranslateCoordinatesRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& src_window = request.src_window; |
| auto& dst_window = request.dst_window; |
| auto& src_x = request.src_x; |
| auto& src_y = request.src_y; |
| |
| // major_opcode |
| uint8_t major_opcode = 40; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // src_window |
| buf.Write(&src_window); |
| |
| // dst_window |
| buf.Write(&dst_window); |
| |
| // src_x |
| buf.Write(&src_x); |
| |
| // src_y |
| buf.Write(&src_y); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<TranslateCoordinatesReply>( |
| &buf, "TranslateCoordinates", false); |
| } |
| |
| Future<TranslateCoordinatesReply> XProto::TranslateCoordinates( |
| const Window& src_window, |
| const Window& dst_window, |
| const int16_t& src_x, |
| const int16_t& src_y) { |
| return XProto::TranslateCoordinates( |
| TranslateCoordinatesRequest{src_window, dst_window, src_x, src_y}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<TranslateCoordinatesReply> detail::ReadReply< |
| TranslateCoordinatesReply>(ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<TranslateCoordinatesReply>(); |
| |
| auto& same_screen = (*reply).same_screen; |
| auto& sequence = (*reply).sequence; |
| auto& child = (*reply).child; |
| auto& dst_x = (*reply).dst_x; |
| auto& dst_y = (*reply).dst_y; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // same_screen |
| Read(&same_screen, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // child |
| Read(&child, &buf); |
| |
| // dst_x |
| Read(&dst_x, &buf); |
| |
| // dst_y |
| Read(&dst_y, &buf); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::WarpPointer(const WarpPointerRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& src_window = request.src_window; |
| auto& dst_window = request.dst_window; |
| auto& src_x = request.src_x; |
| auto& src_y = request.src_y; |
| auto& src_width = request.src_width; |
| auto& src_height = request.src_height; |
| auto& dst_x = request.dst_x; |
| auto& dst_y = request.dst_y; |
| |
| // major_opcode |
| uint8_t major_opcode = 41; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // src_window |
| buf.Write(&src_window); |
| |
| // dst_window |
| buf.Write(&dst_window); |
| |
| // src_x |
| buf.Write(&src_x); |
| |
| // src_y |
| buf.Write(&src_y); |
| |
| // src_width |
| buf.Write(&src_width); |
| |
| // src_height |
| buf.Write(&src_height); |
| |
| // dst_x |
| buf.Write(&dst_x); |
| |
| // dst_y |
| buf.Write(&dst_y); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "WarpPointer", false); |
| } |
| |
| Future<void> XProto::WarpPointer(const Window& src_window, |
| const Window& dst_window, |
| const int16_t& src_x, |
| const int16_t& src_y, |
| const uint16_t& src_width, |
| const uint16_t& src_height, |
| const int16_t& dst_x, |
| const int16_t& dst_y) { |
| return XProto::WarpPointer(WarpPointerRequest{src_window, dst_window, src_x, |
| src_y, src_width, src_height, |
| dst_x, dst_y}); |
| } |
| |
| Future<void> XProto::SetInputFocus(const SetInputFocusRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& revert_to = request.revert_to; |
| auto& focus = request.focus; |
| auto& time = request.time; |
| |
| // major_opcode |
| uint8_t major_opcode = 42; |
| buf.Write(&major_opcode); |
| |
| // revert_to |
| uint8_t tmp74; |
| tmp74 = static_cast<uint8_t>(revert_to); |
| buf.Write(&tmp74); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // focus |
| buf.Write(&focus); |
| |
| // time |
| buf.Write(&time); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "SetInputFocus", false); |
| } |
| |
| Future<void> XProto::SetInputFocus(const InputFocus& revert_to, |
| const Window& focus, |
| const Time& time) { |
| return XProto::SetInputFocus(SetInputFocusRequest{revert_to, focus, time}); |
| } |
| |
| Future<GetInputFocusReply> XProto::GetInputFocus( |
| const GetInputFocusRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| // major_opcode |
| uint8_t major_opcode = 43; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GetInputFocusReply>(&buf, "GetInputFocus", |
| false); |
| } |
| |
| Future<GetInputFocusReply> XProto::GetInputFocus() { |
| return XProto::GetInputFocus(GetInputFocusRequest{}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GetInputFocusReply> detail::ReadReply<GetInputFocusReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GetInputFocusReply>(); |
| |
| auto& revert_to = (*reply).revert_to; |
| auto& sequence = (*reply).sequence; |
| auto& focus = (*reply).focus; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // revert_to |
| uint8_t tmp75; |
| Read(&tmp75, &buf); |
| revert_to = static_cast<InputFocus>(tmp75); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // focus |
| Read(&focus, &buf); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<QueryKeymapReply> XProto::QueryKeymap( |
| const QueryKeymapRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| // major_opcode |
| uint8_t major_opcode = 44; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<QueryKeymapReply>(&buf, "QueryKeymap", false); |
| } |
| |
| Future<QueryKeymapReply> XProto::QueryKeymap() { |
| return XProto::QueryKeymap(QueryKeymapRequest{}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<QueryKeymapReply> detail::ReadReply<QueryKeymapReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<QueryKeymapReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| auto& keys = (*reply).keys; |
| size_t keys_len = keys.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); |
| |
| // keys |
| for (auto& keys_elem : keys) { |
| // keys_elem |
| Read(&keys_elem, &buf); |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::OpenFont(const OpenFontRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& fid = request.fid; |
| uint16_t name_len{}; |
| auto& name = request.name; |
| |
| // major_opcode |
| uint8_t major_opcode = 45; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // fid |
| buf.Write(&fid); |
| |
| // name_len |
| name_len = name.size(); |
| buf.Write(&name_len); |
| |
| // pad1 |
| Pad(&buf, 2); |
| |
| // name |
| DCHECK_EQ(static_cast<size_t>(name_len), name.size()); |
| for (auto& name_elem : name) { |
| // name_elem |
| buf.Write(&name_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "OpenFont", false); |
| } |
| |
| Future<void> XProto::OpenFont(const Font& fid, const std::string& name) { |
| return XProto::OpenFont(OpenFontRequest{fid, name}); |
| } |
| |
| Future<void> XProto::CloseFont(const CloseFontRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& font = request.font; |
| |
| // major_opcode |
| uint8_t major_opcode = 46; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // font |
| buf.Write(&font); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "CloseFont", false); |
| } |
| |
| Future<void> XProto::CloseFont(const Font& font) { |
| return XProto::CloseFont(CloseFontRequest{font}); |
| } |
| |
| Future<QueryFontReply> XProto::QueryFont(const QueryFontRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& font = request.font; |
| |
| // major_opcode |
| uint8_t major_opcode = 47; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // font |
| buf.Write(&font); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<QueryFontReply>(&buf, "QueryFont", false); |
| } |
| |
| Future<QueryFontReply> XProto::QueryFont(const Fontable& font) { |
| return XProto::QueryFont(QueryFontRequest{font}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<QueryFontReply> detail::ReadReply<QueryFontReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<QueryFontReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| auto& min_bounds = (*reply).min_bounds; |
| auto& max_bounds = (*reply).max_bounds; |
| auto& min_char_or_byte2 = (*reply).min_char_or_byte2; |
| auto& max_char_or_byte2 = (*reply).max_char_or_byte2; |
| auto& default_char = (*reply).default_char; |
| uint16_t properties_len{}; |
| auto& draw_direction = (*reply).draw_direction; |
| auto& min_byte1 = (*reply).min_byte1; |
| auto& max_byte1 = (*reply).max_byte1; |
| auto& all_chars_exist = (*reply).all_chars_exist; |
| auto& font_ascent = (*reply).font_ascent; |
| auto& font_descent = (*reply).font_descent; |
| uint32_t char_infos_len{}; |
| auto& properties = (*reply).properties; |
| auto& char_infos = (*reply).char_infos; |
| |
| // 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); |
| |
| // min_bounds |
| { |
| auto& left_side_bearing = min_bounds.left_side_bearing; |
| auto& right_side_bearing = min_bounds.right_side_bearing; |
| auto& character_width = min_bounds.character_width; |
| auto& ascent = min_bounds.ascent; |
| auto& descent = min_bounds.descent; |
| auto& attributes = min_bounds.attributes; |
| |
| // left_side_bearing |
| Read(&left_side_bearing, &buf); |
| |
| // right_side_bearing |
| Read(&right_side_bearing, &buf); |
| |
| // character_width |
| Read(&character_width, &buf); |
| |
| // ascent |
| Read(&ascent, &buf); |
| |
| // descent |
| Read(&descent, &buf); |
| |
| // attributes |
| Read(&attributes, &buf); |
| } |
| |
| // pad1 |
| Pad(&buf, 4); |
| |
| // max_bounds |
| { |
| auto& left_side_bearing = max_bounds.left_side_bearing; |
| auto& right_side_bearing = max_bounds.right_side_bearing; |
| auto& character_width = max_bounds.character_width; |
| auto& ascent = max_bounds.ascent; |
| auto& descent = max_bounds.descent; |
| auto& attributes = max_bounds.attributes; |
| |
| // left_side_bearing |
| Read(&left_side_bearing, &buf); |
| |
| // right_side_bearing |
| Read(&right_side_bearing, &buf); |
| |
| // character_width |
| Read(&character_width, &buf); |
| |
| // ascent |
| Read(&ascent, &buf); |
| |
| // descent |
| Read(&descent, &buf); |
| |
| // attributes |
| Read(&attributes, &buf); |
| } |
| |
| // pad2 |
| Pad(&buf, 4); |
| |
| // min_char_or_byte2 |
| Read(&min_char_or_byte2, &buf); |
| |
| // max_char_or_byte2 |
| Read(&max_char_or_byte2, &buf); |
| |
| // default_char |
| Read(&default_char, &buf); |
| |
| // properties_len |
| Read(&properties_len, &buf); |
| |
| // draw_direction |
| uint8_t tmp76; |
| Read(&tmp76, &buf); |
| draw_direction = static_cast<FontDraw>(tmp76); |
| |
| // min_byte1 |
| Read(&min_byte1, &buf); |
| |
| // max_byte1 |
| Read(&max_byte1, &buf); |
| |
| // all_chars_exist |
| Read(&all_chars_exist, &buf); |
| |
| // font_ascent |
| Read(&font_ascent, &buf); |
| |
| // font_descent |
| Read(&font_descent, &buf); |
| |
| // char_infos_len |
| Read(&char_infos_len, &buf); |
| |
| // properties |
| properties.resize(properties_len); |
| for (auto& properties_elem : properties) { |
| // properties_elem |
| { |
| auto& name = properties_elem.name; |
| auto& value = properties_elem.value; |
| |
| // name |
| Read(&name, &buf); |
| |
| // value |
| Read(&value, &buf); |
| } |
| } |
| |
| // char_infos |
| char_infos.resize(char_infos_len); |
| for (auto& char_infos_elem : char_infos) { |
| // char_infos_elem |
| { |
| auto& left_side_bearing = char_infos_elem.left_side_bearing; |
| auto& right_side_bearing = char_infos_elem.right_side_bearing; |
| auto& character_width = char_infos_elem.character_width; |
| auto& ascent = char_infos_elem.ascent; |
| auto& descent = char_infos_elem.descent; |
| auto& attributes = char_infos_elem.attributes; |
| |
| // left_side_bearing |
| Read(&left_side_bearing, &buf); |
| |
| // right_side_bearing |
| Read(&right_side_bearing, &buf); |
| |
| // character_width |
| Read(&character_width, &buf); |
| |
| // ascent |
| Read(&ascent, &buf); |
| |
| // descent |
| Read(&descent, &buf); |
| |
| // attributes |
| Read(&attributes, &buf); |
| } |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<QueryTextExtentsReply> XProto::QueryTextExtents( |
| const QueryTextExtentsRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& font = request.font; |
| auto& string = request.string; |
| size_t string_len = string.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 48; |
| buf.Write(&major_opcode); |
| |
| // odd_length |
| uint8_t odd_length = BitAnd(string_len, 1); |
| buf.Write(&odd_length); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // font |
| buf.Write(&font); |
| |
| // string |
| DCHECK_EQ(static_cast<size_t>(string_len), string.size()); |
| for (auto& string_elem : string) { |
| // string_elem |
| { |
| auto& byte1 = string_elem.byte1; |
| auto& byte2 = string_elem.byte2; |
| |
| // byte1 |
| buf.Write(&byte1); |
| |
| // byte2 |
| buf.Write(&byte2); |
| } |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<QueryTextExtentsReply>( |
| &buf, "QueryTextExtents", false); |
| } |
| |
| Future<QueryTextExtentsReply> XProto::QueryTextExtents( |
| const Fontable& font, |
| const std::vector<Char16>& string) { |
| return XProto::QueryTextExtents(QueryTextExtentsRequest{font, string}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<QueryTextExtentsReply> detail::ReadReply<QueryTextExtentsReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<QueryTextExtentsReply>(); |
| |
| auto& draw_direction = (*reply).draw_direction; |
| auto& sequence = (*reply).sequence; |
| auto& font_ascent = (*reply).font_ascent; |
| auto& font_descent = (*reply).font_descent; |
| auto& overall_ascent = (*reply).overall_ascent; |
| auto& overall_descent = (*reply).overall_descent; |
| auto& overall_width = (*reply).overall_width; |
| auto& overall_left = (*reply).overall_left; |
| auto& overall_right = (*reply).overall_right; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // draw_direction |
| uint8_t tmp77; |
| Read(&tmp77, &buf); |
| draw_direction = static_cast<FontDraw>(tmp77); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // font_ascent |
| Read(&font_ascent, &buf); |
| |
| // font_descent |
| Read(&font_descent, &buf); |
| |
| // overall_ascent |
| Read(&overall_ascent, &buf); |
| |
| // overall_descent |
| Read(&overall_descent, &buf); |
| |
| // overall_width |
| Read(&overall_width, &buf); |
| |
| // overall_left |
| Read(&overall_left, &buf); |
| |
| // overall_right |
| Read(&overall_right, &buf); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<ListFontsReply> XProto::ListFonts(const ListFontsRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& max_names = request.max_names; |
| uint16_t pattern_len{}; |
| auto& pattern = request.pattern; |
| |
| // major_opcode |
| uint8_t major_opcode = 49; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // max_names |
| buf.Write(&max_names); |
| |
| // pattern_len |
| pattern_len = pattern.size(); |
| buf.Write(&pattern_len); |
| |
| // pattern |
| DCHECK_EQ(static_cast<size_t>(pattern_len), pattern.size()); |
| for (auto& pattern_elem : pattern) { |
| // pattern_elem |
| buf.Write(&pattern_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<ListFontsReply>(&buf, "ListFonts", false); |
| } |
| |
| Future<ListFontsReply> XProto::ListFonts(const uint16_t& max_names, |
| const std::string& pattern) { |
| return XProto::ListFonts(ListFontsRequest{max_names, pattern}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<ListFontsReply> detail::ReadReply<ListFontsReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<ListFontsReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| uint16_t names_len{}; |
| auto& names = (*reply).names; |
| |
| // 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); |
| |
| // names_len |
| Read(&names_len, &buf); |
| |
| // pad1 |
| Pad(&buf, 22); |
| |
| // names |
| names.resize(names_len); |
| for (auto& names_elem : names) { |
| // names_elem |
| { |
| uint8_t name_len{}; |
| auto& name = names_elem.name; |
| |
| // name_len |
| Read(&name_len, &buf); |
| |
| // name |
| name.resize(name_len); |
| for (auto& name_elem : name) { |
| // name_elem |
| Read(&name_elem, &buf); |
| } |
| } |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<ListFontsWithInfoReply> XProto::ListFontsWithInfo( |
| const ListFontsWithInfoRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& max_names = request.max_names; |
| uint16_t pattern_len{}; |
| auto& pattern = request.pattern; |
| |
| // major_opcode |
| uint8_t major_opcode = 50; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // max_names |
| buf.Write(&max_names); |
| |
| // pattern_len |
| pattern_len = pattern.size(); |
| buf.Write(&pattern_len); |
| |
| // pattern |
| DCHECK_EQ(static_cast<size_t>(pattern_len), pattern.size()); |
| for (auto& pattern_elem : pattern) { |
| // pattern_elem |
| buf.Write(&pattern_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<ListFontsWithInfoReply>( |
| &buf, "ListFontsWithInfo", false); |
| } |
| |
| Future<ListFontsWithInfoReply> XProto::ListFontsWithInfo( |
| const uint16_t& max_names, |
| const std::string& pattern) { |
| return XProto::ListFontsWithInfo( |
| ListFontsWithInfoRequest{max_names, pattern}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<ListFontsWithInfoReply> detail::ReadReply< |
| ListFontsWithInfoReply>(ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<ListFontsWithInfoReply>(); |
| |
| uint8_t name_len{}; |
| auto& sequence = (*reply).sequence; |
| auto& min_bounds = (*reply).min_bounds; |
| auto& max_bounds = (*reply).max_bounds; |
| auto& min_char_or_byte2 = (*reply).min_char_or_byte2; |
| auto& max_char_or_byte2 = (*reply).max_char_or_byte2; |
| auto& default_char = (*reply).default_char; |
| uint16_t properties_len{}; |
| auto& draw_direction = (*reply).draw_direction; |
| auto& min_byte1 = (*reply).min_byte1; |
| auto& max_byte1 = (*reply).max_byte1; |
| auto& all_chars_exist = (*reply).all_chars_exist; |
| auto& font_ascent = (*reply).font_ascent; |
| auto& font_descent = (*reply).font_descent; |
| auto& replies_hint = (*reply).replies_hint; |
| auto& properties = (*reply).properties; |
| auto& name = (*reply).name; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // name_len |
| Read(&name_len, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // min_bounds |
| { |
| auto& left_side_bearing = min_bounds.left_side_bearing; |
| auto& right_side_bearing = min_bounds.right_side_bearing; |
| auto& character_width = min_bounds.character_width; |
| auto& ascent = min_bounds.ascent; |
| auto& descent = min_bounds.descent; |
| auto& attributes = min_bounds.attributes; |
| |
| // left_side_bearing |
| Read(&left_side_bearing, &buf); |
| |
| // right_side_bearing |
| Read(&right_side_bearing, &buf); |
| |
| // character_width |
| Read(&character_width, &buf); |
| |
| // ascent |
| Read(&ascent, &buf); |
| |
| // descent |
| Read(&descent, &buf); |
| |
| // attributes |
| Read(&attributes, &buf); |
| } |
| |
| // pad0 |
| Pad(&buf, 4); |
| |
| // max_bounds |
| { |
| auto& left_side_bearing = max_bounds.left_side_bearing; |
| auto& right_side_bearing = max_bounds.right_side_bearing; |
| auto& character_width = max_bounds.character_width; |
| auto& ascent = max_bounds.ascent; |
| auto& descent = max_bounds.descent; |
| auto& attributes = max_bounds.attributes; |
| |
| // left_side_bearing |
| Read(&left_side_bearing, &buf); |
| |
| // right_side_bearing |
| Read(&right_side_bearing, &buf); |
| |
| // character_width |
| Read(&character_width, &buf); |
| |
| // ascent |
| Read(&ascent, &buf); |
| |
| // descent |
| Read(&descent, &buf); |
| |
| // attributes |
| Read(&attributes, &buf); |
| } |
| |
| // pad1 |
| Pad(&buf, 4); |
| |
| // min_char_or_byte2 |
| Read(&min_char_or_byte2, &buf); |
| |
| // max_char_or_byte2 |
| Read(&max_char_or_byte2, &buf); |
| |
| // default_char |
| Read(&default_char, &buf); |
| |
| // properties_len |
| Read(&properties_len, &buf); |
| |
| // draw_direction |
| uint8_t tmp78; |
| Read(&tmp78, &buf); |
| draw_direction = static_cast<FontDraw>(tmp78); |
| |
| // min_byte1 |
| Read(&min_byte1, &buf); |
| |
| // max_byte1 |
| Read(&max_byte1, &buf); |
| |
| // all_chars_exist |
| Read(&all_chars_exist, &buf); |
| |
| // font_ascent |
| Read(&font_ascent, &buf); |
| |
| // font_descent |
| Read(&font_descent, &buf); |
| |
| // replies_hint |
| Read(&replies_hint, &buf); |
| |
| // properties |
| properties.resize(properties_len); |
| for (auto& properties_elem : properties) { |
| // properties_elem |
| { |
| auto& name = properties_elem.name; |
| auto& value = properties_elem.value; |
| |
| // name |
| Read(&name, &buf); |
| |
| // value |
| Read(&value, &buf); |
| } |
| } |
| |
| // name |
| name.resize(name_len); |
| for (auto& name_elem : name) { |
| // name_elem |
| Read(&name_elem, &buf); |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::SetFontPath(const SetFontPathRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| uint16_t font_qty{}; |
| auto& font = request.font; |
| size_t font_len = font.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 51; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // font_qty |
| font_qty = font.size(); |
| buf.Write(&font_qty); |
| |
| // pad1 |
| Pad(&buf, 2); |
| |
| // font |
| DCHECK_EQ(static_cast<size_t>(font_qty), font.size()); |
| for (auto& font_elem : font) { |
| // font_elem |
| { |
| uint8_t name_len{}; |
| auto& name = font_elem.name; |
| |
| // name_len |
| name_len = name.size(); |
| buf.Write(&name_len); |
| |
| // name |
| DCHECK_EQ(static_cast<size_t>(name_len), name.size()); |
| for (auto& name_elem : name) { |
| // name_elem |
| buf.Write(&name_elem); |
| } |
| } |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "SetFontPath", false); |
| } |
| |
| Future<void> XProto::SetFontPath(const std::vector<Str>& font) { |
| return XProto::SetFontPath(SetFontPathRequest{font}); |
| } |
| |
| Future<GetFontPathReply> XProto::GetFontPath( |
| const GetFontPathRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| // major_opcode |
| uint8_t major_opcode = 52; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GetFontPathReply>(&buf, "GetFontPath", false); |
| } |
| |
| Future<GetFontPathReply> XProto::GetFontPath() { |
| return XProto::GetFontPath(GetFontPathRequest{}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GetFontPathReply> detail::ReadReply<GetFontPathReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GetFontPathReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| uint16_t path_len{}; |
| auto& path = (*reply).path; |
| |
| // 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); |
| |
| // path_len |
| Read(&path_len, &buf); |
| |
| // pad1 |
| Pad(&buf, 22); |
| |
| // path |
| path.resize(path_len); |
| for (auto& path_elem : path) { |
| // path_elem |
| { |
| uint8_t name_len{}; |
| auto& name = path_elem.name; |
| |
| // name_len |
| Read(&name_len, &buf); |
| |
| // name |
| name.resize(name_len); |
| for (auto& name_elem : name) { |
| // name_elem |
| Read(&name_elem, &buf); |
| } |
| } |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::CreatePixmap(const CreatePixmapRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& depth = request.depth; |
| auto& pid = request.pid; |
| auto& drawable = request.drawable; |
| auto& width = request.width; |
| auto& height = request.height; |
| |
| // major_opcode |
| uint8_t major_opcode = 53; |
| buf.Write(&major_opcode); |
| |
| // depth |
| buf.Write(&depth); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // pid |
| buf.Write(&pid); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // width |
| buf.Write(&width); |
| |
| // height |
| buf.Write(&height); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "CreatePixmap", false); |
| } |
| |
| Future<void> XProto::CreatePixmap(const uint8_t& depth, |
| const Pixmap& pid, |
| const Drawable& drawable, |
| const uint16_t& width, |
| const uint16_t& height) { |
| return XProto::CreatePixmap( |
| CreatePixmapRequest{depth, pid, drawable, width, height}); |
| } |
| |
| Future<void> XProto::FreePixmap(const FreePixmapRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& pixmap = request.pixmap; |
| |
| // major_opcode |
| uint8_t major_opcode = 54; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // pixmap |
| buf.Write(&pixmap); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "FreePixmap", false); |
| } |
| |
| Future<void> XProto::FreePixmap(const Pixmap& pixmap) { |
| return XProto::FreePixmap(FreePixmapRequest{pixmap}); |
| } |
| |
| Future<void> XProto::CreateGC(const CreateGCRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& cid = request.cid; |
| auto& drawable = request.drawable; |
| GraphicsContextAttribute value_mask{}; |
| auto& value_list = request; |
| |
| // major_opcode |
| uint8_t major_opcode = 55; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cid |
| buf.Write(&cid); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // value_mask |
| SwitchVar(GraphicsContextAttribute::Function, value_list.function.has_value(), |
| true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::PlaneMask, |
| value_list.plane_mask.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::Foreground, |
| value_list.foreground.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::Background, |
| value_list.background.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::LineWidth, |
| value_list.line_width.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::LineStyle, |
| value_list.line_style.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::CapStyle, |
| value_list.cap_style.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::JoinStyle, |
| value_list.join_style.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::FillStyle, |
| value_list.fill_style.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::FillRule, |
| value_list.fill_rule.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::Tile, value_list.tile.has_value(), true, |
| &value_mask); |
| SwitchVar(GraphicsContextAttribute::Stipple, value_list.stipple.has_value(), |
| true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::TileStippleOriginX, |
| value_list.tile_stipple_x_origin.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::TileStippleOriginY, |
| value_list.tile_stipple_y_origin.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::Font, value_list.font.has_value(), true, |
| &value_mask); |
| SwitchVar(GraphicsContextAttribute::SubwindowMode, |
| value_list.subwindow_mode.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::GraphicsExposures, |
| value_list.graphics_exposures.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::ClipOriginX, |
| value_list.clip_x_origin.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::ClipOriginY, |
| value_list.clip_y_origin.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::ClipMask, |
| value_list.clip_mask.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::DashOffset, |
| value_list.dash_offset.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::DashList, value_list.dashes.has_value(), |
| true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::ArcMode, value_list.arc_mode.has_value(), |
| true, &value_mask); |
| uint32_t tmp79; |
| tmp79 = static_cast<uint32_t>(value_mask); |
| buf.Write(&tmp79); |
| |
| // value_list |
| auto value_list_expr = value_mask; |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::Function)) { |
| auto& function = *value_list.function; |
| |
| // function |
| uint32_t tmp80; |
| tmp80 = static_cast<uint32_t>(function); |
| buf.Write(&tmp80); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::PlaneMask)) { |
| auto& plane_mask = *value_list.plane_mask; |
| |
| // plane_mask |
| buf.Write(&plane_mask); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::Foreground)) { |
| auto& foreground = *value_list.foreground; |
| |
| // foreground |
| buf.Write(&foreground); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::Background)) { |
| auto& background = *value_list.background; |
| |
| // background |
| buf.Write(&background); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::LineWidth)) { |
| auto& line_width = *value_list.line_width; |
| |
| // line_width |
| buf.Write(&line_width); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::LineStyle)) { |
| auto& line_style = *value_list.line_style; |
| |
| // line_style |
| uint32_t tmp81; |
| tmp81 = static_cast<uint32_t>(line_style); |
| buf.Write(&tmp81); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::CapStyle)) { |
| auto& cap_style = *value_list.cap_style; |
| |
| // cap_style |
| uint32_t tmp82; |
| tmp82 = static_cast<uint32_t>(cap_style); |
| buf.Write(&tmp82); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::JoinStyle)) { |
| auto& join_style = *value_list.join_style; |
| |
| // join_style |
| uint32_t tmp83; |
| tmp83 = static_cast<uint32_t>(join_style); |
| buf.Write(&tmp83); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::FillStyle)) { |
| auto& fill_style = *value_list.fill_style; |
| |
| // fill_style |
| uint32_t tmp84; |
| tmp84 = static_cast<uint32_t>(fill_style); |
| buf.Write(&tmp84); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::FillRule)) { |
| auto& fill_rule = *value_list.fill_rule; |
| |
| // fill_rule |
| uint32_t tmp85; |
| tmp85 = static_cast<uint32_t>(fill_rule); |
| buf.Write(&tmp85); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::Tile)) { |
| auto& tile = *value_list.tile; |
| |
| // tile |
| buf.Write(&tile); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::Stipple)) { |
| auto& stipple = *value_list.stipple; |
| |
| // stipple |
| buf.Write(&stipple); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::TileStippleOriginX)) { |
| auto& tile_stipple_x_origin = *value_list.tile_stipple_x_origin; |
| |
| // tile_stipple_x_origin |
| buf.Write(&tile_stipple_x_origin); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::TileStippleOriginY)) { |
| auto& tile_stipple_y_origin = *value_list.tile_stipple_y_origin; |
| |
| // tile_stipple_y_origin |
| buf.Write(&tile_stipple_y_origin); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::Font)) { |
| auto& font = *value_list.font; |
| |
| // font |
| buf.Write(&font); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::SubwindowMode)) { |
| auto& subwindow_mode = *value_list.subwindow_mode; |
| |
| // subwindow_mode |
| uint32_t tmp86; |
| tmp86 = static_cast<uint32_t>(subwindow_mode); |
| buf.Write(&tmp86); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::GraphicsExposures)) { |
| auto& graphics_exposures = *value_list.graphics_exposures; |
| |
| // graphics_exposures |
| buf.Write(&graphics_exposures); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::ClipOriginX)) { |
| auto& clip_x_origin = *value_list.clip_x_origin; |
| |
| // clip_x_origin |
| buf.Write(&clip_x_origin); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::ClipOriginY)) { |
| auto& clip_y_origin = *value_list.clip_y_origin; |
| |
| // clip_y_origin |
| buf.Write(&clip_y_origin); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::ClipMask)) { |
| auto& clip_mask = *value_list.clip_mask; |
| |
| // clip_mask |
| buf.Write(&clip_mask); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::DashOffset)) { |
| auto& dash_offset = *value_list.dash_offset; |
| |
| // dash_offset |
| buf.Write(&dash_offset); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::DashList)) { |
| auto& dashes = *value_list.dashes; |
| |
| // dashes |
| buf.Write(&dashes); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::ArcMode)) { |
| auto& arc_mode = *value_list.arc_mode; |
| |
| // arc_mode |
| uint32_t tmp87; |
| tmp87 = static_cast<uint32_t>(arc_mode); |
| buf.Write(&tmp87); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "CreateGC", false); |
| } |
| |
| Future<void> XProto::CreateGC( |
| const GraphicsContext& cid, |
| const Drawable& drawable, |
| const absl::optional<Gx>& function, |
| const absl::optional<uint32_t>& plane_mask, |
| const absl::optional<uint32_t>& foreground, |
| const absl::optional<uint32_t>& background, |
| const absl::optional<uint32_t>& line_width, |
| const absl::optional<LineStyle>& line_style, |
| const absl::optional<CapStyle>& cap_style, |
| const absl::optional<JoinStyle>& join_style, |
| const absl::optional<FillStyle>& fill_style, |
| const absl::optional<FillRule>& fill_rule, |
| const absl::optional<Pixmap>& tile, |
| const absl::optional<Pixmap>& stipple, |
| const absl::optional<int32_t>& tile_stipple_x_origin, |
| const absl::optional<int32_t>& tile_stipple_y_origin, |
| const absl::optional<Font>& font, |
| const absl::optional<SubwindowMode>& subwindow_mode, |
| const absl::optional<Bool32>& graphics_exposures, |
| const absl::optional<int32_t>& clip_x_origin, |
| const absl::optional<int32_t>& clip_y_origin, |
| const absl::optional<Pixmap>& clip_mask, |
| const absl::optional<uint32_t>& dash_offset, |
| const absl::optional<uint32_t>& dashes, |
| const absl::optional<ArcMode>& arc_mode) { |
| return XProto::CreateGC(CreateGCRequest{cid, |
| drawable, |
| function, |
| plane_mask, |
| foreground, |
| background, |
| line_width, |
| line_style, |
| cap_style, |
| join_style, |
| fill_style, |
| fill_rule, |
| tile, |
| stipple, |
| tile_stipple_x_origin, |
| tile_stipple_y_origin, |
| font, |
| subwindow_mode, |
| graphics_exposures, |
| clip_x_origin, |
| clip_y_origin, |
| clip_mask, |
| dash_offset, |
| dashes, |
| arc_mode}); |
| } |
| |
| Future<void> XProto::ChangeGC(const ChangeGCRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& gc = request.gc; |
| GraphicsContextAttribute value_mask{}; |
| auto& value_list = request; |
| |
| // major_opcode |
| uint8_t major_opcode = 56; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // value_mask |
| SwitchVar(GraphicsContextAttribute::Function, value_list.function.has_value(), |
| true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::PlaneMask, |
| value_list.plane_mask.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::Foreground, |
| value_list.foreground.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::Background, |
| value_list.background.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::LineWidth, |
| value_list.line_width.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::LineStyle, |
| value_list.line_style.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::CapStyle, |
| value_list.cap_style.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::JoinStyle, |
| value_list.join_style.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::FillStyle, |
| value_list.fill_style.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::FillRule, |
| value_list.fill_rule.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::Tile, value_list.tile.has_value(), true, |
| &value_mask); |
| SwitchVar(GraphicsContextAttribute::Stipple, value_list.stipple.has_value(), |
| true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::TileStippleOriginX, |
| value_list.tile_stipple_x_origin.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::TileStippleOriginY, |
| value_list.tile_stipple_y_origin.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::Font, value_list.font.has_value(), true, |
| &value_mask); |
| SwitchVar(GraphicsContextAttribute::SubwindowMode, |
| value_list.subwindow_mode.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::GraphicsExposures, |
| value_list.graphics_exposures.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::ClipOriginX, |
| value_list.clip_x_origin.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::ClipOriginY, |
| value_list.clip_y_origin.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::ClipMask, |
| value_list.clip_mask.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::DashOffset, |
| value_list.dash_offset.has_value(), true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::DashList, value_list.dashes.has_value(), |
| true, &value_mask); |
| SwitchVar(GraphicsContextAttribute::ArcMode, value_list.arc_mode.has_value(), |
| true, &value_mask); |
| uint32_t tmp88; |
| tmp88 = static_cast<uint32_t>(value_mask); |
| buf.Write(&tmp88); |
| |
| // value_list |
| auto value_list_expr = value_mask; |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::Function)) { |
| auto& function = *value_list.function; |
| |
| // function |
| uint32_t tmp89; |
| tmp89 = static_cast<uint32_t>(function); |
| buf.Write(&tmp89); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::PlaneMask)) { |
| auto& plane_mask = *value_list.plane_mask; |
| |
| // plane_mask |
| buf.Write(&plane_mask); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::Foreground)) { |
| auto& foreground = *value_list.foreground; |
| |
| // foreground |
| buf.Write(&foreground); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::Background)) { |
| auto& background = *value_list.background; |
| |
| // background |
| buf.Write(&background); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::LineWidth)) { |
| auto& line_width = *value_list.line_width; |
| |
| // line_width |
| buf.Write(&line_width); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::LineStyle)) { |
| auto& line_style = *value_list.line_style; |
| |
| // line_style |
| uint32_t tmp90; |
| tmp90 = static_cast<uint32_t>(line_style); |
| buf.Write(&tmp90); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::CapStyle)) { |
| auto& cap_style = *value_list.cap_style; |
| |
| // cap_style |
| uint32_t tmp91; |
| tmp91 = static_cast<uint32_t>(cap_style); |
| buf.Write(&tmp91); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::JoinStyle)) { |
| auto& join_style = *value_list.join_style; |
| |
| // join_style |
| uint32_t tmp92; |
| tmp92 = static_cast<uint32_t>(join_style); |
| buf.Write(&tmp92); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::FillStyle)) { |
| auto& fill_style = *value_list.fill_style; |
| |
| // fill_style |
| uint32_t tmp93; |
| tmp93 = static_cast<uint32_t>(fill_style); |
| buf.Write(&tmp93); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::FillRule)) { |
| auto& fill_rule = *value_list.fill_rule; |
| |
| // fill_rule |
| uint32_t tmp94; |
| tmp94 = static_cast<uint32_t>(fill_rule); |
| buf.Write(&tmp94); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::Tile)) { |
| auto& tile = *value_list.tile; |
| |
| // tile |
| buf.Write(&tile); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::Stipple)) { |
| auto& stipple = *value_list.stipple; |
| |
| // stipple |
| buf.Write(&stipple); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::TileStippleOriginX)) { |
| auto& tile_stipple_x_origin = *value_list.tile_stipple_x_origin; |
| |
| // tile_stipple_x_origin |
| buf.Write(&tile_stipple_x_origin); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::TileStippleOriginY)) { |
| auto& tile_stipple_y_origin = *value_list.tile_stipple_y_origin; |
| |
| // tile_stipple_y_origin |
| buf.Write(&tile_stipple_y_origin); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::Font)) { |
| auto& font = *value_list.font; |
| |
| // font |
| buf.Write(&font); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::SubwindowMode)) { |
| auto& subwindow_mode = *value_list.subwindow_mode; |
| |
| // subwindow_mode |
| uint32_t tmp95; |
| tmp95 = static_cast<uint32_t>(subwindow_mode); |
| buf.Write(&tmp95); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::GraphicsExposures)) { |
| auto& graphics_exposures = *value_list.graphics_exposures; |
| |
| // graphics_exposures |
| buf.Write(&graphics_exposures); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::ClipOriginX)) { |
| auto& clip_x_origin = *value_list.clip_x_origin; |
| |
| // clip_x_origin |
| buf.Write(&clip_x_origin); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::ClipOriginY)) { |
| auto& clip_y_origin = *value_list.clip_y_origin; |
| |
| // clip_y_origin |
| buf.Write(&clip_y_origin); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::ClipMask)) { |
| auto& clip_mask = *value_list.clip_mask; |
| |
| // clip_mask |
| buf.Write(&clip_mask); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::DashOffset)) { |
| auto& dash_offset = *value_list.dash_offset; |
| |
| // dash_offset |
| buf.Write(&dash_offset); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::DashList)) { |
| auto& dashes = *value_list.dashes; |
| |
| // dashes |
| buf.Write(&dashes); |
| } |
| if (CaseAnd(value_list_expr, GraphicsContextAttribute::ArcMode)) { |
| auto& arc_mode = *value_list.arc_mode; |
| |
| // arc_mode |
| uint32_t tmp96; |
| tmp96 = static_cast<uint32_t>(arc_mode); |
| buf.Write(&tmp96); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ChangeGC", false); |
| } |
| |
| Future<void> XProto::ChangeGC( |
| const GraphicsContext& gc, |
| const absl::optional<Gx>& function, |
| const absl::optional<uint32_t>& plane_mask, |
| const absl::optional<uint32_t>& foreground, |
| const absl::optional<uint32_t>& background, |
| const absl::optional<uint32_t>& line_width, |
| const absl::optional<LineStyle>& line_style, |
| const absl::optional<CapStyle>& cap_style, |
| const absl::optional<JoinStyle>& join_style, |
| const absl::optional<FillStyle>& fill_style, |
| const absl::optional<FillRule>& fill_rule, |
| const absl::optional<Pixmap>& tile, |
| const absl::optional<Pixmap>& stipple, |
| const absl::optional<int32_t>& tile_stipple_x_origin, |
| const absl::optional<int32_t>& tile_stipple_y_origin, |
| const absl::optional<Font>& font, |
| const absl::optional<SubwindowMode>& subwindow_mode, |
| const absl::optional<Bool32>& graphics_exposures, |
| const absl::optional<int32_t>& clip_x_origin, |
| const absl::optional<int32_t>& clip_y_origin, |
| const absl::optional<Pixmap>& clip_mask, |
| const absl::optional<uint32_t>& dash_offset, |
| const absl::optional<uint32_t>& dashes, |
| const absl::optional<ArcMode>& arc_mode) { |
| return XProto::ChangeGC(ChangeGCRequest{gc, |
| function, |
| plane_mask, |
| foreground, |
| background, |
| line_width, |
| line_style, |
| cap_style, |
| join_style, |
| fill_style, |
| fill_rule, |
| tile, |
| stipple, |
| tile_stipple_x_origin, |
| tile_stipple_y_origin, |
| font, |
| subwindow_mode, |
| graphics_exposures, |
| clip_x_origin, |
| clip_y_origin, |
| clip_mask, |
| dash_offset, |
| dashes, |
| arc_mode}); |
| } |
| |
| Future<void> XProto::CopyGC(const CopyGCRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& src_gc = request.src_gc; |
| auto& dst_gc = request.dst_gc; |
| auto& value_mask = request.value_mask; |
| |
| // major_opcode |
| uint8_t major_opcode = 57; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // src_gc |
| buf.Write(&src_gc); |
| |
| // dst_gc |
| buf.Write(&dst_gc); |
| |
| // value_mask |
| uint32_t tmp97; |
| tmp97 = static_cast<uint32_t>(value_mask); |
| buf.Write(&tmp97); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "CopyGC", false); |
| } |
| |
| Future<void> XProto::CopyGC(const GraphicsContext& src_gc, |
| const GraphicsContext& dst_gc, |
| const GraphicsContextAttribute& value_mask) { |
| return XProto::CopyGC(CopyGCRequest{src_gc, dst_gc, value_mask}); |
| } |
| |
| Future<void> XProto::SetDashes(const SetDashesRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& gc = request.gc; |
| auto& dash_offset = request.dash_offset; |
| uint16_t dashes_len{}; |
| auto& dashes = request.dashes; |
| |
| // major_opcode |
| uint8_t major_opcode = 58; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // dash_offset |
| buf.Write(&dash_offset); |
| |
| // dashes_len |
| dashes_len = dashes.size(); |
| buf.Write(&dashes_len); |
| |
| // dashes |
| DCHECK_EQ(static_cast<size_t>(dashes_len), dashes.size()); |
| for (auto& dashes_elem : dashes) { |
| // dashes_elem |
| buf.Write(&dashes_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "SetDashes", false); |
| } |
| |
| Future<void> XProto::SetDashes(const GraphicsContext& gc, |
| const uint16_t& dash_offset, |
| const std::vector<uint8_t>& dashes) { |
| return XProto::SetDashes(SetDashesRequest{gc, dash_offset, dashes}); |
| } |
| |
| Future<void> XProto::SetClipRectangles( |
| const SetClipRectanglesRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& ordering = request.ordering; |
| auto& gc = request.gc; |
| auto& clip_x_origin = request.clip_x_origin; |
| auto& clip_y_origin = request.clip_y_origin; |
| auto& rectangles = request.rectangles; |
| size_t rectangles_len = rectangles.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 59; |
| buf.Write(&major_opcode); |
| |
| // ordering |
| uint8_t tmp98; |
| tmp98 = static_cast<uint8_t>(ordering); |
| buf.Write(&tmp98); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // clip_x_origin |
| buf.Write(&clip_x_origin); |
| |
| // clip_y_origin |
| buf.Write(&clip_y_origin); |
| |
| // rectangles |
| DCHECK_EQ(static_cast<size_t>(rectangles_len), rectangles.size()); |
| for (auto& rectangles_elem : rectangles) { |
| // rectangles_elem |
| { |
| auto& x = rectangles_elem.x; |
| auto& y = rectangles_elem.y; |
| auto& width = rectangles_elem.width; |
| auto& height = rectangles_elem.height; |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| |
| // width |
| buf.Write(&width); |
| |
| // height |
| buf.Write(&height); |
| } |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "SetClipRectangles", false); |
| } |
| |
| Future<void> XProto::SetClipRectangles( |
| const ClipOrdering& ordering, |
| const GraphicsContext& gc, |
| const int16_t& clip_x_origin, |
| const int16_t& clip_y_origin, |
| const std::vector<Rectangle>& rectangles) { |
| return XProto::SetClipRectangles(SetClipRectanglesRequest{ |
| ordering, gc, clip_x_origin, clip_y_origin, rectangles}); |
| } |
| |
| Future<void> XProto::FreeGC(const FreeGCRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& gc = request.gc; |
| |
| // major_opcode |
| uint8_t major_opcode = 60; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // gc |
| buf.Write(&gc); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "FreeGC", false); |
| } |
| |
| Future<void> XProto::FreeGC(const GraphicsContext& gc) { |
| return XProto::FreeGC(FreeGCRequest{gc}); |
| } |
| |
| Future<void> XProto::ClearArea(const ClearAreaRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& exposures = request.exposures; |
| auto& window = request.window; |
| auto& x = request.x; |
| auto& y = request.y; |
| auto& width = request.width; |
| auto& height = request.height; |
| |
| // major_opcode |
| uint8_t major_opcode = 61; |
| buf.Write(&major_opcode); |
| |
| // exposures |
| buf.Write(&exposures); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| |
| // width |
| buf.Write(&width); |
| |
| // height |
| buf.Write(&height); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ClearArea", false); |
| } |
| |
| Future<void> XProto::ClearArea(const uint8_t& exposures, |
| const Window& window, |
| const int16_t& x, |
| const int16_t& y, |
| const uint16_t& width, |
| const uint16_t& height) { |
| return XProto::ClearArea( |
| ClearAreaRequest{exposures, window, x, y, width, height}); |
| } |
| |
| Future<void> XProto::CopyArea(const CopyAreaRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& src_drawable = request.src_drawable; |
| auto& dst_drawable = request.dst_drawable; |
| auto& gc = request.gc; |
| auto& src_x = request.src_x; |
| auto& src_y = request.src_y; |
| auto& dst_x = request.dst_x; |
| auto& dst_y = request.dst_y; |
| auto& width = request.width; |
| auto& height = request.height; |
| |
| // major_opcode |
| uint8_t major_opcode = 62; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // src_drawable |
| buf.Write(&src_drawable); |
| |
| // dst_drawable |
| buf.Write(&dst_drawable); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // src_x |
| buf.Write(&src_x); |
| |
| // src_y |
| buf.Write(&src_y); |
| |
| // dst_x |
| buf.Write(&dst_x); |
| |
| // dst_y |
| buf.Write(&dst_y); |
| |
| // width |
| buf.Write(&width); |
| |
| // height |
| buf.Write(&height); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "CopyArea", false); |
| } |
| |
| Future<void> XProto::CopyArea(const Drawable& src_drawable, |
| const Drawable& dst_drawable, |
| const GraphicsContext& gc, |
| const int16_t& src_x, |
| const int16_t& src_y, |
| const int16_t& dst_x, |
| const int16_t& dst_y, |
| const uint16_t& width, |
| const uint16_t& height) { |
| return XProto::CopyArea(CopyAreaRequest{src_drawable, dst_drawable, gc, src_x, |
| src_y, dst_x, dst_y, width, height}); |
| } |
| |
| Future<void> XProto::CopyPlane(const CopyPlaneRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& src_drawable = request.src_drawable; |
| auto& dst_drawable = request.dst_drawable; |
| auto& gc = request.gc; |
| auto& src_x = request.src_x; |
| auto& src_y = request.src_y; |
| auto& dst_x = request.dst_x; |
| auto& dst_y = request.dst_y; |
| auto& width = request.width; |
| auto& height = request.height; |
| auto& bit_plane = request.bit_plane; |
| |
| // major_opcode |
| uint8_t major_opcode = 63; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // src_drawable |
| buf.Write(&src_drawable); |
| |
| // dst_drawable |
| buf.Write(&dst_drawable); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // src_x |
| buf.Write(&src_x); |
| |
| // src_y |
| buf.Write(&src_y); |
| |
| // dst_x |
| buf.Write(&dst_x); |
| |
| // dst_y |
| buf.Write(&dst_y); |
| |
| // width |
| buf.Write(&width); |
| |
| // height |
| buf.Write(&height); |
| |
| // bit_plane |
| buf.Write(&bit_plane); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "CopyPlane", false); |
| } |
| |
| Future<void> XProto::CopyPlane(const Drawable& src_drawable, |
| const Drawable& dst_drawable, |
| const GraphicsContext& gc, |
| const int16_t& src_x, |
| const int16_t& src_y, |
| const int16_t& dst_x, |
| const int16_t& dst_y, |
| const uint16_t& width, |
| const uint16_t& height, |
| const uint32_t& bit_plane) { |
| return XProto::CopyPlane(CopyPlaneRequest{src_drawable, dst_drawable, gc, |
| src_x, src_y, dst_x, dst_y, width, |
| height, bit_plane}); |
| } |
| |
| Future<void> XProto::PolyPoint(const PolyPointRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& coordinate_mode = request.coordinate_mode; |
| auto& drawable = request.drawable; |
| auto& gc = request.gc; |
| auto& points = request.points; |
| size_t points_len = points.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 64; |
| buf.Write(&major_opcode); |
| |
| // coordinate_mode |
| uint8_t tmp99; |
| tmp99 = static_cast<uint8_t>(coordinate_mode); |
| buf.Write(&tmp99); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // points |
| DCHECK_EQ(static_cast<size_t>(points_len), points.size()); |
| for (auto& points_elem : points) { |
| // points_elem |
| { |
| auto& x = points_elem.x; |
| auto& y = points_elem.y; |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| } |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "PolyPoint", false); |
| } |
| |
| Future<void> XProto::PolyPoint(const CoordMode& coordinate_mode, |
| const Drawable& drawable, |
| const GraphicsContext& gc, |
| const std::vector<Point>& points) { |
| return XProto::PolyPoint( |
| PolyPointRequest{coordinate_mode, drawable, gc, points}); |
| } |
| |
| Future<void> XProto::PolyLine(const PolyLineRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& coordinate_mode = request.coordinate_mode; |
| auto& drawable = request.drawable; |
| auto& gc = request.gc; |
| auto& points = request.points; |
| size_t points_len = points.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 65; |
| buf.Write(&major_opcode); |
| |
| // coordinate_mode |
| uint8_t tmp100; |
| tmp100 = static_cast<uint8_t>(coordinate_mode); |
| buf.Write(&tmp100); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // points |
| DCHECK_EQ(static_cast<size_t>(points_len), points.size()); |
| for (auto& points_elem : points) { |
| // points_elem |
| { |
| auto& x = points_elem.x; |
| auto& y = points_elem.y; |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| } |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "PolyLine", false); |
| } |
| |
| Future<void> XProto::PolyLine(const CoordMode& coordinate_mode, |
| const Drawable& drawable, |
| const GraphicsContext& gc, |
| const std::vector<Point>& points) { |
| return XProto::PolyLine( |
| PolyLineRequest{coordinate_mode, drawable, gc, points}); |
| } |
| |
| Future<void> XProto::PolySegment(const PolySegmentRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& drawable = request.drawable; |
| auto& gc = request.gc; |
| auto& segments = request.segments; |
| size_t segments_len = segments.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 66; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // segments |
| DCHECK_EQ(static_cast<size_t>(segments_len), segments.size()); |
| for (auto& segments_elem : segments) { |
| // segments_elem |
| { |
| auto& x1 = segments_elem.x1; |
| auto& y1 = segments_elem.y1; |
| auto& x2 = segments_elem.x2; |
| auto& y2 = segments_elem.y2; |
| |
| // x1 |
| buf.Write(&x1); |
| |
| // y1 |
| buf.Write(&y1); |
| |
| // x2 |
| buf.Write(&x2); |
| |
| // y2 |
| buf.Write(&y2); |
| } |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "PolySegment", false); |
| } |
| |
| Future<void> XProto::PolySegment(const Drawable& drawable, |
| const GraphicsContext& gc, |
| const std::vector<Segment>& segments) { |
| return XProto::PolySegment(PolySegmentRequest{drawable, gc, segments}); |
| } |
| |
| Future<void> XProto::PolyRectangle(const PolyRectangleRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& drawable = request.drawable; |
| auto& gc = request.gc; |
| auto& rectangles = request.rectangles; |
| size_t rectangles_len = rectangles.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 67; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // rectangles |
| DCHECK_EQ(static_cast<size_t>(rectangles_len), rectangles.size()); |
| for (auto& rectangles_elem : rectangles) { |
| // rectangles_elem |
| { |
| auto& x = rectangles_elem.x; |
| auto& y = rectangles_elem.y; |
| auto& width = rectangles_elem.width; |
| auto& height = rectangles_elem.height; |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| |
| // width |
| buf.Write(&width); |
| |
| // height |
| buf.Write(&height); |
| } |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "PolyRectangle", false); |
| } |
| |
| Future<void> XProto::PolyRectangle(const Drawable& drawable, |
| const GraphicsContext& gc, |
| const std::vector<Rectangle>& rectangles) { |
| return XProto::PolyRectangle(PolyRectangleRequest{drawable, gc, rectangles}); |
| } |
| |
| Future<void> XProto::PolyArc(const PolyArcRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& drawable = request.drawable; |
| auto& gc = request.gc; |
| auto& arcs = request.arcs; |
| size_t arcs_len = arcs.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 68; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // arcs |
| DCHECK_EQ(static_cast<size_t>(arcs_len), arcs.size()); |
| for (auto& arcs_elem : arcs) { |
| // arcs_elem |
| { |
| auto& x = arcs_elem.x; |
| auto& y = arcs_elem.y; |
| auto& width = arcs_elem.width; |
| auto& height = arcs_elem.height; |
| auto& angle1 = arcs_elem.angle1; |
| auto& angle2 = arcs_elem.angle2; |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| |
| // width |
| buf.Write(&width); |
| |
| // height |
| buf.Write(&height); |
| |
| // angle1 |
| buf.Write(&angle1); |
| |
| // angle2 |
| buf.Write(&angle2); |
| } |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "PolyArc", false); |
| } |
| |
| Future<void> XProto::PolyArc(const Drawable& drawable, |
| const GraphicsContext& gc, |
| const std::vector<Arc>& arcs) { |
| return XProto::PolyArc(PolyArcRequest{drawable, gc, arcs}); |
| } |
| |
| Future<void> XProto::FillPoly(const FillPolyRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& drawable = request.drawable; |
| auto& gc = request.gc; |
| auto& shape = request.shape; |
| auto& coordinate_mode = request.coordinate_mode; |
| auto& points = request.points; |
| size_t points_len = points.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 69; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // shape |
| uint8_t tmp101; |
| tmp101 = static_cast<uint8_t>(shape); |
| buf.Write(&tmp101); |
| |
| // coordinate_mode |
| uint8_t tmp102; |
| tmp102 = static_cast<uint8_t>(coordinate_mode); |
| buf.Write(&tmp102); |
| |
| // pad1 |
| Pad(&buf, 2); |
| |
| // points |
| DCHECK_EQ(static_cast<size_t>(points_len), points.size()); |
| for (auto& points_elem : points) { |
| // points_elem |
| { |
| auto& x = points_elem.x; |
| auto& y = points_elem.y; |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| } |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "FillPoly", false); |
| } |
| |
| Future<void> XProto::FillPoly(const Drawable& drawable, |
| const GraphicsContext& gc, |
| const PolyShape& shape, |
| const CoordMode& coordinate_mode, |
| const std::vector<Point>& points) { |
| return XProto::FillPoly( |
| FillPolyRequest{drawable, gc, shape, coordinate_mode, points}); |
| } |
| |
| Future<void> XProto::PolyFillRectangle( |
| const PolyFillRectangleRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& drawable = request.drawable; |
| auto& gc = request.gc; |
| auto& rectangles = request.rectangles; |
| size_t rectangles_len = rectangles.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 70; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // rectangles |
| DCHECK_EQ(static_cast<size_t>(rectangles_len), rectangles.size()); |
| for (auto& rectangles_elem : rectangles) { |
| // rectangles_elem |
| { |
| auto& x = rectangles_elem.x; |
| auto& y = rectangles_elem.y; |
| auto& width = rectangles_elem.width; |
| auto& height = rectangles_elem.height; |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| |
| // width |
| buf.Write(&width); |
| |
| // height |
| buf.Write(&height); |
| } |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "PolyFillRectangle", false); |
| } |
| |
| Future<void> XProto::PolyFillRectangle( |
| const Drawable& drawable, |
| const GraphicsContext& gc, |
| const std::vector<Rectangle>& rectangles) { |
| return XProto::PolyFillRectangle( |
| PolyFillRectangleRequest{drawable, gc, rectangles}); |
| } |
| |
| Future<void> XProto::PolyFillArc(const PolyFillArcRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& drawable = request.drawable; |
| auto& gc = request.gc; |
| auto& arcs = request.arcs; |
| size_t arcs_len = arcs.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 71; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // arcs |
| DCHECK_EQ(static_cast<size_t>(arcs_len), arcs.size()); |
| for (auto& arcs_elem : arcs) { |
| // arcs_elem |
| { |
| auto& x = arcs_elem.x; |
| auto& y = arcs_elem.y; |
| auto& width = arcs_elem.width; |
| auto& height = arcs_elem.height; |
| auto& angle1 = arcs_elem.angle1; |
| auto& angle2 = arcs_elem.angle2; |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| |
| // width |
| buf.Write(&width); |
| |
| // height |
| buf.Write(&height); |
| |
| // angle1 |
| buf.Write(&angle1); |
| |
| // angle2 |
| buf.Write(&angle2); |
| } |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "PolyFillArc", false); |
| } |
| |
| Future<void> XProto::PolyFillArc(const Drawable& drawable, |
| const GraphicsContext& gc, |
| const std::vector<Arc>& arcs) { |
| return XProto::PolyFillArc(PolyFillArcRequest{drawable, gc, arcs}); |
| } |
| |
| Future<void> XProto::PutImage(const PutImageRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& format = request.format; |
| auto& drawable = request.drawable; |
| auto& gc = request.gc; |
| auto& width = request.width; |
| auto& height = request.height; |
| auto& dst_x = request.dst_x; |
| auto& dst_y = request.dst_y; |
| auto& left_pad = request.left_pad; |
| auto& depth = request.depth; |
| auto& data = request.data; |
| size_t data_len = data ? data->size() : 0; |
| |
| // major_opcode |
| uint8_t major_opcode = 72; |
| buf.Write(&major_opcode); |
| |
| // format |
| uint8_t tmp103; |
| tmp103 = static_cast<uint8_t>(format); |
| buf.Write(&tmp103); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // width |
| buf.Write(&width); |
| |
| // height |
| buf.Write(&height); |
| |
| // dst_x |
| buf.Write(&dst_x); |
| |
| // dst_y |
| buf.Write(&dst_y); |
| |
| // left_pad |
| buf.Write(&left_pad); |
| |
| // depth |
| buf.Write(&depth); |
| |
| // pad0 |
| Pad(&buf, 2); |
| |
| // data |
| buf.AppendBuffer(data, data_len); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "PutImage", false); |
| } |
| |
| Future<void> XProto::PutImage( |
| const ImageFormat& format, |
| const Drawable& drawable, |
| const GraphicsContext& gc, |
| const uint16_t& width, |
| const uint16_t& height, |
| const int16_t& dst_x, |
| const int16_t& dst_y, |
| const uint8_t& left_pad, |
| const uint8_t& depth, |
| const scoped_refptr<base::RefCountedMemory>& data) { |
| return XProto::PutImage(PutImageRequest{format, drawable, gc, width, height, |
| dst_x, dst_y, left_pad, depth, data}); |
| } |
| |
| Future<GetImageReply> XProto::GetImage(const GetImageRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& format = request.format; |
| auto& drawable = request.drawable; |
| auto& x = request.x; |
| auto& y = request.y; |
| auto& width = request.width; |
| auto& height = request.height; |
| auto& plane_mask = request.plane_mask; |
| |
| // major_opcode |
| uint8_t major_opcode = 73; |
| buf.Write(&major_opcode); |
| |
| // format |
| uint8_t tmp104; |
| tmp104 = static_cast<uint8_t>(format); |
| buf.Write(&tmp104); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| |
| // width |
| buf.Write(&width); |
| |
| // height |
| buf.Write(&height); |
| |
| // plane_mask |
| buf.Write(&plane_mask); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GetImageReply>(&buf, "GetImage", false); |
| } |
| |
| Future<GetImageReply> XProto::GetImage(const ImageFormat& format, |
| const Drawable& drawable, |
| const int16_t& x, |
| const int16_t& y, |
| const uint16_t& width, |
| const uint16_t& height, |
| const uint32_t& plane_mask) { |
| return XProto::GetImage( |
| GetImageRequest{format, drawable, x, y, width, height, plane_mask}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GetImageReply> detail::ReadReply<GetImageReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GetImageReply>(); |
| |
| auto& depth = (*reply).depth; |
| auto& sequence = (*reply).sequence; |
| auto& visual = (*reply).visual; |
| auto& data = (*reply).data; |
| size_t data_len = data ? data->size() : 0; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // depth |
| Read(&depth, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // visual |
| Read(&visual, &buf); |
| |
| // pad0 |
| Pad(&buf, 20); |
| |
| // data |
| data = buffer->ReadAndAdvance((length) * (4)); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::PolyText8(const PolyText8Request& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& drawable = request.drawable; |
| auto& gc = request.gc; |
| auto& x = request.x; |
| auto& y = request.y; |
| auto& items = request.items; |
| size_t items_len = items.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 74; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| |
| // items |
| DCHECK_EQ(static_cast<size_t>(items_len), items.size()); |
| for (auto& items_elem : items) { |
| // items_elem |
| buf.Write(&items_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "PolyText8", false); |
| } |
| |
| Future<void> XProto::PolyText8(const Drawable& drawable, |
| const GraphicsContext& gc, |
| const int16_t& x, |
| const int16_t& y, |
| const std::vector<uint8_t>& items) { |
| return XProto::PolyText8(PolyText8Request{drawable, gc, x, y, items}); |
| } |
| |
| Future<void> XProto::PolyText16(const PolyText16Request& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& drawable = request.drawable; |
| auto& gc = request.gc; |
| auto& x = request.x; |
| auto& y = request.y; |
| auto& items = request.items; |
| size_t items_len = items.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 75; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| |
| // items |
| DCHECK_EQ(static_cast<size_t>(items_len), items.size()); |
| for (auto& items_elem : items) { |
| // items_elem |
| buf.Write(&items_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "PolyText16", false); |
| } |
| |
| Future<void> XProto::PolyText16(const Drawable& drawable, |
| const GraphicsContext& gc, |
| const int16_t& x, |
| const int16_t& y, |
| const std::vector<uint8_t>& items) { |
| return XProto::PolyText16(PolyText16Request{drawable, gc, x, y, items}); |
| } |
| |
| Future<void> XProto::ImageText8(const ImageText8Request& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| uint8_t string_len{}; |
| auto& drawable = request.drawable; |
| auto& gc = request.gc; |
| auto& x = request.x; |
| auto& y = request.y; |
| auto& string = request.string; |
| |
| // major_opcode |
| uint8_t major_opcode = 76; |
| buf.Write(&major_opcode); |
| |
| // string_len |
| string_len = string.size(); |
| buf.Write(&string_len); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| |
| // string |
| DCHECK_EQ(static_cast<size_t>(string_len), string.size()); |
| for (auto& string_elem : string) { |
| // string_elem |
| buf.Write(&string_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ImageText8", false); |
| } |
| |
| Future<void> XProto::ImageText8(const Drawable& drawable, |
| const GraphicsContext& gc, |
| const int16_t& x, |
| const int16_t& y, |
| const std::string& string) { |
| return XProto::ImageText8(ImageText8Request{drawable, gc, x, y, string}); |
| } |
| |
| Future<void> XProto::ImageText16(const ImageText16Request& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| uint8_t string_len{}; |
| auto& drawable = request.drawable; |
| auto& gc = request.gc; |
| auto& x = request.x; |
| auto& y = request.y; |
| auto& string = request.string; |
| |
| // major_opcode |
| uint8_t major_opcode = 77; |
| buf.Write(&major_opcode); |
| |
| // string_len |
| string_len = string.size(); |
| buf.Write(&string_len); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // gc |
| buf.Write(&gc); |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| |
| // string |
| DCHECK_EQ(static_cast<size_t>(string_len), string.size()); |
| for (auto& string_elem : string) { |
| // string_elem |
| { |
| auto& byte1 = string_elem.byte1; |
| auto& byte2 = string_elem.byte2; |
| |
| // byte1 |
| buf.Write(&byte1); |
| |
| // byte2 |
| buf.Write(&byte2); |
| } |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ImageText16", false); |
| } |
| |
| Future<void> XProto::ImageText16(const Drawable& drawable, |
| const GraphicsContext& gc, |
| const int16_t& x, |
| const int16_t& y, |
| const std::vector<Char16>& string) { |
| return XProto::ImageText16(ImageText16Request{drawable, gc, x, y, string}); |
| } |
| |
| Future<void> XProto::CreateColormap(const CreateColormapRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& alloc = request.alloc; |
| auto& mid = request.mid; |
| auto& window = request.window; |
| auto& visual = request.visual; |
| |
| // major_opcode |
| uint8_t major_opcode = 78; |
| buf.Write(&major_opcode); |
| |
| // alloc |
| uint8_t tmp105; |
| tmp105 = static_cast<uint8_t>(alloc); |
| buf.Write(&tmp105); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // mid |
| buf.Write(&mid); |
| |
| // window |
| buf.Write(&window); |
| |
| // visual |
| buf.Write(&visual); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "CreateColormap", false); |
| } |
| |
| Future<void> XProto::CreateColormap(const ColormapAlloc& alloc, |
| const ColorMap& mid, |
| const Window& window, |
| const VisualId& visual) { |
| return XProto::CreateColormap( |
| CreateColormapRequest{alloc, mid, window, visual}); |
| } |
| |
| Future<void> XProto::FreeColormap(const FreeColormapRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& cmap = request.cmap; |
| |
| // major_opcode |
| uint8_t major_opcode = 79; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cmap |
| buf.Write(&cmap); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "FreeColormap", false); |
| } |
| |
| Future<void> XProto::FreeColormap(const ColorMap& cmap) { |
| return XProto::FreeColormap(FreeColormapRequest{cmap}); |
| } |
| |
| Future<void> XProto::CopyColormapAndFree( |
| const CopyColormapAndFreeRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& mid = request.mid; |
| auto& src_cmap = request.src_cmap; |
| |
| // major_opcode |
| uint8_t major_opcode = 80; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // mid |
| buf.Write(&mid); |
| |
| // src_cmap |
| buf.Write(&src_cmap); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "CopyColormapAndFree", false); |
| } |
| |
| Future<void> XProto::CopyColormapAndFree(const ColorMap& mid, |
| const ColorMap& src_cmap) { |
| return XProto::CopyColormapAndFree(CopyColormapAndFreeRequest{mid, src_cmap}); |
| } |
| |
| Future<void> XProto::InstallColormap(const InstallColormapRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& cmap = request.cmap; |
| |
| // major_opcode |
| uint8_t major_opcode = 81; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cmap |
| buf.Write(&cmap); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "InstallColormap", false); |
| } |
| |
| Future<void> XProto::InstallColormap(const ColorMap& cmap) { |
| return XProto::InstallColormap(InstallColormapRequest{cmap}); |
| } |
| |
| Future<void> XProto::UninstallColormap( |
| const UninstallColormapRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& cmap = request.cmap; |
| |
| // major_opcode |
| uint8_t major_opcode = 82; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cmap |
| buf.Write(&cmap); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "UninstallColormap", false); |
| } |
| |
| Future<void> XProto::UninstallColormap(const ColorMap& cmap) { |
| return XProto::UninstallColormap(UninstallColormapRequest{cmap}); |
| } |
| |
| Future<ListInstalledColormapsReply> XProto::ListInstalledColormaps( |
| const ListInstalledColormapsRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| |
| // major_opcode |
| uint8_t major_opcode = 83; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<ListInstalledColormapsReply>( |
| &buf, "ListInstalledColormaps", false); |
| } |
| |
| Future<ListInstalledColormapsReply> XProto::ListInstalledColormaps( |
| const Window& window) { |
| return XProto::ListInstalledColormaps(ListInstalledColormapsRequest{window}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<ListInstalledColormapsReply> detail::ReadReply< |
| ListInstalledColormapsReply>(ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<ListInstalledColormapsReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| uint16_t cmaps_len{}; |
| auto& cmaps = (*reply).cmaps; |
| |
| // 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); |
| |
| // cmaps_len |
| Read(&cmaps_len, &buf); |
| |
| // pad1 |
| Pad(&buf, 22); |
| |
| // cmaps |
| cmaps.resize(cmaps_len); |
| for (auto& cmaps_elem : cmaps) { |
| // cmaps_elem |
| Read(&cmaps_elem, &buf); |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<AllocColorReply> XProto::AllocColor(const AllocColorRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& cmap = request.cmap; |
| auto& red = request.red; |
| auto& green = request.green; |
| auto& blue = request.blue; |
| |
| // major_opcode |
| uint8_t major_opcode = 84; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cmap |
| buf.Write(&cmap); |
| |
| // red |
| buf.Write(&red); |
| |
| // green |
| buf.Write(&green); |
| |
| // blue |
| buf.Write(&blue); |
| |
| // pad1 |
| Pad(&buf, 2); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<AllocColorReply>(&buf, "AllocColor", false); |
| } |
| |
| Future<AllocColorReply> XProto::AllocColor(const ColorMap& cmap, |
| const uint16_t& red, |
| const uint16_t& green, |
| const uint16_t& blue) { |
| return XProto::AllocColor(AllocColorRequest{cmap, red, green, blue}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<AllocColorReply> detail::ReadReply<AllocColorReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<AllocColorReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| auto& red = (*reply).red; |
| auto& green = (*reply).green; |
| auto& blue = (*reply).blue; |
| auto& pixel = (*reply).pixel; |
| |
| // 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, 2); |
| |
| // pixel |
| Read(&pixel, &buf); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<AllocNamedColorReply> XProto::AllocNamedColor( |
| const AllocNamedColorRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& cmap = request.cmap; |
| uint16_t name_len{}; |
| auto& name = request.name; |
| |
| // major_opcode |
| uint8_t major_opcode = 85; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cmap |
| buf.Write(&cmap); |
| |
| // name_len |
| name_len = name.size(); |
| buf.Write(&name_len); |
| |
| // pad1 |
| Pad(&buf, 2); |
| |
| // name |
| DCHECK_EQ(static_cast<size_t>(name_len), name.size()); |
| for (auto& name_elem : name) { |
| // name_elem |
| buf.Write(&name_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<AllocNamedColorReply>(&buf, "AllocNamedColor", |
| false); |
| } |
| |
| Future<AllocNamedColorReply> XProto::AllocNamedColor(const ColorMap& cmap, |
| const std::string& name) { |
| return XProto::AllocNamedColor(AllocNamedColorRequest{cmap, name}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<AllocNamedColorReply> detail::ReadReply<AllocNamedColorReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<AllocNamedColorReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| auto& pixel = (*reply).pixel; |
| auto& exact_red = (*reply).exact_red; |
| auto& exact_green = (*reply).exact_green; |
| auto& exact_blue = (*reply).exact_blue; |
| auto& visual_red = (*reply).visual_red; |
| auto& visual_green = (*reply).visual_green; |
| auto& visual_blue = (*reply).visual_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); |
| |
| // pixel |
| Read(&pixel, &buf); |
| |
| // exact_red |
| Read(&exact_red, &buf); |
| |
| // exact_green |
| Read(&exact_green, &buf); |
| |
| // exact_blue |
| Read(&exact_blue, &buf); |
| |
| // visual_red |
| Read(&visual_red, &buf); |
| |
| // visual_green |
| Read(&visual_green, &buf); |
| |
| // visual_blue |
| Read(&visual_blue, &buf); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<AllocColorCellsReply> XProto::AllocColorCells( |
| const AllocColorCellsRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& contiguous = request.contiguous; |
| auto& cmap = request.cmap; |
| auto& colors = request.colors; |
| auto& planes = request.planes; |
| |
| // major_opcode |
| uint8_t major_opcode = 86; |
| buf.Write(&major_opcode); |
| |
| // contiguous |
| buf.Write(&contiguous); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cmap |
| buf.Write(&cmap); |
| |
| // colors |
| buf.Write(&colors); |
| |
| // planes |
| buf.Write(&planes); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<AllocColorCellsReply>(&buf, "AllocColorCells", |
| false); |
| } |
| |
| Future<AllocColorCellsReply> XProto::AllocColorCells(const uint8_t& contiguous, |
| const ColorMap& cmap, |
| const uint16_t& colors, |
| const uint16_t& planes) { |
| return XProto::AllocColorCells( |
| AllocColorCellsRequest{contiguous, cmap, colors, planes}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<AllocColorCellsReply> detail::ReadReply<AllocColorCellsReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<AllocColorCellsReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| uint16_t pixels_len{}; |
| uint16_t masks_len{}; |
| auto& pixels = (*reply).pixels; |
| auto& masks = (*reply).masks; |
| |
| // 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); |
| |
| // pixels_len |
| Read(&pixels_len, &buf); |
| |
| // masks_len |
| Read(&masks_len, &buf); |
| |
| // pad1 |
| Pad(&buf, 20); |
| |
| // pixels |
| pixels.resize(pixels_len); |
| for (auto& pixels_elem : pixels) { |
| // pixels_elem |
| Read(&pixels_elem, &buf); |
| } |
| |
| // masks |
| masks.resize(masks_len); |
| for (auto& masks_elem : masks) { |
| // masks_elem |
| Read(&masks_elem, &buf); |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<AllocColorPlanesReply> XProto::AllocColorPlanes( |
| const AllocColorPlanesRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& contiguous = request.contiguous; |
| auto& cmap = request.cmap; |
| auto& colors = request.colors; |
| auto& reds = request.reds; |
| auto& greens = request.greens; |
| auto& blues = request.blues; |
| |
| // major_opcode |
| uint8_t major_opcode = 87; |
| buf.Write(&major_opcode); |
| |
| // contiguous |
| buf.Write(&contiguous); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cmap |
| buf.Write(&cmap); |
| |
| // colors |
| buf.Write(&colors); |
| |
| // reds |
| buf.Write(&reds); |
| |
| // greens |
| buf.Write(&greens); |
| |
| // blues |
| buf.Write(&blues); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<AllocColorPlanesReply>( |
| &buf, "AllocColorPlanes", false); |
| } |
| |
| Future<AllocColorPlanesReply> XProto::AllocColorPlanes( |
| const uint8_t& contiguous, |
| const ColorMap& cmap, |
| const uint16_t& colors, |
| const uint16_t& reds, |
| const uint16_t& greens, |
| const uint16_t& blues) { |
| return XProto::AllocColorPlanes( |
| AllocColorPlanesRequest{contiguous, cmap, colors, reds, greens, blues}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<AllocColorPlanesReply> detail::ReadReply<AllocColorPlanesReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<AllocColorPlanesReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| uint16_t pixels_len{}; |
| auto& red_mask = (*reply).red_mask; |
| auto& green_mask = (*reply).green_mask; |
| auto& blue_mask = (*reply).blue_mask; |
| auto& pixels = (*reply).pixels; |
| |
| // 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); |
| |
| // pixels_len |
| Read(&pixels_len, &buf); |
| |
| // pad1 |
| Pad(&buf, 2); |
| |
| // red_mask |
| Read(&red_mask, &buf); |
| |
| // green_mask |
| Read(&green_mask, &buf); |
| |
| // blue_mask |
| Read(&blue_mask, &buf); |
| |
| // pad2 |
| Pad(&buf, 8); |
| |
| // pixels |
| pixels.resize(pixels_len); |
| for (auto& pixels_elem : pixels) { |
| // pixels_elem |
| Read(&pixels_elem, &buf); |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::FreeColors(const FreeColorsRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& cmap = request.cmap; |
| auto& plane_mask = request.plane_mask; |
| auto& pixels = request.pixels; |
| size_t pixels_len = pixels.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 88; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cmap |
| buf.Write(&cmap); |
| |
| // plane_mask |
| buf.Write(&plane_mask); |
| |
| // pixels |
| DCHECK_EQ(static_cast<size_t>(pixels_len), pixels.size()); |
| for (auto& pixels_elem : pixels) { |
| // pixels_elem |
| buf.Write(&pixels_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "FreeColors", false); |
| } |
| |
| Future<void> XProto::FreeColors(const ColorMap& cmap, |
| const uint32_t& plane_mask, |
| const std::vector<uint32_t>& pixels) { |
| return XProto::FreeColors(FreeColorsRequest{cmap, plane_mask, pixels}); |
| } |
| |
| Future<void> XProto::StoreColors(const StoreColorsRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& cmap = request.cmap; |
| auto& items = request.items; |
| size_t items_len = items.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 89; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cmap |
| buf.Write(&cmap); |
| |
| // items |
| DCHECK_EQ(static_cast<size_t>(items_len), items.size()); |
| for (auto& items_elem : items) { |
| // items_elem |
| { |
| auto& pixel = items_elem.pixel; |
| auto& red = items_elem.red; |
| auto& green = items_elem.green; |
| auto& blue = items_elem.blue; |
| auto& flags = items_elem.flags; |
| |
| // pixel |
| buf.Write(&pixel); |
| |
| // red |
| buf.Write(&red); |
| |
| // green |
| buf.Write(&green); |
| |
| // blue |
| buf.Write(&blue); |
| |
| // flags |
| uint8_t tmp106; |
| tmp106 = static_cast<uint8_t>(flags); |
| buf.Write(&tmp106); |
| |
| // pad0 |
| Pad(&buf, 1); |
| } |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "StoreColors", false); |
| } |
| |
| Future<void> XProto::StoreColors(const ColorMap& cmap, |
| const std::vector<ColorItem>& items) { |
| return XProto::StoreColors(StoreColorsRequest{cmap, items}); |
| } |
| |
| Future<void> XProto::StoreNamedColor(const StoreNamedColorRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& flags = request.flags; |
| auto& cmap = request.cmap; |
| auto& pixel = request.pixel; |
| uint16_t name_len{}; |
| auto& name = request.name; |
| |
| // major_opcode |
| uint8_t major_opcode = 90; |
| buf.Write(&major_opcode); |
| |
| // flags |
| uint8_t tmp107; |
| tmp107 = static_cast<uint8_t>(flags); |
| buf.Write(&tmp107); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cmap |
| buf.Write(&cmap); |
| |
| // pixel |
| buf.Write(&pixel); |
| |
| // name_len |
| name_len = name.size(); |
| buf.Write(&name_len); |
| |
| // pad0 |
| Pad(&buf, 2); |
| |
| // name |
| DCHECK_EQ(static_cast<size_t>(name_len), name.size()); |
| for (auto& name_elem : name) { |
| // name_elem |
| buf.Write(&name_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "StoreNamedColor", false); |
| } |
| |
| Future<void> XProto::StoreNamedColor(const ColorFlag& flags, |
| const ColorMap& cmap, |
| const uint32_t& pixel, |
| const std::string& name) { |
| return XProto::StoreNamedColor( |
| StoreNamedColorRequest{flags, cmap, pixel, name}); |
| } |
| |
| Future<QueryColorsReply> XProto::QueryColors( |
| const QueryColorsRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& cmap = request.cmap; |
| auto& pixels = request.pixels; |
| size_t pixels_len = pixels.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 91; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cmap |
| buf.Write(&cmap); |
| |
| // pixels |
| DCHECK_EQ(static_cast<size_t>(pixels_len), pixels.size()); |
| for (auto& pixels_elem : pixels) { |
| // pixels_elem |
| buf.Write(&pixels_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<QueryColorsReply>(&buf, "QueryColors", false); |
| } |
| |
| Future<QueryColorsReply> XProto::QueryColors( |
| const ColorMap& cmap, |
| const std::vector<uint32_t>& pixels) { |
| return XProto::QueryColors(QueryColorsRequest{cmap, pixels}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<QueryColorsReply> detail::ReadReply<QueryColorsReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<QueryColorsReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| uint16_t colors_len{}; |
| auto& colors = (*reply).colors; |
| |
| // 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); |
| |
| // colors_len |
| Read(&colors_len, &buf); |
| |
| // pad1 |
| Pad(&buf, 22); |
| |
| // colors |
| colors.resize(colors_len); |
| for (auto& colors_elem : colors) { |
| // colors_elem |
| { |
| auto& red = colors_elem.red; |
| auto& green = colors_elem.green; |
| auto& blue = colors_elem.blue; |
| |
| // red |
| Read(&red, &buf); |
| |
| // green |
| Read(&green, &buf); |
| |
| // blue |
| Read(&blue, &buf); |
| |
| // pad0 |
| Pad(&buf, 2); |
| } |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<LookupColorReply> XProto::LookupColor( |
| const LookupColorRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& cmap = request.cmap; |
| uint16_t name_len{}; |
| auto& name = request.name; |
| |
| // major_opcode |
| uint8_t major_opcode = 92; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cmap |
| buf.Write(&cmap); |
| |
| // name_len |
| name_len = name.size(); |
| buf.Write(&name_len); |
| |
| // pad1 |
| Pad(&buf, 2); |
| |
| // name |
| DCHECK_EQ(static_cast<size_t>(name_len), name.size()); |
| for (auto& name_elem : name) { |
| // name_elem |
| buf.Write(&name_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<LookupColorReply>(&buf, "LookupColor", false); |
| } |
| |
| Future<LookupColorReply> XProto::LookupColor(const ColorMap& cmap, |
| const std::string& name) { |
| return XProto::LookupColor(LookupColorRequest{cmap, name}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<LookupColorReply> detail::ReadReply<LookupColorReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<LookupColorReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| auto& exact_red = (*reply).exact_red; |
| auto& exact_green = (*reply).exact_green; |
| auto& exact_blue = (*reply).exact_blue; |
| auto& visual_red = (*reply).visual_red; |
| auto& visual_green = (*reply).visual_green; |
| auto& visual_blue = (*reply).visual_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); |
| |
| // exact_red |
| Read(&exact_red, &buf); |
| |
| // exact_green |
| Read(&exact_green, &buf); |
| |
| // exact_blue |
| Read(&exact_blue, &buf); |
| |
| // visual_red |
| Read(&visual_red, &buf); |
| |
| // visual_green |
| Read(&visual_green, &buf); |
| |
| // visual_blue |
| Read(&visual_blue, &buf); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::CreateCursor(const CreateCursorRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& cid = request.cid; |
| auto& source = request.source; |
| auto& mask = request.mask; |
| auto& fore_red = request.fore_red; |
| auto& fore_green = request.fore_green; |
| auto& fore_blue = request.fore_blue; |
| auto& back_red = request.back_red; |
| auto& back_green = request.back_green; |
| auto& back_blue = request.back_blue; |
| auto& x = request.x; |
| auto& y = request.y; |
| |
| // major_opcode |
| uint8_t major_opcode = 93; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cid |
| buf.Write(&cid); |
| |
| // source |
| buf.Write(&source); |
| |
| // mask |
| buf.Write(&mask); |
| |
| // fore_red |
| buf.Write(&fore_red); |
| |
| // fore_green |
| buf.Write(&fore_green); |
| |
| // fore_blue |
| buf.Write(&fore_blue); |
| |
| // back_red |
| buf.Write(&back_red); |
| |
| // back_green |
| buf.Write(&back_green); |
| |
| // back_blue |
| buf.Write(&back_blue); |
| |
| // x |
| buf.Write(&x); |
| |
| // y |
| buf.Write(&y); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "CreateCursor", false); |
| } |
| |
| Future<void> XProto::CreateCursor(const Cursor& cid, |
| const Pixmap& source, |
| const Pixmap& mask, |
| const uint16_t& fore_red, |
| const uint16_t& fore_green, |
| const uint16_t& fore_blue, |
| const uint16_t& back_red, |
| const uint16_t& back_green, |
| const uint16_t& back_blue, |
| const uint16_t& x, |
| const uint16_t& y) { |
| return XProto::CreateCursor( |
| CreateCursorRequest{cid, source, mask, fore_red, fore_green, fore_blue, |
| back_red, back_green, back_blue, x, y}); |
| } |
| |
| Future<void> XProto::CreateGlyphCursor( |
| const CreateGlyphCursorRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& cid = request.cid; |
| auto& source_font = request.source_font; |
| auto& mask_font = request.mask_font; |
| auto& source_char = request.source_char; |
| auto& mask_char = request.mask_char; |
| auto& fore_red = request.fore_red; |
| auto& fore_green = request.fore_green; |
| auto& fore_blue = request.fore_blue; |
| auto& back_red = request.back_red; |
| auto& back_green = request.back_green; |
| auto& back_blue = request.back_blue; |
| |
| // major_opcode |
| uint8_t major_opcode = 94; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cid |
| buf.Write(&cid); |
| |
| // source_font |
| buf.Write(&source_font); |
| |
| // mask_font |
| buf.Write(&mask_font); |
| |
| // source_char |
| buf.Write(&source_char); |
| |
| // mask_char |
| buf.Write(&mask_char); |
| |
| // fore_red |
| buf.Write(&fore_red); |
| |
| // fore_green |
| buf.Write(&fore_green); |
| |
| // fore_blue |
| buf.Write(&fore_blue); |
| |
| // back_red |
| buf.Write(&back_red); |
| |
| // back_green |
| buf.Write(&back_green); |
| |
| // back_blue |
| buf.Write(&back_blue); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "CreateGlyphCursor", false); |
| } |
| |
| Future<void> XProto::CreateGlyphCursor(const Cursor& cid, |
| const Font& source_font, |
| const Font& mask_font, |
| const uint16_t& source_char, |
| const uint16_t& mask_char, |
| const uint16_t& fore_red, |
| const uint16_t& fore_green, |
| const uint16_t& fore_blue, |
| const uint16_t& back_red, |
| const uint16_t& back_green, |
| const uint16_t& back_blue) { |
| return XProto::CreateGlyphCursor(CreateGlyphCursorRequest{ |
| cid, source_font, mask_font, source_char, mask_char, fore_red, fore_green, |
| fore_blue, back_red, back_green, back_blue}); |
| } |
| |
| Future<void> XProto::FreeCursor(const FreeCursorRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& cursor = request.cursor; |
| |
| // major_opcode |
| uint8_t major_opcode = 95; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cursor |
| buf.Write(&cursor); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "FreeCursor", false); |
| } |
| |
| Future<void> XProto::FreeCursor(const Cursor& cursor) { |
| return XProto::FreeCursor(FreeCursorRequest{cursor}); |
| } |
| |
| Future<void> XProto::RecolorCursor(const RecolorCursorRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& cursor = request.cursor; |
| auto& fore_red = request.fore_red; |
| auto& fore_green = request.fore_green; |
| auto& fore_blue = request.fore_blue; |
| auto& back_red = request.back_red; |
| auto& back_green = request.back_green; |
| auto& back_blue = request.back_blue; |
| |
| // major_opcode |
| uint8_t major_opcode = 96; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // cursor |
| buf.Write(&cursor); |
| |
| // fore_red |
| buf.Write(&fore_red); |
| |
| // fore_green |
| buf.Write(&fore_green); |
| |
| // fore_blue |
| buf.Write(&fore_blue); |
| |
| // back_red |
| buf.Write(&back_red); |
| |
| // back_green |
| buf.Write(&back_green); |
| |
| // back_blue |
| buf.Write(&back_blue); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "RecolorCursor", false); |
| } |
| |
| Future<void> XProto::RecolorCursor(const Cursor& cursor, |
| const uint16_t& fore_red, |
| const uint16_t& fore_green, |
| const uint16_t& fore_blue, |
| const uint16_t& back_red, |
| const uint16_t& back_green, |
| const uint16_t& back_blue) { |
| return XProto::RecolorCursor( |
| RecolorCursorRequest{cursor, fore_red, fore_green, fore_blue, back_red, |
| back_green, back_blue}); |
| } |
| |
| Future<QueryBestSizeReply> XProto::QueryBestSize( |
| const QueryBestSizeRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& c_class = request.c_class; |
| auto& drawable = request.drawable; |
| auto& width = request.width; |
| auto& height = request.height; |
| |
| // major_opcode |
| uint8_t major_opcode = 97; |
| buf.Write(&major_opcode); |
| |
| // c_class |
| uint8_t tmp108; |
| tmp108 = static_cast<uint8_t>(c_class); |
| buf.Write(&tmp108); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // drawable |
| buf.Write(&drawable); |
| |
| // width |
| buf.Write(&width); |
| |
| // height |
| buf.Write(&height); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<QueryBestSizeReply>(&buf, "QueryBestSize", |
| false); |
| } |
| |
| Future<QueryBestSizeReply> XProto::QueryBestSize(const QueryShapeOf& c_class, |
| const Drawable& drawable, |
| const uint16_t& width, |
| const uint16_t& height) { |
| return XProto::QueryBestSize( |
| QueryBestSizeRequest{c_class, drawable, width, height}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<QueryBestSizeReply> detail::ReadReply<QueryBestSizeReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<QueryBestSizeReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| auto& width = (*reply).width; |
| auto& height = (*reply).height; |
| |
| // 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); |
| |
| // width |
| Read(&width, &buf); |
| |
| // height |
| Read(&height, &buf); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<QueryExtensionReply> XProto::QueryExtension( |
| const QueryExtensionRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| uint16_t name_len{}; |
| auto& name = request.name; |
| |
| // major_opcode |
| uint8_t major_opcode = 98; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // name_len |
| name_len = name.size(); |
| buf.Write(&name_len); |
| |
| // pad1 |
| Pad(&buf, 2); |
| |
| // name |
| DCHECK_EQ(static_cast<size_t>(name_len), name.size()); |
| for (auto& name_elem : name) { |
| // name_elem |
| buf.Write(&name_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<QueryExtensionReply>(&buf, "QueryExtension", |
| false); |
| } |
| |
| Future<QueryExtensionReply> XProto::QueryExtension(const std::string& name) { |
| return XProto::QueryExtension(QueryExtensionRequest{name}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<QueryExtensionReply> detail::ReadReply<QueryExtensionReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<QueryExtensionReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| auto& present = (*reply).present; |
| auto& major_opcode = (*reply).major_opcode; |
| auto& first_event = (*reply).first_event; |
| auto& first_error = (*reply).first_error; |
| |
| // 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); |
| |
| // present |
| Read(&present, &buf); |
| |
| // major_opcode |
| Read(&major_opcode, &buf); |
| |
| // first_event |
| Read(&first_event, &buf); |
| |
| // first_error |
| Read(&first_error, &buf); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<ListExtensionsReply> XProto::ListExtensions( |
| const ListExtensionsRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| // major_opcode |
| uint8_t major_opcode = 99; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<ListExtensionsReply>(&buf, "ListExtensions", |
| false); |
| } |
| |
| Future<ListExtensionsReply> XProto::ListExtensions() { |
| return XProto::ListExtensions(ListExtensionsRequest{}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<ListExtensionsReply> detail::ReadReply<ListExtensionsReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<ListExtensionsReply>(); |
| |
| uint8_t names_len{}; |
| auto& sequence = (*reply).sequence; |
| auto& names = (*reply).names; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // names_len |
| Read(&names_len, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // pad0 |
| Pad(&buf, 24); |
| |
| // names |
| names.resize(names_len); |
| for (auto& names_elem : names) { |
| // names_elem |
| { |
| uint8_t name_len{}; |
| auto& name = names_elem.name; |
| |
| // name_len |
| Read(&name_len, &buf); |
| |
| // name |
| name.resize(name_len); |
| for (auto& name_elem : name) { |
| // name_elem |
| Read(&name_elem, &buf); |
| } |
| } |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::ChangeKeyboardMapping( |
| const ChangeKeyboardMappingRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& keycode_count = request.keycode_count; |
| auto& first_keycode = request.first_keycode; |
| auto& keysyms_per_keycode = request.keysyms_per_keycode; |
| auto& keysyms = request.keysyms; |
| size_t keysyms_len = keysyms.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 100; |
| buf.Write(&major_opcode); |
| |
| // keycode_count |
| buf.Write(&keycode_count); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // first_keycode |
| buf.Write(&first_keycode); |
| |
| // keysyms_per_keycode |
| buf.Write(&keysyms_per_keycode); |
| |
| // pad0 |
| Pad(&buf, 2); |
| |
| // keysyms |
| DCHECK_EQ(static_cast<size_t>((keycode_count) * (keysyms_per_keycode)), |
| keysyms.size()); |
| for (auto& keysyms_elem : keysyms) { |
| // keysyms_elem |
| buf.Write(&keysyms_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ChangeKeyboardMapping", false); |
| } |
| |
| Future<void> XProto::ChangeKeyboardMapping(const uint8_t& keycode_count, |
| const KeyCode& first_keycode, |
| const uint8_t& keysyms_per_keycode, |
| const std::vector<KeySym>& keysyms) { |
| return XProto::ChangeKeyboardMapping(ChangeKeyboardMappingRequest{ |
| keycode_count, first_keycode, keysyms_per_keycode, keysyms}); |
| } |
| |
| Future<GetKeyboardMappingReply> XProto::GetKeyboardMapping( |
| const GetKeyboardMappingRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& first_keycode = request.first_keycode; |
| auto& count = request.count; |
| |
| // major_opcode |
| uint8_t major_opcode = 101; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // first_keycode |
| buf.Write(&first_keycode); |
| |
| // count |
| buf.Write(&count); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GetKeyboardMappingReply>( |
| &buf, "GetKeyboardMapping", false); |
| } |
| |
| Future<GetKeyboardMappingReply> XProto::GetKeyboardMapping( |
| const KeyCode& first_keycode, |
| const uint8_t& count) { |
| return XProto::GetKeyboardMapping( |
| GetKeyboardMappingRequest{first_keycode, count}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GetKeyboardMappingReply> detail::ReadReply< |
| GetKeyboardMappingReply>(ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GetKeyboardMappingReply>(); |
| |
| auto& keysyms_per_keycode = (*reply).keysyms_per_keycode; |
| auto& sequence = (*reply).sequence; |
| auto& keysyms = (*reply).keysyms; |
| size_t keysyms_len = keysyms.size(); |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // keysyms_per_keycode |
| Read(&keysyms_per_keycode, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // pad0 |
| Pad(&buf, 24); |
| |
| // keysyms |
| keysyms.resize(length); |
| for (auto& keysyms_elem : keysyms) { |
| // keysyms_elem |
| Read(&keysyms_elem, &buf); |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::ChangeKeyboardControl( |
| const ChangeKeyboardControlRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| Keyboard value_mask{}; |
| auto& value_list = request; |
| |
| // major_opcode |
| uint8_t major_opcode = 102; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // value_mask |
| SwitchVar(Keyboard::KeyClickPercent, value_list.key_click_percent.has_value(), |
| true, &value_mask); |
| SwitchVar(Keyboard::BellPercent, value_list.bell_percent.has_value(), true, |
| &value_mask); |
| SwitchVar(Keyboard::BellPitch, value_list.bell_pitch.has_value(), true, |
| &value_mask); |
| SwitchVar(Keyboard::BellDuration, value_list.bell_duration.has_value(), true, |
| &value_mask); |
| SwitchVar(Keyboard::Led, value_list.led.has_value(), true, &value_mask); |
| SwitchVar(Keyboard::LedMode, value_list.led_mode.has_value(), true, |
| &value_mask); |
| SwitchVar(Keyboard::Key, value_list.key.has_value(), true, &value_mask); |
| SwitchVar(Keyboard::AutoRepeatMode, value_list.auto_repeat_mode.has_value(), |
| true, &value_mask); |
| uint32_t tmp109; |
| tmp109 = static_cast<uint32_t>(value_mask); |
| buf.Write(&tmp109); |
| |
| // value_list |
| auto value_list_expr = value_mask; |
| if (CaseAnd(value_list_expr, Keyboard::KeyClickPercent)) { |
| auto& key_click_percent = *value_list.key_click_percent; |
| |
| // key_click_percent |
| buf.Write(&key_click_percent); |
| } |
| if (CaseAnd(value_list_expr, Keyboard::BellPercent)) { |
| auto& bell_percent = *value_list.bell_percent; |
| |
| // bell_percent |
| buf.Write(&bell_percent); |
| } |
| if (CaseAnd(value_list_expr, Keyboard::BellPitch)) { |
| auto& bell_pitch = *value_list.bell_pitch; |
| |
| // bell_pitch |
| buf.Write(&bell_pitch); |
| } |
| if (CaseAnd(value_list_expr, Keyboard::BellDuration)) { |
| auto& bell_duration = *value_list.bell_duration; |
| |
| // bell_duration |
| buf.Write(&bell_duration); |
| } |
| if (CaseAnd(value_list_expr, Keyboard::Led)) { |
| auto& led = *value_list.led; |
| |
| // led |
| buf.Write(&led); |
| } |
| if (CaseAnd(value_list_expr, Keyboard::LedMode)) { |
| auto& led_mode = *value_list.led_mode; |
| |
| // led_mode |
| uint32_t tmp110; |
| tmp110 = static_cast<uint32_t>(led_mode); |
| buf.Write(&tmp110); |
| } |
| if (CaseAnd(value_list_expr, Keyboard::Key)) { |
| auto& key = *value_list.key; |
| |
| // key |
| buf.Write(&key); |
| } |
| if (CaseAnd(value_list_expr, Keyboard::AutoRepeatMode)) { |
| auto& auto_repeat_mode = *value_list.auto_repeat_mode; |
| |
| // auto_repeat_mode |
| uint32_t tmp111; |
| tmp111 = static_cast<uint32_t>(auto_repeat_mode); |
| buf.Write(&tmp111); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ChangeKeyboardControl", false); |
| } |
| |
| Future<void> XProto::ChangeKeyboardControl( |
| const absl::optional<int32_t>& key_click_percent, |
| const absl::optional<int32_t>& bell_percent, |
| const absl::optional<int32_t>& bell_pitch, |
| const absl::optional<int32_t>& bell_duration, |
| const absl::optional<uint32_t>& led, |
| const absl::optional<LedMode>& led_mode, |
| const absl::optional<KeyCode32>& key, |
| const absl::optional<AutoRepeatMode>& auto_repeat_mode) { |
| return XProto::ChangeKeyboardControl(ChangeKeyboardControlRequest{ |
| key_click_percent, bell_percent, bell_pitch, bell_duration, led, led_mode, |
| key, auto_repeat_mode}); |
| } |
| |
| Future<GetKeyboardControlReply> XProto::GetKeyboardControl( |
| const GetKeyboardControlRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| // major_opcode |
| uint8_t major_opcode = 103; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GetKeyboardControlReply>( |
| &buf, "GetKeyboardControl", false); |
| } |
| |
| Future<GetKeyboardControlReply> XProto::GetKeyboardControl() { |
| return XProto::GetKeyboardControl(GetKeyboardControlRequest{}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GetKeyboardControlReply> detail::ReadReply< |
| GetKeyboardControlReply>(ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GetKeyboardControlReply>(); |
| |
| auto& global_auto_repeat = (*reply).global_auto_repeat; |
| auto& sequence = (*reply).sequence; |
| auto& led_mask = (*reply).led_mask; |
| auto& key_click_percent = (*reply).key_click_percent; |
| auto& bell_percent = (*reply).bell_percent; |
| auto& bell_pitch = (*reply).bell_pitch; |
| auto& bell_duration = (*reply).bell_duration; |
| auto& auto_repeats = (*reply).auto_repeats; |
| size_t auto_repeats_len = auto_repeats.size(); |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // global_auto_repeat |
| uint8_t tmp112; |
| Read(&tmp112, &buf); |
| global_auto_repeat = static_cast<AutoRepeatMode>(tmp112); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // led_mask |
| Read(&led_mask, &buf); |
| |
| // key_click_percent |
| Read(&key_click_percent, &buf); |
| |
| // bell_percent |
| Read(&bell_percent, &buf); |
| |
| // bell_pitch |
| Read(&bell_pitch, &buf); |
| |
| // bell_duration |
| Read(&bell_duration, &buf); |
| |
| // pad0 |
| Pad(&buf, 2); |
| |
| // auto_repeats |
| for (auto& auto_repeats_elem : auto_repeats) { |
| // auto_repeats_elem |
| Read(&auto_repeats_elem, &buf); |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::Bell(const BellRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& percent = request.percent; |
| |
| // major_opcode |
| uint8_t major_opcode = 104; |
| buf.Write(&major_opcode); |
| |
| // percent |
| buf.Write(&percent); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "Bell", false); |
| } |
| |
| Future<void> XProto::Bell(const int8_t& percent) { |
| return XProto::Bell(BellRequest{percent}); |
| } |
| |
| Future<void> XProto::ChangePointerControl( |
| const ChangePointerControlRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& acceleration_numerator = request.acceleration_numerator; |
| auto& acceleration_denominator = request.acceleration_denominator; |
| auto& threshold = request.threshold; |
| auto& do_acceleration = request.do_acceleration; |
| auto& do_threshold = request.do_threshold; |
| |
| // major_opcode |
| uint8_t major_opcode = 105; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // acceleration_numerator |
| buf.Write(&acceleration_numerator); |
| |
| // acceleration_denominator |
| buf.Write(&acceleration_denominator); |
| |
| // threshold |
| buf.Write(&threshold); |
| |
| // do_acceleration |
| buf.Write(&do_acceleration); |
| |
| // do_threshold |
| buf.Write(&do_threshold); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ChangePointerControl", false); |
| } |
| |
| Future<void> XProto::ChangePointerControl( |
| const int16_t& acceleration_numerator, |
| const int16_t& acceleration_denominator, |
| const int16_t& threshold, |
| const uint8_t& do_acceleration, |
| const uint8_t& do_threshold) { |
| return XProto::ChangePointerControl(ChangePointerControlRequest{ |
| acceleration_numerator, acceleration_denominator, threshold, |
| do_acceleration, do_threshold}); |
| } |
| |
| Future<GetPointerControlReply> XProto::GetPointerControl( |
| const GetPointerControlRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| // major_opcode |
| uint8_t major_opcode = 106; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GetPointerControlReply>( |
| &buf, "GetPointerControl", false); |
| } |
| |
| Future<GetPointerControlReply> XProto::GetPointerControl() { |
| return XProto::GetPointerControl(GetPointerControlRequest{}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GetPointerControlReply> detail::ReadReply< |
| GetPointerControlReply>(ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GetPointerControlReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| auto& acceleration_numerator = (*reply).acceleration_numerator; |
| auto& acceleration_denominator = (*reply).acceleration_denominator; |
| auto& threshold = (*reply).threshold; |
| |
| // 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); |
| |
| // acceleration_numerator |
| Read(&acceleration_numerator, &buf); |
| |
| // acceleration_denominator |
| Read(&acceleration_denominator, &buf); |
| |
| // threshold |
| Read(&threshold, &buf); |
| |
| // pad1 |
| Pad(&buf, 18); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::SetScreenSaver(const SetScreenSaverRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& timeout = request.timeout; |
| auto& interval = request.interval; |
| auto& prefer_blanking = request.prefer_blanking; |
| auto& allow_exposures = request.allow_exposures; |
| |
| // major_opcode |
| uint8_t major_opcode = 107; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // timeout |
| buf.Write(&timeout); |
| |
| // interval |
| buf.Write(&interval); |
| |
| // prefer_blanking |
| uint8_t tmp113; |
| tmp113 = static_cast<uint8_t>(prefer_blanking); |
| buf.Write(&tmp113); |
| |
| // allow_exposures |
| uint8_t tmp114; |
| tmp114 = static_cast<uint8_t>(allow_exposures); |
| buf.Write(&tmp114); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "SetScreenSaver", false); |
| } |
| |
| Future<void> XProto::SetScreenSaver(const int16_t& timeout, |
| const int16_t& interval, |
| const Blanking& prefer_blanking, |
| const Exposures& allow_exposures) { |
| return XProto::SetScreenSaver(SetScreenSaverRequest{ |
| timeout, interval, prefer_blanking, allow_exposures}); |
| } |
| |
| Future<GetScreenSaverReply> XProto::GetScreenSaver( |
| const GetScreenSaverRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| // major_opcode |
| uint8_t major_opcode = 108; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GetScreenSaverReply>(&buf, "GetScreenSaver", |
| false); |
| } |
| |
| Future<GetScreenSaverReply> XProto::GetScreenSaver() { |
| return XProto::GetScreenSaver(GetScreenSaverRequest{}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GetScreenSaverReply> detail::ReadReply<GetScreenSaverReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GetScreenSaverReply>(); |
| |
| auto& sequence = (*reply).sequence; |
| auto& timeout = (*reply).timeout; |
| auto& interval = (*reply).interval; |
| auto& prefer_blanking = (*reply).prefer_blanking; |
| auto& allow_exposures = (*reply).allow_exposures; |
| |
| // 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); |
| |
| // timeout |
| Read(&timeout, &buf); |
| |
| // interval |
| Read(&interval, &buf); |
| |
| // prefer_blanking |
| uint8_t tmp115; |
| Read(&tmp115, &buf); |
| prefer_blanking = static_cast<Blanking>(tmp115); |
| |
| // allow_exposures |
| uint8_t tmp116; |
| Read(&tmp116, &buf); |
| allow_exposures = static_cast<Exposures>(tmp116); |
| |
| // pad1 |
| Pad(&buf, 18); |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::ChangeHosts(const ChangeHostsRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& mode = request.mode; |
| auto& family = request.family; |
| uint16_t address_len{}; |
| auto& address = request.address; |
| |
| // major_opcode |
| uint8_t major_opcode = 109; |
| buf.Write(&major_opcode); |
| |
| // mode |
| uint8_t tmp117; |
| tmp117 = static_cast<uint8_t>(mode); |
| buf.Write(&tmp117); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // family |
| uint8_t tmp118; |
| tmp118 = static_cast<uint8_t>(family); |
| buf.Write(&tmp118); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // address_len |
| address_len = address.size(); |
| buf.Write(&address_len); |
| |
| // address |
| DCHECK_EQ(static_cast<size_t>(address_len), address.size()); |
| for (auto& address_elem : address) { |
| // address_elem |
| buf.Write(&address_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ChangeHosts", false); |
| } |
| |
| Future<void> XProto::ChangeHosts(const HostMode& mode, |
| const Family& family, |
| const std::vector<uint8_t>& address) { |
| return XProto::ChangeHosts(ChangeHostsRequest{mode, family, address}); |
| } |
| |
| Future<ListHostsReply> XProto::ListHosts(const ListHostsRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| // major_opcode |
| uint8_t major_opcode = 110; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<ListHostsReply>(&buf, "ListHosts", false); |
| } |
| |
| Future<ListHostsReply> XProto::ListHosts() { |
| return XProto::ListHosts(ListHostsRequest{}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<ListHostsReply> detail::ReadReply<ListHostsReply>( |
| ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<ListHostsReply>(); |
| |
| auto& mode = (*reply).mode; |
| auto& sequence = (*reply).sequence; |
| uint16_t hosts_len{}; |
| auto& hosts = (*reply).hosts; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // mode |
| uint8_t tmp119; |
| Read(&tmp119, &buf); |
| mode = static_cast<AccessControl>(tmp119); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // hosts_len |
| Read(&hosts_len, &buf); |
| |
| // pad0 |
| Pad(&buf, 22); |
| |
| // hosts |
| hosts.resize(hosts_len); |
| for (auto& hosts_elem : hosts) { |
| // hosts_elem |
| { |
| auto& family = hosts_elem.family; |
| uint16_t address_len{}; |
| auto& address = hosts_elem.address; |
| |
| // family |
| uint8_t tmp120; |
| Read(&tmp120, &buf); |
| family = static_cast<Family>(tmp120); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // address_len |
| Read(&address_len, &buf); |
| |
| // address |
| address.resize(address_len); |
| for (auto& address_elem : address) { |
| // address_elem |
| Read(&address_elem, &buf); |
| } |
| |
| // pad1 |
| Align(&buf, 4); |
| } |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::SetAccessControl(const SetAccessControlRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& mode = request.mode; |
| |
| // major_opcode |
| uint8_t major_opcode = 111; |
| buf.Write(&major_opcode); |
| |
| // mode |
| uint8_t tmp121; |
| tmp121 = static_cast<uint8_t>(mode); |
| buf.Write(&tmp121); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "SetAccessControl", false); |
| } |
| |
| Future<void> XProto::SetAccessControl(const AccessControl& mode) { |
| return XProto::SetAccessControl(SetAccessControlRequest{mode}); |
| } |
| |
| Future<void> XProto::SetCloseDownMode(const SetCloseDownModeRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& mode = request.mode; |
| |
| // major_opcode |
| uint8_t major_opcode = 112; |
| buf.Write(&major_opcode); |
| |
| // mode |
| uint8_t tmp122; |
| tmp122 = static_cast<uint8_t>(mode); |
| buf.Write(&tmp122); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "SetCloseDownMode", false); |
| } |
| |
| Future<void> XProto::SetCloseDownMode(const CloseDown& mode) { |
| return XProto::SetCloseDownMode(SetCloseDownModeRequest{mode}); |
| } |
| |
| Future<void> XProto::KillClient(const KillClientRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& resource = request.resource; |
| |
| // major_opcode |
| uint8_t major_opcode = 113; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // resource |
| buf.Write(&resource); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "KillClient", false); |
| } |
| |
| Future<void> XProto::KillClient(const uint32_t& resource) { |
| return XProto::KillClient(KillClientRequest{resource}); |
| } |
| |
| Future<void> XProto::RotateProperties(const RotatePropertiesRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& window = request.window; |
| uint16_t atoms_len{}; |
| auto& delta = request.delta; |
| auto& atoms = request.atoms; |
| |
| // major_opcode |
| uint8_t major_opcode = 114; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // window |
| buf.Write(&window); |
| |
| // atoms_len |
| atoms_len = atoms.size(); |
| buf.Write(&atoms_len); |
| |
| // delta |
| buf.Write(&delta); |
| |
| // atoms |
| DCHECK_EQ(static_cast<size_t>(atoms_len), atoms.size()); |
| for (auto& atoms_elem : atoms) { |
| // atoms_elem |
| buf.Write(&atoms_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "RotateProperties", false); |
| } |
| |
| Future<void> XProto::RotateProperties(const Window& window, |
| const int16_t& delta, |
| const std::vector<Atom>& atoms) { |
| return XProto::RotateProperties( |
| RotatePropertiesRequest{window, delta, atoms}); |
| } |
| |
| Future<void> XProto::ForceScreenSaver(const ForceScreenSaverRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& mode = request.mode; |
| |
| // major_opcode |
| uint8_t major_opcode = 115; |
| buf.Write(&major_opcode); |
| |
| // mode |
| uint8_t tmp123; |
| tmp123 = static_cast<uint8_t>(mode); |
| buf.Write(&tmp123); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "ForceScreenSaver", false); |
| } |
| |
| Future<void> XProto::ForceScreenSaver(const ScreenSaverMode& mode) { |
| return XProto::ForceScreenSaver(ForceScreenSaverRequest{mode}); |
| } |
| |
| Future<SetPointerMappingReply> XProto::SetPointerMapping( |
| const SetPointerMappingRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| uint8_t map_len{}; |
| auto& map = request.map; |
| |
| // major_opcode |
| uint8_t major_opcode = 116; |
| buf.Write(&major_opcode); |
| |
| // map_len |
| map_len = map.size(); |
| buf.Write(&map_len); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // map |
| DCHECK_EQ(static_cast<size_t>(map_len), map.size()); |
| for (auto& map_elem : map) { |
| // map_elem |
| buf.Write(&map_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<SetPointerMappingReply>( |
| &buf, "SetPointerMapping", false); |
| } |
| |
| Future<SetPointerMappingReply> XProto::SetPointerMapping( |
| const std::vector<uint8_t>& map) { |
| return XProto::SetPointerMapping(SetPointerMappingRequest{map}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<SetPointerMappingReply> detail::ReadReply< |
| SetPointerMappingReply>(ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<SetPointerMappingReply>(); |
| |
| auto& status = (*reply).status; |
| auto& sequence = (*reply).sequence; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // status |
| uint8_t tmp124; |
| Read(&tmp124, &buf); |
| status = static_cast<MappingStatus>(tmp124); |
| |
| // 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<GetPointerMappingReply> XProto::GetPointerMapping( |
| const GetPointerMappingRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| // major_opcode |
| uint8_t major_opcode = 117; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GetPointerMappingReply>( |
| &buf, "GetPointerMapping", false); |
| } |
| |
| Future<GetPointerMappingReply> XProto::GetPointerMapping() { |
| return XProto::GetPointerMapping(GetPointerMappingRequest{}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GetPointerMappingReply> detail::ReadReply< |
| GetPointerMappingReply>(ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GetPointerMappingReply>(); |
| |
| uint8_t map_len{}; |
| auto& sequence = (*reply).sequence; |
| auto& map = (*reply).map; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // map_len |
| Read(&map_len, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // pad0 |
| Pad(&buf, 24); |
| |
| // map |
| map.resize(map_len); |
| for (auto& map_elem : map) { |
| // map_elem |
| Read(&map_elem, &buf); |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<SetModifierMappingReply> XProto::SetModifierMapping( |
| const SetModifierMappingRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| auto& keycodes_per_modifier = request.keycodes_per_modifier; |
| auto& keycodes = request.keycodes; |
| size_t keycodes_len = keycodes.size(); |
| |
| // major_opcode |
| uint8_t major_opcode = 118; |
| buf.Write(&major_opcode); |
| |
| // keycodes_per_modifier |
| buf.Write(&keycodes_per_modifier); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| // keycodes |
| DCHECK_EQ(static_cast<size_t>((keycodes_per_modifier) * (8)), |
| keycodes.size()); |
| for (auto& keycodes_elem : keycodes) { |
| // keycodes_elem |
| buf.Write(&keycodes_elem); |
| } |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<SetModifierMappingReply>( |
| &buf, "SetModifierMapping", false); |
| } |
| |
| Future<SetModifierMappingReply> XProto::SetModifierMapping( |
| const uint8_t& keycodes_per_modifier, |
| const std::vector<KeyCode>& keycodes) { |
| return XProto::SetModifierMapping( |
| SetModifierMappingRequest{keycodes_per_modifier, keycodes}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<SetModifierMappingReply> detail::ReadReply< |
| SetModifierMappingReply>(ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<SetModifierMappingReply>(); |
| |
| auto& status = (*reply).status; |
| auto& sequence = (*reply).sequence; |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // status |
| uint8_t tmp125; |
| Read(&tmp125, &buf); |
| status = static_cast<MappingStatus>(tmp125); |
| |
| // 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<GetModifierMappingReply> XProto::GetModifierMapping( |
| const GetModifierMappingRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| // major_opcode |
| uint8_t major_opcode = 119; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<GetModifierMappingReply>( |
| &buf, "GetModifierMapping", false); |
| } |
| |
| Future<GetModifierMappingReply> XProto::GetModifierMapping() { |
| return XProto::GetModifierMapping(GetModifierMappingRequest{}); |
| } |
| |
| template <> |
| COMPONENT_EXPORT(X11) |
| std::unique_ptr<GetModifierMappingReply> detail::ReadReply< |
| GetModifierMappingReply>(ReadBuffer* buffer) { |
| auto& buf = *buffer; |
| auto reply = std::make_unique<GetModifierMappingReply>(); |
| |
| auto& keycodes_per_modifier = (*reply).keycodes_per_modifier; |
| auto& sequence = (*reply).sequence; |
| auto& keycodes = (*reply).keycodes; |
| size_t keycodes_len = keycodes.size(); |
| |
| // response_type |
| uint8_t response_type; |
| Read(&response_type, &buf); |
| |
| // keycodes_per_modifier |
| Read(&keycodes_per_modifier, &buf); |
| |
| // sequence |
| Read(&sequence, &buf); |
| |
| // length |
| uint32_t length; |
| Read(&length, &buf); |
| |
| // pad0 |
| Pad(&buf, 24); |
| |
| // keycodes |
| keycodes.resize((keycodes_per_modifier) * (8)); |
| for (auto& keycodes_elem : keycodes) { |
| // keycodes_elem |
| Read(&keycodes_elem, &buf); |
| } |
| |
| Align(&buf, 4); |
| DCHECK_EQ(buf.offset < 32 ? 0 : buf.offset - 32, 4 * length); |
| |
| return reply; |
| } |
| |
| Future<void> XProto::NoOperation(const NoOperationRequest& request) { |
| if (!connection_->Ready()) |
| return {}; |
| |
| WriteBuffer buf; |
| |
| // major_opcode |
| uint8_t major_opcode = 127; |
| buf.Write(&major_opcode); |
| |
| // pad0 |
| Pad(&buf, 1); |
| |
| // length |
| // Caller fills in length for writes. |
| Pad(&buf, sizeof(uint16_t)); |
| |
| Align(&buf, 4); |
| |
| return connection_->SendRequest<void>(&buf, "NoOperation", false); |
| } |
| |
| Future<void> XProto::NoOperation() { |
| return XProto::NoOperation(NoOperationRequest{}); |
| } |
| |
| } // namespace x11 |