x11rb_protocol/protocol/
xf86vidmode.rs

1// This file contains generated code. Do not edit directly.
2// To regenerate this, run 'make'.
3
4//! Bindings to the `XF86VidMode` 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
26/// The X11 name of the extension for QueryExtension
27pub const X11_EXTENSION_NAME: &str = "XFree86-VidModeExtension";
28
29/// The version number of this extension that this client library supports.
30///
31/// This constant contains the version number of this extension that is supported
32/// by this build of x11rb. For most things, it does not make sense to use this
33/// information. If you need to send a `QueryVersion`, it is recommended to instead
34/// send the maximum version of the extension that you need.
35pub const X11_XML_VERSION: (u32, u32) = (2, 2);
36
37pub type Syncrange = u32;
38
39pub type Dotclock = u32;
40
41#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
42#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
43pub struct ModeFlag(u32);
44impl ModeFlag {
45    pub const POSITIVE_H_SYNC: Self = Self(1 << 0);
46    pub const NEGATIVE_H_SYNC: Self = Self(1 << 1);
47    pub const POSITIVE_V_SYNC: Self = Self(1 << 2);
48    pub const NEGATIVE_V_SYNC: Self = Self(1 << 3);
49    pub const INTERLACE: Self = Self(1 << 4);
50    pub const COMPOSITE_SYNC: Self = Self(1 << 5);
51    pub const POSITIVE_C_SYNC: Self = Self(1 << 6);
52    pub const NEGATIVE_C_SYNC: Self = Self(1 << 7);
53    pub const H_SKEW: Self = Self(1 << 8);
54    pub const BROADCAST: Self = Self(1 << 9);
55    pub const PIXMUX: Self = Self(1 << 10);
56    pub const DOUBLE_CLOCK: Self = Self(1 << 11);
57    pub const HALF_CLOCK: Self = Self(1 << 12);
58}
59impl From<ModeFlag> for u32 {
60    #[inline]
61    fn from(input: ModeFlag) -> Self {
62        input.0
63    }
64}
65impl From<ModeFlag> for Option<u32> {
66    #[inline]
67    fn from(input: ModeFlag) -> Self {
68        Some(input.0)
69    }
70}
71impl From<u8> for ModeFlag {
72    #[inline]
73    fn from(value: u8) -> Self {
74        Self(value.into())
75    }
76}
77impl From<u16> for ModeFlag {
78    #[inline]
79    fn from(value: u16) -> Self {
80        Self(value.into())
81    }
82}
83impl From<u32> for ModeFlag {
84    #[inline]
85    fn from(value: u32) -> Self {
86        Self(value)
87    }
88}
89impl core::fmt::Debug for ModeFlag  {
90    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
91        let variants = [
92            (Self::POSITIVE_H_SYNC.0, "POSITIVE_H_SYNC", "PositiveHSync"),
93            (Self::NEGATIVE_H_SYNC.0, "NEGATIVE_H_SYNC", "NegativeHSync"),
94            (Self::POSITIVE_V_SYNC.0, "POSITIVE_V_SYNC", "PositiveVSync"),
95            (Self::NEGATIVE_V_SYNC.0, "NEGATIVE_V_SYNC", "NegativeVSync"),
96            (Self::INTERLACE.0, "INTERLACE", "Interlace"),
97            (Self::COMPOSITE_SYNC.0, "COMPOSITE_SYNC", "CompositeSync"),
98            (Self::POSITIVE_C_SYNC.0, "POSITIVE_C_SYNC", "PositiveCSync"),
99            (Self::NEGATIVE_C_SYNC.0, "NEGATIVE_C_SYNC", "NegativeCSync"),
100            (Self::H_SKEW.0, "H_SKEW", "HSkew"),
101            (Self::BROADCAST.0, "BROADCAST", "Broadcast"),
102            (Self::PIXMUX.0, "PIXMUX", "Pixmux"),
103            (Self::DOUBLE_CLOCK.0, "DOUBLE_CLOCK", "DoubleClock"),
104            (Self::HALF_CLOCK.0, "HALF_CLOCK", "HalfClock"),
105        ];
106        pretty_print_bitmask(fmt, self.0, &variants)
107    }
108}
109bitmask_binop!(ModeFlag, u32);
110
111#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
112#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
113pub struct ClockFlag(u32);
114impl ClockFlag {
115    pub const PROGRAMABLE: Self = Self(1 << 0);
116}
117impl From<ClockFlag> for u32 {
118    #[inline]
119    fn from(input: ClockFlag) -> Self {
120        input.0
121    }
122}
123impl From<ClockFlag> for Option<u32> {
124    #[inline]
125    fn from(input: ClockFlag) -> Self {
126        Some(input.0)
127    }
128}
129impl From<u8> for ClockFlag {
130    #[inline]
131    fn from(value: u8) -> Self {
132        Self(value.into())
133    }
134}
135impl From<u16> for ClockFlag {
136    #[inline]
137    fn from(value: u16) -> Self {
138        Self(value.into())
139    }
140}
141impl From<u32> for ClockFlag {
142    #[inline]
143    fn from(value: u32) -> Self {
144        Self(value)
145    }
146}
147impl core::fmt::Debug for ClockFlag  {
148    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
149        let variants = [
150            (Self::PROGRAMABLE.0, "PROGRAMABLE", "Programable"),
151        ];
152        pretty_print_bitmask(fmt, self.0, &variants)
153    }
154}
155bitmask_binop!(ClockFlag, u32);
156
157#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
158#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
159pub struct Permission(u32);
160impl Permission {
161    pub const READ: Self = Self(1 << 0);
162    pub const WRITE: Self = Self(1 << 1);
163}
164impl From<Permission> for u32 {
165    #[inline]
166    fn from(input: Permission) -> Self {
167        input.0
168    }
169}
170impl From<Permission> for Option<u32> {
171    #[inline]
172    fn from(input: Permission) -> Self {
173        Some(input.0)
174    }
175}
176impl From<u8> for Permission {
177    #[inline]
178    fn from(value: u8) -> Self {
179        Self(value.into())
180    }
181}
182impl From<u16> for Permission {
183    #[inline]
184    fn from(value: u16) -> Self {
185        Self(value.into())
186    }
187}
188impl From<u32> for Permission {
189    #[inline]
190    fn from(value: u32) -> Self {
191        Self(value)
192    }
193}
194impl core::fmt::Debug for Permission  {
195    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
196        let variants = [
197            (Self::READ.0, "READ", "Read"),
198            (Self::WRITE.0, "WRITE", "Write"),
199        ];
200        pretty_print_bitmask(fmt, self.0, &variants)
201    }
202}
203bitmask_binop!(Permission, u32);
204
205#[derive(Clone, Copy, Default)]
206#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
207#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
208pub struct ModeInfo {
209    pub dotclock: Dotclock,
210    pub hdisplay: u16,
211    pub hsyncstart: u16,
212    pub hsyncend: u16,
213    pub htotal: u16,
214    pub hskew: u32,
215    pub vdisplay: u16,
216    pub vsyncstart: u16,
217    pub vsyncend: u16,
218    pub vtotal: u16,
219    pub flags: ModeFlag,
220    pub privsize: u32,
221}
222impl_debug_if_no_extra_traits!(ModeInfo, "ModeInfo");
223impl TryParse for ModeInfo {
224    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
225        let (dotclock, remaining) = Dotclock::try_parse(remaining)?;
226        let (hdisplay, remaining) = u16::try_parse(remaining)?;
227        let (hsyncstart, remaining) = u16::try_parse(remaining)?;
228        let (hsyncend, remaining) = u16::try_parse(remaining)?;
229        let (htotal, remaining) = u16::try_parse(remaining)?;
230        let (hskew, remaining) = u32::try_parse(remaining)?;
231        let (vdisplay, remaining) = u16::try_parse(remaining)?;
232        let (vsyncstart, remaining) = u16::try_parse(remaining)?;
233        let (vsyncend, remaining) = u16::try_parse(remaining)?;
234        let (vtotal, remaining) = u16::try_parse(remaining)?;
235        let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
236        let (flags, remaining) = u32::try_parse(remaining)?;
237        let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
238        let (privsize, remaining) = u32::try_parse(remaining)?;
239        let flags = flags.into();
240        let result = ModeInfo { dotclock, hdisplay, hsyncstart, hsyncend, htotal, hskew, vdisplay, vsyncstart, vsyncend, vtotal, flags, privsize };
241        Ok((result, remaining))
242    }
243}
244impl Serialize for ModeInfo {
245    type Bytes = [u8; 48];
246    fn serialize(&self) -> [u8; 48] {
247        let dotclock_bytes = self.dotclock.serialize();
248        let hdisplay_bytes = self.hdisplay.serialize();
249        let hsyncstart_bytes = self.hsyncstart.serialize();
250        let hsyncend_bytes = self.hsyncend.serialize();
251        let htotal_bytes = self.htotal.serialize();
252        let hskew_bytes = self.hskew.serialize();
253        let vdisplay_bytes = self.vdisplay.serialize();
254        let vsyncstart_bytes = self.vsyncstart.serialize();
255        let vsyncend_bytes = self.vsyncend.serialize();
256        let vtotal_bytes = self.vtotal.serialize();
257        let flags_bytes = u32::from(self.flags).serialize();
258        let privsize_bytes = self.privsize.serialize();
259        [
260            dotclock_bytes[0],
261            dotclock_bytes[1],
262            dotclock_bytes[2],
263            dotclock_bytes[3],
264            hdisplay_bytes[0],
265            hdisplay_bytes[1],
266            hsyncstart_bytes[0],
267            hsyncstart_bytes[1],
268            hsyncend_bytes[0],
269            hsyncend_bytes[1],
270            htotal_bytes[0],
271            htotal_bytes[1],
272            hskew_bytes[0],
273            hskew_bytes[1],
274            hskew_bytes[2],
275            hskew_bytes[3],
276            vdisplay_bytes[0],
277            vdisplay_bytes[1],
278            vsyncstart_bytes[0],
279            vsyncstart_bytes[1],
280            vsyncend_bytes[0],
281            vsyncend_bytes[1],
282            vtotal_bytes[0],
283            vtotal_bytes[1],
284            0,
285            0,
286            0,
287            0,
288            flags_bytes[0],
289            flags_bytes[1],
290            flags_bytes[2],
291            flags_bytes[3],
292            0,
293            0,
294            0,
295            0,
296            0,
297            0,
298            0,
299            0,
300            0,
301            0,
302            0,
303            0,
304            privsize_bytes[0],
305            privsize_bytes[1],
306            privsize_bytes[2],
307            privsize_bytes[3],
308        ]
309    }
310    fn serialize_into(&self, bytes: &mut Vec<u8>) {
311        bytes.reserve(48);
312        self.dotclock.serialize_into(bytes);
313        self.hdisplay.serialize_into(bytes);
314        self.hsyncstart.serialize_into(bytes);
315        self.hsyncend.serialize_into(bytes);
316        self.htotal.serialize_into(bytes);
317        self.hskew.serialize_into(bytes);
318        self.vdisplay.serialize_into(bytes);
319        self.vsyncstart.serialize_into(bytes);
320        self.vsyncend.serialize_into(bytes);
321        self.vtotal.serialize_into(bytes);
322        bytes.extend_from_slice(&[0; 4]);
323        u32::from(self.flags).serialize_into(bytes);
324        bytes.extend_from_slice(&[0; 12]);
325        self.privsize.serialize_into(bytes);
326    }
327}
328
329/// Opcode for the QueryVersion request
330pub const QUERY_VERSION_REQUEST: u8 = 0;
331#[derive(Clone, Copy, Default)]
332#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
333#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
334pub struct QueryVersionRequest;
335impl_debug_if_no_extra_traits!(QueryVersionRequest, "QueryVersionRequest");
336impl QueryVersionRequest {
337    /// Serialize this request into bytes for the provided connection
338    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
339        let length_so_far = 0;
340        let mut request0 = vec![
341            major_opcode,
342            QUERY_VERSION_REQUEST,
343            0,
344            0,
345        ];
346        let length_so_far = length_so_far + request0.len();
347        assert_eq!(length_so_far % 4, 0);
348        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
349        request0[2..4].copy_from_slice(&length.to_ne_bytes());
350        ([request0.into()], vec![])
351    }
352    /// Parse this request given its header, its body, and any fds that go along with it
353    #[cfg(feature = "request-parsing")]
354    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
355        if header.minor_opcode != QUERY_VERSION_REQUEST {
356            return Err(ParseError::InvalidValue);
357        }
358        let _ = value;
359        Ok(QueryVersionRequest
360        )
361    }
362}
363impl Request for QueryVersionRequest {
364    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
365
366    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
367        let (bufs, fds) = self.serialize(major_opcode);
368        // Flatten the buffers into a single vector
369        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
370        (buf, fds)
371    }
372}
373impl crate::x11_utils::ReplyRequest for QueryVersionRequest {
374    type Reply = QueryVersionReply;
375}
376
377#[derive(Clone, Copy, Default)]
378#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
379#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
380pub struct QueryVersionReply {
381    pub sequence: u16,
382    pub length: u32,
383    pub major_version: u16,
384    pub minor_version: u16,
385}
386impl_debug_if_no_extra_traits!(QueryVersionReply, "QueryVersionReply");
387impl TryParse for QueryVersionReply {
388    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
389        let remaining = initial_value;
390        let (response_type, remaining) = u8::try_parse(remaining)?;
391        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
392        let (sequence, remaining) = u16::try_parse(remaining)?;
393        let (length, remaining) = u32::try_parse(remaining)?;
394        let (major_version, remaining) = u16::try_parse(remaining)?;
395        let (minor_version, remaining) = u16::try_parse(remaining)?;
396        if response_type != 1 {
397            return Err(ParseError::InvalidValue);
398        }
399        let result = QueryVersionReply { sequence, length, major_version, minor_version };
400        let _ = remaining;
401        let remaining = initial_value.get(32 + length as usize * 4..)
402            .ok_or(ParseError::InsufficientData)?;
403        Ok((result, remaining))
404    }
405}
406impl Serialize for QueryVersionReply {
407    type Bytes = [u8; 12];
408    fn serialize(&self) -> [u8; 12] {
409        let response_type_bytes = &[1];
410        let sequence_bytes = self.sequence.serialize();
411        let length_bytes = self.length.serialize();
412        let major_version_bytes = self.major_version.serialize();
413        let minor_version_bytes = self.minor_version.serialize();
414        [
415            response_type_bytes[0],
416            0,
417            sequence_bytes[0],
418            sequence_bytes[1],
419            length_bytes[0],
420            length_bytes[1],
421            length_bytes[2],
422            length_bytes[3],
423            major_version_bytes[0],
424            major_version_bytes[1],
425            minor_version_bytes[0],
426            minor_version_bytes[1],
427        ]
428    }
429    fn serialize_into(&self, bytes: &mut Vec<u8>) {
430        bytes.reserve(12);
431        let response_type_bytes = &[1];
432        bytes.push(response_type_bytes[0]);
433        bytes.extend_from_slice(&[0; 1]);
434        self.sequence.serialize_into(bytes);
435        self.length.serialize_into(bytes);
436        self.major_version.serialize_into(bytes);
437        self.minor_version.serialize_into(bytes);
438    }
439}
440
441/// Opcode for the GetModeLine request
442pub const GET_MODE_LINE_REQUEST: u8 = 1;
443#[derive(Clone, Copy, Default)]
444#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
445#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
446pub struct GetModeLineRequest {
447    pub screen: u16,
448}
449impl_debug_if_no_extra_traits!(GetModeLineRequest, "GetModeLineRequest");
450impl GetModeLineRequest {
451    /// Serialize this request into bytes for the provided connection
452    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
453        let length_so_far = 0;
454        let screen_bytes = self.screen.serialize();
455        let mut request0 = vec![
456            major_opcode,
457            GET_MODE_LINE_REQUEST,
458            0,
459            0,
460            screen_bytes[0],
461            screen_bytes[1],
462            0,
463            0,
464        ];
465        let length_so_far = length_so_far + request0.len();
466        assert_eq!(length_so_far % 4, 0);
467        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
468        request0[2..4].copy_from_slice(&length.to_ne_bytes());
469        ([request0.into()], vec![])
470    }
471    /// Parse this request given its header, its body, and any fds that go along with it
472    #[cfg(feature = "request-parsing")]
473    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
474        if header.minor_opcode != GET_MODE_LINE_REQUEST {
475            return Err(ParseError::InvalidValue);
476        }
477        let (screen, remaining) = u16::try_parse(value)?;
478        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
479        let _ = remaining;
480        Ok(GetModeLineRequest {
481            screen,
482        })
483    }
484}
485impl Request for GetModeLineRequest {
486    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
487
488    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
489        let (bufs, fds) = self.serialize(major_opcode);
490        // Flatten the buffers into a single vector
491        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
492        (buf, fds)
493    }
494}
495impl crate::x11_utils::ReplyRequest for GetModeLineRequest {
496    type Reply = GetModeLineReply;
497}
498
499#[derive(Clone, Default)]
500#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
501#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
502pub struct GetModeLineReply {
503    pub sequence: u16,
504    pub length: u32,
505    pub dotclock: Dotclock,
506    pub hdisplay: u16,
507    pub hsyncstart: u16,
508    pub hsyncend: u16,
509    pub htotal: u16,
510    pub hskew: u16,
511    pub vdisplay: u16,
512    pub vsyncstart: u16,
513    pub vsyncend: u16,
514    pub vtotal: u16,
515    pub flags: ModeFlag,
516    pub private: Vec<u8>,
517}
518impl_debug_if_no_extra_traits!(GetModeLineReply, "GetModeLineReply");
519impl TryParse for GetModeLineReply {
520    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
521        let remaining = initial_value;
522        let (response_type, remaining) = u8::try_parse(remaining)?;
523        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
524        let (sequence, remaining) = u16::try_parse(remaining)?;
525        let (length, remaining) = u32::try_parse(remaining)?;
526        let (dotclock, remaining) = Dotclock::try_parse(remaining)?;
527        let (hdisplay, remaining) = u16::try_parse(remaining)?;
528        let (hsyncstart, remaining) = u16::try_parse(remaining)?;
529        let (hsyncend, remaining) = u16::try_parse(remaining)?;
530        let (htotal, remaining) = u16::try_parse(remaining)?;
531        let (hskew, remaining) = u16::try_parse(remaining)?;
532        let (vdisplay, remaining) = u16::try_parse(remaining)?;
533        let (vsyncstart, remaining) = u16::try_parse(remaining)?;
534        let (vsyncend, remaining) = u16::try_parse(remaining)?;
535        let (vtotal, remaining) = u16::try_parse(remaining)?;
536        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
537        let (flags, remaining) = u32::try_parse(remaining)?;
538        let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
539        let (privsize, remaining) = u32::try_parse(remaining)?;
540        let (private, remaining) = crate::x11_utils::parse_u8_list(remaining, privsize.try_to_usize()?)?;
541        let private = private.to_vec();
542        if response_type != 1 {
543            return Err(ParseError::InvalidValue);
544        }
545        let flags = flags.into();
546        let result = GetModeLineReply { sequence, length, dotclock, hdisplay, hsyncstart, hsyncend, htotal, hskew, vdisplay, vsyncstart, vsyncend, vtotal, flags, private };
547        let _ = remaining;
548        let remaining = initial_value.get(32 + length as usize * 4..)
549            .ok_or(ParseError::InsufficientData)?;
550        Ok((result, remaining))
551    }
552}
553impl Serialize for GetModeLineReply {
554    type Bytes = Vec<u8>;
555    fn serialize(&self) -> Vec<u8> {
556        let mut result = Vec::new();
557        self.serialize_into(&mut result);
558        result
559    }
560    fn serialize_into(&self, bytes: &mut Vec<u8>) {
561        bytes.reserve(52);
562        let response_type_bytes = &[1];
563        bytes.push(response_type_bytes[0]);
564        bytes.extend_from_slice(&[0; 1]);
565        self.sequence.serialize_into(bytes);
566        self.length.serialize_into(bytes);
567        self.dotclock.serialize_into(bytes);
568        self.hdisplay.serialize_into(bytes);
569        self.hsyncstart.serialize_into(bytes);
570        self.hsyncend.serialize_into(bytes);
571        self.htotal.serialize_into(bytes);
572        self.hskew.serialize_into(bytes);
573        self.vdisplay.serialize_into(bytes);
574        self.vsyncstart.serialize_into(bytes);
575        self.vsyncend.serialize_into(bytes);
576        self.vtotal.serialize_into(bytes);
577        bytes.extend_from_slice(&[0; 2]);
578        u32::from(self.flags).serialize_into(bytes);
579        bytes.extend_from_slice(&[0; 12]);
580        let privsize = u32::try_from(self.private.len()).expect("`private` has too many elements");
581        privsize.serialize_into(bytes);
582        bytes.extend_from_slice(&self.private);
583    }
584}
585impl GetModeLineReply {
586    /// Get the value of the `privsize` field.
587    ///
588    /// The `privsize` field is used as the length field of the `private` field.
589    /// This function computes the field's value again based on the length of the list.
590    ///
591    /// # Panics
592    ///
593    /// Panics if the value cannot be represented in the target type. This
594    /// cannot happen with values of the struct received from the X11 server.
595    pub fn privsize(&self) -> u32 {
596        self.private.len()
597            .try_into().unwrap()
598    }
599}
600
601/// Opcode for the ModModeLine request
602pub const MOD_MODE_LINE_REQUEST: u8 = 2;
603#[derive(Clone, Default)]
604#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
605#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
606pub struct ModModeLineRequest<'input> {
607    pub screen: u32,
608    pub hdisplay: u16,
609    pub hsyncstart: u16,
610    pub hsyncend: u16,
611    pub htotal: u16,
612    pub hskew: u16,
613    pub vdisplay: u16,
614    pub vsyncstart: u16,
615    pub vsyncend: u16,
616    pub vtotal: u16,
617    pub flags: ModeFlag,
618    pub private: Cow<'input, [u8]>,
619}
620impl_debug_if_no_extra_traits!(ModModeLineRequest<'_>, "ModModeLineRequest");
621impl<'input> ModModeLineRequest<'input> {
622    /// Serialize this request into bytes for the provided connection
623    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
624        let length_so_far = 0;
625        let screen_bytes = self.screen.serialize();
626        let hdisplay_bytes = self.hdisplay.serialize();
627        let hsyncstart_bytes = self.hsyncstart.serialize();
628        let hsyncend_bytes = self.hsyncend.serialize();
629        let htotal_bytes = self.htotal.serialize();
630        let hskew_bytes = self.hskew.serialize();
631        let vdisplay_bytes = self.vdisplay.serialize();
632        let vsyncstart_bytes = self.vsyncstart.serialize();
633        let vsyncend_bytes = self.vsyncend.serialize();
634        let vtotal_bytes = self.vtotal.serialize();
635        let flags_bytes = u32::from(self.flags).serialize();
636        let privsize = u32::try_from(self.private.len()).expect("`private` has too many elements");
637        let privsize_bytes = privsize.serialize();
638        let mut request0 = vec![
639            major_opcode,
640            MOD_MODE_LINE_REQUEST,
641            0,
642            0,
643            screen_bytes[0],
644            screen_bytes[1],
645            screen_bytes[2],
646            screen_bytes[3],
647            hdisplay_bytes[0],
648            hdisplay_bytes[1],
649            hsyncstart_bytes[0],
650            hsyncstart_bytes[1],
651            hsyncend_bytes[0],
652            hsyncend_bytes[1],
653            htotal_bytes[0],
654            htotal_bytes[1],
655            hskew_bytes[0],
656            hskew_bytes[1],
657            vdisplay_bytes[0],
658            vdisplay_bytes[1],
659            vsyncstart_bytes[0],
660            vsyncstart_bytes[1],
661            vsyncend_bytes[0],
662            vsyncend_bytes[1],
663            vtotal_bytes[0],
664            vtotal_bytes[1],
665            0,
666            0,
667            flags_bytes[0],
668            flags_bytes[1],
669            flags_bytes[2],
670            flags_bytes[3],
671            0,
672            0,
673            0,
674            0,
675            0,
676            0,
677            0,
678            0,
679            0,
680            0,
681            0,
682            0,
683            privsize_bytes[0],
684            privsize_bytes[1],
685            privsize_bytes[2],
686            privsize_bytes[3],
687        ];
688        let length_so_far = length_so_far + request0.len();
689        let length_so_far = length_so_far + self.private.len();
690        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
691        let length_so_far = length_so_far + padding0.len();
692        assert_eq!(length_so_far % 4, 0);
693        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
694        request0[2..4].copy_from_slice(&length.to_ne_bytes());
695        ([request0.into(), self.private, padding0.into()], vec![])
696    }
697    /// Parse this request given its header, its body, and any fds that go along with it
698    #[cfg(feature = "request-parsing")]
699    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
700        if header.minor_opcode != MOD_MODE_LINE_REQUEST {
701            return Err(ParseError::InvalidValue);
702        }
703        let (screen, remaining) = u32::try_parse(value)?;
704        let (hdisplay, remaining) = u16::try_parse(remaining)?;
705        let (hsyncstart, remaining) = u16::try_parse(remaining)?;
706        let (hsyncend, remaining) = u16::try_parse(remaining)?;
707        let (htotal, remaining) = u16::try_parse(remaining)?;
708        let (hskew, remaining) = u16::try_parse(remaining)?;
709        let (vdisplay, remaining) = u16::try_parse(remaining)?;
710        let (vsyncstart, remaining) = u16::try_parse(remaining)?;
711        let (vsyncend, remaining) = u16::try_parse(remaining)?;
712        let (vtotal, remaining) = u16::try_parse(remaining)?;
713        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
714        let (flags, remaining) = u32::try_parse(remaining)?;
715        let flags = flags.into();
716        let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
717        let (privsize, remaining) = u32::try_parse(remaining)?;
718        let (private, remaining) = crate::x11_utils::parse_u8_list(remaining, privsize.try_to_usize()?)?;
719        let _ = remaining;
720        Ok(ModModeLineRequest {
721            screen,
722            hdisplay,
723            hsyncstart,
724            hsyncend,
725            htotal,
726            hskew,
727            vdisplay,
728            vsyncstart,
729            vsyncend,
730            vtotal,
731            flags,
732            private: Cow::Borrowed(private),
733        })
734    }
735    /// Clone all borrowed data in this ModModeLineRequest.
736    pub fn into_owned(self) -> ModModeLineRequest<'static> {
737        ModModeLineRequest {
738            screen: self.screen,
739            hdisplay: self.hdisplay,
740            hsyncstart: self.hsyncstart,
741            hsyncend: self.hsyncend,
742            htotal: self.htotal,
743            hskew: self.hskew,
744            vdisplay: self.vdisplay,
745            vsyncstart: self.vsyncstart,
746            vsyncend: self.vsyncend,
747            vtotal: self.vtotal,
748            flags: self.flags,
749            private: Cow::Owned(self.private.into_owned()),
750        }
751    }
752}
753impl<'input> Request for ModModeLineRequest<'input> {
754    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
755
756    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
757        let (bufs, fds) = self.serialize(major_opcode);
758        // Flatten the buffers into a single vector
759        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
760        (buf, fds)
761    }
762}
763impl<'input> crate::x11_utils::VoidRequest for ModModeLineRequest<'input> {
764}
765
766/// Opcode for the SwitchMode request
767pub const SWITCH_MODE_REQUEST: u8 = 3;
768#[derive(Clone, Copy, Default)]
769#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
770#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
771pub struct SwitchModeRequest {
772    pub screen: u16,
773    pub zoom: u16,
774}
775impl_debug_if_no_extra_traits!(SwitchModeRequest, "SwitchModeRequest");
776impl SwitchModeRequest {
777    /// Serialize this request into bytes for the provided connection
778    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
779        let length_so_far = 0;
780        let screen_bytes = self.screen.serialize();
781        let zoom_bytes = self.zoom.serialize();
782        let mut request0 = vec![
783            major_opcode,
784            SWITCH_MODE_REQUEST,
785            0,
786            0,
787            screen_bytes[0],
788            screen_bytes[1],
789            zoom_bytes[0],
790            zoom_bytes[1],
791        ];
792        let length_so_far = length_so_far + request0.len();
793        assert_eq!(length_so_far % 4, 0);
794        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
795        request0[2..4].copy_from_slice(&length.to_ne_bytes());
796        ([request0.into()], vec![])
797    }
798    /// Parse this request given its header, its body, and any fds that go along with it
799    #[cfg(feature = "request-parsing")]
800    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
801        if header.minor_opcode != SWITCH_MODE_REQUEST {
802            return Err(ParseError::InvalidValue);
803        }
804        let (screen, remaining) = u16::try_parse(value)?;
805        let (zoom, remaining) = u16::try_parse(remaining)?;
806        let _ = remaining;
807        Ok(SwitchModeRequest {
808            screen,
809            zoom,
810        })
811    }
812}
813impl Request for SwitchModeRequest {
814    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
815
816    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
817        let (bufs, fds) = self.serialize(major_opcode);
818        // Flatten the buffers into a single vector
819        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
820        (buf, fds)
821    }
822}
823impl crate::x11_utils::VoidRequest for SwitchModeRequest {
824}
825
826/// Opcode for the GetMonitor request
827pub const GET_MONITOR_REQUEST: u8 = 4;
828#[derive(Clone, Copy, Default)]
829#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
830#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
831pub struct GetMonitorRequest {
832    pub screen: u16,
833}
834impl_debug_if_no_extra_traits!(GetMonitorRequest, "GetMonitorRequest");
835impl GetMonitorRequest {
836    /// Serialize this request into bytes for the provided connection
837    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
838        let length_so_far = 0;
839        let screen_bytes = self.screen.serialize();
840        let mut request0 = vec![
841            major_opcode,
842            GET_MONITOR_REQUEST,
843            0,
844            0,
845            screen_bytes[0],
846            screen_bytes[1],
847            0,
848            0,
849        ];
850        let length_so_far = length_so_far + request0.len();
851        assert_eq!(length_so_far % 4, 0);
852        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
853        request0[2..4].copy_from_slice(&length.to_ne_bytes());
854        ([request0.into()], vec![])
855    }
856    /// Parse this request given its header, its body, and any fds that go along with it
857    #[cfg(feature = "request-parsing")]
858    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
859        if header.minor_opcode != GET_MONITOR_REQUEST {
860            return Err(ParseError::InvalidValue);
861        }
862        let (screen, remaining) = u16::try_parse(value)?;
863        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
864        let _ = remaining;
865        Ok(GetMonitorRequest {
866            screen,
867        })
868    }
869}
870impl Request for GetMonitorRequest {
871    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
872
873    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
874        let (bufs, fds) = self.serialize(major_opcode);
875        // Flatten the buffers into a single vector
876        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
877        (buf, fds)
878    }
879}
880impl crate::x11_utils::ReplyRequest for GetMonitorRequest {
881    type Reply = GetMonitorReply;
882}
883
884#[derive(Clone, Default)]
885#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
886#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
887pub struct GetMonitorReply {
888    pub sequence: u16,
889    pub length: u32,
890    pub hsync: Vec<Syncrange>,
891    pub vsync: Vec<Syncrange>,
892    pub vendor: Vec<u8>,
893    pub alignment_pad: Vec<u8>,
894    pub model: Vec<u8>,
895}
896impl_debug_if_no_extra_traits!(GetMonitorReply, "GetMonitorReply");
897impl TryParse for GetMonitorReply {
898    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
899        let remaining = initial_value;
900        let (response_type, remaining) = u8::try_parse(remaining)?;
901        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
902        let (sequence, remaining) = u16::try_parse(remaining)?;
903        let (length, remaining) = u32::try_parse(remaining)?;
904        let (vendor_length, remaining) = u8::try_parse(remaining)?;
905        let (model_length, remaining) = u8::try_parse(remaining)?;
906        let (num_hsync, remaining) = u8::try_parse(remaining)?;
907        let (num_vsync, remaining) = u8::try_parse(remaining)?;
908        let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
909        let (hsync, remaining) = crate::x11_utils::parse_list::<Syncrange>(remaining, num_hsync.try_to_usize()?)?;
910        let (vsync, remaining) = crate::x11_utils::parse_list::<Syncrange>(remaining, num_vsync.try_to_usize()?)?;
911        let (vendor, remaining) = crate::x11_utils::parse_u8_list(remaining, vendor_length.try_to_usize()?)?;
912        let vendor = vendor.to_vec();
913        let (alignment_pad, remaining) = crate::x11_utils::parse_u8_list(remaining, (u32::from(vendor_length).checked_add(3u32).ok_or(ParseError::InvalidExpression)? & (!3u32)).checked_sub(u32::from(vendor_length)).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
914        let alignment_pad = alignment_pad.to_vec();
915        let (model, remaining) = crate::x11_utils::parse_u8_list(remaining, model_length.try_to_usize()?)?;
916        let model = model.to_vec();
917        if response_type != 1 {
918            return Err(ParseError::InvalidValue);
919        }
920        let result = GetMonitorReply { sequence, length, hsync, vsync, vendor, alignment_pad, model };
921        let _ = remaining;
922        let remaining = initial_value.get(32 + length as usize * 4..)
923            .ok_or(ParseError::InsufficientData)?;
924        Ok((result, remaining))
925    }
926}
927impl Serialize for GetMonitorReply {
928    type Bytes = Vec<u8>;
929    fn serialize(&self) -> Vec<u8> {
930        let mut result = Vec::new();
931        self.serialize_into(&mut result);
932        result
933    }
934    fn serialize_into(&self, bytes: &mut Vec<u8>) {
935        bytes.reserve(32);
936        let response_type_bytes = &[1];
937        bytes.push(response_type_bytes[0]);
938        bytes.extend_from_slice(&[0; 1]);
939        self.sequence.serialize_into(bytes);
940        self.length.serialize_into(bytes);
941        let vendor_length = u8::try_from(self.vendor.len()).expect("`vendor` has too many elements");
942        vendor_length.serialize_into(bytes);
943        let model_length = u8::try_from(self.model.len()).expect("`model` has too many elements");
944        model_length.serialize_into(bytes);
945        let num_hsync = u8::try_from(self.hsync.len()).expect("`hsync` has too many elements");
946        num_hsync.serialize_into(bytes);
947        let num_vsync = u8::try_from(self.vsync.len()).expect("`vsync` has too many elements");
948        num_vsync.serialize_into(bytes);
949        bytes.extend_from_slice(&[0; 20]);
950        self.hsync.serialize_into(bytes);
951        self.vsync.serialize_into(bytes);
952        bytes.extend_from_slice(&self.vendor);
953        assert_eq!(self.alignment_pad.len(), usize::try_from((u32::from(vendor_length).checked_add(3u32).unwrap() & (!3u32)).checked_sub(u32::from(vendor_length)).unwrap()).unwrap(), "`alignment_pad` has an incorrect length");
954        bytes.extend_from_slice(&self.alignment_pad);
955        bytes.extend_from_slice(&self.model);
956    }
957}
958impl GetMonitorReply {
959    /// Get the value of the `vendor_length` field.
960    ///
961    /// The `vendor_length` field is used as the length field of the `vendor` field.
962    /// This function computes the field's value again based on the length of the list.
963    ///
964    /// # Panics
965    ///
966    /// Panics if the value cannot be represented in the target type. This
967    /// cannot happen with values of the struct received from the X11 server.
968    pub fn vendor_length(&self) -> u8 {
969        self.vendor.len()
970            .try_into().unwrap()
971    }
972    /// Get the value of the `model_length` field.
973    ///
974    /// The `model_length` field is used as the length field of the `model` field.
975    /// This function computes the field's value again based on the length of the list.
976    ///
977    /// # Panics
978    ///
979    /// Panics if the value cannot be represented in the target type. This
980    /// cannot happen with values of the struct received from the X11 server.
981    pub fn model_length(&self) -> u8 {
982        self.model.len()
983            .try_into().unwrap()
984    }
985    /// Get the value of the `num_hsync` field.
986    ///
987    /// The `num_hsync` field is used as the length field of the `hsync` field.
988    /// This function computes the field's value again based on the length of the list.
989    ///
990    /// # Panics
991    ///
992    /// Panics if the value cannot be represented in the target type. This
993    /// cannot happen with values of the struct received from the X11 server.
994    pub fn num_hsync(&self) -> u8 {
995        self.hsync.len()
996            .try_into().unwrap()
997    }
998    /// Get the value of the `num_vsync` field.
999    ///
1000    /// The `num_vsync` field is used as the length field of the `vsync` field.
1001    /// This function computes the field's value again based on the length of the list.
1002    ///
1003    /// # Panics
1004    ///
1005    /// Panics if the value cannot be represented in the target type. This
1006    /// cannot happen with values of the struct received from the X11 server.
1007    pub fn num_vsync(&self) -> u8 {
1008        self.vsync.len()
1009            .try_into().unwrap()
1010    }
1011}
1012
1013/// Opcode for the LockModeSwitch request
1014pub const LOCK_MODE_SWITCH_REQUEST: u8 = 5;
1015#[derive(Clone, Copy, Default)]
1016#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1017#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1018pub struct LockModeSwitchRequest {
1019    pub screen: u16,
1020    pub lock: u16,
1021}
1022impl_debug_if_no_extra_traits!(LockModeSwitchRequest, "LockModeSwitchRequest");
1023impl LockModeSwitchRequest {
1024    /// Serialize this request into bytes for the provided connection
1025    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1026        let length_so_far = 0;
1027        let screen_bytes = self.screen.serialize();
1028        let lock_bytes = self.lock.serialize();
1029        let mut request0 = vec![
1030            major_opcode,
1031            LOCK_MODE_SWITCH_REQUEST,
1032            0,
1033            0,
1034            screen_bytes[0],
1035            screen_bytes[1],
1036            lock_bytes[0],
1037            lock_bytes[1],
1038        ];
1039        let length_so_far = length_so_far + request0.len();
1040        assert_eq!(length_so_far % 4, 0);
1041        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1042        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1043        ([request0.into()], vec![])
1044    }
1045    /// Parse this request given its header, its body, and any fds that go along with it
1046    #[cfg(feature = "request-parsing")]
1047    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1048        if header.minor_opcode != LOCK_MODE_SWITCH_REQUEST {
1049            return Err(ParseError::InvalidValue);
1050        }
1051        let (screen, remaining) = u16::try_parse(value)?;
1052        let (lock, remaining) = u16::try_parse(remaining)?;
1053        let _ = remaining;
1054        Ok(LockModeSwitchRequest {
1055            screen,
1056            lock,
1057        })
1058    }
1059}
1060impl Request for LockModeSwitchRequest {
1061    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1062
1063    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1064        let (bufs, fds) = self.serialize(major_opcode);
1065        // Flatten the buffers into a single vector
1066        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1067        (buf, fds)
1068    }
1069}
1070impl crate::x11_utils::VoidRequest for LockModeSwitchRequest {
1071}
1072
1073/// Opcode for the GetAllModeLines request
1074pub const GET_ALL_MODE_LINES_REQUEST: u8 = 6;
1075#[derive(Clone, Copy, Default)]
1076#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1077#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1078pub struct GetAllModeLinesRequest {
1079    pub screen: u16,
1080}
1081impl_debug_if_no_extra_traits!(GetAllModeLinesRequest, "GetAllModeLinesRequest");
1082impl GetAllModeLinesRequest {
1083    /// Serialize this request into bytes for the provided connection
1084    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1085        let length_so_far = 0;
1086        let screen_bytes = self.screen.serialize();
1087        let mut request0 = vec![
1088            major_opcode,
1089            GET_ALL_MODE_LINES_REQUEST,
1090            0,
1091            0,
1092            screen_bytes[0],
1093            screen_bytes[1],
1094            0,
1095            0,
1096        ];
1097        let length_so_far = length_so_far + request0.len();
1098        assert_eq!(length_so_far % 4, 0);
1099        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1100        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1101        ([request0.into()], vec![])
1102    }
1103    /// Parse this request given its header, its body, and any fds that go along with it
1104    #[cfg(feature = "request-parsing")]
1105    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1106        if header.minor_opcode != GET_ALL_MODE_LINES_REQUEST {
1107            return Err(ParseError::InvalidValue);
1108        }
1109        let (screen, remaining) = u16::try_parse(value)?;
1110        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1111        let _ = remaining;
1112        Ok(GetAllModeLinesRequest {
1113            screen,
1114        })
1115    }
1116}
1117impl Request for GetAllModeLinesRequest {
1118    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1119
1120    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1121        let (bufs, fds) = self.serialize(major_opcode);
1122        // Flatten the buffers into a single vector
1123        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1124        (buf, fds)
1125    }
1126}
1127impl crate::x11_utils::ReplyRequest for GetAllModeLinesRequest {
1128    type Reply = GetAllModeLinesReply;
1129}
1130
1131#[derive(Clone, Default)]
1132#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1133#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1134pub struct GetAllModeLinesReply {
1135    pub sequence: u16,
1136    pub length: u32,
1137    pub modeinfo: Vec<ModeInfo>,
1138}
1139impl_debug_if_no_extra_traits!(GetAllModeLinesReply, "GetAllModeLinesReply");
1140impl TryParse for GetAllModeLinesReply {
1141    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1142        let remaining = initial_value;
1143        let (response_type, remaining) = u8::try_parse(remaining)?;
1144        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1145        let (sequence, remaining) = u16::try_parse(remaining)?;
1146        let (length, remaining) = u32::try_parse(remaining)?;
1147        let (modecount, remaining) = u32::try_parse(remaining)?;
1148        let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
1149        let (modeinfo, remaining) = crate::x11_utils::parse_list::<ModeInfo>(remaining, modecount.try_to_usize()?)?;
1150        if response_type != 1 {
1151            return Err(ParseError::InvalidValue);
1152        }
1153        let result = GetAllModeLinesReply { sequence, length, modeinfo };
1154        let _ = remaining;
1155        let remaining = initial_value.get(32 + length as usize * 4..)
1156            .ok_or(ParseError::InsufficientData)?;
1157        Ok((result, remaining))
1158    }
1159}
1160impl Serialize for GetAllModeLinesReply {
1161    type Bytes = Vec<u8>;
1162    fn serialize(&self) -> Vec<u8> {
1163        let mut result = Vec::new();
1164        self.serialize_into(&mut result);
1165        result
1166    }
1167    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1168        bytes.reserve(32);
1169        let response_type_bytes = &[1];
1170        bytes.push(response_type_bytes[0]);
1171        bytes.extend_from_slice(&[0; 1]);
1172        self.sequence.serialize_into(bytes);
1173        self.length.serialize_into(bytes);
1174        let modecount = u32::try_from(self.modeinfo.len()).expect("`modeinfo` has too many elements");
1175        modecount.serialize_into(bytes);
1176        bytes.extend_from_slice(&[0; 20]);
1177        self.modeinfo.serialize_into(bytes);
1178    }
1179}
1180impl GetAllModeLinesReply {
1181    /// Get the value of the `modecount` field.
1182    ///
1183    /// The `modecount` field is used as the length field of the `modeinfo` field.
1184    /// This function computes the field's value again based on the length of the list.
1185    ///
1186    /// # Panics
1187    ///
1188    /// Panics if the value cannot be represented in the target type. This
1189    /// cannot happen with values of the struct received from the X11 server.
1190    pub fn modecount(&self) -> u32 {
1191        self.modeinfo.len()
1192            .try_into().unwrap()
1193    }
1194}
1195
1196/// Opcode for the AddModeLine request
1197pub const ADD_MODE_LINE_REQUEST: u8 = 7;
1198#[derive(Clone, Default)]
1199#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1200#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1201pub struct AddModeLineRequest<'input> {
1202    pub screen: u32,
1203    pub dotclock: Dotclock,
1204    pub hdisplay: u16,
1205    pub hsyncstart: u16,
1206    pub hsyncend: u16,
1207    pub htotal: u16,
1208    pub hskew: u16,
1209    pub vdisplay: u16,
1210    pub vsyncstart: u16,
1211    pub vsyncend: u16,
1212    pub vtotal: u16,
1213    pub flags: ModeFlag,
1214    pub after_dotclock: Dotclock,
1215    pub after_hdisplay: u16,
1216    pub after_hsyncstart: u16,
1217    pub after_hsyncend: u16,
1218    pub after_htotal: u16,
1219    pub after_hskew: u16,
1220    pub after_vdisplay: u16,
1221    pub after_vsyncstart: u16,
1222    pub after_vsyncend: u16,
1223    pub after_vtotal: u16,
1224    pub after_flags: ModeFlag,
1225    pub private: Cow<'input, [u8]>,
1226}
1227impl_debug_if_no_extra_traits!(AddModeLineRequest<'_>, "AddModeLineRequest");
1228impl<'input> AddModeLineRequest<'input> {
1229    /// Serialize this request into bytes for the provided connection
1230    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
1231        let length_so_far = 0;
1232        let screen_bytes = self.screen.serialize();
1233        let dotclock_bytes = self.dotclock.serialize();
1234        let hdisplay_bytes = self.hdisplay.serialize();
1235        let hsyncstart_bytes = self.hsyncstart.serialize();
1236        let hsyncend_bytes = self.hsyncend.serialize();
1237        let htotal_bytes = self.htotal.serialize();
1238        let hskew_bytes = self.hskew.serialize();
1239        let vdisplay_bytes = self.vdisplay.serialize();
1240        let vsyncstart_bytes = self.vsyncstart.serialize();
1241        let vsyncend_bytes = self.vsyncend.serialize();
1242        let vtotal_bytes = self.vtotal.serialize();
1243        let flags_bytes = u32::from(self.flags).serialize();
1244        let privsize = u32::try_from(self.private.len()).expect("`private` has too many elements");
1245        let privsize_bytes = privsize.serialize();
1246        let after_dotclock_bytes = self.after_dotclock.serialize();
1247        let after_hdisplay_bytes = self.after_hdisplay.serialize();
1248        let after_hsyncstart_bytes = self.after_hsyncstart.serialize();
1249        let after_hsyncend_bytes = self.after_hsyncend.serialize();
1250        let after_htotal_bytes = self.after_htotal.serialize();
1251        let after_hskew_bytes = self.after_hskew.serialize();
1252        let after_vdisplay_bytes = self.after_vdisplay.serialize();
1253        let after_vsyncstart_bytes = self.after_vsyncstart.serialize();
1254        let after_vsyncend_bytes = self.after_vsyncend.serialize();
1255        let after_vtotal_bytes = self.after_vtotal.serialize();
1256        let after_flags_bytes = u32::from(self.after_flags).serialize();
1257        let mut request0 = vec![
1258            major_opcode,
1259            ADD_MODE_LINE_REQUEST,
1260            0,
1261            0,
1262            screen_bytes[0],
1263            screen_bytes[1],
1264            screen_bytes[2],
1265            screen_bytes[3],
1266            dotclock_bytes[0],
1267            dotclock_bytes[1],
1268            dotclock_bytes[2],
1269            dotclock_bytes[3],
1270            hdisplay_bytes[0],
1271            hdisplay_bytes[1],
1272            hsyncstart_bytes[0],
1273            hsyncstart_bytes[1],
1274            hsyncend_bytes[0],
1275            hsyncend_bytes[1],
1276            htotal_bytes[0],
1277            htotal_bytes[1],
1278            hskew_bytes[0],
1279            hskew_bytes[1],
1280            vdisplay_bytes[0],
1281            vdisplay_bytes[1],
1282            vsyncstart_bytes[0],
1283            vsyncstart_bytes[1],
1284            vsyncend_bytes[0],
1285            vsyncend_bytes[1],
1286            vtotal_bytes[0],
1287            vtotal_bytes[1],
1288            0,
1289            0,
1290            flags_bytes[0],
1291            flags_bytes[1],
1292            flags_bytes[2],
1293            flags_bytes[3],
1294            0,
1295            0,
1296            0,
1297            0,
1298            0,
1299            0,
1300            0,
1301            0,
1302            0,
1303            0,
1304            0,
1305            0,
1306            privsize_bytes[0],
1307            privsize_bytes[1],
1308            privsize_bytes[2],
1309            privsize_bytes[3],
1310            after_dotclock_bytes[0],
1311            after_dotclock_bytes[1],
1312            after_dotclock_bytes[2],
1313            after_dotclock_bytes[3],
1314            after_hdisplay_bytes[0],
1315            after_hdisplay_bytes[1],
1316            after_hsyncstart_bytes[0],
1317            after_hsyncstart_bytes[1],
1318            after_hsyncend_bytes[0],
1319            after_hsyncend_bytes[1],
1320            after_htotal_bytes[0],
1321            after_htotal_bytes[1],
1322            after_hskew_bytes[0],
1323            after_hskew_bytes[1],
1324            after_vdisplay_bytes[0],
1325            after_vdisplay_bytes[1],
1326            after_vsyncstart_bytes[0],
1327            after_vsyncstart_bytes[1],
1328            after_vsyncend_bytes[0],
1329            after_vsyncend_bytes[1],
1330            after_vtotal_bytes[0],
1331            after_vtotal_bytes[1],
1332            0,
1333            0,
1334            after_flags_bytes[0],
1335            after_flags_bytes[1],
1336            after_flags_bytes[2],
1337            after_flags_bytes[3],
1338            0,
1339            0,
1340            0,
1341            0,
1342            0,
1343            0,
1344            0,
1345            0,
1346            0,
1347            0,
1348            0,
1349            0,
1350        ];
1351        let length_so_far = length_so_far + request0.len();
1352        let length_so_far = length_so_far + self.private.len();
1353        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
1354        let length_so_far = length_so_far + padding0.len();
1355        assert_eq!(length_so_far % 4, 0);
1356        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1357        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1358        ([request0.into(), self.private, padding0.into()], vec![])
1359    }
1360    /// Parse this request given its header, its body, and any fds that go along with it
1361    #[cfg(feature = "request-parsing")]
1362    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
1363        if header.minor_opcode != ADD_MODE_LINE_REQUEST {
1364            return Err(ParseError::InvalidValue);
1365        }
1366        let (screen, remaining) = u32::try_parse(value)?;
1367        let (dotclock, remaining) = Dotclock::try_parse(remaining)?;
1368        let (hdisplay, remaining) = u16::try_parse(remaining)?;
1369        let (hsyncstart, remaining) = u16::try_parse(remaining)?;
1370        let (hsyncend, remaining) = u16::try_parse(remaining)?;
1371        let (htotal, remaining) = u16::try_parse(remaining)?;
1372        let (hskew, remaining) = u16::try_parse(remaining)?;
1373        let (vdisplay, remaining) = u16::try_parse(remaining)?;
1374        let (vsyncstart, remaining) = u16::try_parse(remaining)?;
1375        let (vsyncend, remaining) = u16::try_parse(remaining)?;
1376        let (vtotal, remaining) = u16::try_parse(remaining)?;
1377        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1378        let (flags, remaining) = u32::try_parse(remaining)?;
1379        let flags = flags.into();
1380        let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
1381        let (privsize, remaining) = u32::try_parse(remaining)?;
1382        let (after_dotclock, remaining) = Dotclock::try_parse(remaining)?;
1383        let (after_hdisplay, remaining) = u16::try_parse(remaining)?;
1384        let (after_hsyncstart, remaining) = u16::try_parse(remaining)?;
1385        let (after_hsyncend, remaining) = u16::try_parse(remaining)?;
1386        let (after_htotal, remaining) = u16::try_parse(remaining)?;
1387        let (after_hskew, remaining) = u16::try_parse(remaining)?;
1388        let (after_vdisplay, remaining) = u16::try_parse(remaining)?;
1389        let (after_vsyncstart, remaining) = u16::try_parse(remaining)?;
1390        let (after_vsyncend, remaining) = u16::try_parse(remaining)?;
1391        let (after_vtotal, remaining) = u16::try_parse(remaining)?;
1392        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1393        let (after_flags, remaining) = u32::try_parse(remaining)?;
1394        let after_flags = after_flags.into();
1395        let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
1396        let (private, remaining) = crate::x11_utils::parse_u8_list(remaining, privsize.try_to_usize()?)?;
1397        let _ = remaining;
1398        Ok(AddModeLineRequest {
1399            screen,
1400            dotclock,
1401            hdisplay,
1402            hsyncstart,
1403            hsyncend,
1404            htotal,
1405            hskew,
1406            vdisplay,
1407            vsyncstart,
1408            vsyncend,
1409            vtotal,
1410            flags,
1411            after_dotclock,
1412            after_hdisplay,
1413            after_hsyncstart,
1414            after_hsyncend,
1415            after_htotal,
1416            after_hskew,
1417            after_vdisplay,
1418            after_vsyncstart,
1419            after_vsyncend,
1420            after_vtotal,
1421            after_flags,
1422            private: Cow::Borrowed(private),
1423        })
1424    }
1425    /// Clone all borrowed data in this AddModeLineRequest.
1426    pub fn into_owned(self) -> AddModeLineRequest<'static> {
1427        AddModeLineRequest {
1428            screen: self.screen,
1429            dotclock: self.dotclock,
1430            hdisplay: self.hdisplay,
1431            hsyncstart: self.hsyncstart,
1432            hsyncend: self.hsyncend,
1433            htotal: self.htotal,
1434            hskew: self.hskew,
1435            vdisplay: self.vdisplay,
1436            vsyncstart: self.vsyncstart,
1437            vsyncend: self.vsyncend,
1438            vtotal: self.vtotal,
1439            flags: self.flags,
1440            after_dotclock: self.after_dotclock,
1441            after_hdisplay: self.after_hdisplay,
1442            after_hsyncstart: self.after_hsyncstart,
1443            after_hsyncend: self.after_hsyncend,
1444            after_htotal: self.after_htotal,
1445            after_hskew: self.after_hskew,
1446            after_vdisplay: self.after_vdisplay,
1447            after_vsyncstart: self.after_vsyncstart,
1448            after_vsyncend: self.after_vsyncend,
1449            after_vtotal: self.after_vtotal,
1450            after_flags: self.after_flags,
1451            private: Cow::Owned(self.private.into_owned()),
1452        }
1453    }
1454}
1455impl<'input> Request for AddModeLineRequest<'input> {
1456    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1457
1458    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1459        let (bufs, fds) = self.serialize(major_opcode);
1460        // Flatten the buffers into a single vector
1461        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1462        (buf, fds)
1463    }
1464}
1465impl<'input> crate::x11_utils::VoidRequest for AddModeLineRequest<'input> {
1466}
1467
1468/// Opcode for the DeleteModeLine request
1469pub const DELETE_MODE_LINE_REQUEST: u8 = 8;
1470#[derive(Clone, Default)]
1471#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1472#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1473pub struct DeleteModeLineRequest<'input> {
1474    pub screen: u32,
1475    pub dotclock: Dotclock,
1476    pub hdisplay: u16,
1477    pub hsyncstart: u16,
1478    pub hsyncend: u16,
1479    pub htotal: u16,
1480    pub hskew: u16,
1481    pub vdisplay: u16,
1482    pub vsyncstart: u16,
1483    pub vsyncend: u16,
1484    pub vtotal: u16,
1485    pub flags: ModeFlag,
1486    pub private: Cow<'input, [u8]>,
1487}
1488impl_debug_if_no_extra_traits!(DeleteModeLineRequest<'_>, "DeleteModeLineRequest");
1489impl<'input> DeleteModeLineRequest<'input> {
1490    /// Serialize this request into bytes for the provided connection
1491    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
1492        let length_so_far = 0;
1493        let screen_bytes = self.screen.serialize();
1494        let dotclock_bytes = self.dotclock.serialize();
1495        let hdisplay_bytes = self.hdisplay.serialize();
1496        let hsyncstart_bytes = self.hsyncstart.serialize();
1497        let hsyncend_bytes = self.hsyncend.serialize();
1498        let htotal_bytes = self.htotal.serialize();
1499        let hskew_bytes = self.hskew.serialize();
1500        let vdisplay_bytes = self.vdisplay.serialize();
1501        let vsyncstart_bytes = self.vsyncstart.serialize();
1502        let vsyncend_bytes = self.vsyncend.serialize();
1503        let vtotal_bytes = self.vtotal.serialize();
1504        let flags_bytes = u32::from(self.flags).serialize();
1505        let privsize = u32::try_from(self.private.len()).expect("`private` has too many elements");
1506        let privsize_bytes = privsize.serialize();
1507        let mut request0 = vec![
1508            major_opcode,
1509            DELETE_MODE_LINE_REQUEST,
1510            0,
1511            0,
1512            screen_bytes[0],
1513            screen_bytes[1],
1514            screen_bytes[2],
1515            screen_bytes[3],
1516            dotclock_bytes[0],
1517            dotclock_bytes[1],
1518            dotclock_bytes[2],
1519            dotclock_bytes[3],
1520            hdisplay_bytes[0],
1521            hdisplay_bytes[1],
1522            hsyncstart_bytes[0],
1523            hsyncstart_bytes[1],
1524            hsyncend_bytes[0],
1525            hsyncend_bytes[1],
1526            htotal_bytes[0],
1527            htotal_bytes[1],
1528            hskew_bytes[0],
1529            hskew_bytes[1],
1530            vdisplay_bytes[0],
1531            vdisplay_bytes[1],
1532            vsyncstart_bytes[0],
1533            vsyncstart_bytes[1],
1534            vsyncend_bytes[0],
1535            vsyncend_bytes[1],
1536            vtotal_bytes[0],
1537            vtotal_bytes[1],
1538            0,
1539            0,
1540            flags_bytes[0],
1541            flags_bytes[1],
1542            flags_bytes[2],
1543            flags_bytes[3],
1544            0,
1545            0,
1546            0,
1547            0,
1548            0,
1549            0,
1550            0,
1551            0,
1552            0,
1553            0,
1554            0,
1555            0,
1556            privsize_bytes[0],
1557            privsize_bytes[1],
1558            privsize_bytes[2],
1559            privsize_bytes[3],
1560        ];
1561        let length_so_far = length_so_far + request0.len();
1562        let length_so_far = length_so_far + self.private.len();
1563        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
1564        let length_so_far = length_so_far + padding0.len();
1565        assert_eq!(length_so_far % 4, 0);
1566        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1567        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1568        ([request0.into(), self.private, padding0.into()], vec![])
1569    }
1570    /// Parse this request given its header, its body, and any fds that go along with it
1571    #[cfg(feature = "request-parsing")]
1572    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
1573        if header.minor_opcode != DELETE_MODE_LINE_REQUEST {
1574            return Err(ParseError::InvalidValue);
1575        }
1576        let (screen, remaining) = u32::try_parse(value)?;
1577        let (dotclock, remaining) = Dotclock::try_parse(remaining)?;
1578        let (hdisplay, remaining) = u16::try_parse(remaining)?;
1579        let (hsyncstart, remaining) = u16::try_parse(remaining)?;
1580        let (hsyncend, remaining) = u16::try_parse(remaining)?;
1581        let (htotal, remaining) = u16::try_parse(remaining)?;
1582        let (hskew, remaining) = u16::try_parse(remaining)?;
1583        let (vdisplay, remaining) = u16::try_parse(remaining)?;
1584        let (vsyncstart, remaining) = u16::try_parse(remaining)?;
1585        let (vsyncend, remaining) = u16::try_parse(remaining)?;
1586        let (vtotal, remaining) = u16::try_parse(remaining)?;
1587        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1588        let (flags, remaining) = u32::try_parse(remaining)?;
1589        let flags = flags.into();
1590        let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
1591        let (privsize, remaining) = u32::try_parse(remaining)?;
1592        let (private, remaining) = crate::x11_utils::parse_u8_list(remaining, privsize.try_to_usize()?)?;
1593        let _ = remaining;
1594        Ok(DeleteModeLineRequest {
1595            screen,
1596            dotclock,
1597            hdisplay,
1598            hsyncstart,
1599            hsyncend,
1600            htotal,
1601            hskew,
1602            vdisplay,
1603            vsyncstart,
1604            vsyncend,
1605            vtotal,
1606            flags,
1607            private: Cow::Borrowed(private),
1608        })
1609    }
1610    /// Clone all borrowed data in this DeleteModeLineRequest.
1611    pub fn into_owned(self) -> DeleteModeLineRequest<'static> {
1612        DeleteModeLineRequest {
1613            screen: self.screen,
1614            dotclock: self.dotclock,
1615            hdisplay: self.hdisplay,
1616            hsyncstart: self.hsyncstart,
1617            hsyncend: self.hsyncend,
1618            htotal: self.htotal,
1619            hskew: self.hskew,
1620            vdisplay: self.vdisplay,
1621            vsyncstart: self.vsyncstart,
1622            vsyncend: self.vsyncend,
1623            vtotal: self.vtotal,
1624            flags: self.flags,
1625            private: Cow::Owned(self.private.into_owned()),
1626        }
1627    }
1628}
1629impl<'input> Request for DeleteModeLineRequest<'input> {
1630    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1631
1632    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1633        let (bufs, fds) = self.serialize(major_opcode);
1634        // Flatten the buffers into a single vector
1635        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1636        (buf, fds)
1637    }
1638}
1639impl<'input> crate::x11_utils::VoidRequest for DeleteModeLineRequest<'input> {
1640}
1641
1642/// Opcode for the ValidateModeLine request
1643pub const VALIDATE_MODE_LINE_REQUEST: u8 = 9;
1644#[derive(Clone, Default)]
1645#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1646#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1647pub struct ValidateModeLineRequest<'input> {
1648    pub screen: u32,
1649    pub dotclock: Dotclock,
1650    pub hdisplay: u16,
1651    pub hsyncstart: u16,
1652    pub hsyncend: u16,
1653    pub htotal: u16,
1654    pub hskew: u16,
1655    pub vdisplay: u16,
1656    pub vsyncstart: u16,
1657    pub vsyncend: u16,
1658    pub vtotal: u16,
1659    pub flags: ModeFlag,
1660    pub private: Cow<'input, [u8]>,
1661}
1662impl_debug_if_no_extra_traits!(ValidateModeLineRequest<'_>, "ValidateModeLineRequest");
1663impl<'input> ValidateModeLineRequest<'input> {
1664    /// Serialize this request into bytes for the provided connection
1665    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
1666        let length_so_far = 0;
1667        let screen_bytes = self.screen.serialize();
1668        let dotclock_bytes = self.dotclock.serialize();
1669        let hdisplay_bytes = self.hdisplay.serialize();
1670        let hsyncstart_bytes = self.hsyncstart.serialize();
1671        let hsyncend_bytes = self.hsyncend.serialize();
1672        let htotal_bytes = self.htotal.serialize();
1673        let hskew_bytes = self.hskew.serialize();
1674        let vdisplay_bytes = self.vdisplay.serialize();
1675        let vsyncstart_bytes = self.vsyncstart.serialize();
1676        let vsyncend_bytes = self.vsyncend.serialize();
1677        let vtotal_bytes = self.vtotal.serialize();
1678        let flags_bytes = u32::from(self.flags).serialize();
1679        let privsize = u32::try_from(self.private.len()).expect("`private` has too many elements");
1680        let privsize_bytes = privsize.serialize();
1681        let mut request0 = vec![
1682            major_opcode,
1683            VALIDATE_MODE_LINE_REQUEST,
1684            0,
1685            0,
1686            screen_bytes[0],
1687            screen_bytes[1],
1688            screen_bytes[2],
1689            screen_bytes[3],
1690            dotclock_bytes[0],
1691            dotclock_bytes[1],
1692            dotclock_bytes[2],
1693            dotclock_bytes[3],
1694            hdisplay_bytes[0],
1695            hdisplay_bytes[1],
1696            hsyncstart_bytes[0],
1697            hsyncstart_bytes[1],
1698            hsyncend_bytes[0],
1699            hsyncend_bytes[1],
1700            htotal_bytes[0],
1701            htotal_bytes[1],
1702            hskew_bytes[0],
1703            hskew_bytes[1],
1704            vdisplay_bytes[0],
1705            vdisplay_bytes[1],
1706            vsyncstart_bytes[0],
1707            vsyncstart_bytes[1],
1708            vsyncend_bytes[0],
1709            vsyncend_bytes[1],
1710            vtotal_bytes[0],
1711            vtotal_bytes[1],
1712            0,
1713            0,
1714            flags_bytes[0],
1715            flags_bytes[1],
1716            flags_bytes[2],
1717            flags_bytes[3],
1718            0,
1719            0,
1720            0,
1721            0,
1722            0,
1723            0,
1724            0,
1725            0,
1726            0,
1727            0,
1728            0,
1729            0,
1730            privsize_bytes[0],
1731            privsize_bytes[1],
1732            privsize_bytes[2],
1733            privsize_bytes[3],
1734        ];
1735        let length_so_far = length_so_far + request0.len();
1736        let length_so_far = length_so_far + self.private.len();
1737        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
1738        let length_so_far = length_so_far + padding0.len();
1739        assert_eq!(length_so_far % 4, 0);
1740        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1741        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1742        ([request0.into(), self.private, padding0.into()], vec![])
1743    }
1744    /// Parse this request given its header, its body, and any fds that go along with it
1745    #[cfg(feature = "request-parsing")]
1746    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
1747        if header.minor_opcode != VALIDATE_MODE_LINE_REQUEST {
1748            return Err(ParseError::InvalidValue);
1749        }
1750        let (screen, remaining) = u32::try_parse(value)?;
1751        let (dotclock, remaining) = Dotclock::try_parse(remaining)?;
1752        let (hdisplay, remaining) = u16::try_parse(remaining)?;
1753        let (hsyncstart, remaining) = u16::try_parse(remaining)?;
1754        let (hsyncend, remaining) = u16::try_parse(remaining)?;
1755        let (htotal, remaining) = u16::try_parse(remaining)?;
1756        let (hskew, remaining) = u16::try_parse(remaining)?;
1757        let (vdisplay, remaining) = u16::try_parse(remaining)?;
1758        let (vsyncstart, remaining) = u16::try_parse(remaining)?;
1759        let (vsyncend, remaining) = u16::try_parse(remaining)?;
1760        let (vtotal, remaining) = u16::try_parse(remaining)?;
1761        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1762        let (flags, remaining) = u32::try_parse(remaining)?;
1763        let flags = flags.into();
1764        let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
1765        let (privsize, remaining) = u32::try_parse(remaining)?;
1766        let (private, remaining) = crate::x11_utils::parse_u8_list(remaining, privsize.try_to_usize()?)?;
1767        let _ = remaining;
1768        Ok(ValidateModeLineRequest {
1769            screen,
1770            dotclock,
1771            hdisplay,
1772            hsyncstart,
1773            hsyncend,
1774            htotal,
1775            hskew,
1776            vdisplay,
1777            vsyncstart,
1778            vsyncend,
1779            vtotal,
1780            flags,
1781            private: Cow::Borrowed(private),
1782        })
1783    }
1784    /// Clone all borrowed data in this ValidateModeLineRequest.
1785    pub fn into_owned(self) -> ValidateModeLineRequest<'static> {
1786        ValidateModeLineRequest {
1787            screen: self.screen,
1788            dotclock: self.dotclock,
1789            hdisplay: self.hdisplay,
1790            hsyncstart: self.hsyncstart,
1791            hsyncend: self.hsyncend,
1792            htotal: self.htotal,
1793            hskew: self.hskew,
1794            vdisplay: self.vdisplay,
1795            vsyncstart: self.vsyncstart,
1796            vsyncend: self.vsyncend,
1797            vtotal: self.vtotal,
1798            flags: self.flags,
1799            private: Cow::Owned(self.private.into_owned()),
1800        }
1801    }
1802}
1803impl<'input> Request for ValidateModeLineRequest<'input> {
1804    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1805
1806    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1807        let (bufs, fds) = self.serialize(major_opcode);
1808        // Flatten the buffers into a single vector
1809        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1810        (buf, fds)
1811    }
1812}
1813impl<'input> crate::x11_utils::ReplyRequest for ValidateModeLineRequest<'input> {
1814    type Reply = ValidateModeLineReply;
1815}
1816
1817#[derive(Clone, Copy, Default)]
1818#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1819#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1820pub struct ValidateModeLineReply {
1821    pub sequence: u16,
1822    pub length: u32,
1823    pub status: u32,
1824}
1825impl_debug_if_no_extra_traits!(ValidateModeLineReply, "ValidateModeLineReply");
1826impl TryParse for ValidateModeLineReply {
1827    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1828        let remaining = initial_value;
1829        let (response_type, remaining) = u8::try_parse(remaining)?;
1830        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1831        let (sequence, remaining) = u16::try_parse(remaining)?;
1832        let (length, remaining) = u32::try_parse(remaining)?;
1833        let (status, remaining) = u32::try_parse(remaining)?;
1834        let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
1835        if response_type != 1 {
1836            return Err(ParseError::InvalidValue);
1837        }
1838        let result = ValidateModeLineReply { sequence, length, status };
1839        let _ = remaining;
1840        let remaining = initial_value.get(32 + length as usize * 4..)
1841            .ok_or(ParseError::InsufficientData)?;
1842        Ok((result, remaining))
1843    }
1844}
1845impl Serialize for ValidateModeLineReply {
1846    type Bytes = [u8; 32];
1847    fn serialize(&self) -> [u8; 32] {
1848        let response_type_bytes = &[1];
1849        let sequence_bytes = self.sequence.serialize();
1850        let length_bytes = self.length.serialize();
1851        let status_bytes = self.status.serialize();
1852        [
1853            response_type_bytes[0],
1854            0,
1855            sequence_bytes[0],
1856            sequence_bytes[1],
1857            length_bytes[0],
1858            length_bytes[1],
1859            length_bytes[2],
1860            length_bytes[3],
1861            status_bytes[0],
1862            status_bytes[1],
1863            status_bytes[2],
1864            status_bytes[3],
1865            0,
1866            0,
1867            0,
1868            0,
1869            0,
1870            0,
1871            0,
1872            0,
1873            0,
1874            0,
1875            0,
1876            0,
1877            0,
1878            0,
1879            0,
1880            0,
1881            0,
1882            0,
1883            0,
1884            0,
1885        ]
1886    }
1887    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1888        bytes.reserve(32);
1889        let response_type_bytes = &[1];
1890        bytes.push(response_type_bytes[0]);
1891        bytes.extend_from_slice(&[0; 1]);
1892        self.sequence.serialize_into(bytes);
1893        self.length.serialize_into(bytes);
1894        self.status.serialize_into(bytes);
1895        bytes.extend_from_slice(&[0; 20]);
1896    }
1897}
1898
1899/// Opcode for the SwitchToMode request
1900pub const SWITCH_TO_MODE_REQUEST: u8 = 10;
1901#[derive(Clone, Default)]
1902#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1903#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1904pub struct SwitchToModeRequest<'input> {
1905    pub screen: u32,
1906    pub dotclock: Dotclock,
1907    pub hdisplay: u16,
1908    pub hsyncstart: u16,
1909    pub hsyncend: u16,
1910    pub htotal: u16,
1911    pub hskew: u16,
1912    pub vdisplay: u16,
1913    pub vsyncstart: u16,
1914    pub vsyncend: u16,
1915    pub vtotal: u16,
1916    pub flags: ModeFlag,
1917    pub private: Cow<'input, [u8]>,
1918}
1919impl_debug_if_no_extra_traits!(SwitchToModeRequest<'_>, "SwitchToModeRequest");
1920impl<'input> SwitchToModeRequest<'input> {
1921    /// Serialize this request into bytes for the provided connection
1922    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
1923        let length_so_far = 0;
1924        let screen_bytes = self.screen.serialize();
1925        let dotclock_bytes = self.dotclock.serialize();
1926        let hdisplay_bytes = self.hdisplay.serialize();
1927        let hsyncstart_bytes = self.hsyncstart.serialize();
1928        let hsyncend_bytes = self.hsyncend.serialize();
1929        let htotal_bytes = self.htotal.serialize();
1930        let hskew_bytes = self.hskew.serialize();
1931        let vdisplay_bytes = self.vdisplay.serialize();
1932        let vsyncstart_bytes = self.vsyncstart.serialize();
1933        let vsyncend_bytes = self.vsyncend.serialize();
1934        let vtotal_bytes = self.vtotal.serialize();
1935        let flags_bytes = u32::from(self.flags).serialize();
1936        let privsize = u32::try_from(self.private.len()).expect("`private` has too many elements");
1937        let privsize_bytes = privsize.serialize();
1938        let mut request0 = vec![
1939            major_opcode,
1940            SWITCH_TO_MODE_REQUEST,
1941            0,
1942            0,
1943            screen_bytes[0],
1944            screen_bytes[1],
1945            screen_bytes[2],
1946            screen_bytes[3],
1947            dotclock_bytes[0],
1948            dotclock_bytes[1],
1949            dotclock_bytes[2],
1950            dotclock_bytes[3],
1951            hdisplay_bytes[0],
1952            hdisplay_bytes[1],
1953            hsyncstart_bytes[0],
1954            hsyncstart_bytes[1],
1955            hsyncend_bytes[0],
1956            hsyncend_bytes[1],
1957            htotal_bytes[0],
1958            htotal_bytes[1],
1959            hskew_bytes[0],
1960            hskew_bytes[1],
1961            vdisplay_bytes[0],
1962            vdisplay_bytes[1],
1963            vsyncstart_bytes[0],
1964            vsyncstart_bytes[1],
1965            vsyncend_bytes[0],
1966            vsyncend_bytes[1],
1967            vtotal_bytes[0],
1968            vtotal_bytes[1],
1969            0,
1970            0,
1971            flags_bytes[0],
1972            flags_bytes[1],
1973            flags_bytes[2],
1974            flags_bytes[3],
1975            0,
1976            0,
1977            0,
1978            0,
1979            0,
1980            0,
1981            0,
1982            0,
1983            0,
1984            0,
1985            0,
1986            0,
1987            privsize_bytes[0],
1988            privsize_bytes[1],
1989            privsize_bytes[2],
1990            privsize_bytes[3],
1991        ];
1992        let length_so_far = length_so_far + request0.len();
1993        let length_so_far = length_so_far + self.private.len();
1994        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
1995        let length_so_far = length_so_far + padding0.len();
1996        assert_eq!(length_so_far % 4, 0);
1997        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1998        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1999        ([request0.into(), self.private, padding0.into()], vec![])
2000    }
2001    /// Parse this request given its header, its body, and any fds that go along with it
2002    #[cfg(feature = "request-parsing")]
2003    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
2004        if header.minor_opcode != SWITCH_TO_MODE_REQUEST {
2005            return Err(ParseError::InvalidValue);
2006        }
2007        let (screen, remaining) = u32::try_parse(value)?;
2008        let (dotclock, remaining) = Dotclock::try_parse(remaining)?;
2009        let (hdisplay, remaining) = u16::try_parse(remaining)?;
2010        let (hsyncstart, remaining) = u16::try_parse(remaining)?;
2011        let (hsyncend, remaining) = u16::try_parse(remaining)?;
2012        let (htotal, remaining) = u16::try_parse(remaining)?;
2013        let (hskew, remaining) = u16::try_parse(remaining)?;
2014        let (vdisplay, remaining) = u16::try_parse(remaining)?;
2015        let (vsyncstart, remaining) = u16::try_parse(remaining)?;
2016        let (vsyncend, remaining) = u16::try_parse(remaining)?;
2017        let (vtotal, remaining) = u16::try_parse(remaining)?;
2018        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
2019        let (flags, remaining) = u32::try_parse(remaining)?;
2020        let flags = flags.into();
2021        let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
2022        let (privsize, remaining) = u32::try_parse(remaining)?;
2023        let (private, remaining) = crate::x11_utils::parse_u8_list(remaining, privsize.try_to_usize()?)?;
2024        let _ = remaining;
2025        Ok(SwitchToModeRequest {
2026            screen,
2027            dotclock,
2028            hdisplay,
2029            hsyncstart,
2030            hsyncend,
2031            htotal,
2032            hskew,
2033            vdisplay,
2034            vsyncstart,
2035            vsyncend,
2036            vtotal,
2037            flags,
2038            private: Cow::Borrowed(private),
2039        })
2040    }
2041    /// Clone all borrowed data in this SwitchToModeRequest.
2042    pub fn into_owned(self) -> SwitchToModeRequest<'static> {
2043        SwitchToModeRequest {
2044            screen: self.screen,
2045            dotclock: self.dotclock,
2046            hdisplay: self.hdisplay,
2047            hsyncstart: self.hsyncstart,
2048            hsyncend: self.hsyncend,
2049            htotal: self.htotal,
2050            hskew: self.hskew,
2051            vdisplay: self.vdisplay,
2052            vsyncstart: self.vsyncstart,
2053            vsyncend: self.vsyncend,
2054            vtotal: self.vtotal,
2055            flags: self.flags,
2056            private: Cow::Owned(self.private.into_owned()),
2057        }
2058    }
2059}
2060impl<'input> Request for SwitchToModeRequest<'input> {
2061    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2062
2063    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2064        let (bufs, fds) = self.serialize(major_opcode);
2065        // Flatten the buffers into a single vector
2066        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2067        (buf, fds)
2068    }
2069}
2070impl<'input> crate::x11_utils::VoidRequest for SwitchToModeRequest<'input> {
2071}
2072
2073/// Opcode for the GetViewPort request
2074pub const GET_VIEW_PORT_REQUEST: u8 = 11;
2075#[derive(Clone, Copy, Default)]
2076#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2077#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2078pub struct GetViewPortRequest {
2079    pub screen: u16,
2080}
2081impl_debug_if_no_extra_traits!(GetViewPortRequest, "GetViewPortRequest");
2082impl GetViewPortRequest {
2083    /// Serialize this request into bytes for the provided connection
2084    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2085        let length_so_far = 0;
2086        let screen_bytes = self.screen.serialize();
2087        let mut request0 = vec![
2088            major_opcode,
2089            GET_VIEW_PORT_REQUEST,
2090            0,
2091            0,
2092            screen_bytes[0],
2093            screen_bytes[1],
2094            0,
2095            0,
2096        ];
2097        let length_so_far = length_so_far + request0.len();
2098        assert_eq!(length_so_far % 4, 0);
2099        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2100        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2101        ([request0.into()], vec![])
2102    }
2103    /// Parse this request given its header, its body, and any fds that go along with it
2104    #[cfg(feature = "request-parsing")]
2105    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2106        if header.minor_opcode != GET_VIEW_PORT_REQUEST {
2107            return Err(ParseError::InvalidValue);
2108        }
2109        let (screen, remaining) = u16::try_parse(value)?;
2110        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
2111        let _ = remaining;
2112        Ok(GetViewPortRequest {
2113            screen,
2114        })
2115    }
2116}
2117impl Request for GetViewPortRequest {
2118    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2119
2120    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2121        let (bufs, fds) = self.serialize(major_opcode);
2122        // Flatten the buffers into a single vector
2123        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2124        (buf, fds)
2125    }
2126}
2127impl crate::x11_utils::ReplyRequest for GetViewPortRequest {
2128    type Reply = GetViewPortReply;
2129}
2130
2131#[derive(Clone, Copy, Default)]
2132#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2133#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2134pub struct GetViewPortReply {
2135    pub sequence: u16,
2136    pub length: u32,
2137    pub x: u32,
2138    pub y: u32,
2139}
2140impl_debug_if_no_extra_traits!(GetViewPortReply, "GetViewPortReply");
2141impl TryParse for GetViewPortReply {
2142    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2143        let remaining = initial_value;
2144        let (response_type, remaining) = u8::try_parse(remaining)?;
2145        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2146        let (sequence, remaining) = u16::try_parse(remaining)?;
2147        let (length, remaining) = u32::try_parse(remaining)?;
2148        let (x, remaining) = u32::try_parse(remaining)?;
2149        let (y, remaining) = u32::try_parse(remaining)?;
2150        let remaining = remaining.get(16..).ok_or(ParseError::InsufficientData)?;
2151        if response_type != 1 {
2152            return Err(ParseError::InvalidValue);
2153        }
2154        let result = GetViewPortReply { sequence, length, x, y };
2155        let _ = remaining;
2156        let remaining = initial_value.get(32 + length as usize * 4..)
2157            .ok_or(ParseError::InsufficientData)?;
2158        Ok((result, remaining))
2159    }
2160}
2161impl Serialize for GetViewPortReply {
2162    type Bytes = [u8; 32];
2163    fn serialize(&self) -> [u8; 32] {
2164        let response_type_bytes = &[1];
2165        let sequence_bytes = self.sequence.serialize();
2166        let length_bytes = self.length.serialize();
2167        let x_bytes = self.x.serialize();
2168        let y_bytes = self.y.serialize();
2169        [
2170            response_type_bytes[0],
2171            0,
2172            sequence_bytes[0],
2173            sequence_bytes[1],
2174            length_bytes[0],
2175            length_bytes[1],
2176            length_bytes[2],
2177            length_bytes[3],
2178            x_bytes[0],
2179            x_bytes[1],
2180            x_bytes[2],
2181            x_bytes[3],
2182            y_bytes[0],
2183            y_bytes[1],
2184            y_bytes[2],
2185            y_bytes[3],
2186            0,
2187            0,
2188            0,
2189            0,
2190            0,
2191            0,
2192            0,
2193            0,
2194            0,
2195            0,
2196            0,
2197            0,
2198            0,
2199            0,
2200            0,
2201            0,
2202        ]
2203    }
2204    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2205        bytes.reserve(32);
2206        let response_type_bytes = &[1];
2207        bytes.push(response_type_bytes[0]);
2208        bytes.extend_from_slice(&[0; 1]);
2209        self.sequence.serialize_into(bytes);
2210        self.length.serialize_into(bytes);
2211        self.x.serialize_into(bytes);
2212        self.y.serialize_into(bytes);
2213        bytes.extend_from_slice(&[0; 16]);
2214    }
2215}
2216
2217/// Opcode for the SetViewPort request
2218pub const SET_VIEW_PORT_REQUEST: u8 = 12;
2219#[derive(Clone, Copy, Default)]
2220#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2221#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2222pub struct SetViewPortRequest {
2223    pub screen: u16,
2224    pub x: u32,
2225    pub y: u32,
2226}
2227impl_debug_if_no_extra_traits!(SetViewPortRequest, "SetViewPortRequest");
2228impl SetViewPortRequest {
2229    /// Serialize this request into bytes for the provided connection
2230    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2231        let length_so_far = 0;
2232        let screen_bytes = self.screen.serialize();
2233        let x_bytes = self.x.serialize();
2234        let y_bytes = self.y.serialize();
2235        let mut request0 = vec![
2236            major_opcode,
2237            SET_VIEW_PORT_REQUEST,
2238            0,
2239            0,
2240            screen_bytes[0],
2241            screen_bytes[1],
2242            0,
2243            0,
2244            x_bytes[0],
2245            x_bytes[1],
2246            x_bytes[2],
2247            x_bytes[3],
2248            y_bytes[0],
2249            y_bytes[1],
2250            y_bytes[2],
2251            y_bytes[3],
2252        ];
2253        let length_so_far = length_so_far + request0.len();
2254        assert_eq!(length_so_far % 4, 0);
2255        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2256        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2257        ([request0.into()], vec![])
2258    }
2259    /// Parse this request given its header, its body, and any fds that go along with it
2260    #[cfg(feature = "request-parsing")]
2261    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2262        if header.minor_opcode != SET_VIEW_PORT_REQUEST {
2263            return Err(ParseError::InvalidValue);
2264        }
2265        let (screen, remaining) = u16::try_parse(value)?;
2266        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
2267        let (x, remaining) = u32::try_parse(remaining)?;
2268        let (y, remaining) = u32::try_parse(remaining)?;
2269        let _ = remaining;
2270        Ok(SetViewPortRequest {
2271            screen,
2272            x,
2273            y,
2274        })
2275    }
2276}
2277impl Request for SetViewPortRequest {
2278    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2279
2280    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2281        let (bufs, fds) = self.serialize(major_opcode);
2282        // Flatten the buffers into a single vector
2283        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2284        (buf, fds)
2285    }
2286}
2287impl crate::x11_utils::VoidRequest for SetViewPortRequest {
2288}
2289
2290/// Opcode for the GetDotClocks request
2291pub const GET_DOT_CLOCKS_REQUEST: u8 = 13;
2292#[derive(Clone, Copy, Default)]
2293#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2294#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2295pub struct GetDotClocksRequest {
2296    pub screen: u16,
2297}
2298impl_debug_if_no_extra_traits!(GetDotClocksRequest, "GetDotClocksRequest");
2299impl GetDotClocksRequest {
2300    /// Serialize this request into bytes for the provided connection
2301    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2302        let length_so_far = 0;
2303        let screen_bytes = self.screen.serialize();
2304        let mut request0 = vec![
2305            major_opcode,
2306            GET_DOT_CLOCKS_REQUEST,
2307            0,
2308            0,
2309            screen_bytes[0],
2310            screen_bytes[1],
2311            0,
2312            0,
2313        ];
2314        let length_so_far = length_so_far + request0.len();
2315        assert_eq!(length_so_far % 4, 0);
2316        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2317        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2318        ([request0.into()], vec![])
2319    }
2320    /// Parse this request given its header, its body, and any fds that go along with it
2321    #[cfg(feature = "request-parsing")]
2322    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2323        if header.minor_opcode != GET_DOT_CLOCKS_REQUEST {
2324            return Err(ParseError::InvalidValue);
2325        }
2326        let (screen, remaining) = u16::try_parse(value)?;
2327        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
2328        let _ = remaining;
2329        Ok(GetDotClocksRequest {
2330            screen,
2331        })
2332    }
2333}
2334impl Request for GetDotClocksRequest {
2335    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2336
2337    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2338        let (bufs, fds) = self.serialize(major_opcode);
2339        // Flatten the buffers into a single vector
2340        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2341        (buf, fds)
2342    }
2343}
2344impl crate::x11_utils::ReplyRequest for GetDotClocksRequest {
2345    type Reply = GetDotClocksReply;
2346}
2347
2348#[derive(Clone, Default)]
2349#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2350#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2351pub struct GetDotClocksReply {
2352    pub sequence: u16,
2353    pub length: u32,
2354    pub flags: ClockFlag,
2355    pub clocks: u32,
2356    pub maxclocks: u32,
2357    pub clock: Vec<u32>,
2358}
2359impl_debug_if_no_extra_traits!(GetDotClocksReply, "GetDotClocksReply");
2360impl TryParse for GetDotClocksReply {
2361    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2362        let remaining = initial_value;
2363        let (response_type, remaining) = u8::try_parse(remaining)?;
2364        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2365        let (sequence, remaining) = u16::try_parse(remaining)?;
2366        let (length, remaining) = u32::try_parse(remaining)?;
2367        let (flags, remaining) = u32::try_parse(remaining)?;
2368        let (clocks, remaining) = u32::try_parse(remaining)?;
2369        let (maxclocks, remaining) = u32::try_parse(remaining)?;
2370        let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
2371        let (clock, remaining) = crate::x11_utils::parse_list::<u32>(remaining, 1u32.checked_sub(u32::from(flags) & 1u32).ok_or(ParseError::InvalidExpression)?.checked_mul(u32::from(clocks)).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
2372        if response_type != 1 {
2373            return Err(ParseError::InvalidValue);
2374        }
2375        let flags = flags.into();
2376        let result = GetDotClocksReply { sequence, length, flags, clocks, maxclocks, clock };
2377        let _ = remaining;
2378        let remaining = initial_value.get(32 + length as usize * 4..)
2379            .ok_or(ParseError::InsufficientData)?;
2380        Ok((result, remaining))
2381    }
2382}
2383impl Serialize for GetDotClocksReply {
2384    type Bytes = Vec<u8>;
2385    fn serialize(&self) -> Vec<u8> {
2386        let mut result = Vec::new();
2387        self.serialize_into(&mut result);
2388        result
2389    }
2390    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2391        bytes.reserve(32);
2392        let response_type_bytes = &[1];
2393        bytes.push(response_type_bytes[0]);
2394        bytes.extend_from_slice(&[0; 1]);
2395        self.sequence.serialize_into(bytes);
2396        self.length.serialize_into(bytes);
2397        u32::from(self.flags).serialize_into(bytes);
2398        self.clocks.serialize_into(bytes);
2399        self.maxclocks.serialize_into(bytes);
2400        bytes.extend_from_slice(&[0; 12]);
2401        assert_eq!(self.clock.len(), usize::try_from(1u32.checked_sub(u32::from(self.flags) & 1u32).unwrap().checked_mul(u32::from(self.clocks)).unwrap()).unwrap(), "`clock` has an incorrect length");
2402        self.clock.serialize_into(bytes);
2403    }
2404}
2405
2406/// Opcode for the SetClientVersion request
2407pub const SET_CLIENT_VERSION_REQUEST: u8 = 14;
2408#[derive(Clone, Copy, Default)]
2409#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2410#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2411pub struct SetClientVersionRequest {
2412    pub major: u16,
2413    pub minor: u16,
2414}
2415impl_debug_if_no_extra_traits!(SetClientVersionRequest, "SetClientVersionRequest");
2416impl SetClientVersionRequest {
2417    /// Serialize this request into bytes for the provided connection
2418    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2419        let length_so_far = 0;
2420        let major_bytes = self.major.serialize();
2421        let minor_bytes = self.minor.serialize();
2422        let mut request0 = vec![
2423            major_opcode,
2424            SET_CLIENT_VERSION_REQUEST,
2425            0,
2426            0,
2427            major_bytes[0],
2428            major_bytes[1],
2429            minor_bytes[0],
2430            minor_bytes[1],
2431        ];
2432        let length_so_far = length_so_far + request0.len();
2433        assert_eq!(length_so_far % 4, 0);
2434        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2435        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2436        ([request0.into()], vec![])
2437    }
2438    /// Parse this request given its header, its body, and any fds that go along with it
2439    #[cfg(feature = "request-parsing")]
2440    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2441        if header.minor_opcode != SET_CLIENT_VERSION_REQUEST {
2442            return Err(ParseError::InvalidValue);
2443        }
2444        let (major, remaining) = u16::try_parse(value)?;
2445        let (minor, remaining) = u16::try_parse(remaining)?;
2446        let _ = remaining;
2447        Ok(SetClientVersionRequest {
2448            major,
2449            minor,
2450        })
2451    }
2452}
2453impl Request for SetClientVersionRequest {
2454    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2455
2456    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2457        let (bufs, fds) = self.serialize(major_opcode);
2458        // Flatten the buffers into a single vector
2459        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2460        (buf, fds)
2461    }
2462}
2463impl crate::x11_utils::VoidRequest for SetClientVersionRequest {
2464}
2465
2466/// Opcode for the SetGamma request
2467pub const SET_GAMMA_REQUEST: u8 = 15;
2468#[derive(Clone, Copy, Default)]
2469#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2470#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2471pub struct SetGammaRequest {
2472    pub screen: u16,
2473    pub red: u32,
2474    pub green: u32,
2475    pub blue: u32,
2476}
2477impl_debug_if_no_extra_traits!(SetGammaRequest, "SetGammaRequest");
2478impl SetGammaRequest {
2479    /// Serialize this request into bytes for the provided connection
2480    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2481        let length_so_far = 0;
2482        let screen_bytes = self.screen.serialize();
2483        let red_bytes = self.red.serialize();
2484        let green_bytes = self.green.serialize();
2485        let blue_bytes = self.blue.serialize();
2486        let mut request0 = vec![
2487            major_opcode,
2488            SET_GAMMA_REQUEST,
2489            0,
2490            0,
2491            screen_bytes[0],
2492            screen_bytes[1],
2493            0,
2494            0,
2495            red_bytes[0],
2496            red_bytes[1],
2497            red_bytes[2],
2498            red_bytes[3],
2499            green_bytes[0],
2500            green_bytes[1],
2501            green_bytes[2],
2502            green_bytes[3],
2503            blue_bytes[0],
2504            blue_bytes[1],
2505            blue_bytes[2],
2506            blue_bytes[3],
2507            0,
2508            0,
2509            0,
2510            0,
2511            0,
2512            0,
2513            0,
2514            0,
2515            0,
2516            0,
2517            0,
2518            0,
2519        ];
2520        let length_so_far = length_so_far + request0.len();
2521        assert_eq!(length_so_far % 4, 0);
2522        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2523        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2524        ([request0.into()], vec![])
2525    }
2526    /// Parse this request given its header, its body, and any fds that go along with it
2527    #[cfg(feature = "request-parsing")]
2528    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2529        if header.minor_opcode != SET_GAMMA_REQUEST {
2530            return Err(ParseError::InvalidValue);
2531        }
2532        let (screen, remaining) = u16::try_parse(value)?;
2533        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
2534        let (red, remaining) = u32::try_parse(remaining)?;
2535        let (green, remaining) = u32::try_parse(remaining)?;
2536        let (blue, remaining) = u32::try_parse(remaining)?;
2537        let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
2538        let _ = remaining;
2539        Ok(SetGammaRequest {
2540            screen,
2541            red,
2542            green,
2543            blue,
2544        })
2545    }
2546}
2547impl Request for SetGammaRequest {
2548    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2549
2550    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2551        let (bufs, fds) = self.serialize(major_opcode);
2552        // Flatten the buffers into a single vector
2553        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2554        (buf, fds)
2555    }
2556}
2557impl crate::x11_utils::VoidRequest for SetGammaRequest {
2558}
2559
2560/// Opcode for the GetGamma request
2561pub const GET_GAMMA_REQUEST: u8 = 16;
2562#[derive(Clone, Copy, Default)]
2563#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2564#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2565pub struct GetGammaRequest {
2566    pub screen: u16,
2567}
2568impl_debug_if_no_extra_traits!(GetGammaRequest, "GetGammaRequest");
2569impl GetGammaRequest {
2570    /// Serialize this request into bytes for the provided connection
2571    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2572        let length_so_far = 0;
2573        let screen_bytes = self.screen.serialize();
2574        let mut request0 = vec![
2575            major_opcode,
2576            GET_GAMMA_REQUEST,
2577            0,
2578            0,
2579            screen_bytes[0],
2580            screen_bytes[1],
2581            0,
2582            0,
2583            0,
2584            0,
2585            0,
2586            0,
2587            0,
2588            0,
2589            0,
2590            0,
2591            0,
2592            0,
2593            0,
2594            0,
2595            0,
2596            0,
2597            0,
2598            0,
2599            0,
2600            0,
2601            0,
2602            0,
2603            0,
2604            0,
2605            0,
2606            0,
2607        ];
2608        let length_so_far = length_so_far + request0.len();
2609        assert_eq!(length_so_far % 4, 0);
2610        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2611        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2612        ([request0.into()], vec![])
2613    }
2614    /// Parse this request given its header, its body, and any fds that go along with it
2615    #[cfg(feature = "request-parsing")]
2616    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2617        if header.minor_opcode != GET_GAMMA_REQUEST {
2618            return Err(ParseError::InvalidValue);
2619        }
2620        let (screen, remaining) = u16::try_parse(value)?;
2621        let remaining = remaining.get(26..).ok_or(ParseError::InsufficientData)?;
2622        let _ = remaining;
2623        Ok(GetGammaRequest {
2624            screen,
2625        })
2626    }
2627}
2628impl Request for GetGammaRequest {
2629    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2630
2631    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2632        let (bufs, fds) = self.serialize(major_opcode);
2633        // Flatten the buffers into a single vector
2634        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2635        (buf, fds)
2636    }
2637}
2638impl crate::x11_utils::ReplyRequest for GetGammaRequest {
2639    type Reply = GetGammaReply;
2640}
2641
2642#[derive(Clone, Copy, Default)]
2643#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2644#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2645pub struct GetGammaReply {
2646    pub sequence: u16,
2647    pub length: u32,
2648    pub red: u32,
2649    pub green: u32,
2650    pub blue: u32,
2651}
2652impl_debug_if_no_extra_traits!(GetGammaReply, "GetGammaReply");
2653impl TryParse for GetGammaReply {
2654    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2655        let remaining = initial_value;
2656        let (response_type, remaining) = u8::try_parse(remaining)?;
2657        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2658        let (sequence, remaining) = u16::try_parse(remaining)?;
2659        let (length, remaining) = u32::try_parse(remaining)?;
2660        let (red, remaining) = u32::try_parse(remaining)?;
2661        let (green, remaining) = u32::try_parse(remaining)?;
2662        let (blue, remaining) = u32::try_parse(remaining)?;
2663        let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
2664        if response_type != 1 {
2665            return Err(ParseError::InvalidValue);
2666        }
2667        let result = GetGammaReply { sequence, length, red, green, blue };
2668        let _ = remaining;
2669        let remaining = initial_value.get(32 + length as usize * 4..)
2670            .ok_or(ParseError::InsufficientData)?;
2671        Ok((result, remaining))
2672    }
2673}
2674impl Serialize for GetGammaReply {
2675    type Bytes = [u8; 32];
2676    fn serialize(&self) -> [u8; 32] {
2677        let response_type_bytes = &[1];
2678        let sequence_bytes = self.sequence.serialize();
2679        let length_bytes = self.length.serialize();
2680        let red_bytes = self.red.serialize();
2681        let green_bytes = self.green.serialize();
2682        let blue_bytes = self.blue.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            red_bytes[0],
2693            red_bytes[1],
2694            red_bytes[2],
2695            red_bytes[3],
2696            green_bytes[0],
2697            green_bytes[1],
2698            green_bytes[2],
2699            green_bytes[3],
2700            blue_bytes[0],
2701            blue_bytes[1],
2702            blue_bytes[2],
2703            blue_bytes[3],
2704            0,
2705            0,
2706            0,
2707            0,
2708            0,
2709            0,
2710            0,
2711            0,
2712            0,
2713            0,
2714            0,
2715            0,
2716        ]
2717    }
2718    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2719        bytes.reserve(32);
2720        let response_type_bytes = &[1];
2721        bytes.push(response_type_bytes[0]);
2722        bytes.extend_from_slice(&[0; 1]);
2723        self.sequence.serialize_into(bytes);
2724        self.length.serialize_into(bytes);
2725        self.red.serialize_into(bytes);
2726        self.green.serialize_into(bytes);
2727        self.blue.serialize_into(bytes);
2728        bytes.extend_from_slice(&[0; 12]);
2729    }
2730}
2731
2732/// Opcode for the GetGammaRamp request
2733pub const GET_GAMMA_RAMP_REQUEST: u8 = 17;
2734#[derive(Clone, Copy, Default)]
2735#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2736#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2737pub struct GetGammaRampRequest {
2738    pub screen: u16,
2739    pub size: u16,
2740}
2741impl_debug_if_no_extra_traits!(GetGammaRampRequest, "GetGammaRampRequest");
2742impl GetGammaRampRequest {
2743    /// Serialize this request into bytes for the provided connection
2744    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2745        let length_so_far = 0;
2746        let screen_bytes = self.screen.serialize();
2747        let size_bytes = self.size.serialize();
2748        let mut request0 = vec![
2749            major_opcode,
2750            GET_GAMMA_RAMP_REQUEST,
2751            0,
2752            0,
2753            screen_bytes[0],
2754            screen_bytes[1],
2755            size_bytes[0],
2756            size_bytes[1],
2757        ];
2758        let length_so_far = length_so_far + request0.len();
2759        assert_eq!(length_so_far % 4, 0);
2760        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2761        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2762        ([request0.into()], vec![])
2763    }
2764    /// Parse this request given its header, its body, and any fds that go along with it
2765    #[cfg(feature = "request-parsing")]
2766    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2767        if header.minor_opcode != GET_GAMMA_RAMP_REQUEST {
2768            return Err(ParseError::InvalidValue);
2769        }
2770        let (screen, remaining) = u16::try_parse(value)?;
2771        let (size, remaining) = u16::try_parse(remaining)?;
2772        let _ = remaining;
2773        Ok(GetGammaRampRequest {
2774            screen,
2775            size,
2776        })
2777    }
2778}
2779impl Request for GetGammaRampRequest {
2780    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2781
2782    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2783        let (bufs, fds) = self.serialize(major_opcode);
2784        // Flatten the buffers into a single vector
2785        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2786        (buf, fds)
2787    }
2788}
2789impl crate::x11_utils::ReplyRequest for GetGammaRampRequest {
2790    type Reply = GetGammaRampReply;
2791}
2792
2793#[derive(Clone, Default)]
2794#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2795#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2796pub struct GetGammaRampReply {
2797    pub sequence: u16,
2798    pub length: u32,
2799    pub size: u16,
2800    pub red: Vec<u16>,
2801    pub green: Vec<u16>,
2802    pub blue: Vec<u16>,
2803}
2804impl_debug_if_no_extra_traits!(GetGammaRampReply, "GetGammaRampReply");
2805impl TryParse for GetGammaRampReply {
2806    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2807        let remaining = initial_value;
2808        let (response_type, remaining) = u8::try_parse(remaining)?;
2809        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2810        let (sequence, remaining) = u16::try_parse(remaining)?;
2811        let (length, remaining) = u32::try_parse(remaining)?;
2812        let (size, remaining) = u16::try_parse(remaining)?;
2813        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
2814        let (red, remaining) = crate::x11_utils::parse_list::<u16>(remaining, (u32::from(size).checked_add(1u32).ok_or(ParseError::InvalidExpression)? & (!1u32)).try_to_usize()?)?;
2815        let (green, remaining) = crate::x11_utils::parse_list::<u16>(remaining, (u32::from(size).checked_add(1u32).ok_or(ParseError::InvalidExpression)? & (!1u32)).try_to_usize()?)?;
2816        let (blue, remaining) = crate::x11_utils::parse_list::<u16>(remaining, (u32::from(size).checked_add(1u32).ok_or(ParseError::InvalidExpression)? & (!1u32)).try_to_usize()?)?;
2817        if response_type != 1 {
2818            return Err(ParseError::InvalidValue);
2819        }
2820        let result = GetGammaRampReply { sequence, length, size, red, green, blue };
2821        let _ = remaining;
2822        let remaining = initial_value.get(32 + length as usize * 4..)
2823            .ok_or(ParseError::InsufficientData)?;
2824        Ok((result, remaining))
2825    }
2826}
2827impl Serialize for GetGammaRampReply {
2828    type Bytes = Vec<u8>;
2829    fn serialize(&self) -> Vec<u8> {
2830        let mut result = Vec::new();
2831        self.serialize_into(&mut result);
2832        result
2833    }
2834    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2835        bytes.reserve(32);
2836        let response_type_bytes = &[1];
2837        bytes.push(response_type_bytes[0]);
2838        bytes.extend_from_slice(&[0; 1]);
2839        self.sequence.serialize_into(bytes);
2840        self.length.serialize_into(bytes);
2841        self.size.serialize_into(bytes);
2842        bytes.extend_from_slice(&[0; 22]);
2843        assert_eq!(self.red.len(), usize::try_from(u32::from(self.size).checked_add(1u32).unwrap() & (!1u32)).unwrap(), "`red` has an incorrect length");
2844        self.red.serialize_into(bytes);
2845        assert_eq!(self.green.len(), usize::try_from(u32::from(self.size).checked_add(1u32).unwrap() & (!1u32)).unwrap(), "`green` has an incorrect length");
2846        self.green.serialize_into(bytes);
2847        assert_eq!(self.blue.len(), usize::try_from(u32::from(self.size).checked_add(1u32).unwrap() & (!1u32)).unwrap(), "`blue` has an incorrect length");
2848        self.blue.serialize_into(bytes);
2849    }
2850}
2851
2852/// Opcode for the SetGammaRamp request
2853pub const SET_GAMMA_RAMP_REQUEST: u8 = 18;
2854#[derive(Clone, Default)]
2855#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2856#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2857pub struct SetGammaRampRequest<'input> {
2858    pub screen: u16,
2859    pub size: u16,
2860    pub red: Cow<'input, [u16]>,
2861    pub green: Cow<'input, [u16]>,
2862    pub blue: Cow<'input, [u16]>,
2863}
2864impl_debug_if_no_extra_traits!(SetGammaRampRequest<'_>, "SetGammaRampRequest");
2865impl<'input> SetGammaRampRequest<'input> {
2866    /// Serialize this request into bytes for the provided connection
2867    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 5]> {
2868        let length_so_far = 0;
2869        let screen_bytes = self.screen.serialize();
2870        let size_bytes = self.size.serialize();
2871        let mut request0 = vec![
2872            major_opcode,
2873            SET_GAMMA_RAMP_REQUEST,
2874            0,
2875            0,
2876            screen_bytes[0],
2877            screen_bytes[1],
2878            size_bytes[0],
2879            size_bytes[1],
2880        ];
2881        let length_so_far = length_so_far + request0.len();
2882        assert_eq!(self.red.len(), usize::try_from(u32::from(self.size).checked_add(1u32).unwrap() & (!1u32)).unwrap(), "`red` has an incorrect length");
2883        let red_bytes = self.red.serialize();
2884        let length_so_far = length_so_far + red_bytes.len();
2885        assert_eq!(self.green.len(), usize::try_from(u32::from(self.size).checked_add(1u32).unwrap() & (!1u32)).unwrap(), "`green` has an incorrect length");
2886        let green_bytes = self.green.serialize();
2887        let length_so_far = length_so_far + green_bytes.len();
2888        assert_eq!(self.blue.len(), usize::try_from(u32::from(self.size).checked_add(1u32).unwrap() & (!1u32)).unwrap(), "`blue` has an incorrect length");
2889        let blue_bytes = self.blue.serialize();
2890        let length_so_far = length_so_far + blue_bytes.len();
2891        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
2892        let length_so_far = length_so_far + padding0.len();
2893        assert_eq!(length_so_far % 4, 0);
2894        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2895        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2896        ([request0.into(), red_bytes.into(), green_bytes.into(), blue_bytes.into(), padding0.into()], vec![])
2897    }
2898    /// Parse this request given its header, its body, and any fds that go along with it
2899    #[cfg(feature = "request-parsing")]
2900    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
2901        if header.minor_opcode != SET_GAMMA_RAMP_REQUEST {
2902            return Err(ParseError::InvalidValue);
2903        }
2904        let (screen, remaining) = u16::try_parse(value)?;
2905        let (size, remaining) = u16::try_parse(remaining)?;
2906        let (red, remaining) = crate::x11_utils::parse_list::<u16>(remaining, (u32::from(size).checked_add(1u32).ok_or(ParseError::InvalidExpression)? & (!1u32)).try_to_usize()?)?;
2907        let (green, remaining) = crate::x11_utils::parse_list::<u16>(remaining, (u32::from(size).checked_add(1u32).ok_or(ParseError::InvalidExpression)? & (!1u32)).try_to_usize()?)?;
2908        let (blue, remaining) = crate::x11_utils::parse_list::<u16>(remaining, (u32::from(size).checked_add(1u32).ok_or(ParseError::InvalidExpression)? & (!1u32)).try_to_usize()?)?;
2909        let _ = remaining;
2910        Ok(SetGammaRampRequest {
2911            screen,
2912            size,
2913            red: Cow::Owned(red),
2914            green: Cow::Owned(green),
2915            blue: Cow::Owned(blue),
2916        })
2917    }
2918    /// Clone all borrowed data in this SetGammaRampRequest.
2919    pub fn into_owned(self) -> SetGammaRampRequest<'static> {
2920        SetGammaRampRequest {
2921            screen: self.screen,
2922            size: self.size,
2923            red: Cow::Owned(self.red.into_owned()),
2924            green: Cow::Owned(self.green.into_owned()),
2925            blue: Cow::Owned(self.blue.into_owned()),
2926        }
2927    }
2928}
2929impl<'input> Request for SetGammaRampRequest<'input> {
2930    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2931
2932    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2933        let (bufs, fds) = self.serialize(major_opcode);
2934        // Flatten the buffers into a single vector
2935        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2936        (buf, fds)
2937    }
2938}
2939impl<'input> crate::x11_utils::VoidRequest for SetGammaRampRequest<'input> {
2940}
2941
2942/// Opcode for the GetGammaRampSize request
2943pub const GET_GAMMA_RAMP_SIZE_REQUEST: u8 = 19;
2944#[derive(Clone, Copy, Default)]
2945#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2946#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2947pub struct GetGammaRampSizeRequest {
2948    pub screen: u16,
2949}
2950impl_debug_if_no_extra_traits!(GetGammaRampSizeRequest, "GetGammaRampSizeRequest");
2951impl GetGammaRampSizeRequest {
2952    /// Serialize this request into bytes for the provided connection
2953    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2954        let length_so_far = 0;
2955        let screen_bytes = self.screen.serialize();
2956        let mut request0 = vec![
2957            major_opcode,
2958            GET_GAMMA_RAMP_SIZE_REQUEST,
2959            0,
2960            0,
2961            screen_bytes[0],
2962            screen_bytes[1],
2963            0,
2964            0,
2965        ];
2966        let length_so_far = length_so_far + request0.len();
2967        assert_eq!(length_so_far % 4, 0);
2968        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2969        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2970        ([request0.into()], vec![])
2971    }
2972    /// Parse this request given its header, its body, and any fds that go along with it
2973    #[cfg(feature = "request-parsing")]
2974    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2975        if header.minor_opcode != GET_GAMMA_RAMP_SIZE_REQUEST {
2976            return Err(ParseError::InvalidValue);
2977        }
2978        let (screen, remaining) = u16::try_parse(value)?;
2979        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
2980        let _ = remaining;
2981        Ok(GetGammaRampSizeRequest {
2982            screen,
2983        })
2984    }
2985}
2986impl Request for GetGammaRampSizeRequest {
2987    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2988
2989    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2990        let (bufs, fds) = self.serialize(major_opcode);
2991        // Flatten the buffers into a single vector
2992        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2993        (buf, fds)
2994    }
2995}
2996impl crate::x11_utils::ReplyRequest for GetGammaRampSizeRequest {
2997    type Reply = GetGammaRampSizeReply;
2998}
2999
3000#[derive(Clone, Copy, Default)]
3001#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3002#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3003pub struct GetGammaRampSizeReply {
3004    pub sequence: u16,
3005    pub length: u32,
3006    pub size: u16,
3007}
3008impl_debug_if_no_extra_traits!(GetGammaRampSizeReply, "GetGammaRampSizeReply");
3009impl TryParse for GetGammaRampSizeReply {
3010    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3011        let remaining = initial_value;
3012        let (response_type, remaining) = u8::try_parse(remaining)?;
3013        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
3014        let (sequence, remaining) = u16::try_parse(remaining)?;
3015        let (length, remaining) = u32::try_parse(remaining)?;
3016        let (size, remaining) = u16::try_parse(remaining)?;
3017        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
3018        if response_type != 1 {
3019            return Err(ParseError::InvalidValue);
3020        }
3021        let result = GetGammaRampSizeReply { sequence, length, size };
3022        let _ = remaining;
3023        let remaining = initial_value.get(32 + length as usize * 4..)
3024            .ok_or(ParseError::InsufficientData)?;
3025        Ok((result, remaining))
3026    }
3027}
3028impl Serialize for GetGammaRampSizeReply {
3029    type Bytes = [u8; 32];
3030    fn serialize(&self) -> [u8; 32] {
3031        let response_type_bytes = &[1];
3032        let sequence_bytes = self.sequence.serialize();
3033        let length_bytes = self.length.serialize();
3034        let size_bytes = self.size.serialize();
3035        [
3036            response_type_bytes[0],
3037            0,
3038            sequence_bytes[0],
3039            sequence_bytes[1],
3040            length_bytes[0],
3041            length_bytes[1],
3042            length_bytes[2],
3043            length_bytes[3],
3044            size_bytes[0],
3045            size_bytes[1],
3046            0,
3047            0,
3048            0,
3049            0,
3050            0,
3051            0,
3052            0,
3053            0,
3054            0,
3055            0,
3056            0,
3057            0,
3058            0,
3059            0,
3060            0,
3061            0,
3062            0,
3063            0,
3064            0,
3065            0,
3066            0,
3067            0,
3068        ]
3069    }
3070    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3071        bytes.reserve(32);
3072        let response_type_bytes = &[1];
3073        bytes.push(response_type_bytes[0]);
3074        bytes.extend_from_slice(&[0; 1]);
3075        self.sequence.serialize_into(bytes);
3076        self.length.serialize_into(bytes);
3077        self.size.serialize_into(bytes);
3078        bytes.extend_from_slice(&[0; 22]);
3079    }
3080}
3081
3082/// Opcode for the GetPermissions request
3083pub const GET_PERMISSIONS_REQUEST: u8 = 20;
3084#[derive(Clone, Copy, Default)]
3085#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3086#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3087pub struct GetPermissionsRequest {
3088    pub screen: u16,
3089}
3090impl_debug_if_no_extra_traits!(GetPermissionsRequest, "GetPermissionsRequest");
3091impl GetPermissionsRequest {
3092    /// Serialize this request into bytes for the provided connection
3093    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
3094        let length_so_far = 0;
3095        let screen_bytes = self.screen.serialize();
3096        let mut request0 = vec![
3097            major_opcode,
3098            GET_PERMISSIONS_REQUEST,
3099            0,
3100            0,
3101            screen_bytes[0],
3102            screen_bytes[1],
3103            0,
3104            0,
3105        ];
3106        let length_so_far = length_so_far + request0.len();
3107        assert_eq!(length_so_far % 4, 0);
3108        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
3109        request0[2..4].copy_from_slice(&length.to_ne_bytes());
3110        ([request0.into()], vec![])
3111    }
3112    /// Parse this request given its header, its body, and any fds that go along with it
3113    #[cfg(feature = "request-parsing")]
3114    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
3115        if header.minor_opcode != GET_PERMISSIONS_REQUEST {
3116            return Err(ParseError::InvalidValue);
3117        }
3118        let (screen, remaining) = u16::try_parse(value)?;
3119        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
3120        let _ = remaining;
3121        Ok(GetPermissionsRequest {
3122            screen,
3123        })
3124    }
3125}
3126impl Request for GetPermissionsRequest {
3127    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
3128
3129    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
3130        let (bufs, fds) = self.serialize(major_opcode);
3131        // Flatten the buffers into a single vector
3132        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
3133        (buf, fds)
3134    }
3135}
3136impl crate::x11_utils::ReplyRequest for GetPermissionsRequest {
3137    type Reply = GetPermissionsReply;
3138}
3139
3140#[derive(Clone, Copy, Default)]
3141#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3142#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3143pub struct GetPermissionsReply {
3144    pub sequence: u16,
3145    pub length: u32,
3146    pub permissions: Permission,
3147}
3148impl_debug_if_no_extra_traits!(GetPermissionsReply, "GetPermissionsReply");
3149impl TryParse for GetPermissionsReply {
3150    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3151        let remaining = initial_value;
3152        let (response_type, remaining) = u8::try_parse(remaining)?;
3153        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
3154        let (sequence, remaining) = u16::try_parse(remaining)?;
3155        let (length, remaining) = u32::try_parse(remaining)?;
3156        let (permissions, remaining) = u32::try_parse(remaining)?;
3157        let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
3158        if response_type != 1 {
3159            return Err(ParseError::InvalidValue);
3160        }
3161        let permissions = permissions.into();
3162        let result = GetPermissionsReply { sequence, length, permissions };
3163        let _ = remaining;
3164        let remaining = initial_value.get(32 + length as usize * 4..)
3165            .ok_or(ParseError::InsufficientData)?;
3166        Ok((result, remaining))
3167    }
3168}
3169impl Serialize for GetPermissionsReply {
3170    type Bytes = [u8; 32];
3171    fn serialize(&self) -> [u8; 32] {
3172        let response_type_bytes = &[1];
3173        let sequence_bytes = self.sequence.serialize();
3174        let length_bytes = self.length.serialize();
3175        let permissions_bytes = u32::from(self.permissions).serialize();
3176        [
3177            response_type_bytes[0],
3178            0,
3179            sequence_bytes[0],
3180            sequence_bytes[1],
3181            length_bytes[0],
3182            length_bytes[1],
3183            length_bytes[2],
3184            length_bytes[3],
3185            permissions_bytes[0],
3186            permissions_bytes[1],
3187            permissions_bytes[2],
3188            permissions_bytes[3],
3189            0,
3190            0,
3191            0,
3192            0,
3193            0,
3194            0,
3195            0,
3196            0,
3197            0,
3198            0,
3199            0,
3200            0,
3201            0,
3202            0,
3203            0,
3204            0,
3205            0,
3206            0,
3207            0,
3208            0,
3209        ]
3210    }
3211    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3212        bytes.reserve(32);
3213        let response_type_bytes = &[1];
3214        bytes.push(response_type_bytes[0]);
3215        bytes.extend_from_slice(&[0; 1]);
3216        self.sequence.serialize_into(bytes);
3217        self.length.serialize_into(bytes);
3218        u32::from(self.permissions).serialize_into(bytes);
3219        bytes.extend_from_slice(&[0; 20]);
3220    }
3221}
3222
3223/// Opcode for the BadClock error
3224pub const BAD_CLOCK_ERROR: u8 = 0;
3225
3226/// Opcode for the BadHTimings error
3227pub const BAD_H_TIMINGS_ERROR: u8 = 1;
3228
3229/// Opcode for the BadVTimings error
3230pub const BAD_V_TIMINGS_ERROR: u8 = 2;
3231
3232/// Opcode for the ModeUnsuitable error
3233pub const MODE_UNSUITABLE_ERROR: u8 = 3;
3234
3235/// Opcode for the ExtensionDisabled error
3236pub const EXTENSION_DISABLED_ERROR: u8 = 4;
3237
3238/// Opcode for the ClientNotLocal error
3239pub const CLIENT_NOT_LOCAL_ERROR: u8 = 5;
3240
3241/// Opcode for the ZoomLocked error
3242pub const ZOOM_LOCKED_ERROR: u8 = 6;
3243