x11rb_protocol/protocol/
xv.rs

1// This file contains generated code. Do not edit directly.
2// To regenerate this, run 'make'.
3
4//! Bindings to the `Xv` X11 extension.
5
6#![allow(clippy::too_many_arguments)]
7// The code generator is simpler if it can always use conversions
8#![allow(clippy::useless_conversion)]
9
10#[allow(unused_imports)]
11use alloc::borrow::Cow;
12#[allow(unused_imports)]
13use core::convert::TryInto;
14use alloc::vec;
15use alloc::vec::Vec;
16use core::convert::TryFrom;
17use crate::errors::ParseError;
18#[allow(unused_imports)]
19use crate::x11_utils::TryIntoUSize;
20use crate::BufWithFds;
21#[allow(unused_imports)]
22use crate::utils::{RawFdContainer, pretty_print_bitmask, pretty_print_enum};
23#[allow(unused_imports)]
24use crate::x11_utils::{Request, RequestHeader, Serialize, TryParse, TryParseFd};
25#[allow(unused_imports)]
26use super::shm;
27#[allow(unused_imports)]
28use super::xproto;
29
30/// The X11 name of the extension for QueryExtension
31pub const X11_EXTENSION_NAME: &str = "XVideo";
32
33/// The version number of this extension that this client library supports.
34///
35/// This constant contains the version number of this extension that is supported
36/// by this build of x11rb. For most things, it does not make sense to use this
37/// information. If you need to send a `QueryVersion`, it is recommended to instead
38/// send the maximum version of the extension that you need.
39pub const X11_XML_VERSION: (u32, u32) = (2, 2);
40
41pub type Port = u32;
42
43pub type Encoding = u32;
44
45#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
46#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
47pub struct Type(u8);
48impl Type {
49    pub const INPUT_MASK: Self = Self(1 << 0);
50    pub const OUTPUT_MASK: Self = Self(1 << 1);
51    pub const VIDEO_MASK: Self = Self(1 << 2);
52    pub const STILL_MASK: Self = Self(1 << 3);
53    pub const IMAGE_MASK: Self = Self(1 << 4);
54}
55impl From<Type> for u8 {
56    #[inline]
57    fn from(input: Type) -> Self {
58        input.0
59    }
60}
61impl From<Type> for Option<u8> {
62    #[inline]
63    fn from(input: Type) -> Self {
64        Some(input.0)
65    }
66}
67impl From<Type> for u16 {
68    #[inline]
69    fn from(input: Type) -> Self {
70        u16::from(input.0)
71    }
72}
73impl From<Type> for Option<u16> {
74    #[inline]
75    fn from(input: Type) -> Self {
76        Some(u16::from(input.0))
77    }
78}
79impl From<Type> for u32 {
80    #[inline]
81    fn from(input: Type) -> Self {
82        u32::from(input.0)
83    }
84}
85impl From<Type> for Option<u32> {
86    #[inline]
87    fn from(input: Type) -> Self {
88        Some(u32::from(input.0))
89    }
90}
91impl From<u8> for Type {
92    #[inline]
93    fn from(value: u8) -> Self {
94        Self(value)
95    }
96}
97impl core::fmt::Debug for Type  {
98    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
99        let variants = [
100            (Self::INPUT_MASK.0.into(), "INPUT_MASK", "InputMask"),
101            (Self::OUTPUT_MASK.0.into(), "OUTPUT_MASK", "OutputMask"),
102            (Self::VIDEO_MASK.0.into(), "VIDEO_MASK", "VideoMask"),
103            (Self::STILL_MASK.0.into(), "STILL_MASK", "StillMask"),
104            (Self::IMAGE_MASK.0.into(), "IMAGE_MASK", "ImageMask"),
105        ];
106        pretty_print_bitmask(fmt, self.0.into(), &variants)
107    }
108}
109bitmask_binop!(Type, u8);
110
111#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
112#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
113pub struct ImageFormatInfoType(u8);
114impl ImageFormatInfoType {
115    pub const RGB: Self = Self(0);
116    pub const YUV: Self = Self(1);
117}
118impl From<ImageFormatInfoType> for u8 {
119    #[inline]
120    fn from(input: ImageFormatInfoType) -> Self {
121        input.0
122    }
123}
124impl From<ImageFormatInfoType> for Option<u8> {
125    #[inline]
126    fn from(input: ImageFormatInfoType) -> Self {
127        Some(input.0)
128    }
129}
130impl From<ImageFormatInfoType> for u16 {
131    #[inline]
132    fn from(input: ImageFormatInfoType) -> Self {
133        u16::from(input.0)
134    }
135}
136impl From<ImageFormatInfoType> for Option<u16> {
137    #[inline]
138    fn from(input: ImageFormatInfoType) -> Self {
139        Some(u16::from(input.0))
140    }
141}
142impl From<ImageFormatInfoType> for u32 {
143    #[inline]
144    fn from(input: ImageFormatInfoType) -> Self {
145        u32::from(input.0)
146    }
147}
148impl From<ImageFormatInfoType> for Option<u32> {
149    #[inline]
150    fn from(input: ImageFormatInfoType) -> Self {
151        Some(u32::from(input.0))
152    }
153}
154impl From<u8> for ImageFormatInfoType {
155    #[inline]
156    fn from(value: u8) -> Self {
157        Self(value)
158    }
159}
160impl core::fmt::Debug for ImageFormatInfoType  {
161    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
162        let variants = [
163            (Self::RGB.0.into(), "RGB", "RGB"),
164            (Self::YUV.0.into(), "YUV", "YUV"),
165        ];
166        pretty_print_enum(fmt, self.0.into(), &variants)
167    }
168}
169
170#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
171#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
172pub struct ImageFormatInfoFormat(u8);
173impl ImageFormatInfoFormat {
174    pub const PACKED: Self = Self(0);
175    pub const PLANAR: Self = Self(1);
176}
177impl From<ImageFormatInfoFormat> for u8 {
178    #[inline]
179    fn from(input: ImageFormatInfoFormat) -> Self {
180        input.0
181    }
182}
183impl From<ImageFormatInfoFormat> for Option<u8> {
184    #[inline]
185    fn from(input: ImageFormatInfoFormat) -> Self {
186        Some(input.0)
187    }
188}
189impl From<ImageFormatInfoFormat> for u16 {
190    #[inline]
191    fn from(input: ImageFormatInfoFormat) -> Self {
192        u16::from(input.0)
193    }
194}
195impl From<ImageFormatInfoFormat> for Option<u16> {
196    #[inline]
197    fn from(input: ImageFormatInfoFormat) -> Self {
198        Some(u16::from(input.0))
199    }
200}
201impl From<ImageFormatInfoFormat> for u32 {
202    #[inline]
203    fn from(input: ImageFormatInfoFormat) -> Self {
204        u32::from(input.0)
205    }
206}
207impl From<ImageFormatInfoFormat> for Option<u32> {
208    #[inline]
209    fn from(input: ImageFormatInfoFormat) -> Self {
210        Some(u32::from(input.0))
211    }
212}
213impl From<u8> for ImageFormatInfoFormat {
214    #[inline]
215    fn from(value: u8) -> Self {
216        Self(value)
217    }
218}
219impl core::fmt::Debug for ImageFormatInfoFormat  {
220    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
221        let variants = [
222            (Self::PACKED.0.into(), "PACKED", "Packed"),
223            (Self::PLANAR.0.into(), "PLANAR", "Planar"),
224        ];
225        pretty_print_enum(fmt, self.0.into(), &variants)
226    }
227}
228
229#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
230#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
231pub struct AttributeFlag(u32);
232impl AttributeFlag {
233    pub const GETTABLE: Self = Self(1 << 0);
234    pub const SETTABLE: Self = Self(1 << 1);
235}
236impl From<AttributeFlag> for u32 {
237    #[inline]
238    fn from(input: AttributeFlag) -> Self {
239        input.0
240    }
241}
242impl From<AttributeFlag> for Option<u32> {
243    #[inline]
244    fn from(input: AttributeFlag) -> Self {
245        Some(input.0)
246    }
247}
248impl From<u8> for AttributeFlag {
249    #[inline]
250    fn from(value: u8) -> Self {
251        Self(value.into())
252    }
253}
254impl From<u16> for AttributeFlag {
255    #[inline]
256    fn from(value: u16) -> Self {
257        Self(value.into())
258    }
259}
260impl From<u32> for AttributeFlag {
261    #[inline]
262    fn from(value: u32) -> Self {
263        Self(value)
264    }
265}
266impl core::fmt::Debug for AttributeFlag  {
267    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
268        let variants = [
269            (Self::GETTABLE.0, "GETTABLE", "Gettable"),
270            (Self::SETTABLE.0, "SETTABLE", "Settable"),
271        ];
272        pretty_print_bitmask(fmt, self.0, &variants)
273    }
274}
275bitmask_binop!(AttributeFlag, u32);
276
277#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
278#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
279pub struct VideoNotifyReason(u8);
280impl VideoNotifyReason {
281    pub const STARTED: Self = Self(0);
282    pub const STOPPED: Self = Self(1);
283    pub const BUSY: Self = Self(2);
284    pub const PREEMPTED: Self = Self(3);
285    pub const HARD_ERROR: Self = Self(4);
286}
287impl From<VideoNotifyReason> for u8 {
288    #[inline]
289    fn from(input: VideoNotifyReason) -> Self {
290        input.0
291    }
292}
293impl From<VideoNotifyReason> for Option<u8> {
294    #[inline]
295    fn from(input: VideoNotifyReason) -> Self {
296        Some(input.0)
297    }
298}
299impl From<VideoNotifyReason> for u16 {
300    #[inline]
301    fn from(input: VideoNotifyReason) -> Self {
302        u16::from(input.0)
303    }
304}
305impl From<VideoNotifyReason> for Option<u16> {
306    #[inline]
307    fn from(input: VideoNotifyReason) -> Self {
308        Some(u16::from(input.0))
309    }
310}
311impl From<VideoNotifyReason> for u32 {
312    #[inline]
313    fn from(input: VideoNotifyReason) -> Self {
314        u32::from(input.0)
315    }
316}
317impl From<VideoNotifyReason> for Option<u32> {
318    #[inline]
319    fn from(input: VideoNotifyReason) -> Self {
320        Some(u32::from(input.0))
321    }
322}
323impl From<u8> for VideoNotifyReason {
324    #[inline]
325    fn from(value: u8) -> Self {
326        Self(value)
327    }
328}
329impl core::fmt::Debug for VideoNotifyReason  {
330    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
331        let variants = [
332            (Self::STARTED.0.into(), "STARTED", "Started"),
333            (Self::STOPPED.0.into(), "STOPPED", "Stopped"),
334            (Self::BUSY.0.into(), "BUSY", "Busy"),
335            (Self::PREEMPTED.0.into(), "PREEMPTED", "Preempted"),
336            (Self::HARD_ERROR.0.into(), "HARD_ERROR", "HardError"),
337        ];
338        pretty_print_enum(fmt, self.0.into(), &variants)
339    }
340}
341
342#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
343#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
344pub struct ScanlineOrder(u8);
345impl ScanlineOrder {
346    pub const TOP_TO_BOTTOM: Self = Self(0);
347    pub const BOTTOM_TO_TOP: Self = Self(1);
348}
349impl From<ScanlineOrder> for u8 {
350    #[inline]
351    fn from(input: ScanlineOrder) -> Self {
352        input.0
353    }
354}
355impl From<ScanlineOrder> for Option<u8> {
356    #[inline]
357    fn from(input: ScanlineOrder) -> Self {
358        Some(input.0)
359    }
360}
361impl From<ScanlineOrder> for u16 {
362    #[inline]
363    fn from(input: ScanlineOrder) -> Self {
364        u16::from(input.0)
365    }
366}
367impl From<ScanlineOrder> for Option<u16> {
368    #[inline]
369    fn from(input: ScanlineOrder) -> Self {
370        Some(u16::from(input.0))
371    }
372}
373impl From<ScanlineOrder> for u32 {
374    #[inline]
375    fn from(input: ScanlineOrder) -> Self {
376        u32::from(input.0)
377    }
378}
379impl From<ScanlineOrder> for Option<u32> {
380    #[inline]
381    fn from(input: ScanlineOrder) -> Self {
382        Some(u32::from(input.0))
383    }
384}
385impl From<u8> for ScanlineOrder {
386    #[inline]
387    fn from(value: u8) -> Self {
388        Self(value)
389    }
390}
391impl core::fmt::Debug for ScanlineOrder  {
392    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
393        let variants = [
394            (Self::TOP_TO_BOTTOM.0.into(), "TOP_TO_BOTTOM", "TopToBottom"),
395            (Self::BOTTOM_TO_TOP.0.into(), "BOTTOM_TO_TOP", "BottomToTop"),
396        ];
397        pretty_print_enum(fmt, self.0.into(), &variants)
398    }
399}
400
401#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
402#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
403pub struct GrabPortStatus(u8);
404impl GrabPortStatus {
405    pub const SUCCESS: Self = Self(0);
406    pub const BAD_EXTENSION: Self = Self(1);
407    pub const ALREADY_GRABBED: Self = Self(2);
408    pub const INVALID_TIME: Self = Self(3);
409    pub const BAD_REPLY: Self = Self(4);
410    pub const BAD_ALLOC: Self = Self(5);
411}
412impl From<GrabPortStatus> for u8 {
413    #[inline]
414    fn from(input: GrabPortStatus) -> Self {
415        input.0
416    }
417}
418impl From<GrabPortStatus> for Option<u8> {
419    #[inline]
420    fn from(input: GrabPortStatus) -> Self {
421        Some(input.0)
422    }
423}
424impl From<GrabPortStatus> for u16 {
425    #[inline]
426    fn from(input: GrabPortStatus) -> Self {
427        u16::from(input.0)
428    }
429}
430impl From<GrabPortStatus> for Option<u16> {
431    #[inline]
432    fn from(input: GrabPortStatus) -> Self {
433        Some(u16::from(input.0))
434    }
435}
436impl From<GrabPortStatus> for u32 {
437    #[inline]
438    fn from(input: GrabPortStatus) -> Self {
439        u32::from(input.0)
440    }
441}
442impl From<GrabPortStatus> for Option<u32> {
443    #[inline]
444    fn from(input: GrabPortStatus) -> Self {
445        Some(u32::from(input.0))
446    }
447}
448impl From<u8> for GrabPortStatus {
449    #[inline]
450    fn from(value: u8) -> Self {
451        Self(value)
452    }
453}
454impl core::fmt::Debug for GrabPortStatus  {
455    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
456        let variants = [
457            (Self::SUCCESS.0.into(), "SUCCESS", "Success"),
458            (Self::BAD_EXTENSION.0.into(), "BAD_EXTENSION", "BadExtension"),
459            (Self::ALREADY_GRABBED.0.into(), "ALREADY_GRABBED", "AlreadyGrabbed"),
460            (Self::INVALID_TIME.0.into(), "INVALID_TIME", "InvalidTime"),
461            (Self::BAD_REPLY.0.into(), "BAD_REPLY", "BadReply"),
462            (Self::BAD_ALLOC.0.into(), "BAD_ALLOC", "BadAlloc"),
463        ];
464        pretty_print_enum(fmt, self.0.into(), &variants)
465    }
466}
467
468#[derive(Clone, Copy, Default)]
469#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
470#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
471pub struct Rational {
472    pub numerator: i32,
473    pub denominator: i32,
474}
475impl_debug_if_no_extra_traits!(Rational, "Rational");
476impl TryParse for Rational {
477    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
478        let (numerator, remaining) = i32::try_parse(remaining)?;
479        let (denominator, remaining) = i32::try_parse(remaining)?;
480        let result = Rational { numerator, denominator };
481        Ok((result, remaining))
482    }
483}
484impl Serialize for Rational {
485    type Bytes = [u8; 8];
486    fn serialize(&self) -> [u8; 8] {
487        let numerator_bytes = self.numerator.serialize();
488        let denominator_bytes = self.denominator.serialize();
489        [
490            numerator_bytes[0],
491            numerator_bytes[1],
492            numerator_bytes[2],
493            numerator_bytes[3],
494            denominator_bytes[0],
495            denominator_bytes[1],
496            denominator_bytes[2],
497            denominator_bytes[3],
498        ]
499    }
500    fn serialize_into(&self, bytes: &mut Vec<u8>) {
501        bytes.reserve(8);
502        self.numerator.serialize_into(bytes);
503        self.denominator.serialize_into(bytes);
504    }
505}
506
507#[derive(Clone, Copy, Default)]
508#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
509#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
510pub struct Format {
511    pub visual: xproto::Visualid,
512    pub depth: u8,
513}
514impl_debug_if_no_extra_traits!(Format, "Format");
515impl TryParse for Format {
516    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
517        let (visual, remaining) = xproto::Visualid::try_parse(remaining)?;
518        let (depth, remaining) = u8::try_parse(remaining)?;
519        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
520        let result = Format { visual, depth };
521        Ok((result, remaining))
522    }
523}
524impl Serialize for Format {
525    type Bytes = [u8; 8];
526    fn serialize(&self) -> [u8; 8] {
527        let visual_bytes = self.visual.serialize();
528        let depth_bytes = self.depth.serialize();
529        [
530            visual_bytes[0],
531            visual_bytes[1],
532            visual_bytes[2],
533            visual_bytes[3],
534            depth_bytes[0],
535            0,
536            0,
537            0,
538        ]
539    }
540    fn serialize_into(&self, bytes: &mut Vec<u8>) {
541        bytes.reserve(8);
542        self.visual.serialize_into(bytes);
543        self.depth.serialize_into(bytes);
544        bytes.extend_from_slice(&[0; 3]);
545    }
546}
547
548#[derive(Clone, Default)]
549#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
550#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
551pub struct AdaptorInfo {
552    pub base_id: Port,
553    pub num_ports: u16,
554    pub type_: Type,
555    pub name: Vec<u8>,
556    pub formats: Vec<Format>,
557}
558impl_debug_if_no_extra_traits!(AdaptorInfo, "AdaptorInfo");
559impl TryParse for AdaptorInfo {
560    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
561        let value = remaining;
562        let (base_id, remaining) = Port::try_parse(remaining)?;
563        let (name_size, remaining) = u16::try_parse(remaining)?;
564        let (num_ports, remaining) = u16::try_parse(remaining)?;
565        let (num_formats, remaining) = u16::try_parse(remaining)?;
566        let (type_, remaining) = u8::try_parse(remaining)?;
567        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
568        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_size.try_to_usize()?)?;
569        let name = name.to_vec();
570        // Align offset to multiple of 4
571        let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
572        let misalignment = (4 - (offset % 4)) % 4;
573        let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
574        let (formats, remaining) = crate::x11_utils::parse_list::<Format>(remaining, num_formats.try_to_usize()?)?;
575        let type_ = type_.into();
576        let result = AdaptorInfo { base_id, num_ports, type_, name, formats };
577        Ok((result, remaining))
578    }
579}
580impl Serialize for AdaptorInfo {
581    type Bytes = Vec<u8>;
582    fn serialize(&self) -> Vec<u8> {
583        let mut result = Vec::new();
584        self.serialize_into(&mut result);
585        result
586    }
587    fn serialize_into(&self, bytes: &mut Vec<u8>) {
588        bytes.reserve(12);
589        self.base_id.serialize_into(bytes);
590        let name_size = u16::try_from(self.name.len()).expect("`name` has too many elements");
591        name_size.serialize_into(bytes);
592        self.num_ports.serialize_into(bytes);
593        let num_formats = u16::try_from(self.formats.len()).expect("`formats` has too many elements");
594        num_formats.serialize_into(bytes);
595        u8::from(self.type_).serialize_into(bytes);
596        bytes.extend_from_slice(&[0; 1]);
597        bytes.extend_from_slice(&self.name);
598        bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
599        self.formats.serialize_into(bytes);
600    }
601}
602impl AdaptorInfo {
603    /// Get the value of the `name_size` field.
604    ///
605    /// The `name_size` field is used as the length field of the `name` field.
606    /// This function computes the field's value again based on the length of the list.
607    ///
608    /// # Panics
609    ///
610    /// Panics if the value cannot be represented in the target type. This
611    /// cannot happen with values of the struct received from the X11 server.
612    pub fn name_size(&self) -> u16 {
613        self.name.len()
614            .try_into().unwrap()
615    }
616    /// Get the value of the `num_formats` field.
617    ///
618    /// The `num_formats` field is used as the length field of the `formats` field.
619    /// This function computes the field's value again based on the length of the list.
620    ///
621    /// # Panics
622    ///
623    /// Panics if the value cannot be represented in the target type. This
624    /// cannot happen with values of the struct received from the X11 server.
625    pub fn num_formats(&self) -> u16 {
626        self.formats.len()
627            .try_into().unwrap()
628    }
629}
630
631#[derive(Clone, Default)]
632#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
633#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
634pub struct EncodingInfo {
635    pub encoding: Encoding,
636    pub width: u16,
637    pub height: u16,
638    pub rate: Rational,
639    pub name: Vec<u8>,
640}
641impl_debug_if_no_extra_traits!(EncodingInfo, "EncodingInfo");
642impl TryParse for EncodingInfo {
643    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
644        let value = remaining;
645        let (encoding, remaining) = Encoding::try_parse(remaining)?;
646        let (name_size, remaining) = u16::try_parse(remaining)?;
647        let (width, remaining) = u16::try_parse(remaining)?;
648        let (height, remaining) = u16::try_parse(remaining)?;
649        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
650        let (rate, remaining) = Rational::try_parse(remaining)?;
651        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_size.try_to_usize()?)?;
652        let name = name.to_vec();
653        // Align offset to multiple of 4
654        let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
655        let misalignment = (4 - (offset % 4)) % 4;
656        let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
657        let result = EncodingInfo { encoding, width, height, rate, name };
658        Ok((result, remaining))
659    }
660}
661impl Serialize for EncodingInfo {
662    type Bytes = Vec<u8>;
663    fn serialize(&self) -> Vec<u8> {
664        let mut result = Vec::new();
665        self.serialize_into(&mut result);
666        result
667    }
668    fn serialize_into(&self, bytes: &mut Vec<u8>) {
669        bytes.reserve(20);
670        self.encoding.serialize_into(bytes);
671        let name_size = u16::try_from(self.name.len()).expect("`name` has too many elements");
672        name_size.serialize_into(bytes);
673        self.width.serialize_into(bytes);
674        self.height.serialize_into(bytes);
675        bytes.extend_from_slice(&[0; 2]);
676        self.rate.serialize_into(bytes);
677        bytes.extend_from_slice(&self.name);
678        bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
679    }
680}
681impl EncodingInfo {
682    /// Get the value of the `name_size` field.
683    ///
684    /// The `name_size` field is used as the length field of the `name` field.
685    /// This function computes the field's value again based on the length of the list.
686    ///
687    /// # Panics
688    ///
689    /// Panics if the value cannot be represented in the target type. This
690    /// cannot happen with values of the struct received from the X11 server.
691    pub fn name_size(&self) -> u16 {
692        self.name.len()
693            .try_into().unwrap()
694    }
695}
696
697#[derive(Clone, Default)]
698#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
699#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
700pub struct Image {
701    pub id: u32,
702    pub width: u16,
703    pub height: u16,
704    pub pitches: Vec<u32>,
705    pub offsets: Vec<u32>,
706    pub data: Vec<u8>,
707}
708impl_debug_if_no_extra_traits!(Image, "Image");
709impl TryParse for Image {
710    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
711        let (id, remaining) = u32::try_parse(remaining)?;
712        let (width, remaining) = u16::try_parse(remaining)?;
713        let (height, remaining) = u16::try_parse(remaining)?;
714        let (data_size, remaining) = u32::try_parse(remaining)?;
715        let (num_planes, remaining) = u32::try_parse(remaining)?;
716        let (pitches, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_planes.try_to_usize()?)?;
717        let (offsets, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_planes.try_to_usize()?)?;
718        let (data, remaining) = crate::x11_utils::parse_u8_list(remaining, data_size.try_to_usize()?)?;
719        let data = data.to_vec();
720        let result = Image { id, width, height, pitches, offsets, data };
721        Ok((result, remaining))
722    }
723}
724impl Serialize for Image {
725    type Bytes = Vec<u8>;
726    fn serialize(&self) -> Vec<u8> {
727        let mut result = Vec::new();
728        self.serialize_into(&mut result);
729        result
730    }
731    fn serialize_into(&self, bytes: &mut Vec<u8>) {
732        bytes.reserve(16);
733        self.id.serialize_into(bytes);
734        self.width.serialize_into(bytes);
735        self.height.serialize_into(bytes);
736        let data_size = u32::try_from(self.data.len()).expect("`data` has too many elements");
737        data_size.serialize_into(bytes);
738        let num_planes = u32::try_from(self.pitches.len()).expect("`pitches` has too many elements");
739        num_planes.serialize_into(bytes);
740        self.pitches.serialize_into(bytes);
741        assert_eq!(self.offsets.len(), usize::try_from(num_planes).unwrap(), "`offsets` has an incorrect length");
742        self.offsets.serialize_into(bytes);
743        bytes.extend_from_slice(&self.data);
744    }
745}
746impl Image {
747    /// Get the value of the `data_size` field.
748    ///
749    /// The `data_size` field is used as the length field of the `data` field.
750    /// This function computes the field's value again based on the length of the list.
751    ///
752    /// # Panics
753    ///
754    /// Panics if the value cannot be represented in the target type. This
755    /// cannot happen with values of the struct received from the X11 server.
756    pub fn data_size(&self) -> u32 {
757        self.data.len()
758            .try_into().unwrap()
759    }
760    /// Get the value of the `num_planes` field.
761    ///
762    /// The `num_planes` field is used as the length field of the `pitches` field.
763    /// This function computes the field's value again based on the length of the list.
764    ///
765    /// # Panics
766    ///
767    /// Panics if the value cannot be represented in the target type. This
768    /// cannot happen with values of the struct received from the X11 server.
769    pub fn num_planes(&self) -> u32 {
770        self.pitches.len()
771            .try_into().unwrap()
772    }
773}
774
775#[derive(Clone, Default)]
776#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
777#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
778pub struct AttributeInfo {
779    pub flags: AttributeFlag,
780    pub min: i32,
781    pub max: i32,
782    pub name: Vec<u8>,
783}
784impl_debug_if_no_extra_traits!(AttributeInfo, "AttributeInfo");
785impl TryParse for AttributeInfo {
786    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
787        let value = remaining;
788        let (flags, remaining) = u32::try_parse(remaining)?;
789        let (min, remaining) = i32::try_parse(remaining)?;
790        let (max, remaining) = i32::try_parse(remaining)?;
791        let (size, remaining) = u32::try_parse(remaining)?;
792        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, size.try_to_usize()?)?;
793        let name = name.to_vec();
794        // Align offset to multiple of 4
795        let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
796        let misalignment = (4 - (offset % 4)) % 4;
797        let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
798        let flags = flags.into();
799        let result = AttributeInfo { flags, min, max, name };
800        Ok((result, remaining))
801    }
802}
803impl Serialize for AttributeInfo {
804    type Bytes = Vec<u8>;
805    fn serialize(&self) -> Vec<u8> {
806        let mut result = Vec::new();
807        self.serialize_into(&mut result);
808        result
809    }
810    fn serialize_into(&self, bytes: &mut Vec<u8>) {
811        bytes.reserve(16);
812        u32::from(self.flags).serialize_into(bytes);
813        self.min.serialize_into(bytes);
814        self.max.serialize_into(bytes);
815        let size = u32::try_from(self.name.len()).expect("`name` has too many elements");
816        size.serialize_into(bytes);
817        bytes.extend_from_slice(&self.name);
818        bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
819    }
820}
821impl AttributeInfo {
822    /// Get the value of the `size` field.
823    ///
824    /// The `size` field is used as the length field of the `name` field.
825    /// This function computes the field's value again based on the length of the list.
826    ///
827    /// # Panics
828    ///
829    /// Panics if the value cannot be represented in the target type. This
830    /// cannot happen with values of the struct received from the X11 server.
831    pub fn size(&self) -> u32 {
832        self.name.len()
833            .try_into().unwrap()
834    }
835}
836
837#[derive(Clone, Copy, Default)]
838#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
839#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
840pub struct ImageFormatInfo {
841    pub id: u32,
842    pub type_: ImageFormatInfoType,
843    pub byte_order: xproto::ImageOrder,
844    pub guid: [u8; 16],
845    pub bpp: u8,
846    pub num_planes: u8,
847    pub depth: u8,
848    pub red_mask: u32,
849    pub green_mask: u32,
850    pub blue_mask: u32,
851    pub format: ImageFormatInfoFormat,
852    pub y_sample_bits: u32,
853    pub u_sample_bits: u32,
854    pub v_sample_bits: u32,
855    pub vhorz_y_period: u32,
856    pub vhorz_u_period: u32,
857    pub vhorz_v_period: u32,
858    pub vvert_y_period: u32,
859    pub vvert_u_period: u32,
860    pub vvert_v_period: u32,
861    pub vcomp_order: [u8; 32],
862    pub vscanline_order: ScanlineOrder,
863}
864impl_debug_if_no_extra_traits!(ImageFormatInfo, "ImageFormatInfo");
865impl TryParse for ImageFormatInfo {
866    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
867        let (id, remaining) = u32::try_parse(remaining)?;
868        let (type_, remaining) = u8::try_parse(remaining)?;
869        let (byte_order, remaining) = u8::try_parse(remaining)?;
870        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
871        let (guid, remaining) = crate::x11_utils::parse_u8_array::<16>(remaining)?;
872        let (bpp, remaining) = u8::try_parse(remaining)?;
873        let (num_planes, remaining) = u8::try_parse(remaining)?;
874        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
875        let (depth, remaining) = u8::try_parse(remaining)?;
876        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
877        let (red_mask, remaining) = u32::try_parse(remaining)?;
878        let (green_mask, remaining) = u32::try_parse(remaining)?;
879        let (blue_mask, remaining) = u32::try_parse(remaining)?;
880        let (format, remaining) = u8::try_parse(remaining)?;
881        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
882        let (y_sample_bits, remaining) = u32::try_parse(remaining)?;
883        let (u_sample_bits, remaining) = u32::try_parse(remaining)?;
884        let (v_sample_bits, remaining) = u32::try_parse(remaining)?;
885        let (vhorz_y_period, remaining) = u32::try_parse(remaining)?;
886        let (vhorz_u_period, remaining) = u32::try_parse(remaining)?;
887        let (vhorz_v_period, remaining) = u32::try_parse(remaining)?;
888        let (vvert_y_period, remaining) = u32::try_parse(remaining)?;
889        let (vvert_u_period, remaining) = u32::try_parse(remaining)?;
890        let (vvert_v_period, remaining) = u32::try_parse(remaining)?;
891        let (vcomp_order, remaining) = crate::x11_utils::parse_u8_array::<32>(remaining)?;
892        let (vscanline_order, remaining) = u8::try_parse(remaining)?;
893        let remaining = remaining.get(11..).ok_or(ParseError::InsufficientData)?;
894        let type_ = type_.into();
895        let byte_order = byte_order.into();
896        let format = format.into();
897        let vscanline_order = vscanline_order.into();
898        let result = ImageFormatInfo { id, type_, byte_order, guid, bpp, num_planes, depth, red_mask, green_mask, blue_mask, format, y_sample_bits, u_sample_bits, v_sample_bits, vhorz_y_period, vhorz_u_period, vhorz_v_period, vvert_y_period, vvert_u_period, vvert_v_period, vcomp_order, vscanline_order };
899        Ok((result, remaining))
900    }
901}
902impl Serialize for ImageFormatInfo {
903    type Bytes = [u8; 128];
904    fn serialize(&self) -> [u8; 128] {
905        let id_bytes = self.id.serialize();
906        let type_bytes = u8::from(self.type_).serialize();
907        let byte_order_bytes = u8::from(self.byte_order).serialize();
908        let bpp_bytes = self.bpp.serialize();
909        let num_planes_bytes = self.num_planes.serialize();
910        let depth_bytes = self.depth.serialize();
911        let red_mask_bytes = self.red_mask.serialize();
912        let green_mask_bytes = self.green_mask.serialize();
913        let blue_mask_bytes = self.blue_mask.serialize();
914        let format_bytes = u8::from(self.format).serialize();
915        let y_sample_bits_bytes = self.y_sample_bits.serialize();
916        let u_sample_bits_bytes = self.u_sample_bits.serialize();
917        let v_sample_bits_bytes = self.v_sample_bits.serialize();
918        let vhorz_y_period_bytes = self.vhorz_y_period.serialize();
919        let vhorz_u_period_bytes = self.vhorz_u_period.serialize();
920        let vhorz_v_period_bytes = self.vhorz_v_period.serialize();
921        let vvert_y_period_bytes = self.vvert_y_period.serialize();
922        let vvert_u_period_bytes = self.vvert_u_period.serialize();
923        let vvert_v_period_bytes = self.vvert_v_period.serialize();
924        let vscanline_order_bytes = u8::from(self.vscanline_order).serialize();
925        [
926            id_bytes[0],
927            id_bytes[1],
928            id_bytes[2],
929            id_bytes[3],
930            type_bytes[0],
931            byte_order_bytes[0],
932            0,
933            0,
934            self.guid[0],
935            self.guid[1],
936            self.guid[2],
937            self.guid[3],
938            self.guid[4],
939            self.guid[5],
940            self.guid[6],
941            self.guid[7],
942            self.guid[8],
943            self.guid[9],
944            self.guid[10],
945            self.guid[11],
946            self.guid[12],
947            self.guid[13],
948            self.guid[14],
949            self.guid[15],
950            bpp_bytes[0],
951            num_planes_bytes[0],
952            0,
953            0,
954            depth_bytes[0],
955            0,
956            0,
957            0,
958            red_mask_bytes[0],
959            red_mask_bytes[1],
960            red_mask_bytes[2],
961            red_mask_bytes[3],
962            green_mask_bytes[0],
963            green_mask_bytes[1],
964            green_mask_bytes[2],
965            green_mask_bytes[3],
966            blue_mask_bytes[0],
967            blue_mask_bytes[1],
968            blue_mask_bytes[2],
969            blue_mask_bytes[3],
970            format_bytes[0],
971            0,
972            0,
973            0,
974            y_sample_bits_bytes[0],
975            y_sample_bits_bytes[1],
976            y_sample_bits_bytes[2],
977            y_sample_bits_bytes[3],
978            u_sample_bits_bytes[0],
979            u_sample_bits_bytes[1],
980            u_sample_bits_bytes[2],
981            u_sample_bits_bytes[3],
982            v_sample_bits_bytes[0],
983            v_sample_bits_bytes[1],
984            v_sample_bits_bytes[2],
985            v_sample_bits_bytes[3],
986            vhorz_y_period_bytes[0],
987            vhorz_y_period_bytes[1],
988            vhorz_y_period_bytes[2],
989            vhorz_y_period_bytes[3],
990            vhorz_u_period_bytes[0],
991            vhorz_u_period_bytes[1],
992            vhorz_u_period_bytes[2],
993            vhorz_u_period_bytes[3],
994            vhorz_v_period_bytes[0],
995            vhorz_v_period_bytes[1],
996            vhorz_v_period_bytes[2],
997            vhorz_v_period_bytes[3],
998            vvert_y_period_bytes[0],
999            vvert_y_period_bytes[1],
1000            vvert_y_period_bytes[2],
1001            vvert_y_period_bytes[3],
1002            vvert_u_period_bytes[0],
1003            vvert_u_period_bytes[1],
1004            vvert_u_period_bytes[2],
1005            vvert_u_period_bytes[3],
1006            vvert_v_period_bytes[0],
1007            vvert_v_period_bytes[1],
1008            vvert_v_period_bytes[2],
1009            vvert_v_period_bytes[3],
1010            self.vcomp_order[0],
1011            self.vcomp_order[1],
1012            self.vcomp_order[2],
1013            self.vcomp_order[3],
1014            self.vcomp_order[4],
1015            self.vcomp_order[5],
1016            self.vcomp_order[6],
1017            self.vcomp_order[7],
1018            self.vcomp_order[8],
1019            self.vcomp_order[9],
1020            self.vcomp_order[10],
1021            self.vcomp_order[11],
1022            self.vcomp_order[12],
1023            self.vcomp_order[13],
1024            self.vcomp_order[14],
1025            self.vcomp_order[15],
1026            self.vcomp_order[16],
1027            self.vcomp_order[17],
1028            self.vcomp_order[18],
1029            self.vcomp_order[19],
1030            self.vcomp_order[20],
1031            self.vcomp_order[21],
1032            self.vcomp_order[22],
1033            self.vcomp_order[23],
1034            self.vcomp_order[24],
1035            self.vcomp_order[25],
1036            self.vcomp_order[26],
1037            self.vcomp_order[27],
1038            self.vcomp_order[28],
1039            self.vcomp_order[29],
1040            self.vcomp_order[30],
1041            self.vcomp_order[31],
1042            vscanline_order_bytes[0],
1043            0,
1044            0,
1045            0,
1046            0,
1047            0,
1048            0,
1049            0,
1050            0,
1051            0,
1052            0,
1053            0,
1054        ]
1055    }
1056    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1057        bytes.reserve(128);
1058        self.id.serialize_into(bytes);
1059        u8::from(self.type_).serialize_into(bytes);
1060        u8::from(self.byte_order).serialize_into(bytes);
1061        bytes.extend_from_slice(&[0; 2]);
1062        bytes.extend_from_slice(&self.guid);
1063        self.bpp.serialize_into(bytes);
1064        self.num_planes.serialize_into(bytes);
1065        bytes.extend_from_slice(&[0; 2]);
1066        self.depth.serialize_into(bytes);
1067        bytes.extend_from_slice(&[0; 3]);
1068        self.red_mask.serialize_into(bytes);
1069        self.green_mask.serialize_into(bytes);
1070        self.blue_mask.serialize_into(bytes);
1071        u8::from(self.format).serialize_into(bytes);
1072        bytes.extend_from_slice(&[0; 3]);
1073        self.y_sample_bits.serialize_into(bytes);
1074        self.u_sample_bits.serialize_into(bytes);
1075        self.v_sample_bits.serialize_into(bytes);
1076        self.vhorz_y_period.serialize_into(bytes);
1077        self.vhorz_u_period.serialize_into(bytes);
1078        self.vhorz_v_period.serialize_into(bytes);
1079        self.vvert_y_period.serialize_into(bytes);
1080        self.vvert_u_period.serialize_into(bytes);
1081        self.vvert_v_period.serialize_into(bytes);
1082        bytes.extend_from_slice(&self.vcomp_order);
1083        u8::from(self.vscanline_order).serialize_into(bytes);
1084        bytes.extend_from_slice(&[0; 11]);
1085    }
1086}
1087
1088/// Opcode for the BadPort error
1089pub const BAD_PORT_ERROR: u8 = 0;
1090
1091/// Opcode for the BadEncoding error
1092pub const BAD_ENCODING_ERROR: u8 = 1;
1093
1094/// Opcode for the BadControl error
1095pub const BAD_CONTROL_ERROR: u8 = 2;
1096
1097/// Opcode for the VideoNotify event
1098pub const VIDEO_NOTIFY_EVENT: u8 = 0;
1099#[derive(Clone, Copy, Default)]
1100#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1101#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1102pub struct VideoNotifyEvent {
1103    pub response_type: u8,
1104    pub reason: VideoNotifyReason,
1105    pub sequence: u16,
1106    pub time: xproto::Timestamp,
1107    pub drawable: xproto::Drawable,
1108    pub port: Port,
1109}
1110impl_debug_if_no_extra_traits!(VideoNotifyEvent, "VideoNotifyEvent");
1111impl TryParse for VideoNotifyEvent {
1112    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1113        let remaining = initial_value;
1114        let (response_type, remaining) = u8::try_parse(remaining)?;
1115        let (reason, remaining) = u8::try_parse(remaining)?;
1116        let (sequence, remaining) = u16::try_parse(remaining)?;
1117        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
1118        let (drawable, remaining) = xproto::Drawable::try_parse(remaining)?;
1119        let (port, remaining) = Port::try_parse(remaining)?;
1120        let reason = reason.into();
1121        let result = VideoNotifyEvent { response_type, reason, sequence, time, drawable, port };
1122        let _ = remaining;
1123        let remaining = initial_value.get(32..)
1124            .ok_or(ParseError::InsufficientData)?;
1125        Ok((result, remaining))
1126    }
1127}
1128impl Serialize for VideoNotifyEvent {
1129    type Bytes = [u8; 16];
1130    fn serialize(&self) -> [u8; 16] {
1131        let response_type_bytes = self.response_type.serialize();
1132        let reason_bytes = u8::from(self.reason).serialize();
1133        let sequence_bytes = self.sequence.serialize();
1134        let time_bytes = self.time.serialize();
1135        let drawable_bytes = self.drawable.serialize();
1136        let port_bytes = self.port.serialize();
1137        [
1138            response_type_bytes[0],
1139            reason_bytes[0],
1140            sequence_bytes[0],
1141            sequence_bytes[1],
1142            time_bytes[0],
1143            time_bytes[1],
1144            time_bytes[2],
1145            time_bytes[3],
1146            drawable_bytes[0],
1147            drawable_bytes[1],
1148            drawable_bytes[2],
1149            drawable_bytes[3],
1150            port_bytes[0],
1151            port_bytes[1],
1152            port_bytes[2],
1153            port_bytes[3],
1154        ]
1155    }
1156    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1157        bytes.reserve(16);
1158        self.response_type.serialize_into(bytes);
1159        u8::from(self.reason).serialize_into(bytes);
1160        self.sequence.serialize_into(bytes);
1161        self.time.serialize_into(bytes);
1162        self.drawable.serialize_into(bytes);
1163        self.port.serialize_into(bytes);
1164    }
1165}
1166impl From<&VideoNotifyEvent> for [u8; 32] {
1167    fn from(input: &VideoNotifyEvent) -> Self {
1168        let response_type_bytes = input.response_type.serialize();
1169        let reason_bytes = u8::from(input.reason).serialize();
1170        let sequence_bytes = input.sequence.serialize();
1171        let time_bytes = input.time.serialize();
1172        let drawable_bytes = input.drawable.serialize();
1173        let port_bytes = input.port.serialize();
1174        [
1175            response_type_bytes[0],
1176            reason_bytes[0],
1177            sequence_bytes[0],
1178            sequence_bytes[1],
1179            time_bytes[0],
1180            time_bytes[1],
1181            time_bytes[2],
1182            time_bytes[3],
1183            drawable_bytes[0],
1184            drawable_bytes[1],
1185            drawable_bytes[2],
1186            drawable_bytes[3],
1187            port_bytes[0],
1188            port_bytes[1],
1189            port_bytes[2],
1190            port_bytes[3],
1191            // trailing padding
1192            0,
1193            0,
1194            0,
1195            0,
1196            0,
1197            0,
1198            0,
1199            0,
1200            0,
1201            0,
1202            0,
1203            0,
1204            0,
1205            0,
1206            0,
1207            0,
1208        ]
1209    }
1210}
1211impl From<VideoNotifyEvent> for [u8; 32] {
1212    fn from(input: VideoNotifyEvent) -> Self {
1213        Self::from(&input)
1214    }
1215}
1216
1217/// Opcode for the PortNotify event
1218pub const PORT_NOTIFY_EVENT: u8 = 1;
1219#[derive(Clone, Copy, Default)]
1220#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1221#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1222pub struct PortNotifyEvent {
1223    pub response_type: u8,
1224    pub sequence: u16,
1225    pub time: xproto::Timestamp,
1226    pub port: Port,
1227    pub attribute: xproto::Atom,
1228    pub value: i32,
1229}
1230impl_debug_if_no_extra_traits!(PortNotifyEvent, "PortNotifyEvent");
1231impl TryParse for PortNotifyEvent {
1232    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1233        let remaining = initial_value;
1234        let (response_type, remaining) = u8::try_parse(remaining)?;
1235        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1236        let (sequence, remaining) = u16::try_parse(remaining)?;
1237        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
1238        let (port, remaining) = Port::try_parse(remaining)?;
1239        let (attribute, remaining) = xproto::Atom::try_parse(remaining)?;
1240        let (value, remaining) = i32::try_parse(remaining)?;
1241        let result = PortNotifyEvent { response_type, sequence, time, port, attribute, value };
1242        let _ = remaining;
1243        let remaining = initial_value.get(32..)
1244            .ok_or(ParseError::InsufficientData)?;
1245        Ok((result, remaining))
1246    }
1247}
1248impl Serialize for PortNotifyEvent {
1249    type Bytes = [u8; 20];
1250    fn serialize(&self) -> [u8; 20] {
1251        let response_type_bytes = self.response_type.serialize();
1252        let sequence_bytes = self.sequence.serialize();
1253        let time_bytes = self.time.serialize();
1254        let port_bytes = self.port.serialize();
1255        let attribute_bytes = self.attribute.serialize();
1256        let value_bytes = self.value.serialize();
1257        [
1258            response_type_bytes[0],
1259            0,
1260            sequence_bytes[0],
1261            sequence_bytes[1],
1262            time_bytes[0],
1263            time_bytes[1],
1264            time_bytes[2],
1265            time_bytes[3],
1266            port_bytes[0],
1267            port_bytes[1],
1268            port_bytes[2],
1269            port_bytes[3],
1270            attribute_bytes[0],
1271            attribute_bytes[1],
1272            attribute_bytes[2],
1273            attribute_bytes[3],
1274            value_bytes[0],
1275            value_bytes[1],
1276            value_bytes[2],
1277            value_bytes[3],
1278        ]
1279    }
1280    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1281        bytes.reserve(20);
1282        self.response_type.serialize_into(bytes);
1283        bytes.extend_from_slice(&[0; 1]);
1284        self.sequence.serialize_into(bytes);
1285        self.time.serialize_into(bytes);
1286        self.port.serialize_into(bytes);
1287        self.attribute.serialize_into(bytes);
1288        self.value.serialize_into(bytes);
1289    }
1290}
1291impl From<&PortNotifyEvent> for [u8; 32] {
1292    fn from(input: &PortNotifyEvent) -> Self {
1293        let response_type_bytes = input.response_type.serialize();
1294        let sequence_bytes = input.sequence.serialize();
1295        let time_bytes = input.time.serialize();
1296        let port_bytes = input.port.serialize();
1297        let attribute_bytes = input.attribute.serialize();
1298        let value_bytes = input.value.serialize();
1299        [
1300            response_type_bytes[0],
1301            0,
1302            sequence_bytes[0],
1303            sequence_bytes[1],
1304            time_bytes[0],
1305            time_bytes[1],
1306            time_bytes[2],
1307            time_bytes[3],
1308            port_bytes[0],
1309            port_bytes[1],
1310            port_bytes[2],
1311            port_bytes[3],
1312            attribute_bytes[0],
1313            attribute_bytes[1],
1314            attribute_bytes[2],
1315            attribute_bytes[3],
1316            value_bytes[0],
1317            value_bytes[1],
1318            value_bytes[2],
1319            value_bytes[3],
1320            // trailing padding
1321            0,
1322            0,
1323            0,
1324            0,
1325            0,
1326            0,
1327            0,
1328            0,
1329            0,
1330            0,
1331            0,
1332            0,
1333        ]
1334    }
1335}
1336impl From<PortNotifyEvent> for [u8; 32] {
1337    fn from(input: PortNotifyEvent) -> Self {
1338        Self::from(&input)
1339    }
1340}
1341
1342/// Opcode for the QueryExtension request
1343pub const QUERY_EXTENSION_REQUEST: u8 = 0;
1344#[derive(Clone, Copy, Default)]
1345#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1346#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1347pub struct QueryExtensionRequest;
1348impl_debug_if_no_extra_traits!(QueryExtensionRequest, "QueryExtensionRequest");
1349impl QueryExtensionRequest {
1350    /// Serialize this request into bytes for the provided connection
1351    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1352        let length_so_far = 0;
1353        let mut request0 = vec![
1354            major_opcode,
1355            QUERY_EXTENSION_REQUEST,
1356            0,
1357            0,
1358        ];
1359        let length_so_far = length_so_far + request0.len();
1360        assert_eq!(length_so_far % 4, 0);
1361        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1362        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1363        ([request0.into()], vec![])
1364    }
1365    /// Parse this request given its header, its body, and any fds that go along with it
1366    #[cfg(feature = "request-parsing")]
1367    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1368        if header.minor_opcode != QUERY_EXTENSION_REQUEST {
1369            return Err(ParseError::InvalidValue);
1370        }
1371        let _ = value;
1372        Ok(QueryExtensionRequest
1373        )
1374    }
1375}
1376impl Request for QueryExtensionRequest {
1377    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1378
1379    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1380        let (bufs, fds) = self.serialize(major_opcode);
1381        // Flatten the buffers into a single vector
1382        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1383        (buf, fds)
1384    }
1385}
1386impl crate::x11_utils::ReplyRequest for QueryExtensionRequest {
1387    type Reply = QueryExtensionReply;
1388}
1389
1390#[derive(Clone, Copy, Default)]
1391#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1392#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1393pub struct QueryExtensionReply {
1394    pub sequence: u16,
1395    pub length: u32,
1396    pub major: u16,
1397    pub minor: u16,
1398}
1399impl_debug_if_no_extra_traits!(QueryExtensionReply, "QueryExtensionReply");
1400impl TryParse for QueryExtensionReply {
1401    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1402        let remaining = initial_value;
1403        let (response_type, remaining) = u8::try_parse(remaining)?;
1404        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1405        let (sequence, remaining) = u16::try_parse(remaining)?;
1406        let (length, remaining) = u32::try_parse(remaining)?;
1407        let (major, remaining) = u16::try_parse(remaining)?;
1408        let (minor, remaining) = u16::try_parse(remaining)?;
1409        if response_type != 1 {
1410            return Err(ParseError::InvalidValue);
1411        }
1412        let result = QueryExtensionReply { sequence, length, major, minor };
1413        let _ = remaining;
1414        let remaining = initial_value.get(32 + length as usize * 4..)
1415            .ok_or(ParseError::InsufficientData)?;
1416        Ok((result, remaining))
1417    }
1418}
1419impl Serialize for QueryExtensionReply {
1420    type Bytes = [u8; 12];
1421    fn serialize(&self) -> [u8; 12] {
1422        let response_type_bytes = &[1];
1423        let sequence_bytes = self.sequence.serialize();
1424        let length_bytes = self.length.serialize();
1425        let major_bytes = self.major.serialize();
1426        let minor_bytes = self.minor.serialize();
1427        [
1428            response_type_bytes[0],
1429            0,
1430            sequence_bytes[0],
1431            sequence_bytes[1],
1432            length_bytes[0],
1433            length_bytes[1],
1434            length_bytes[2],
1435            length_bytes[3],
1436            major_bytes[0],
1437            major_bytes[1],
1438            minor_bytes[0],
1439            minor_bytes[1],
1440        ]
1441    }
1442    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1443        bytes.reserve(12);
1444        let response_type_bytes = &[1];
1445        bytes.push(response_type_bytes[0]);
1446        bytes.extend_from_slice(&[0; 1]);
1447        self.sequence.serialize_into(bytes);
1448        self.length.serialize_into(bytes);
1449        self.major.serialize_into(bytes);
1450        self.minor.serialize_into(bytes);
1451    }
1452}
1453
1454/// Opcode for the QueryAdaptors request
1455pub const QUERY_ADAPTORS_REQUEST: u8 = 1;
1456#[derive(Clone, Copy, Default)]
1457#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1458#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1459pub struct QueryAdaptorsRequest {
1460    pub window: xproto::Window,
1461}
1462impl_debug_if_no_extra_traits!(QueryAdaptorsRequest, "QueryAdaptorsRequest");
1463impl QueryAdaptorsRequest {
1464    /// Serialize this request into bytes for the provided connection
1465    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1466        let length_so_far = 0;
1467        let window_bytes = self.window.serialize();
1468        let mut request0 = vec![
1469            major_opcode,
1470            QUERY_ADAPTORS_REQUEST,
1471            0,
1472            0,
1473            window_bytes[0],
1474            window_bytes[1],
1475            window_bytes[2],
1476            window_bytes[3],
1477        ];
1478        let length_so_far = length_so_far + request0.len();
1479        assert_eq!(length_so_far % 4, 0);
1480        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1481        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1482        ([request0.into()], vec![])
1483    }
1484    /// Parse this request given its header, its body, and any fds that go along with it
1485    #[cfg(feature = "request-parsing")]
1486    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1487        if header.minor_opcode != QUERY_ADAPTORS_REQUEST {
1488            return Err(ParseError::InvalidValue);
1489        }
1490        let (window, remaining) = xproto::Window::try_parse(value)?;
1491        let _ = remaining;
1492        Ok(QueryAdaptorsRequest {
1493            window,
1494        })
1495    }
1496}
1497impl Request for QueryAdaptorsRequest {
1498    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1499
1500    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1501        let (bufs, fds) = self.serialize(major_opcode);
1502        // Flatten the buffers into a single vector
1503        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1504        (buf, fds)
1505    }
1506}
1507impl crate::x11_utils::ReplyRequest for QueryAdaptorsRequest {
1508    type Reply = QueryAdaptorsReply;
1509}
1510
1511#[derive(Clone, Default)]
1512#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1513#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1514pub struct QueryAdaptorsReply {
1515    pub sequence: u16,
1516    pub length: u32,
1517    pub info: Vec<AdaptorInfo>,
1518}
1519impl_debug_if_no_extra_traits!(QueryAdaptorsReply, "QueryAdaptorsReply");
1520impl TryParse for QueryAdaptorsReply {
1521    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1522        let remaining = initial_value;
1523        let (response_type, remaining) = u8::try_parse(remaining)?;
1524        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1525        let (sequence, remaining) = u16::try_parse(remaining)?;
1526        let (length, remaining) = u32::try_parse(remaining)?;
1527        let (num_adaptors, remaining) = u16::try_parse(remaining)?;
1528        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
1529        let (info, remaining) = crate::x11_utils::parse_list::<AdaptorInfo>(remaining, num_adaptors.try_to_usize()?)?;
1530        if response_type != 1 {
1531            return Err(ParseError::InvalidValue);
1532        }
1533        let result = QueryAdaptorsReply { sequence, length, info };
1534        let _ = remaining;
1535        let remaining = initial_value.get(32 + length as usize * 4..)
1536            .ok_or(ParseError::InsufficientData)?;
1537        Ok((result, remaining))
1538    }
1539}
1540impl Serialize for QueryAdaptorsReply {
1541    type Bytes = Vec<u8>;
1542    fn serialize(&self) -> Vec<u8> {
1543        let mut result = Vec::new();
1544        self.serialize_into(&mut result);
1545        result
1546    }
1547    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1548        bytes.reserve(32);
1549        let response_type_bytes = &[1];
1550        bytes.push(response_type_bytes[0]);
1551        bytes.extend_from_slice(&[0; 1]);
1552        self.sequence.serialize_into(bytes);
1553        self.length.serialize_into(bytes);
1554        let num_adaptors = u16::try_from(self.info.len()).expect("`info` has too many elements");
1555        num_adaptors.serialize_into(bytes);
1556        bytes.extend_from_slice(&[0; 22]);
1557        self.info.serialize_into(bytes);
1558    }
1559}
1560impl QueryAdaptorsReply {
1561    /// Get the value of the `num_adaptors` field.
1562    ///
1563    /// The `num_adaptors` field is used as the length field of the `info` field.
1564    /// This function computes the field's value again based on the length of the list.
1565    ///
1566    /// # Panics
1567    ///
1568    /// Panics if the value cannot be represented in the target type. This
1569    /// cannot happen with values of the struct received from the X11 server.
1570    pub fn num_adaptors(&self) -> u16 {
1571        self.info.len()
1572            .try_into().unwrap()
1573    }
1574}
1575
1576/// Opcode for the QueryEncodings request
1577pub const QUERY_ENCODINGS_REQUEST: u8 = 2;
1578#[derive(Clone, Copy, Default)]
1579#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1580#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1581pub struct QueryEncodingsRequest {
1582    pub port: Port,
1583}
1584impl_debug_if_no_extra_traits!(QueryEncodingsRequest, "QueryEncodingsRequest");
1585impl QueryEncodingsRequest {
1586    /// Serialize this request into bytes for the provided connection
1587    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1588        let length_so_far = 0;
1589        let port_bytes = self.port.serialize();
1590        let mut request0 = vec![
1591            major_opcode,
1592            QUERY_ENCODINGS_REQUEST,
1593            0,
1594            0,
1595            port_bytes[0],
1596            port_bytes[1],
1597            port_bytes[2],
1598            port_bytes[3],
1599        ];
1600        let length_so_far = length_so_far + request0.len();
1601        assert_eq!(length_so_far % 4, 0);
1602        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1603        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1604        ([request0.into()], vec![])
1605    }
1606    /// Parse this request given its header, its body, and any fds that go along with it
1607    #[cfg(feature = "request-parsing")]
1608    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1609        if header.minor_opcode != QUERY_ENCODINGS_REQUEST {
1610            return Err(ParseError::InvalidValue);
1611        }
1612        let (port, remaining) = Port::try_parse(value)?;
1613        let _ = remaining;
1614        Ok(QueryEncodingsRequest {
1615            port,
1616        })
1617    }
1618}
1619impl Request for QueryEncodingsRequest {
1620    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1621
1622    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1623        let (bufs, fds) = self.serialize(major_opcode);
1624        // Flatten the buffers into a single vector
1625        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1626        (buf, fds)
1627    }
1628}
1629impl crate::x11_utils::ReplyRequest for QueryEncodingsRequest {
1630    type Reply = QueryEncodingsReply;
1631}
1632
1633#[derive(Clone, Default)]
1634#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1635#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1636pub struct QueryEncodingsReply {
1637    pub sequence: u16,
1638    pub length: u32,
1639    pub info: Vec<EncodingInfo>,
1640}
1641impl_debug_if_no_extra_traits!(QueryEncodingsReply, "QueryEncodingsReply");
1642impl TryParse for QueryEncodingsReply {
1643    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1644        let remaining = initial_value;
1645        let (response_type, remaining) = u8::try_parse(remaining)?;
1646        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1647        let (sequence, remaining) = u16::try_parse(remaining)?;
1648        let (length, remaining) = u32::try_parse(remaining)?;
1649        let (num_encodings, remaining) = u16::try_parse(remaining)?;
1650        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
1651        let (info, remaining) = crate::x11_utils::parse_list::<EncodingInfo>(remaining, num_encodings.try_to_usize()?)?;
1652        if response_type != 1 {
1653            return Err(ParseError::InvalidValue);
1654        }
1655        let result = QueryEncodingsReply { sequence, length, info };
1656        let _ = remaining;
1657        let remaining = initial_value.get(32 + length as usize * 4..)
1658            .ok_or(ParseError::InsufficientData)?;
1659        Ok((result, remaining))
1660    }
1661}
1662impl Serialize for QueryEncodingsReply {
1663    type Bytes = Vec<u8>;
1664    fn serialize(&self) -> Vec<u8> {
1665        let mut result = Vec::new();
1666        self.serialize_into(&mut result);
1667        result
1668    }
1669    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1670        bytes.reserve(32);
1671        let response_type_bytes = &[1];
1672        bytes.push(response_type_bytes[0]);
1673        bytes.extend_from_slice(&[0; 1]);
1674        self.sequence.serialize_into(bytes);
1675        self.length.serialize_into(bytes);
1676        let num_encodings = u16::try_from(self.info.len()).expect("`info` has too many elements");
1677        num_encodings.serialize_into(bytes);
1678        bytes.extend_from_slice(&[0; 22]);
1679        self.info.serialize_into(bytes);
1680    }
1681}
1682impl QueryEncodingsReply {
1683    /// Get the value of the `num_encodings` field.
1684    ///
1685    /// The `num_encodings` field is used as the length field of the `info` field.
1686    /// This function computes the field's value again based on the length of the list.
1687    ///
1688    /// # Panics
1689    ///
1690    /// Panics if the value cannot be represented in the target type. This
1691    /// cannot happen with values of the struct received from the X11 server.
1692    pub fn num_encodings(&self) -> u16 {
1693        self.info.len()
1694            .try_into().unwrap()
1695    }
1696}
1697
1698/// Opcode for the GrabPort request
1699pub const GRAB_PORT_REQUEST: u8 = 3;
1700#[derive(Clone, Copy, Default)]
1701#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1702#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1703pub struct GrabPortRequest {
1704    pub port: Port,
1705    pub time: xproto::Timestamp,
1706}
1707impl_debug_if_no_extra_traits!(GrabPortRequest, "GrabPortRequest");
1708impl GrabPortRequest {
1709    /// Serialize this request into bytes for the provided connection
1710    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1711        let length_so_far = 0;
1712        let port_bytes = self.port.serialize();
1713        let time_bytes = self.time.serialize();
1714        let mut request0 = vec![
1715            major_opcode,
1716            GRAB_PORT_REQUEST,
1717            0,
1718            0,
1719            port_bytes[0],
1720            port_bytes[1],
1721            port_bytes[2],
1722            port_bytes[3],
1723            time_bytes[0],
1724            time_bytes[1],
1725            time_bytes[2],
1726            time_bytes[3],
1727        ];
1728        let length_so_far = length_so_far + request0.len();
1729        assert_eq!(length_so_far % 4, 0);
1730        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1731        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1732        ([request0.into()], vec![])
1733    }
1734    /// Parse this request given its header, its body, and any fds that go along with it
1735    #[cfg(feature = "request-parsing")]
1736    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1737        if header.minor_opcode != GRAB_PORT_REQUEST {
1738            return Err(ParseError::InvalidValue);
1739        }
1740        let (port, remaining) = Port::try_parse(value)?;
1741        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
1742        let _ = remaining;
1743        Ok(GrabPortRequest {
1744            port,
1745            time,
1746        })
1747    }
1748}
1749impl Request for GrabPortRequest {
1750    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1751
1752    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1753        let (bufs, fds) = self.serialize(major_opcode);
1754        // Flatten the buffers into a single vector
1755        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1756        (buf, fds)
1757    }
1758}
1759impl crate::x11_utils::ReplyRequest for GrabPortRequest {
1760    type Reply = GrabPortReply;
1761}
1762
1763#[derive(Clone, Copy, Default)]
1764#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1765#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1766pub struct GrabPortReply {
1767    pub result: GrabPortStatus,
1768    pub sequence: u16,
1769    pub length: u32,
1770}
1771impl_debug_if_no_extra_traits!(GrabPortReply, "GrabPortReply");
1772impl TryParse for GrabPortReply {
1773    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1774        let remaining = initial_value;
1775        let (response_type, remaining) = u8::try_parse(remaining)?;
1776        let (result, remaining) = u8::try_parse(remaining)?;
1777        let (sequence, remaining) = u16::try_parse(remaining)?;
1778        let (length, remaining) = u32::try_parse(remaining)?;
1779        if response_type != 1 {
1780            return Err(ParseError::InvalidValue);
1781        }
1782        let result = result.into();
1783        let result = GrabPortReply { result, sequence, length };
1784        let _ = remaining;
1785        let remaining = initial_value.get(32 + length as usize * 4..)
1786            .ok_or(ParseError::InsufficientData)?;
1787        Ok((result, remaining))
1788    }
1789}
1790impl Serialize for GrabPortReply {
1791    type Bytes = [u8; 8];
1792    fn serialize(&self) -> [u8; 8] {
1793        let response_type_bytes = &[1];
1794        let result_bytes = u8::from(self.result).serialize();
1795        let sequence_bytes = self.sequence.serialize();
1796        let length_bytes = self.length.serialize();
1797        [
1798            response_type_bytes[0],
1799            result_bytes[0],
1800            sequence_bytes[0],
1801            sequence_bytes[1],
1802            length_bytes[0],
1803            length_bytes[1],
1804            length_bytes[2],
1805            length_bytes[3],
1806        ]
1807    }
1808    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1809        bytes.reserve(8);
1810        let response_type_bytes = &[1];
1811        bytes.push(response_type_bytes[0]);
1812        u8::from(self.result).serialize_into(bytes);
1813        self.sequence.serialize_into(bytes);
1814        self.length.serialize_into(bytes);
1815    }
1816}
1817
1818/// Opcode for the UngrabPort request
1819pub const UNGRAB_PORT_REQUEST: u8 = 4;
1820#[derive(Clone, Copy, Default)]
1821#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1822#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1823pub struct UngrabPortRequest {
1824    pub port: Port,
1825    pub time: xproto::Timestamp,
1826}
1827impl_debug_if_no_extra_traits!(UngrabPortRequest, "UngrabPortRequest");
1828impl UngrabPortRequest {
1829    /// Serialize this request into bytes for the provided connection
1830    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1831        let length_so_far = 0;
1832        let port_bytes = self.port.serialize();
1833        let time_bytes = self.time.serialize();
1834        let mut request0 = vec![
1835            major_opcode,
1836            UNGRAB_PORT_REQUEST,
1837            0,
1838            0,
1839            port_bytes[0],
1840            port_bytes[1],
1841            port_bytes[2],
1842            port_bytes[3],
1843            time_bytes[0],
1844            time_bytes[1],
1845            time_bytes[2],
1846            time_bytes[3],
1847        ];
1848        let length_so_far = length_so_far + request0.len();
1849        assert_eq!(length_so_far % 4, 0);
1850        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1851        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1852        ([request0.into()], vec![])
1853    }
1854    /// Parse this request given its header, its body, and any fds that go along with it
1855    #[cfg(feature = "request-parsing")]
1856    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1857        if header.minor_opcode != UNGRAB_PORT_REQUEST {
1858            return Err(ParseError::InvalidValue);
1859        }
1860        let (port, remaining) = Port::try_parse(value)?;
1861        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
1862        let _ = remaining;
1863        Ok(UngrabPortRequest {
1864            port,
1865            time,
1866        })
1867    }
1868}
1869impl Request for UngrabPortRequest {
1870    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1871
1872    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1873        let (bufs, fds) = self.serialize(major_opcode);
1874        // Flatten the buffers into a single vector
1875        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1876        (buf, fds)
1877    }
1878}
1879impl crate::x11_utils::VoidRequest for UngrabPortRequest {
1880}
1881
1882/// Opcode for the PutVideo request
1883pub const PUT_VIDEO_REQUEST: u8 = 5;
1884#[derive(Clone, Copy, Default)]
1885#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1886#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1887pub struct PutVideoRequest {
1888    pub port: Port,
1889    pub drawable: xproto::Drawable,
1890    pub gc: xproto::Gcontext,
1891    pub vid_x: i16,
1892    pub vid_y: i16,
1893    pub vid_w: u16,
1894    pub vid_h: u16,
1895    pub drw_x: i16,
1896    pub drw_y: i16,
1897    pub drw_w: u16,
1898    pub drw_h: u16,
1899}
1900impl_debug_if_no_extra_traits!(PutVideoRequest, "PutVideoRequest");
1901impl PutVideoRequest {
1902    /// Serialize this request into bytes for the provided connection
1903    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1904        let length_so_far = 0;
1905        let port_bytes = self.port.serialize();
1906        let drawable_bytes = self.drawable.serialize();
1907        let gc_bytes = self.gc.serialize();
1908        let vid_x_bytes = self.vid_x.serialize();
1909        let vid_y_bytes = self.vid_y.serialize();
1910        let vid_w_bytes = self.vid_w.serialize();
1911        let vid_h_bytes = self.vid_h.serialize();
1912        let drw_x_bytes = self.drw_x.serialize();
1913        let drw_y_bytes = self.drw_y.serialize();
1914        let drw_w_bytes = self.drw_w.serialize();
1915        let drw_h_bytes = self.drw_h.serialize();
1916        let mut request0 = vec![
1917            major_opcode,
1918            PUT_VIDEO_REQUEST,
1919            0,
1920            0,
1921            port_bytes[0],
1922            port_bytes[1],
1923            port_bytes[2],
1924            port_bytes[3],
1925            drawable_bytes[0],
1926            drawable_bytes[1],
1927            drawable_bytes[2],
1928            drawable_bytes[3],
1929            gc_bytes[0],
1930            gc_bytes[1],
1931            gc_bytes[2],
1932            gc_bytes[3],
1933            vid_x_bytes[0],
1934            vid_x_bytes[1],
1935            vid_y_bytes[0],
1936            vid_y_bytes[1],
1937            vid_w_bytes[0],
1938            vid_w_bytes[1],
1939            vid_h_bytes[0],
1940            vid_h_bytes[1],
1941            drw_x_bytes[0],
1942            drw_x_bytes[1],
1943            drw_y_bytes[0],
1944            drw_y_bytes[1],
1945            drw_w_bytes[0],
1946            drw_w_bytes[1],
1947            drw_h_bytes[0],
1948            drw_h_bytes[1],
1949        ];
1950        let length_so_far = length_so_far + request0.len();
1951        assert_eq!(length_so_far % 4, 0);
1952        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1953        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1954        ([request0.into()], vec![])
1955    }
1956    /// Parse this request given its header, its body, and any fds that go along with it
1957    #[cfg(feature = "request-parsing")]
1958    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1959        if header.minor_opcode != PUT_VIDEO_REQUEST {
1960            return Err(ParseError::InvalidValue);
1961        }
1962        let (port, remaining) = Port::try_parse(value)?;
1963        let (drawable, remaining) = xproto::Drawable::try_parse(remaining)?;
1964        let (gc, remaining) = xproto::Gcontext::try_parse(remaining)?;
1965        let (vid_x, remaining) = i16::try_parse(remaining)?;
1966        let (vid_y, remaining) = i16::try_parse(remaining)?;
1967        let (vid_w, remaining) = u16::try_parse(remaining)?;
1968        let (vid_h, remaining) = u16::try_parse(remaining)?;
1969        let (drw_x, remaining) = i16::try_parse(remaining)?;
1970        let (drw_y, remaining) = i16::try_parse(remaining)?;
1971        let (drw_w, remaining) = u16::try_parse(remaining)?;
1972        let (drw_h, remaining) = u16::try_parse(remaining)?;
1973        let _ = remaining;
1974        Ok(PutVideoRequest {
1975            port,
1976            drawable,
1977            gc,
1978            vid_x,
1979            vid_y,
1980            vid_w,
1981            vid_h,
1982            drw_x,
1983            drw_y,
1984            drw_w,
1985            drw_h,
1986        })
1987    }
1988}
1989impl Request for PutVideoRequest {
1990    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1991
1992    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1993        let (bufs, fds) = self.serialize(major_opcode);
1994        // Flatten the buffers into a single vector
1995        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1996        (buf, fds)
1997    }
1998}
1999impl crate::x11_utils::VoidRequest for PutVideoRequest {
2000}
2001
2002/// Opcode for the PutStill request
2003pub const PUT_STILL_REQUEST: u8 = 6;
2004#[derive(Clone, Copy, Default)]
2005#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2006#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2007pub struct PutStillRequest {
2008    pub port: Port,
2009    pub drawable: xproto::Drawable,
2010    pub gc: xproto::Gcontext,
2011    pub vid_x: i16,
2012    pub vid_y: i16,
2013    pub vid_w: u16,
2014    pub vid_h: u16,
2015    pub drw_x: i16,
2016    pub drw_y: i16,
2017    pub drw_w: u16,
2018    pub drw_h: u16,
2019}
2020impl_debug_if_no_extra_traits!(PutStillRequest, "PutStillRequest");
2021impl PutStillRequest {
2022    /// Serialize this request into bytes for the provided connection
2023    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2024        let length_so_far = 0;
2025        let port_bytes = self.port.serialize();
2026        let drawable_bytes = self.drawable.serialize();
2027        let gc_bytes = self.gc.serialize();
2028        let vid_x_bytes = self.vid_x.serialize();
2029        let vid_y_bytes = self.vid_y.serialize();
2030        let vid_w_bytes = self.vid_w.serialize();
2031        let vid_h_bytes = self.vid_h.serialize();
2032        let drw_x_bytes = self.drw_x.serialize();
2033        let drw_y_bytes = self.drw_y.serialize();
2034        let drw_w_bytes = self.drw_w.serialize();
2035        let drw_h_bytes = self.drw_h.serialize();
2036        let mut request0 = vec![
2037            major_opcode,
2038            PUT_STILL_REQUEST,
2039            0,
2040            0,
2041            port_bytes[0],
2042            port_bytes[1],
2043            port_bytes[2],
2044            port_bytes[3],
2045            drawable_bytes[0],
2046            drawable_bytes[1],
2047            drawable_bytes[2],
2048            drawable_bytes[3],
2049            gc_bytes[0],
2050            gc_bytes[1],
2051            gc_bytes[2],
2052            gc_bytes[3],
2053            vid_x_bytes[0],
2054            vid_x_bytes[1],
2055            vid_y_bytes[0],
2056            vid_y_bytes[1],
2057            vid_w_bytes[0],
2058            vid_w_bytes[1],
2059            vid_h_bytes[0],
2060            vid_h_bytes[1],
2061            drw_x_bytes[0],
2062            drw_x_bytes[1],
2063            drw_y_bytes[0],
2064            drw_y_bytes[1],
2065            drw_w_bytes[0],
2066            drw_w_bytes[1],
2067            drw_h_bytes[0],
2068            drw_h_bytes[1],
2069        ];
2070        let length_so_far = length_so_far + request0.len();
2071        assert_eq!(length_so_far % 4, 0);
2072        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2073        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2074        ([request0.into()], vec![])
2075    }
2076    /// Parse this request given its header, its body, and any fds that go along with it
2077    #[cfg(feature = "request-parsing")]
2078    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2079        if header.minor_opcode != PUT_STILL_REQUEST {
2080            return Err(ParseError::InvalidValue);
2081        }
2082        let (port, remaining) = Port::try_parse(value)?;
2083        let (drawable, remaining) = xproto::Drawable::try_parse(remaining)?;
2084        let (gc, remaining) = xproto::Gcontext::try_parse(remaining)?;
2085        let (vid_x, remaining) = i16::try_parse(remaining)?;
2086        let (vid_y, remaining) = i16::try_parse(remaining)?;
2087        let (vid_w, remaining) = u16::try_parse(remaining)?;
2088        let (vid_h, remaining) = u16::try_parse(remaining)?;
2089        let (drw_x, remaining) = i16::try_parse(remaining)?;
2090        let (drw_y, remaining) = i16::try_parse(remaining)?;
2091        let (drw_w, remaining) = u16::try_parse(remaining)?;
2092        let (drw_h, remaining) = u16::try_parse(remaining)?;
2093        let _ = remaining;
2094        Ok(PutStillRequest {
2095            port,
2096            drawable,
2097            gc,
2098            vid_x,
2099            vid_y,
2100            vid_w,
2101            vid_h,
2102            drw_x,
2103            drw_y,
2104            drw_w,
2105            drw_h,
2106        })
2107    }
2108}
2109impl Request for PutStillRequest {
2110    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2111
2112    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2113        let (bufs, fds) = self.serialize(major_opcode);
2114        // Flatten the buffers into a single vector
2115        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2116        (buf, fds)
2117    }
2118}
2119impl crate::x11_utils::VoidRequest for PutStillRequest {
2120}
2121
2122/// Opcode for the GetVideo request
2123pub const GET_VIDEO_REQUEST: u8 = 7;
2124#[derive(Clone, Copy, Default)]
2125#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2126#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2127pub struct GetVideoRequest {
2128    pub port: Port,
2129    pub drawable: xproto::Drawable,
2130    pub gc: xproto::Gcontext,
2131    pub vid_x: i16,
2132    pub vid_y: i16,
2133    pub vid_w: u16,
2134    pub vid_h: u16,
2135    pub drw_x: i16,
2136    pub drw_y: i16,
2137    pub drw_w: u16,
2138    pub drw_h: u16,
2139}
2140impl_debug_if_no_extra_traits!(GetVideoRequest, "GetVideoRequest");
2141impl GetVideoRequest {
2142    /// Serialize this request into bytes for the provided connection
2143    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2144        let length_so_far = 0;
2145        let port_bytes = self.port.serialize();
2146        let drawable_bytes = self.drawable.serialize();
2147        let gc_bytes = self.gc.serialize();
2148        let vid_x_bytes = self.vid_x.serialize();
2149        let vid_y_bytes = self.vid_y.serialize();
2150        let vid_w_bytes = self.vid_w.serialize();
2151        let vid_h_bytes = self.vid_h.serialize();
2152        let drw_x_bytes = self.drw_x.serialize();
2153        let drw_y_bytes = self.drw_y.serialize();
2154        let drw_w_bytes = self.drw_w.serialize();
2155        let drw_h_bytes = self.drw_h.serialize();
2156        let mut request0 = vec![
2157            major_opcode,
2158            GET_VIDEO_REQUEST,
2159            0,
2160            0,
2161            port_bytes[0],
2162            port_bytes[1],
2163            port_bytes[2],
2164            port_bytes[3],
2165            drawable_bytes[0],
2166            drawable_bytes[1],
2167            drawable_bytes[2],
2168            drawable_bytes[3],
2169            gc_bytes[0],
2170            gc_bytes[1],
2171            gc_bytes[2],
2172            gc_bytes[3],
2173            vid_x_bytes[0],
2174            vid_x_bytes[1],
2175            vid_y_bytes[0],
2176            vid_y_bytes[1],
2177            vid_w_bytes[0],
2178            vid_w_bytes[1],
2179            vid_h_bytes[0],
2180            vid_h_bytes[1],
2181            drw_x_bytes[0],
2182            drw_x_bytes[1],
2183            drw_y_bytes[0],
2184            drw_y_bytes[1],
2185            drw_w_bytes[0],
2186            drw_w_bytes[1],
2187            drw_h_bytes[0],
2188            drw_h_bytes[1],
2189        ];
2190        let length_so_far = length_so_far + request0.len();
2191        assert_eq!(length_so_far % 4, 0);
2192        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2193        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2194        ([request0.into()], vec![])
2195    }
2196    /// Parse this request given its header, its body, and any fds that go along with it
2197    #[cfg(feature = "request-parsing")]
2198    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2199        if header.minor_opcode != GET_VIDEO_REQUEST {
2200            return Err(ParseError::InvalidValue);
2201        }
2202        let (port, remaining) = Port::try_parse(value)?;
2203        let (drawable, remaining) = xproto::Drawable::try_parse(remaining)?;
2204        let (gc, remaining) = xproto::Gcontext::try_parse(remaining)?;
2205        let (vid_x, remaining) = i16::try_parse(remaining)?;
2206        let (vid_y, remaining) = i16::try_parse(remaining)?;
2207        let (vid_w, remaining) = u16::try_parse(remaining)?;
2208        let (vid_h, remaining) = u16::try_parse(remaining)?;
2209        let (drw_x, remaining) = i16::try_parse(remaining)?;
2210        let (drw_y, remaining) = i16::try_parse(remaining)?;
2211        let (drw_w, remaining) = u16::try_parse(remaining)?;
2212        let (drw_h, remaining) = u16::try_parse(remaining)?;
2213        let _ = remaining;
2214        Ok(GetVideoRequest {
2215            port,
2216            drawable,
2217            gc,
2218            vid_x,
2219            vid_y,
2220            vid_w,
2221            vid_h,
2222            drw_x,
2223            drw_y,
2224            drw_w,
2225            drw_h,
2226        })
2227    }
2228}
2229impl Request for GetVideoRequest {
2230    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2231
2232    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2233        let (bufs, fds) = self.serialize(major_opcode);
2234        // Flatten the buffers into a single vector
2235        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2236        (buf, fds)
2237    }
2238}
2239impl crate::x11_utils::VoidRequest for GetVideoRequest {
2240}
2241
2242/// Opcode for the GetStill request
2243pub const GET_STILL_REQUEST: u8 = 8;
2244#[derive(Clone, Copy, Default)]
2245#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2246#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2247pub struct GetStillRequest {
2248    pub port: Port,
2249    pub drawable: xproto::Drawable,
2250    pub gc: xproto::Gcontext,
2251    pub vid_x: i16,
2252    pub vid_y: i16,
2253    pub vid_w: u16,
2254    pub vid_h: u16,
2255    pub drw_x: i16,
2256    pub drw_y: i16,
2257    pub drw_w: u16,
2258    pub drw_h: u16,
2259}
2260impl_debug_if_no_extra_traits!(GetStillRequest, "GetStillRequest");
2261impl GetStillRequest {
2262    /// Serialize this request into bytes for the provided connection
2263    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2264        let length_so_far = 0;
2265        let port_bytes = self.port.serialize();
2266        let drawable_bytes = self.drawable.serialize();
2267        let gc_bytes = self.gc.serialize();
2268        let vid_x_bytes = self.vid_x.serialize();
2269        let vid_y_bytes = self.vid_y.serialize();
2270        let vid_w_bytes = self.vid_w.serialize();
2271        let vid_h_bytes = self.vid_h.serialize();
2272        let drw_x_bytes = self.drw_x.serialize();
2273        let drw_y_bytes = self.drw_y.serialize();
2274        let drw_w_bytes = self.drw_w.serialize();
2275        let drw_h_bytes = self.drw_h.serialize();
2276        let mut request0 = vec![
2277            major_opcode,
2278            GET_STILL_REQUEST,
2279            0,
2280            0,
2281            port_bytes[0],
2282            port_bytes[1],
2283            port_bytes[2],
2284            port_bytes[3],
2285            drawable_bytes[0],
2286            drawable_bytes[1],
2287            drawable_bytes[2],
2288            drawable_bytes[3],
2289            gc_bytes[0],
2290            gc_bytes[1],
2291            gc_bytes[2],
2292            gc_bytes[3],
2293            vid_x_bytes[0],
2294            vid_x_bytes[1],
2295            vid_y_bytes[0],
2296            vid_y_bytes[1],
2297            vid_w_bytes[0],
2298            vid_w_bytes[1],
2299            vid_h_bytes[0],
2300            vid_h_bytes[1],
2301            drw_x_bytes[0],
2302            drw_x_bytes[1],
2303            drw_y_bytes[0],
2304            drw_y_bytes[1],
2305            drw_w_bytes[0],
2306            drw_w_bytes[1],
2307            drw_h_bytes[0],
2308            drw_h_bytes[1],
2309        ];
2310        let length_so_far = length_so_far + request0.len();
2311        assert_eq!(length_so_far % 4, 0);
2312        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2313        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2314        ([request0.into()], vec![])
2315    }
2316    /// Parse this request given its header, its body, and any fds that go along with it
2317    #[cfg(feature = "request-parsing")]
2318    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2319        if header.minor_opcode != GET_STILL_REQUEST {
2320            return Err(ParseError::InvalidValue);
2321        }
2322        let (port, remaining) = Port::try_parse(value)?;
2323        let (drawable, remaining) = xproto::Drawable::try_parse(remaining)?;
2324        let (gc, remaining) = xproto::Gcontext::try_parse(remaining)?;
2325        let (vid_x, remaining) = i16::try_parse(remaining)?;
2326        let (vid_y, remaining) = i16::try_parse(remaining)?;
2327        let (vid_w, remaining) = u16::try_parse(remaining)?;
2328        let (vid_h, remaining) = u16::try_parse(remaining)?;
2329        let (drw_x, remaining) = i16::try_parse(remaining)?;
2330        let (drw_y, remaining) = i16::try_parse(remaining)?;
2331        let (drw_w, remaining) = u16::try_parse(remaining)?;
2332        let (drw_h, remaining) = u16::try_parse(remaining)?;
2333        let _ = remaining;
2334        Ok(GetStillRequest {
2335            port,
2336            drawable,
2337            gc,
2338            vid_x,
2339            vid_y,
2340            vid_w,
2341            vid_h,
2342            drw_x,
2343            drw_y,
2344            drw_w,
2345            drw_h,
2346        })
2347    }
2348}
2349impl Request for GetStillRequest {
2350    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2351
2352    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2353        let (bufs, fds) = self.serialize(major_opcode);
2354        // Flatten the buffers into a single vector
2355        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2356        (buf, fds)
2357    }
2358}
2359impl crate::x11_utils::VoidRequest for GetStillRequest {
2360}
2361
2362/// Opcode for the StopVideo request
2363pub const STOP_VIDEO_REQUEST: u8 = 9;
2364#[derive(Clone, Copy, Default)]
2365#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2366#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2367pub struct StopVideoRequest {
2368    pub port: Port,
2369    pub drawable: xproto::Drawable,
2370}
2371impl_debug_if_no_extra_traits!(StopVideoRequest, "StopVideoRequest");
2372impl StopVideoRequest {
2373    /// Serialize this request into bytes for the provided connection
2374    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2375        let length_so_far = 0;
2376        let port_bytes = self.port.serialize();
2377        let drawable_bytes = self.drawable.serialize();
2378        let mut request0 = vec![
2379            major_opcode,
2380            STOP_VIDEO_REQUEST,
2381            0,
2382            0,
2383            port_bytes[0],
2384            port_bytes[1],
2385            port_bytes[2],
2386            port_bytes[3],
2387            drawable_bytes[0],
2388            drawable_bytes[1],
2389            drawable_bytes[2],
2390            drawable_bytes[3],
2391        ];
2392        let length_so_far = length_so_far + request0.len();
2393        assert_eq!(length_so_far % 4, 0);
2394        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2395        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2396        ([request0.into()], vec![])
2397    }
2398    /// Parse this request given its header, its body, and any fds that go along with it
2399    #[cfg(feature = "request-parsing")]
2400    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2401        if header.minor_opcode != STOP_VIDEO_REQUEST {
2402            return Err(ParseError::InvalidValue);
2403        }
2404        let (port, remaining) = Port::try_parse(value)?;
2405        let (drawable, remaining) = xproto::Drawable::try_parse(remaining)?;
2406        let _ = remaining;
2407        Ok(StopVideoRequest {
2408            port,
2409            drawable,
2410        })
2411    }
2412}
2413impl Request for StopVideoRequest {
2414    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2415
2416    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2417        let (bufs, fds) = self.serialize(major_opcode);
2418        // Flatten the buffers into a single vector
2419        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2420        (buf, fds)
2421    }
2422}
2423impl crate::x11_utils::VoidRequest for StopVideoRequest {
2424}
2425
2426/// Opcode for the SelectVideoNotify request
2427pub const SELECT_VIDEO_NOTIFY_REQUEST: u8 = 10;
2428#[derive(Clone, Copy, Default)]
2429#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2430#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2431pub struct SelectVideoNotifyRequest {
2432    pub drawable: xproto::Drawable,
2433    pub onoff: bool,
2434}
2435impl_debug_if_no_extra_traits!(SelectVideoNotifyRequest, "SelectVideoNotifyRequest");
2436impl SelectVideoNotifyRequest {
2437    /// Serialize this request into bytes for the provided connection
2438    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2439        let length_so_far = 0;
2440        let drawable_bytes = self.drawable.serialize();
2441        let onoff_bytes = self.onoff.serialize();
2442        let mut request0 = vec![
2443            major_opcode,
2444            SELECT_VIDEO_NOTIFY_REQUEST,
2445            0,
2446            0,
2447            drawable_bytes[0],
2448            drawable_bytes[1],
2449            drawable_bytes[2],
2450            drawable_bytes[3],
2451            onoff_bytes[0],
2452            0,
2453            0,
2454            0,
2455        ];
2456        let length_so_far = length_so_far + request0.len();
2457        assert_eq!(length_so_far % 4, 0);
2458        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2459        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2460        ([request0.into()], vec![])
2461    }
2462    /// Parse this request given its header, its body, and any fds that go along with it
2463    #[cfg(feature = "request-parsing")]
2464    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2465        if header.minor_opcode != SELECT_VIDEO_NOTIFY_REQUEST {
2466            return Err(ParseError::InvalidValue);
2467        }
2468        let (drawable, remaining) = xproto::Drawable::try_parse(value)?;
2469        let (onoff, remaining) = bool::try_parse(remaining)?;
2470        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
2471        let _ = remaining;
2472        Ok(SelectVideoNotifyRequest {
2473            drawable,
2474            onoff,
2475        })
2476    }
2477}
2478impl Request for SelectVideoNotifyRequest {
2479    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2480
2481    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2482        let (bufs, fds) = self.serialize(major_opcode);
2483        // Flatten the buffers into a single vector
2484        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2485        (buf, fds)
2486    }
2487}
2488impl crate::x11_utils::VoidRequest for SelectVideoNotifyRequest {
2489}
2490
2491/// Opcode for the SelectPortNotify request
2492pub const SELECT_PORT_NOTIFY_REQUEST: u8 = 11;
2493#[derive(Clone, Copy, Default)]
2494#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2495#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2496pub struct SelectPortNotifyRequest {
2497    pub port: Port,
2498    pub onoff: bool,
2499}
2500impl_debug_if_no_extra_traits!(SelectPortNotifyRequest, "SelectPortNotifyRequest");
2501impl SelectPortNotifyRequest {
2502    /// Serialize this request into bytes for the provided connection
2503    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2504        let length_so_far = 0;
2505        let port_bytes = self.port.serialize();
2506        let onoff_bytes = self.onoff.serialize();
2507        let mut request0 = vec![
2508            major_opcode,
2509            SELECT_PORT_NOTIFY_REQUEST,
2510            0,
2511            0,
2512            port_bytes[0],
2513            port_bytes[1],
2514            port_bytes[2],
2515            port_bytes[3],
2516            onoff_bytes[0],
2517            0,
2518            0,
2519            0,
2520        ];
2521        let length_so_far = length_so_far + request0.len();
2522        assert_eq!(length_so_far % 4, 0);
2523        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2524        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2525        ([request0.into()], vec![])
2526    }
2527    /// Parse this request given its header, its body, and any fds that go along with it
2528    #[cfg(feature = "request-parsing")]
2529    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2530        if header.minor_opcode != SELECT_PORT_NOTIFY_REQUEST {
2531            return Err(ParseError::InvalidValue);
2532        }
2533        let (port, remaining) = Port::try_parse(value)?;
2534        let (onoff, remaining) = bool::try_parse(remaining)?;
2535        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
2536        let _ = remaining;
2537        Ok(SelectPortNotifyRequest {
2538            port,
2539            onoff,
2540        })
2541    }
2542}
2543impl Request for SelectPortNotifyRequest {
2544    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2545
2546    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2547        let (bufs, fds) = self.serialize(major_opcode);
2548        // Flatten the buffers into a single vector
2549        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2550        (buf, fds)
2551    }
2552}
2553impl crate::x11_utils::VoidRequest for SelectPortNotifyRequest {
2554}
2555
2556/// Opcode for the QueryBestSize request
2557pub const QUERY_BEST_SIZE_REQUEST: u8 = 12;
2558#[derive(Clone, Copy, Default)]
2559#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2560#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2561pub struct QueryBestSizeRequest {
2562    pub port: Port,
2563    pub vid_w: u16,
2564    pub vid_h: u16,
2565    pub drw_w: u16,
2566    pub drw_h: u16,
2567    pub motion: bool,
2568}
2569impl_debug_if_no_extra_traits!(QueryBestSizeRequest, "QueryBestSizeRequest");
2570impl QueryBestSizeRequest {
2571    /// Serialize this request into bytes for the provided connection
2572    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2573        let length_so_far = 0;
2574        let port_bytes = self.port.serialize();
2575        let vid_w_bytes = self.vid_w.serialize();
2576        let vid_h_bytes = self.vid_h.serialize();
2577        let drw_w_bytes = self.drw_w.serialize();
2578        let drw_h_bytes = self.drw_h.serialize();
2579        let motion_bytes = self.motion.serialize();
2580        let mut request0 = vec![
2581            major_opcode,
2582            QUERY_BEST_SIZE_REQUEST,
2583            0,
2584            0,
2585            port_bytes[0],
2586            port_bytes[1],
2587            port_bytes[2],
2588            port_bytes[3],
2589            vid_w_bytes[0],
2590            vid_w_bytes[1],
2591            vid_h_bytes[0],
2592            vid_h_bytes[1],
2593            drw_w_bytes[0],
2594            drw_w_bytes[1],
2595            drw_h_bytes[0],
2596            drw_h_bytes[1],
2597            motion_bytes[0],
2598            0,
2599            0,
2600            0,
2601        ];
2602        let length_so_far = length_so_far + request0.len();
2603        assert_eq!(length_so_far % 4, 0);
2604        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2605        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2606        ([request0.into()], vec![])
2607    }
2608    /// Parse this request given its header, its body, and any fds that go along with it
2609    #[cfg(feature = "request-parsing")]
2610    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2611        if header.minor_opcode != QUERY_BEST_SIZE_REQUEST {
2612            return Err(ParseError::InvalidValue);
2613        }
2614        let (port, remaining) = Port::try_parse(value)?;
2615        let (vid_w, remaining) = u16::try_parse(remaining)?;
2616        let (vid_h, remaining) = u16::try_parse(remaining)?;
2617        let (drw_w, remaining) = u16::try_parse(remaining)?;
2618        let (drw_h, remaining) = u16::try_parse(remaining)?;
2619        let (motion, remaining) = bool::try_parse(remaining)?;
2620        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
2621        let _ = remaining;
2622        Ok(QueryBestSizeRequest {
2623            port,
2624            vid_w,
2625            vid_h,
2626            drw_w,
2627            drw_h,
2628            motion,
2629        })
2630    }
2631}
2632impl Request for QueryBestSizeRequest {
2633    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2634
2635    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2636        let (bufs, fds) = self.serialize(major_opcode);
2637        // Flatten the buffers into a single vector
2638        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2639        (buf, fds)
2640    }
2641}
2642impl crate::x11_utils::ReplyRequest for QueryBestSizeRequest {
2643    type Reply = QueryBestSizeReply;
2644}
2645
2646#[derive(Clone, Copy, Default)]
2647#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2648#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2649pub struct QueryBestSizeReply {
2650    pub sequence: u16,
2651    pub length: u32,
2652    pub actual_width: u16,
2653    pub actual_height: u16,
2654}
2655impl_debug_if_no_extra_traits!(QueryBestSizeReply, "QueryBestSizeReply");
2656impl TryParse for QueryBestSizeReply {
2657    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2658        let remaining = initial_value;
2659        let (response_type, remaining) = u8::try_parse(remaining)?;
2660        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2661        let (sequence, remaining) = u16::try_parse(remaining)?;
2662        let (length, remaining) = u32::try_parse(remaining)?;
2663        let (actual_width, remaining) = u16::try_parse(remaining)?;
2664        let (actual_height, remaining) = u16::try_parse(remaining)?;
2665        if response_type != 1 {
2666            return Err(ParseError::InvalidValue);
2667        }
2668        let result = QueryBestSizeReply { sequence, length, actual_width, actual_height };
2669        let _ = remaining;
2670        let remaining = initial_value.get(32 + length as usize * 4..)
2671            .ok_or(ParseError::InsufficientData)?;
2672        Ok((result, remaining))
2673    }
2674}
2675impl Serialize for QueryBestSizeReply {
2676    type Bytes = [u8; 12];
2677    fn serialize(&self) -> [u8; 12] {
2678        let response_type_bytes = &[1];
2679        let sequence_bytes = self.sequence.serialize();
2680        let length_bytes = self.length.serialize();
2681        let actual_width_bytes = self.actual_width.serialize();
2682        let actual_height_bytes = self.actual_height.serialize();
2683        [
2684            response_type_bytes[0],
2685            0,
2686            sequence_bytes[0],
2687            sequence_bytes[1],
2688            length_bytes[0],
2689            length_bytes[1],
2690            length_bytes[2],
2691            length_bytes[3],
2692            actual_width_bytes[0],
2693            actual_width_bytes[1],
2694            actual_height_bytes[0],
2695            actual_height_bytes[1],
2696        ]
2697    }
2698    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2699        bytes.reserve(12);
2700        let response_type_bytes = &[1];
2701        bytes.push(response_type_bytes[0]);
2702        bytes.extend_from_slice(&[0; 1]);
2703        self.sequence.serialize_into(bytes);
2704        self.length.serialize_into(bytes);
2705        self.actual_width.serialize_into(bytes);
2706        self.actual_height.serialize_into(bytes);
2707    }
2708}
2709
2710/// Opcode for the SetPortAttribute request
2711pub const SET_PORT_ATTRIBUTE_REQUEST: u8 = 13;
2712#[derive(Clone, Copy, Default)]
2713#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2714#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2715pub struct SetPortAttributeRequest {
2716    pub port: Port,
2717    pub attribute: xproto::Atom,
2718    pub value: i32,
2719}
2720impl_debug_if_no_extra_traits!(SetPortAttributeRequest, "SetPortAttributeRequest");
2721impl SetPortAttributeRequest {
2722    /// Serialize this request into bytes for the provided connection
2723    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2724        let length_so_far = 0;
2725        let port_bytes = self.port.serialize();
2726        let attribute_bytes = self.attribute.serialize();
2727        let value_bytes = self.value.serialize();
2728        let mut request0 = vec![
2729            major_opcode,
2730            SET_PORT_ATTRIBUTE_REQUEST,
2731            0,
2732            0,
2733            port_bytes[0],
2734            port_bytes[1],
2735            port_bytes[2],
2736            port_bytes[3],
2737            attribute_bytes[0],
2738            attribute_bytes[1],
2739            attribute_bytes[2],
2740            attribute_bytes[3],
2741            value_bytes[0],
2742            value_bytes[1],
2743            value_bytes[2],
2744            value_bytes[3],
2745        ];
2746        let length_so_far = length_so_far + request0.len();
2747        assert_eq!(length_so_far % 4, 0);
2748        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2749        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2750        ([request0.into()], vec![])
2751    }
2752    /// Parse this request given its header, its body, and any fds that go along with it
2753    #[cfg(feature = "request-parsing")]
2754    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2755        if header.minor_opcode != SET_PORT_ATTRIBUTE_REQUEST {
2756            return Err(ParseError::InvalidValue);
2757        }
2758        let (port, remaining) = Port::try_parse(value)?;
2759        let (attribute, remaining) = xproto::Atom::try_parse(remaining)?;
2760        let (value, remaining) = i32::try_parse(remaining)?;
2761        let _ = remaining;
2762        Ok(SetPortAttributeRequest {
2763            port,
2764            attribute,
2765            value,
2766        })
2767    }
2768}
2769impl Request for SetPortAttributeRequest {
2770    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2771
2772    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2773        let (bufs, fds) = self.serialize(major_opcode);
2774        // Flatten the buffers into a single vector
2775        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2776        (buf, fds)
2777    }
2778}
2779impl crate::x11_utils::VoidRequest for SetPortAttributeRequest {
2780}
2781
2782/// Opcode for the GetPortAttribute request
2783pub const GET_PORT_ATTRIBUTE_REQUEST: u8 = 14;
2784#[derive(Clone, Copy, Default)]
2785#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2786#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2787pub struct GetPortAttributeRequest {
2788    pub port: Port,
2789    pub attribute: xproto::Atom,
2790}
2791impl_debug_if_no_extra_traits!(GetPortAttributeRequest, "GetPortAttributeRequest");
2792impl GetPortAttributeRequest {
2793    /// Serialize this request into bytes for the provided connection
2794    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2795        let length_so_far = 0;
2796        let port_bytes = self.port.serialize();
2797        let attribute_bytes = self.attribute.serialize();
2798        let mut request0 = vec![
2799            major_opcode,
2800            GET_PORT_ATTRIBUTE_REQUEST,
2801            0,
2802            0,
2803            port_bytes[0],
2804            port_bytes[1],
2805            port_bytes[2],
2806            port_bytes[3],
2807            attribute_bytes[0],
2808            attribute_bytes[1],
2809            attribute_bytes[2],
2810            attribute_bytes[3],
2811        ];
2812        let length_so_far = length_so_far + request0.len();
2813        assert_eq!(length_so_far % 4, 0);
2814        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2815        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2816        ([request0.into()], vec![])
2817    }
2818    /// Parse this request given its header, its body, and any fds that go along with it
2819    #[cfg(feature = "request-parsing")]
2820    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2821        if header.minor_opcode != GET_PORT_ATTRIBUTE_REQUEST {
2822            return Err(ParseError::InvalidValue);
2823        }
2824        let (port, remaining) = Port::try_parse(value)?;
2825        let (attribute, remaining) = xproto::Atom::try_parse(remaining)?;
2826        let _ = remaining;
2827        Ok(GetPortAttributeRequest {
2828            port,
2829            attribute,
2830        })
2831    }
2832}
2833impl Request for GetPortAttributeRequest {
2834    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2835
2836    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2837        let (bufs, fds) = self.serialize(major_opcode);
2838        // Flatten the buffers into a single vector
2839        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2840        (buf, fds)
2841    }
2842}
2843impl crate::x11_utils::ReplyRequest for GetPortAttributeRequest {
2844    type Reply = GetPortAttributeReply;
2845}
2846
2847#[derive(Clone, Copy, Default)]
2848#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2849#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2850pub struct GetPortAttributeReply {
2851    pub sequence: u16,
2852    pub length: u32,
2853    pub value: i32,
2854}
2855impl_debug_if_no_extra_traits!(GetPortAttributeReply, "GetPortAttributeReply");
2856impl TryParse for GetPortAttributeReply {
2857    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2858        let remaining = initial_value;
2859        let (response_type, remaining) = u8::try_parse(remaining)?;
2860        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2861        let (sequence, remaining) = u16::try_parse(remaining)?;
2862        let (length, remaining) = u32::try_parse(remaining)?;
2863        let (value, remaining) = i32::try_parse(remaining)?;
2864        if response_type != 1 {
2865            return Err(ParseError::InvalidValue);
2866        }
2867        let result = GetPortAttributeReply { sequence, length, value };
2868        let _ = remaining;
2869        let remaining = initial_value.get(32 + length as usize * 4..)
2870            .ok_or(ParseError::InsufficientData)?;
2871        Ok((result, remaining))
2872    }
2873}
2874impl Serialize for GetPortAttributeReply {
2875    type Bytes = [u8; 12];
2876    fn serialize(&self) -> [u8; 12] {
2877        let response_type_bytes = &[1];
2878        let sequence_bytes = self.sequence.serialize();
2879        let length_bytes = self.length.serialize();
2880        let value_bytes = self.value.serialize();
2881        [
2882            response_type_bytes[0],
2883            0,
2884            sequence_bytes[0],
2885            sequence_bytes[1],
2886            length_bytes[0],
2887            length_bytes[1],
2888            length_bytes[2],
2889            length_bytes[3],
2890            value_bytes[0],
2891            value_bytes[1],
2892            value_bytes[2],
2893            value_bytes[3],
2894        ]
2895    }
2896    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2897        bytes.reserve(12);
2898        let response_type_bytes = &[1];
2899        bytes.push(response_type_bytes[0]);
2900        bytes.extend_from_slice(&[0; 1]);
2901        self.sequence.serialize_into(bytes);
2902        self.length.serialize_into(bytes);
2903        self.value.serialize_into(bytes);
2904    }
2905}
2906
2907/// Opcode for the QueryPortAttributes request
2908pub const QUERY_PORT_ATTRIBUTES_REQUEST: u8 = 15;
2909#[derive(Clone, Copy, Default)]
2910#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2911#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2912pub struct QueryPortAttributesRequest {
2913    pub port: Port,
2914}
2915impl_debug_if_no_extra_traits!(QueryPortAttributesRequest, "QueryPortAttributesRequest");
2916impl QueryPortAttributesRequest {
2917    /// Serialize this request into bytes for the provided connection
2918    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2919        let length_so_far = 0;
2920        let port_bytes = self.port.serialize();
2921        let mut request0 = vec![
2922            major_opcode,
2923            QUERY_PORT_ATTRIBUTES_REQUEST,
2924            0,
2925            0,
2926            port_bytes[0],
2927            port_bytes[1],
2928            port_bytes[2],
2929            port_bytes[3],
2930        ];
2931        let length_so_far = length_so_far + request0.len();
2932        assert_eq!(length_so_far % 4, 0);
2933        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2934        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2935        ([request0.into()], vec![])
2936    }
2937    /// Parse this request given its header, its body, and any fds that go along with it
2938    #[cfg(feature = "request-parsing")]
2939    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2940        if header.minor_opcode != QUERY_PORT_ATTRIBUTES_REQUEST {
2941            return Err(ParseError::InvalidValue);
2942        }
2943        let (port, remaining) = Port::try_parse(value)?;
2944        let _ = remaining;
2945        Ok(QueryPortAttributesRequest {
2946            port,
2947        })
2948    }
2949}
2950impl Request for QueryPortAttributesRequest {
2951    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2952
2953    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2954        let (bufs, fds) = self.serialize(major_opcode);
2955        // Flatten the buffers into a single vector
2956        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2957        (buf, fds)
2958    }
2959}
2960impl crate::x11_utils::ReplyRequest for QueryPortAttributesRequest {
2961    type Reply = QueryPortAttributesReply;
2962}
2963
2964#[derive(Clone, Default)]
2965#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2966#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2967pub struct QueryPortAttributesReply {
2968    pub sequence: u16,
2969    pub length: u32,
2970    pub text_size: u32,
2971    pub attributes: Vec<AttributeInfo>,
2972}
2973impl_debug_if_no_extra_traits!(QueryPortAttributesReply, "QueryPortAttributesReply");
2974impl TryParse for QueryPortAttributesReply {
2975    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2976        let remaining = initial_value;
2977        let (response_type, remaining) = u8::try_parse(remaining)?;
2978        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2979        let (sequence, remaining) = u16::try_parse(remaining)?;
2980        let (length, remaining) = u32::try_parse(remaining)?;
2981        let (num_attributes, remaining) = u32::try_parse(remaining)?;
2982        let (text_size, remaining) = u32::try_parse(remaining)?;
2983        let remaining = remaining.get(16..).ok_or(ParseError::InsufficientData)?;
2984        let (attributes, remaining) = crate::x11_utils::parse_list::<AttributeInfo>(remaining, num_attributes.try_to_usize()?)?;
2985        if response_type != 1 {
2986            return Err(ParseError::InvalidValue);
2987        }
2988        let result = QueryPortAttributesReply { sequence, length, text_size, attributes };
2989        let _ = remaining;
2990        let remaining = initial_value.get(32 + length as usize * 4..)
2991            .ok_or(ParseError::InsufficientData)?;
2992        Ok((result, remaining))
2993    }
2994}
2995impl Serialize for QueryPortAttributesReply {
2996    type Bytes = Vec<u8>;
2997    fn serialize(&self) -> Vec<u8> {
2998        let mut result = Vec::new();
2999        self.serialize_into(&mut result);
3000        result
3001    }
3002    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3003        bytes.reserve(32);
3004        let response_type_bytes = &[1];
3005        bytes.push(response_type_bytes[0]);
3006        bytes.extend_from_slice(&[0; 1]);
3007        self.sequence.serialize_into(bytes);
3008        self.length.serialize_into(bytes);
3009        let num_attributes = u32::try_from(self.attributes.len()).expect("`attributes` has too many elements");
3010        num_attributes.serialize_into(bytes);
3011        self.text_size.serialize_into(bytes);
3012        bytes.extend_from_slice(&[0; 16]);
3013        self.attributes.serialize_into(bytes);
3014    }
3015}
3016impl QueryPortAttributesReply {
3017    /// Get the value of the `num_attributes` field.
3018    ///
3019    /// The `num_attributes` field is used as the length field of the `attributes` field.
3020    /// This function computes the field's value again based on the length of the list.
3021    ///
3022    /// # Panics
3023    ///
3024    /// Panics if the value cannot be represented in the target type. This
3025    /// cannot happen with values of the struct received from the X11 server.
3026    pub fn num_attributes(&self) -> u32 {
3027        self.attributes.len()
3028            .try_into().unwrap()
3029    }
3030}
3031
3032/// Opcode for the ListImageFormats request
3033pub const LIST_IMAGE_FORMATS_REQUEST: u8 = 16;
3034#[derive(Clone, Copy, Default)]
3035#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3036#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3037pub struct ListImageFormatsRequest {
3038    pub port: Port,
3039}
3040impl_debug_if_no_extra_traits!(ListImageFormatsRequest, "ListImageFormatsRequest");
3041impl ListImageFormatsRequest {
3042    /// Serialize this request into bytes for the provided connection
3043    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
3044        let length_so_far = 0;
3045        let port_bytes = self.port.serialize();
3046        let mut request0 = vec![
3047            major_opcode,
3048            LIST_IMAGE_FORMATS_REQUEST,
3049            0,
3050            0,
3051            port_bytes[0],
3052            port_bytes[1],
3053            port_bytes[2],
3054            port_bytes[3],
3055        ];
3056        let length_so_far = length_so_far + request0.len();
3057        assert_eq!(length_so_far % 4, 0);
3058        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
3059        request0[2..4].copy_from_slice(&length.to_ne_bytes());
3060        ([request0.into()], vec![])
3061    }
3062    /// Parse this request given its header, its body, and any fds that go along with it
3063    #[cfg(feature = "request-parsing")]
3064    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
3065        if header.minor_opcode != LIST_IMAGE_FORMATS_REQUEST {
3066            return Err(ParseError::InvalidValue);
3067        }
3068        let (port, remaining) = Port::try_parse(value)?;
3069        let _ = remaining;
3070        Ok(ListImageFormatsRequest {
3071            port,
3072        })
3073    }
3074}
3075impl Request for ListImageFormatsRequest {
3076    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
3077
3078    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
3079        let (bufs, fds) = self.serialize(major_opcode);
3080        // Flatten the buffers into a single vector
3081        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
3082        (buf, fds)
3083    }
3084}
3085impl crate::x11_utils::ReplyRequest for ListImageFormatsRequest {
3086    type Reply = ListImageFormatsReply;
3087}
3088
3089#[derive(Clone, Default)]
3090#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3091#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3092pub struct ListImageFormatsReply {
3093    pub sequence: u16,
3094    pub length: u32,
3095    pub format: Vec<ImageFormatInfo>,
3096}
3097impl_debug_if_no_extra_traits!(ListImageFormatsReply, "ListImageFormatsReply");
3098impl TryParse for ListImageFormatsReply {
3099    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3100        let remaining = initial_value;
3101        let (response_type, remaining) = u8::try_parse(remaining)?;
3102        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
3103        let (sequence, remaining) = u16::try_parse(remaining)?;
3104        let (length, remaining) = u32::try_parse(remaining)?;
3105        let (num_formats, remaining) = u32::try_parse(remaining)?;
3106        let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
3107        let (format, remaining) = crate::x11_utils::parse_list::<ImageFormatInfo>(remaining, num_formats.try_to_usize()?)?;
3108        if response_type != 1 {
3109            return Err(ParseError::InvalidValue);
3110        }
3111        let result = ListImageFormatsReply { sequence, length, format };
3112        let _ = remaining;
3113        let remaining = initial_value.get(32 + length as usize * 4..)
3114            .ok_or(ParseError::InsufficientData)?;
3115        Ok((result, remaining))
3116    }
3117}
3118impl Serialize for ListImageFormatsReply {
3119    type Bytes = Vec<u8>;
3120    fn serialize(&self) -> Vec<u8> {
3121        let mut result = Vec::new();
3122        self.serialize_into(&mut result);
3123        result
3124    }
3125    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3126        bytes.reserve(32);
3127        let response_type_bytes = &[1];
3128        bytes.push(response_type_bytes[0]);
3129        bytes.extend_from_slice(&[0; 1]);
3130        self.sequence.serialize_into(bytes);
3131        self.length.serialize_into(bytes);
3132        let num_formats = u32::try_from(self.format.len()).expect("`format` has too many elements");
3133        num_formats.serialize_into(bytes);
3134        bytes.extend_from_slice(&[0; 20]);
3135        self.format.serialize_into(bytes);
3136    }
3137}
3138impl ListImageFormatsReply {
3139    /// Get the value of the `num_formats` field.
3140    ///
3141    /// The `num_formats` field is used as the length field of the `format` field.
3142    /// This function computes the field's value again based on the length of the list.
3143    ///
3144    /// # Panics
3145    ///
3146    /// Panics if the value cannot be represented in the target type. This
3147    /// cannot happen with values of the struct received from the X11 server.
3148    pub fn num_formats(&self) -> u32 {
3149        self.format.len()
3150            .try_into().unwrap()
3151    }
3152}
3153
3154/// Opcode for the QueryImageAttributes request
3155pub const QUERY_IMAGE_ATTRIBUTES_REQUEST: u8 = 17;
3156#[derive(Clone, Copy, Default)]
3157#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3158#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3159pub struct QueryImageAttributesRequest {
3160    pub port: Port,
3161    pub id: u32,
3162    pub width: u16,
3163    pub height: u16,
3164}
3165impl_debug_if_no_extra_traits!(QueryImageAttributesRequest, "QueryImageAttributesRequest");
3166impl QueryImageAttributesRequest {
3167    /// Serialize this request into bytes for the provided connection
3168    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
3169        let length_so_far = 0;
3170        let port_bytes = self.port.serialize();
3171        let id_bytes = self.id.serialize();
3172        let width_bytes = self.width.serialize();
3173        let height_bytes = self.height.serialize();
3174        let mut request0 = vec![
3175            major_opcode,
3176            QUERY_IMAGE_ATTRIBUTES_REQUEST,
3177            0,
3178            0,
3179            port_bytes[0],
3180            port_bytes[1],
3181            port_bytes[2],
3182            port_bytes[3],
3183            id_bytes[0],
3184            id_bytes[1],
3185            id_bytes[2],
3186            id_bytes[3],
3187            width_bytes[0],
3188            width_bytes[1],
3189            height_bytes[0],
3190            height_bytes[1],
3191        ];
3192        let length_so_far = length_so_far + request0.len();
3193        assert_eq!(length_so_far % 4, 0);
3194        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
3195        request0[2..4].copy_from_slice(&length.to_ne_bytes());
3196        ([request0.into()], vec![])
3197    }
3198    /// Parse this request given its header, its body, and any fds that go along with it
3199    #[cfg(feature = "request-parsing")]
3200    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
3201        if header.minor_opcode != QUERY_IMAGE_ATTRIBUTES_REQUEST {
3202            return Err(ParseError::InvalidValue);
3203        }
3204        let (port, remaining) = Port::try_parse(value)?;
3205        let (id, remaining) = u32::try_parse(remaining)?;
3206        let (width, remaining) = u16::try_parse(remaining)?;
3207        let (height, remaining) = u16::try_parse(remaining)?;
3208        let _ = remaining;
3209        Ok(QueryImageAttributesRequest {
3210            port,
3211            id,
3212            width,
3213            height,
3214        })
3215    }
3216}
3217impl Request for QueryImageAttributesRequest {
3218    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
3219
3220    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
3221        let (bufs, fds) = self.serialize(major_opcode);
3222        // Flatten the buffers into a single vector
3223        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
3224        (buf, fds)
3225    }
3226}
3227impl crate::x11_utils::ReplyRequest for QueryImageAttributesRequest {
3228    type Reply = QueryImageAttributesReply;
3229}
3230
3231#[derive(Clone, Default)]
3232#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3233#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3234pub struct QueryImageAttributesReply {
3235    pub sequence: u16,
3236    pub length: u32,
3237    pub data_size: u32,
3238    pub width: u16,
3239    pub height: u16,
3240    pub pitches: Vec<u32>,
3241    pub offsets: Vec<u32>,
3242}
3243impl_debug_if_no_extra_traits!(QueryImageAttributesReply, "QueryImageAttributesReply");
3244impl TryParse for QueryImageAttributesReply {
3245    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3246        let remaining = initial_value;
3247        let (response_type, remaining) = u8::try_parse(remaining)?;
3248        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
3249        let (sequence, remaining) = u16::try_parse(remaining)?;
3250        let (length, remaining) = u32::try_parse(remaining)?;
3251        let (num_planes, remaining) = u32::try_parse(remaining)?;
3252        let (data_size, remaining) = u32::try_parse(remaining)?;
3253        let (width, remaining) = u16::try_parse(remaining)?;
3254        let (height, remaining) = u16::try_parse(remaining)?;
3255        let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
3256        let (pitches, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_planes.try_to_usize()?)?;
3257        let (offsets, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_planes.try_to_usize()?)?;
3258        if response_type != 1 {
3259            return Err(ParseError::InvalidValue);
3260        }
3261        let result = QueryImageAttributesReply { sequence, length, data_size, width, height, pitches, offsets };
3262        let _ = remaining;
3263        let remaining = initial_value.get(32 + length as usize * 4..)
3264            .ok_or(ParseError::InsufficientData)?;
3265        Ok((result, remaining))
3266    }
3267}
3268impl Serialize for QueryImageAttributesReply {
3269    type Bytes = Vec<u8>;
3270    fn serialize(&self) -> Vec<u8> {
3271        let mut result = Vec::new();
3272        self.serialize_into(&mut result);
3273        result
3274    }
3275    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3276        bytes.reserve(32);
3277        let response_type_bytes = &[1];
3278        bytes.push(response_type_bytes[0]);
3279        bytes.extend_from_slice(&[0; 1]);
3280        self.sequence.serialize_into(bytes);
3281        self.length.serialize_into(bytes);
3282        let num_planes = u32::try_from(self.pitches.len()).expect("`pitches` has too many elements");
3283        num_planes.serialize_into(bytes);
3284        self.data_size.serialize_into(bytes);
3285        self.width.serialize_into(bytes);
3286        self.height.serialize_into(bytes);
3287        bytes.extend_from_slice(&[0; 12]);
3288        self.pitches.serialize_into(bytes);
3289        assert_eq!(self.offsets.len(), usize::try_from(num_planes).unwrap(), "`offsets` has an incorrect length");
3290        self.offsets.serialize_into(bytes);
3291    }
3292}
3293impl QueryImageAttributesReply {
3294    /// Get the value of the `num_planes` field.
3295    ///
3296    /// The `num_planes` field is used as the length field of the `pitches` field.
3297    /// This function computes the field's value again based on the length of the list.
3298    ///
3299    /// # Panics
3300    ///
3301    /// Panics if the value cannot be represented in the target type. This
3302    /// cannot happen with values of the struct received from the X11 server.
3303    pub fn num_planes(&self) -> u32 {
3304        self.pitches.len()
3305            .try_into().unwrap()
3306    }
3307}
3308
3309/// Opcode for the PutImage request
3310pub const PUT_IMAGE_REQUEST: u8 = 18;
3311#[derive(Clone, Default)]
3312#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3313#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3314pub struct PutImageRequest<'input> {
3315    pub port: Port,
3316    pub drawable: xproto::Drawable,
3317    pub gc: xproto::Gcontext,
3318    pub id: u32,
3319    pub src_x: i16,
3320    pub src_y: i16,
3321    pub src_w: u16,
3322    pub src_h: u16,
3323    pub drw_x: i16,
3324    pub drw_y: i16,
3325    pub drw_w: u16,
3326    pub drw_h: u16,
3327    pub width: u16,
3328    pub height: u16,
3329    pub data: Cow<'input, [u8]>,
3330}
3331impl_debug_if_no_extra_traits!(PutImageRequest<'_>, "PutImageRequest");
3332impl<'input> PutImageRequest<'input> {
3333    /// Serialize this request into bytes for the provided connection
3334    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
3335        let length_so_far = 0;
3336        let port_bytes = self.port.serialize();
3337        let drawable_bytes = self.drawable.serialize();
3338        let gc_bytes = self.gc.serialize();
3339        let id_bytes = self.id.serialize();
3340        let src_x_bytes = self.src_x.serialize();
3341        let src_y_bytes = self.src_y.serialize();
3342        let src_w_bytes = self.src_w.serialize();
3343        let src_h_bytes = self.src_h.serialize();
3344        let drw_x_bytes = self.drw_x.serialize();
3345        let drw_y_bytes = self.drw_y.serialize();
3346        let drw_w_bytes = self.drw_w.serialize();
3347        let drw_h_bytes = self.drw_h.serialize();
3348        let width_bytes = self.width.serialize();
3349        let height_bytes = self.height.serialize();
3350        let mut request0 = vec![
3351            major_opcode,
3352            PUT_IMAGE_REQUEST,
3353            0,
3354            0,
3355            port_bytes[0],
3356            port_bytes[1],
3357            port_bytes[2],
3358            port_bytes[3],
3359            drawable_bytes[0],
3360            drawable_bytes[1],
3361            drawable_bytes[2],
3362            drawable_bytes[3],
3363            gc_bytes[0],
3364            gc_bytes[1],
3365            gc_bytes[2],
3366            gc_bytes[3],
3367            id_bytes[0],
3368            id_bytes[1],
3369            id_bytes[2],
3370            id_bytes[3],
3371            src_x_bytes[0],
3372            src_x_bytes[1],
3373            src_y_bytes[0],
3374            src_y_bytes[1],
3375            src_w_bytes[0],
3376            src_w_bytes[1],
3377            src_h_bytes[0],
3378            src_h_bytes[1],
3379            drw_x_bytes[0],
3380            drw_x_bytes[1],
3381            drw_y_bytes[0],
3382            drw_y_bytes[1],
3383            drw_w_bytes[0],
3384            drw_w_bytes[1],
3385            drw_h_bytes[0],
3386            drw_h_bytes[1],
3387            width_bytes[0],
3388            width_bytes[1],
3389            height_bytes[0],
3390            height_bytes[1],
3391        ];
3392        let length_so_far = length_so_far + request0.len();
3393        let length_so_far = length_so_far + self.data.len();
3394        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
3395        let length_so_far = length_so_far + padding0.len();
3396        assert_eq!(length_so_far % 4, 0);
3397        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
3398        request0[2..4].copy_from_slice(&length.to_ne_bytes());
3399        ([request0.into(), self.data, padding0.into()], vec![])
3400    }
3401    /// Parse this request given its header, its body, and any fds that go along with it
3402    #[cfg(feature = "request-parsing")]
3403    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
3404        if header.minor_opcode != PUT_IMAGE_REQUEST {
3405            return Err(ParseError::InvalidValue);
3406        }
3407        let (port, remaining) = Port::try_parse(value)?;
3408        let (drawable, remaining) = xproto::Drawable::try_parse(remaining)?;
3409        let (gc, remaining) = xproto::Gcontext::try_parse(remaining)?;
3410        let (id, remaining) = u32::try_parse(remaining)?;
3411        let (src_x, remaining) = i16::try_parse(remaining)?;
3412        let (src_y, remaining) = i16::try_parse(remaining)?;
3413        let (src_w, remaining) = u16::try_parse(remaining)?;
3414        let (src_h, remaining) = u16::try_parse(remaining)?;
3415        let (drw_x, remaining) = i16::try_parse(remaining)?;
3416        let (drw_y, remaining) = i16::try_parse(remaining)?;
3417        let (drw_w, remaining) = u16::try_parse(remaining)?;
3418        let (drw_h, remaining) = u16::try_parse(remaining)?;
3419        let (width, remaining) = u16::try_parse(remaining)?;
3420        let (height, remaining) = u16::try_parse(remaining)?;
3421        let (data, remaining) = remaining.split_at(remaining.len());
3422        let _ = remaining;
3423        Ok(PutImageRequest {
3424            port,
3425            drawable,
3426            gc,
3427            id,
3428            src_x,
3429            src_y,
3430            src_w,
3431            src_h,
3432            drw_x,
3433            drw_y,
3434            drw_w,
3435            drw_h,
3436            width,
3437            height,
3438            data: Cow::Borrowed(data),
3439        })
3440    }
3441    /// Clone all borrowed data in this PutImageRequest.
3442    pub fn into_owned(self) -> PutImageRequest<'static> {
3443        PutImageRequest {
3444            port: self.port,
3445            drawable: self.drawable,
3446            gc: self.gc,
3447            id: self.id,
3448            src_x: self.src_x,
3449            src_y: self.src_y,
3450            src_w: self.src_w,
3451            src_h: self.src_h,
3452            drw_x: self.drw_x,
3453            drw_y: self.drw_y,
3454            drw_w: self.drw_w,
3455            drw_h: self.drw_h,
3456            width: self.width,
3457            height: self.height,
3458            data: Cow::Owned(self.data.into_owned()),
3459        }
3460    }
3461}
3462impl<'input> Request for PutImageRequest<'input> {
3463    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
3464
3465    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
3466        let (bufs, fds) = self.serialize(major_opcode);
3467        // Flatten the buffers into a single vector
3468        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
3469        (buf, fds)
3470    }
3471}
3472impl<'input> crate::x11_utils::VoidRequest for PutImageRequest<'input> {
3473}
3474
3475/// Opcode for the ShmPutImage request
3476pub const SHM_PUT_IMAGE_REQUEST: u8 = 19;
3477#[derive(Clone, Copy, Default)]
3478#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3479#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3480pub struct ShmPutImageRequest {
3481    pub port: Port,
3482    pub drawable: xproto::Drawable,
3483    pub gc: xproto::Gcontext,
3484    pub shmseg: shm::Seg,
3485    pub id: u32,
3486    pub offset: u32,
3487    pub src_x: i16,
3488    pub src_y: i16,
3489    pub src_w: u16,
3490    pub src_h: u16,
3491    pub drw_x: i16,
3492    pub drw_y: i16,
3493    pub drw_w: u16,
3494    pub drw_h: u16,
3495    pub width: u16,
3496    pub height: u16,
3497    pub send_event: u8,
3498}
3499impl_debug_if_no_extra_traits!(ShmPutImageRequest, "ShmPutImageRequest");
3500impl ShmPutImageRequest {
3501    /// Serialize this request into bytes for the provided connection
3502    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
3503        let length_so_far = 0;
3504        let port_bytes = self.port.serialize();
3505        let drawable_bytes = self.drawable.serialize();
3506        let gc_bytes = self.gc.serialize();
3507        let shmseg_bytes = self.shmseg.serialize();
3508        let id_bytes = self.id.serialize();
3509        let offset_bytes = self.offset.serialize();
3510        let src_x_bytes = self.src_x.serialize();
3511        let src_y_bytes = self.src_y.serialize();
3512        let src_w_bytes = self.src_w.serialize();
3513        let src_h_bytes = self.src_h.serialize();
3514        let drw_x_bytes = self.drw_x.serialize();
3515        let drw_y_bytes = self.drw_y.serialize();
3516        let drw_w_bytes = self.drw_w.serialize();
3517        let drw_h_bytes = self.drw_h.serialize();
3518        let width_bytes = self.width.serialize();
3519        let height_bytes = self.height.serialize();
3520        let send_event_bytes = self.send_event.serialize();
3521        let mut request0 = vec![
3522            major_opcode,
3523            SHM_PUT_IMAGE_REQUEST,
3524            0,
3525            0,
3526            port_bytes[0],
3527            port_bytes[1],
3528            port_bytes[2],
3529            port_bytes[3],
3530            drawable_bytes[0],
3531            drawable_bytes[1],
3532            drawable_bytes[2],
3533            drawable_bytes[3],
3534            gc_bytes[0],
3535            gc_bytes[1],
3536            gc_bytes[2],
3537            gc_bytes[3],
3538            shmseg_bytes[0],
3539            shmseg_bytes[1],
3540            shmseg_bytes[2],
3541            shmseg_bytes[3],
3542            id_bytes[0],
3543            id_bytes[1],
3544            id_bytes[2],
3545            id_bytes[3],
3546            offset_bytes[0],
3547            offset_bytes[1],
3548            offset_bytes[2],
3549            offset_bytes[3],
3550            src_x_bytes[0],
3551            src_x_bytes[1],
3552            src_y_bytes[0],
3553            src_y_bytes[1],
3554            src_w_bytes[0],
3555            src_w_bytes[1],
3556            src_h_bytes[0],
3557            src_h_bytes[1],
3558            drw_x_bytes[0],
3559            drw_x_bytes[1],
3560            drw_y_bytes[0],
3561            drw_y_bytes[1],
3562            drw_w_bytes[0],
3563            drw_w_bytes[1],
3564            drw_h_bytes[0],
3565            drw_h_bytes[1],
3566            width_bytes[0],
3567            width_bytes[1],
3568            height_bytes[0],
3569            height_bytes[1],
3570            send_event_bytes[0],
3571            0,
3572            0,
3573            0,
3574        ];
3575        let length_so_far = length_so_far + request0.len();
3576        assert_eq!(length_so_far % 4, 0);
3577        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
3578        request0[2..4].copy_from_slice(&length.to_ne_bytes());
3579        ([request0.into()], vec![])
3580    }
3581    /// Parse this request given its header, its body, and any fds that go along with it
3582    #[cfg(feature = "request-parsing")]
3583    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
3584        if header.minor_opcode != SHM_PUT_IMAGE_REQUEST {
3585            return Err(ParseError::InvalidValue);
3586        }
3587        let (port, remaining) = Port::try_parse(value)?;
3588        let (drawable, remaining) = xproto::Drawable::try_parse(remaining)?;
3589        let (gc, remaining) = xproto::Gcontext::try_parse(remaining)?;
3590        let (shmseg, remaining) = shm::Seg::try_parse(remaining)?;
3591        let (id, remaining) = u32::try_parse(remaining)?;
3592        let (offset, remaining) = u32::try_parse(remaining)?;
3593        let (src_x, remaining) = i16::try_parse(remaining)?;
3594        let (src_y, remaining) = i16::try_parse(remaining)?;
3595        let (src_w, remaining) = u16::try_parse(remaining)?;
3596        let (src_h, remaining) = u16::try_parse(remaining)?;
3597        let (drw_x, remaining) = i16::try_parse(remaining)?;
3598        let (drw_y, remaining) = i16::try_parse(remaining)?;
3599        let (drw_w, remaining) = u16::try_parse(remaining)?;
3600        let (drw_h, remaining) = u16::try_parse(remaining)?;
3601        let (width, remaining) = u16::try_parse(remaining)?;
3602        let (height, remaining) = u16::try_parse(remaining)?;
3603        let (send_event, remaining) = u8::try_parse(remaining)?;
3604        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
3605        let _ = remaining;
3606        Ok(ShmPutImageRequest {
3607            port,
3608            drawable,
3609            gc,
3610            shmseg,
3611            id,
3612            offset,
3613            src_x,
3614            src_y,
3615            src_w,
3616            src_h,
3617            drw_x,
3618            drw_y,
3619            drw_w,
3620            drw_h,
3621            width,
3622            height,
3623            send_event,
3624        })
3625    }
3626}
3627impl Request for ShmPutImageRequest {
3628    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
3629
3630    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
3631        let (bufs, fds) = self.serialize(major_opcode);
3632        // Flatten the buffers into a single vector
3633        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
3634        (buf, fds)
3635    }
3636}
3637impl crate::x11_utils::VoidRequest for ShmPutImageRequest {
3638}
3639