x11rb_protocol/protocol/
xproto.rs

1// This file contains generated code. Do not edit directly.
2// To regenerate this, run 'make'.
3
4//! Bindings to the core X11 protocol.
5//!
6//! For more documentation on the X11 protocol, see the
7//! [protocol reference manual](https://www.x.org/releases/X11R7.6/doc/xproto/x11protocol.html).
8//! This is especially recommended for looking up the exact semantics of
9//! specific errors, events, or requests.
10
11#![allow(clippy::too_many_arguments)]
12// The code generator is simpler if it can always use conversions
13#![allow(clippy::useless_conversion)]
14
15#[allow(unused_imports)]
16use alloc::borrow::Cow;
17#[allow(unused_imports)]
18use core::convert::TryInto;
19use alloc::vec;
20use alloc::vec::Vec;
21use core::convert::TryFrom;
22use crate::errors::ParseError;
23#[allow(unused_imports)]
24use crate::x11_utils::TryIntoUSize;
25use crate::BufWithFds;
26#[allow(unused_imports)]
27use crate::utils::{RawFdContainer, pretty_print_bitmask, pretty_print_enum};
28#[allow(unused_imports)]
29use crate::x11_utils::{Request, RequestHeader, Serialize, TryParse, TryParseFd};
30
31#[derive(Clone, Copy, Default)]
32#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
33#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
34pub struct Char2b {
35    pub byte1: u8,
36    pub byte2: u8,
37}
38impl_debug_if_no_extra_traits!(Char2b, "Char2b");
39impl TryParse for Char2b {
40    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
41        let (byte1, remaining) = u8::try_parse(remaining)?;
42        let (byte2, remaining) = u8::try_parse(remaining)?;
43        let result = Char2b { byte1, byte2 };
44        Ok((result, remaining))
45    }
46}
47impl Serialize for Char2b {
48    type Bytes = [u8; 2];
49    fn serialize(&self) -> [u8; 2] {
50        let byte1_bytes = self.byte1.serialize();
51        let byte2_bytes = self.byte2.serialize();
52        [
53            byte1_bytes[0],
54            byte2_bytes[0],
55        ]
56    }
57    fn serialize_into(&self, bytes: &mut Vec<u8>) {
58        bytes.reserve(2);
59        self.byte1.serialize_into(bytes);
60        self.byte2.serialize_into(bytes);
61    }
62}
63
64pub type Window = u32;
65
66pub type Pixmap = u32;
67
68pub type Cursor = u32;
69
70pub type Font = u32;
71
72pub type Gcontext = u32;
73
74pub type Colormap = u32;
75
76pub type Atom = u32;
77
78pub type Drawable = u32;
79
80pub type Fontable = u32;
81
82pub type Bool32 = u32;
83
84pub type Visualid = u32;
85
86pub type Timestamp = u32;
87
88pub type Keysym = u32;
89
90pub type Keycode = u8;
91
92pub type Keycode32 = u32;
93
94pub type Button = u8;
95
96#[derive(Clone, Copy, Default)]
97#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
98#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
99pub struct Point {
100    pub x: i16,
101    pub y: i16,
102}
103impl_debug_if_no_extra_traits!(Point, "Point");
104impl TryParse for Point {
105    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
106        let (x, remaining) = i16::try_parse(remaining)?;
107        let (y, remaining) = i16::try_parse(remaining)?;
108        let result = Point { x, y };
109        Ok((result, remaining))
110    }
111}
112impl Serialize for Point {
113    type Bytes = [u8; 4];
114    fn serialize(&self) -> [u8; 4] {
115        let x_bytes = self.x.serialize();
116        let y_bytes = self.y.serialize();
117        [
118            x_bytes[0],
119            x_bytes[1],
120            y_bytes[0],
121            y_bytes[1],
122        ]
123    }
124    fn serialize_into(&self, bytes: &mut Vec<u8>) {
125        bytes.reserve(4);
126        self.x.serialize_into(bytes);
127        self.y.serialize_into(bytes);
128    }
129}
130
131#[derive(Clone, Copy, Default)]
132#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
133#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
134pub struct Rectangle {
135    pub x: i16,
136    pub y: i16,
137    pub width: u16,
138    pub height: u16,
139}
140impl_debug_if_no_extra_traits!(Rectangle, "Rectangle");
141impl TryParse for Rectangle {
142    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
143        let (x, remaining) = i16::try_parse(remaining)?;
144        let (y, remaining) = i16::try_parse(remaining)?;
145        let (width, remaining) = u16::try_parse(remaining)?;
146        let (height, remaining) = u16::try_parse(remaining)?;
147        let result = Rectangle { x, y, width, height };
148        Ok((result, remaining))
149    }
150}
151impl Serialize for Rectangle {
152    type Bytes = [u8; 8];
153    fn serialize(&self) -> [u8; 8] {
154        let x_bytes = self.x.serialize();
155        let y_bytes = self.y.serialize();
156        let width_bytes = self.width.serialize();
157        let height_bytes = self.height.serialize();
158        [
159            x_bytes[0],
160            x_bytes[1],
161            y_bytes[0],
162            y_bytes[1],
163            width_bytes[0],
164            width_bytes[1],
165            height_bytes[0],
166            height_bytes[1],
167        ]
168    }
169    fn serialize_into(&self, bytes: &mut Vec<u8>) {
170        bytes.reserve(8);
171        self.x.serialize_into(bytes);
172        self.y.serialize_into(bytes);
173        self.width.serialize_into(bytes);
174        self.height.serialize_into(bytes);
175    }
176}
177
178#[derive(Clone, Copy, Default)]
179#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
180#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
181pub struct Arc {
182    pub x: i16,
183    pub y: i16,
184    pub width: u16,
185    pub height: u16,
186    pub angle1: i16,
187    pub angle2: i16,
188}
189impl_debug_if_no_extra_traits!(Arc, "Arc");
190impl TryParse for Arc {
191    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
192        let (x, remaining) = i16::try_parse(remaining)?;
193        let (y, remaining) = i16::try_parse(remaining)?;
194        let (width, remaining) = u16::try_parse(remaining)?;
195        let (height, remaining) = u16::try_parse(remaining)?;
196        let (angle1, remaining) = i16::try_parse(remaining)?;
197        let (angle2, remaining) = i16::try_parse(remaining)?;
198        let result = Arc { x, y, width, height, angle1, angle2 };
199        Ok((result, remaining))
200    }
201}
202impl Serialize for Arc {
203    type Bytes = [u8; 12];
204    fn serialize(&self) -> [u8; 12] {
205        let x_bytes = self.x.serialize();
206        let y_bytes = self.y.serialize();
207        let width_bytes = self.width.serialize();
208        let height_bytes = self.height.serialize();
209        let angle1_bytes = self.angle1.serialize();
210        let angle2_bytes = self.angle2.serialize();
211        [
212            x_bytes[0],
213            x_bytes[1],
214            y_bytes[0],
215            y_bytes[1],
216            width_bytes[0],
217            width_bytes[1],
218            height_bytes[0],
219            height_bytes[1],
220            angle1_bytes[0],
221            angle1_bytes[1],
222            angle2_bytes[0],
223            angle2_bytes[1],
224        ]
225    }
226    fn serialize_into(&self, bytes: &mut Vec<u8>) {
227        bytes.reserve(12);
228        self.x.serialize_into(bytes);
229        self.y.serialize_into(bytes);
230        self.width.serialize_into(bytes);
231        self.height.serialize_into(bytes);
232        self.angle1.serialize_into(bytes);
233        self.angle2.serialize_into(bytes);
234    }
235}
236
237#[derive(Clone, Copy, Default)]
238#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
239#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
240pub struct Format {
241    pub depth: u8,
242    pub bits_per_pixel: u8,
243    pub scanline_pad: u8,
244}
245impl_debug_if_no_extra_traits!(Format, "Format");
246impl TryParse for Format {
247    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
248        let (depth, remaining) = u8::try_parse(remaining)?;
249        let (bits_per_pixel, remaining) = u8::try_parse(remaining)?;
250        let (scanline_pad, remaining) = u8::try_parse(remaining)?;
251        let remaining = remaining.get(5..).ok_or(ParseError::InsufficientData)?;
252        let result = Format { depth, bits_per_pixel, scanline_pad };
253        Ok((result, remaining))
254    }
255}
256impl Serialize for Format {
257    type Bytes = [u8; 8];
258    fn serialize(&self) -> [u8; 8] {
259        let depth_bytes = self.depth.serialize();
260        let bits_per_pixel_bytes = self.bits_per_pixel.serialize();
261        let scanline_pad_bytes = self.scanline_pad.serialize();
262        [
263            depth_bytes[0],
264            bits_per_pixel_bytes[0],
265            scanline_pad_bytes[0],
266            0,
267            0,
268            0,
269            0,
270            0,
271        ]
272    }
273    fn serialize_into(&self, bytes: &mut Vec<u8>) {
274        bytes.reserve(8);
275        self.depth.serialize_into(bytes);
276        self.bits_per_pixel.serialize_into(bytes);
277        self.scanline_pad.serialize_into(bytes);
278        bytes.extend_from_slice(&[0; 5]);
279    }
280}
281
282#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
283#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
284pub struct VisualClass(u8);
285impl VisualClass {
286    pub const STATIC_GRAY: Self = Self(0);
287    pub const GRAY_SCALE: Self = Self(1);
288    pub const STATIC_COLOR: Self = Self(2);
289    pub const PSEUDO_COLOR: Self = Self(3);
290    pub const TRUE_COLOR: Self = Self(4);
291    pub const DIRECT_COLOR: Self = Self(5);
292}
293impl From<VisualClass> for u8 {
294    #[inline]
295    fn from(input: VisualClass) -> Self {
296        input.0
297    }
298}
299impl From<VisualClass> for Option<u8> {
300    #[inline]
301    fn from(input: VisualClass) -> Self {
302        Some(input.0)
303    }
304}
305impl From<VisualClass> for u16 {
306    #[inline]
307    fn from(input: VisualClass) -> Self {
308        u16::from(input.0)
309    }
310}
311impl From<VisualClass> for Option<u16> {
312    #[inline]
313    fn from(input: VisualClass) -> Self {
314        Some(u16::from(input.0))
315    }
316}
317impl From<VisualClass> for u32 {
318    #[inline]
319    fn from(input: VisualClass) -> Self {
320        u32::from(input.0)
321    }
322}
323impl From<VisualClass> for Option<u32> {
324    #[inline]
325    fn from(input: VisualClass) -> Self {
326        Some(u32::from(input.0))
327    }
328}
329impl From<u8> for VisualClass {
330    #[inline]
331    fn from(value: u8) -> Self {
332        Self(value)
333    }
334}
335impl core::fmt::Debug for VisualClass  {
336    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
337        let variants = [
338            (Self::STATIC_GRAY.0.into(), "STATIC_GRAY", "StaticGray"),
339            (Self::GRAY_SCALE.0.into(), "GRAY_SCALE", "GrayScale"),
340            (Self::STATIC_COLOR.0.into(), "STATIC_COLOR", "StaticColor"),
341            (Self::PSEUDO_COLOR.0.into(), "PSEUDO_COLOR", "PseudoColor"),
342            (Self::TRUE_COLOR.0.into(), "TRUE_COLOR", "TrueColor"),
343            (Self::DIRECT_COLOR.0.into(), "DIRECT_COLOR", "DirectColor"),
344        ];
345        pretty_print_enum(fmt, self.0.into(), &variants)
346    }
347}
348
349#[derive(Clone, Copy, Default)]
350#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
351#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
352pub struct Visualtype {
353    pub visual_id: Visualid,
354    pub class: VisualClass,
355    pub bits_per_rgb_value: u8,
356    pub colormap_entries: u16,
357    pub red_mask: u32,
358    pub green_mask: u32,
359    pub blue_mask: u32,
360}
361impl_debug_if_no_extra_traits!(Visualtype, "Visualtype");
362impl TryParse for Visualtype {
363    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
364        let (visual_id, remaining) = Visualid::try_parse(remaining)?;
365        let (class, remaining) = u8::try_parse(remaining)?;
366        let (bits_per_rgb_value, remaining) = u8::try_parse(remaining)?;
367        let (colormap_entries, remaining) = u16::try_parse(remaining)?;
368        let (red_mask, remaining) = u32::try_parse(remaining)?;
369        let (green_mask, remaining) = u32::try_parse(remaining)?;
370        let (blue_mask, remaining) = u32::try_parse(remaining)?;
371        let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
372        let class = class.into();
373        let result = Visualtype { visual_id, class, bits_per_rgb_value, colormap_entries, red_mask, green_mask, blue_mask };
374        Ok((result, remaining))
375    }
376}
377impl Serialize for Visualtype {
378    type Bytes = [u8; 24];
379    fn serialize(&self) -> [u8; 24] {
380        let visual_id_bytes = self.visual_id.serialize();
381        let class_bytes = u8::from(self.class).serialize();
382        let bits_per_rgb_value_bytes = self.bits_per_rgb_value.serialize();
383        let colormap_entries_bytes = self.colormap_entries.serialize();
384        let red_mask_bytes = self.red_mask.serialize();
385        let green_mask_bytes = self.green_mask.serialize();
386        let blue_mask_bytes = self.blue_mask.serialize();
387        [
388            visual_id_bytes[0],
389            visual_id_bytes[1],
390            visual_id_bytes[2],
391            visual_id_bytes[3],
392            class_bytes[0],
393            bits_per_rgb_value_bytes[0],
394            colormap_entries_bytes[0],
395            colormap_entries_bytes[1],
396            red_mask_bytes[0],
397            red_mask_bytes[1],
398            red_mask_bytes[2],
399            red_mask_bytes[3],
400            green_mask_bytes[0],
401            green_mask_bytes[1],
402            green_mask_bytes[2],
403            green_mask_bytes[3],
404            blue_mask_bytes[0],
405            blue_mask_bytes[1],
406            blue_mask_bytes[2],
407            blue_mask_bytes[3],
408            0,
409            0,
410            0,
411            0,
412        ]
413    }
414    fn serialize_into(&self, bytes: &mut Vec<u8>) {
415        bytes.reserve(24);
416        self.visual_id.serialize_into(bytes);
417        u8::from(self.class).serialize_into(bytes);
418        self.bits_per_rgb_value.serialize_into(bytes);
419        self.colormap_entries.serialize_into(bytes);
420        self.red_mask.serialize_into(bytes);
421        self.green_mask.serialize_into(bytes);
422        self.blue_mask.serialize_into(bytes);
423        bytes.extend_from_slice(&[0; 4]);
424    }
425}
426
427#[derive(Clone, Default)]
428#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
429#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
430pub struct Depth {
431    pub depth: u8,
432    pub visuals: Vec<Visualtype>,
433}
434impl_debug_if_no_extra_traits!(Depth, "Depth");
435impl TryParse for Depth {
436    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
437        let (depth, remaining) = u8::try_parse(remaining)?;
438        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
439        let (visuals_len, remaining) = u16::try_parse(remaining)?;
440        let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
441        let (visuals, remaining) = crate::x11_utils::parse_list::<Visualtype>(remaining, visuals_len.try_to_usize()?)?;
442        let result = Depth { depth, visuals };
443        Ok((result, remaining))
444    }
445}
446impl Serialize for Depth {
447    type Bytes = Vec<u8>;
448    fn serialize(&self) -> Vec<u8> {
449        let mut result = Vec::new();
450        self.serialize_into(&mut result);
451        result
452    }
453    fn serialize_into(&self, bytes: &mut Vec<u8>) {
454        bytes.reserve(8);
455        self.depth.serialize_into(bytes);
456        bytes.extend_from_slice(&[0; 1]);
457        let visuals_len = u16::try_from(self.visuals.len()).expect("`visuals` has too many elements");
458        visuals_len.serialize_into(bytes);
459        bytes.extend_from_slice(&[0; 4]);
460        self.visuals.serialize_into(bytes);
461    }
462}
463impl Depth {
464    /// Get the value of the `visuals_len` field.
465    ///
466    /// The `visuals_len` field is used as the length field of the `visuals` field.
467    /// This function computes the field's value again based on the length of the list.
468    ///
469    /// # Panics
470    ///
471    /// Panics if the value cannot be represented in the target type. This
472    /// cannot happen with values of the struct received from the X11 server.
473    pub fn visuals_len(&self) -> u16 {
474        self.visuals.len()
475            .try_into().unwrap()
476    }
477}
478
479#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
480#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
481pub struct EventMask(u32);
482impl EventMask {
483    pub const NO_EVENT: Self = Self(0);
484    pub const KEY_PRESS: Self = Self(1 << 0);
485    pub const KEY_RELEASE: Self = Self(1 << 1);
486    pub const BUTTON_PRESS: Self = Self(1 << 2);
487    pub const BUTTON_RELEASE: Self = Self(1 << 3);
488    pub const ENTER_WINDOW: Self = Self(1 << 4);
489    pub const LEAVE_WINDOW: Self = Self(1 << 5);
490    pub const POINTER_MOTION: Self = Self(1 << 6);
491    pub const POINTER_MOTION_HINT: Self = Self(1 << 7);
492    pub const BUTTON1_MOTION: Self = Self(1 << 8);
493    pub const BUTTON2_MOTION: Self = Self(1 << 9);
494    pub const BUTTON3_MOTION: Self = Self(1 << 10);
495    pub const BUTTON4_MOTION: Self = Self(1 << 11);
496    pub const BUTTON5_MOTION: Self = Self(1 << 12);
497    pub const BUTTON_MOTION: Self = Self(1 << 13);
498    pub const KEYMAP_STATE: Self = Self(1 << 14);
499    pub const EXPOSURE: Self = Self(1 << 15);
500    pub const VISIBILITY_CHANGE: Self = Self(1 << 16);
501    pub const STRUCTURE_NOTIFY: Self = Self(1 << 17);
502    pub const RESIZE_REDIRECT: Self = Self(1 << 18);
503    pub const SUBSTRUCTURE_NOTIFY: Self = Self(1 << 19);
504    pub const SUBSTRUCTURE_REDIRECT: Self = Self(1 << 20);
505    pub const FOCUS_CHANGE: Self = Self(1 << 21);
506    pub const PROPERTY_CHANGE: Self = Self(1 << 22);
507    pub const COLOR_MAP_CHANGE: Self = Self(1 << 23);
508    pub const OWNER_GRAB_BUTTON: Self = Self(1 << 24);
509}
510impl From<EventMask> for u32 {
511    #[inline]
512    fn from(input: EventMask) -> Self {
513        input.0
514    }
515}
516impl From<EventMask> for Option<u32> {
517    #[inline]
518    fn from(input: EventMask) -> Self {
519        Some(input.0)
520    }
521}
522impl From<u8> for EventMask {
523    #[inline]
524    fn from(value: u8) -> Self {
525        Self(value.into())
526    }
527}
528impl From<u16> for EventMask {
529    #[inline]
530    fn from(value: u16) -> Self {
531        Self(value.into())
532    }
533}
534impl From<u32> for EventMask {
535    #[inline]
536    fn from(value: u32) -> Self {
537        Self(value)
538    }
539}
540impl core::fmt::Debug for EventMask  {
541    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
542        let variants = [
543            (Self::NO_EVENT.0, "NO_EVENT", "NoEvent"),
544            (Self::KEY_PRESS.0, "KEY_PRESS", "KeyPress"),
545            (Self::KEY_RELEASE.0, "KEY_RELEASE", "KeyRelease"),
546            (Self::BUTTON_PRESS.0, "BUTTON_PRESS", "ButtonPress"),
547            (Self::BUTTON_RELEASE.0, "BUTTON_RELEASE", "ButtonRelease"),
548            (Self::ENTER_WINDOW.0, "ENTER_WINDOW", "EnterWindow"),
549            (Self::LEAVE_WINDOW.0, "LEAVE_WINDOW", "LeaveWindow"),
550            (Self::POINTER_MOTION.0, "POINTER_MOTION", "PointerMotion"),
551            (Self::POINTER_MOTION_HINT.0, "POINTER_MOTION_HINT", "PointerMotionHint"),
552            (Self::BUTTON1_MOTION.0, "BUTTON1_MOTION", "Button1Motion"),
553            (Self::BUTTON2_MOTION.0, "BUTTON2_MOTION", "Button2Motion"),
554            (Self::BUTTON3_MOTION.0, "BUTTON3_MOTION", "Button3Motion"),
555            (Self::BUTTON4_MOTION.0, "BUTTON4_MOTION", "Button4Motion"),
556            (Self::BUTTON5_MOTION.0, "BUTTON5_MOTION", "Button5Motion"),
557            (Self::BUTTON_MOTION.0, "BUTTON_MOTION", "ButtonMotion"),
558            (Self::KEYMAP_STATE.0, "KEYMAP_STATE", "KeymapState"),
559            (Self::EXPOSURE.0, "EXPOSURE", "Exposure"),
560            (Self::VISIBILITY_CHANGE.0, "VISIBILITY_CHANGE", "VisibilityChange"),
561            (Self::STRUCTURE_NOTIFY.0, "STRUCTURE_NOTIFY", "StructureNotify"),
562            (Self::RESIZE_REDIRECT.0, "RESIZE_REDIRECT", "ResizeRedirect"),
563            (Self::SUBSTRUCTURE_NOTIFY.0, "SUBSTRUCTURE_NOTIFY", "SubstructureNotify"),
564            (Self::SUBSTRUCTURE_REDIRECT.0, "SUBSTRUCTURE_REDIRECT", "SubstructureRedirect"),
565            (Self::FOCUS_CHANGE.0, "FOCUS_CHANGE", "FocusChange"),
566            (Self::PROPERTY_CHANGE.0, "PROPERTY_CHANGE", "PropertyChange"),
567            (Self::COLOR_MAP_CHANGE.0, "COLOR_MAP_CHANGE", "ColorMapChange"),
568            (Self::OWNER_GRAB_BUTTON.0, "OWNER_GRAB_BUTTON", "OwnerGrabButton"),
569        ];
570        pretty_print_bitmask(fmt, self.0, &variants)
571    }
572}
573bitmask_binop!(EventMask, u32);
574
575#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
576#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
577pub struct BackingStore(u32);
578impl BackingStore {
579    pub const NOT_USEFUL: Self = Self(0);
580    pub const WHEN_MAPPED: Self = Self(1);
581    pub const ALWAYS: Self = Self(2);
582}
583impl From<BackingStore> for u32 {
584    #[inline]
585    fn from(input: BackingStore) -> Self {
586        input.0
587    }
588}
589impl From<BackingStore> for Option<u32> {
590    #[inline]
591    fn from(input: BackingStore) -> Self {
592        Some(input.0)
593    }
594}
595impl From<u8> for BackingStore {
596    #[inline]
597    fn from(value: u8) -> Self {
598        Self(value.into())
599    }
600}
601impl From<u16> for BackingStore {
602    #[inline]
603    fn from(value: u16) -> Self {
604        Self(value.into())
605    }
606}
607impl From<u32> for BackingStore {
608    #[inline]
609    fn from(value: u32) -> Self {
610        Self(value)
611    }
612}
613impl core::fmt::Debug for BackingStore  {
614    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
615        let variants = [
616            (Self::NOT_USEFUL.0, "NOT_USEFUL", "NotUseful"),
617            (Self::WHEN_MAPPED.0, "WHEN_MAPPED", "WhenMapped"),
618            (Self::ALWAYS.0, "ALWAYS", "Always"),
619        ];
620        pretty_print_enum(fmt, self.0, &variants)
621    }
622}
623
624#[derive(Clone, Default)]
625#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
626#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
627pub struct Screen {
628    pub root: Window,
629    pub default_colormap: Colormap,
630    pub white_pixel: u32,
631    pub black_pixel: u32,
632    pub current_input_masks: EventMask,
633    pub width_in_pixels: u16,
634    pub height_in_pixels: u16,
635    pub width_in_millimeters: u16,
636    pub height_in_millimeters: u16,
637    pub min_installed_maps: u16,
638    pub max_installed_maps: u16,
639    pub root_visual: Visualid,
640    pub backing_stores: BackingStore,
641    pub save_unders: bool,
642    pub root_depth: u8,
643    pub allowed_depths: Vec<Depth>,
644}
645impl_debug_if_no_extra_traits!(Screen, "Screen");
646impl TryParse for Screen {
647    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
648        let (root, remaining) = Window::try_parse(remaining)?;
649        let (default_colormap, remaining) = Colormap::try_parse(remaining)?;
650        let (white_pixel, remaining) = u32::try_parse(remaining)?;
651        let (black_pixel, remaining) = u32::try_parse(remaining)?;
652        let (current_input_masks, remaining) = u32::try_parse(remaining)?;
653        let (width_in_pixels, remaining) = u16::try_parse(remaining)?;
654        let (height_in_pixels, remaining) = u16::try_parse(remaining)?;
655        let (width_in_millimeters, remaining) = u16::try_parse(remaining)?;
656        let (height_in_millimeters, remaining) = u16::try_parse(remaining)?;
657        let (min_installed_maps, remaining) = u16::try_parse(remaining)?;
658        let (max_installed_maps, remaining) = u16::try_parse(remaining)?;
659        let (root_visual, remaining) = Visualid::try_parse(remaining)?;
660        let (backing_stores, remaining) = u8::try_parse(remaining)?;
661        let (save_unders, remaining) = bool::try_parse(remaining)?;
662        let (root_depth, remaining) = u8::try_parse(remaining)?;
663        let (allowed_depths_len, remaining) = u8::try_parse(remaining)?;
664        let (allowed_depths, remaining) = crate::x11_utils::parse_list::<Depth>(remaining, allowed_depths_len.try_to_usize()?)?;
665        let current_input_masks = current_input_masks.into();
666        let backing_stores = backing_stores.into();
667        let result = Screen { root, default_colormap, white_pixel, black_pixel, current_input_masks, width_in_pixels, height_in_pixels, width_in_millimeters, height_in_millimeters, min_installed_maps, max_installed_maps, root_visual, backing_stores, save_unders, root_depth, allowed_depths };
668        Ok((result, remaining))
669    }
670}
671impl Serialize for Screen {
672    type Bytes = Vec<u8>;
673    fn serialize(&self) -> Vec<u8> {
674        let mut result = Vec::new();
675        self.serialize_into(&mut result);
676        result
677    }
678    fn serialize_into(&self, bytes: &mut Vec<u8>) {
679        bytes.reserve(40);
680        self.root.serialize_into(bytes);
681        self.default_colormap.serialize_into(bytes);
682        self.white_pixel.serialize_into(bytes);
683        self.black_pixel.serialize_into(bytes);
684        u32::from(self.current_input_masks).serialize_into(bytes);
685        self.width_in_pixels.serialize_into(bytes);
686        self.height_in_pixels.serialize_into(bytes);
687        self.width_in_millimeters.serialize_into(bytes);
688        self.height_in_millimeters.serialize_into(bytes);
689        self.min_installed_maps.serialize_into(bytes);
690        self.max_installed_maps.serialize_into(bytes);
691        self.root_visual.serialize_into(bytes);
692        (u32::from(self.backing_stores) as u8).serialize_into(bytes);
693        self.save_unders.serialize_into(bytes);
694        self.root_depth.serialize_into(bytes);
695        let allowed_depths_len = u8::try_from(self.allowed_depths.len()).expect("`allowed_depths` has too many elements");
696        allowed_depths_len.serialize_into(bytes);
697        self.allowed_depths.serialize_into(bytes);
698    }
699}
700impl Screen {
701    /// Get the value of the `allowed_depths_len` field.
702    ///
703    /// The `allowed_depths_len` field is used as the length field of the `allowed_depths` field.
704    /// This function computes the field's value again based on the length of the list.
705    ///
706    /// # Panics
707    ///
708    /// Panics if the value cannot be represented in the target type. This
709    /// cannot happen with values of the struct received from the X11 server.
710    pub fn allowed_depths_len(&self) -> u8 {
711        self.allowed_depths.len()
712            .try_into().unwrap()
713    }
714}
715
716#[derive(Clone, Default)]
717#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
718#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
719pub struct SetupRequest {
720    pub byte_order: u8,
721    pub protocol_major_version: u16,
722    pub protocol_minor_version: u16,
723    pub authorization_protocol_name: Vec<u8>,
724    pub authorization_protocol_data: Vec<u8>,
725}
726impl_debug_if_no_extra_traits!(SetupRequest, "SetupRequest");
727impl TryParse for SetupRequest {
728    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
729        let value = remaining;
730        let (byte_order, remaining) = u8::try_parse(remaining)?;
731        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
732        let (protocol_major_version, remaining) = u16::try_parse(remaining)?;
733        let (protocol_minor_version, remaining) = u16::try_parse(remaining)?;
734        let (authorization_protocol_name_len, remaining) = u16::try_parse(remaining)?;
735        let (authorization_protocol_data_len, remaining) = u16::try_parse(remaining)?;
736        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
737        let (authorization_protocol_name, remaining) = crate::x11_utils::parse_u8_list(remaining, authorization_protocol_name_len.try_to_usize()?)?;
738        let authorization_protocol_name = authorization_protocol_name.to_vec();
739        // Align offset to multiple of 4
740        let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
741        let misalignment = (4 - (offset % 4)) % 4;
742        let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
743        let (authorization_protocol_data, remaining) = crate::x11_utils::parse_u8_list(remaining, authorization_protocol_data_len.try_to_usize()?)?;
744        let authorization_protocol_data = authorization_protocol_data.to_vec();
745        // Align offset to multiple of 4
746        let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
747        let misalignment = (4 - (offset % 4)) % 4;
748        let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
749        let result = SetupRequest { byte_order, protocol_major_version, protocol_minor_version, authorization_protocol_name, authorization_protocol_data };
750        Ok((result, remaining))
751    }
752}
753impl Serialize for SetupRequest {
754    type Bytes = Vec<u8>;
755    fn serialize(&self) -> Vec<u8> {
756        let mut result = Vec::new();
757        self.serialize_into(&mut result);
758        result
759    }
760    fn serialize_into(&self, bytes: &mut Vec<u8>) {
761        bytes.reserve(12);
762        self.byte_order.serialize_into(bytes);
763        bytes.extend_from_slice(&[0; 1]);
764        self.protocol_major_version.serialize_into(bytes);
765        self.protocol_minor_version.serialize_into(bytes);
766        let authorization_protocol_name_len = u16::try_from(self.authorization_protocol_name.len()).expect("`authorization_protocol_name` has too many elements");
767        authorization_protocol_name_len.serialize_into(bytes);
768        let authorization_protocol_data_len = u16::try_from(self.authorization_protocol_data.len()).expect("`authorization_protocol_data` has too many elements");
769        authorization_protocol_data_len.serialize_into(bytes);
770        bytes.extend_from_slice(&[0; 2]);
771        bytes.extend_from_slice(&self.authorization_protocol_name);
772        bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
773        bytes.extend_from_slice(&self.authorization_protocol_data);
774        bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
775    }
776}
777impl SetupRequest {
778    /// Get the value of the `authorization_protocol_name_len` field.
779    ///
780    /// The `authorization_protocol_name_len` field is used as the length field of the `authorization_protocol_name` field.
781    /// This function computes the field's value again based on the length of the list.
782    ///
783    /// # Panics
784    ///
785    /// Panics if the value cannot be represented in the target type. This
786    /// cannot happen with values of the struct received from the X11 server.
787    pub fn authorization_protocol_name_len(&self) -> u16 {
788        self.authorization_protocol_name.len()
789            .try_into().unwrap()
790    }
791    /// Get the value of the `authorization_protocol_data_len` field.
792    ///
793    /// The `authorization_protocol_data_len` field is used as the length field of the `authorization_protocol_data` field.
794    /// This function computes the field's value again based on the length of the list.
795    ///
796    /// # Panics
797    ///
798    /// Panics if the value cannot be represented in the target type. This
799    /// cannot happen with values of the struct received from the X11 server.
800    pub fn authorization_protocol_data_len(&self) -> u16 {
801        self.authorization_protocol_data.len()
802            .try_into().unwrap()
803    }
804}
805
806#[derive(Clone, Default)]
807#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
808#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
809pub struct SetupFailed {
810    pub status: u8,
811    pub protocol_major_version: u16,
812    pub protocol_minor_version: u16,
813    pub length: u16,
814    pub reason: Vec<u8>,
815}
816impl_debug_if_no_extra_traits!(SetupFailed, "SetupFailed");
817impl TryParse for SetupFailed {
818    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
819        let (status, remaining) = u8::try_parse(remaining)?;
820        let (reason_len, remaining) = u8::try_parse(remaining)?;
821        let (protocol_major_version, remaining) = u16::try_parse(remaining)?;
822        let (protocol_minor_version, remaining) = u16::try_parse(remaining)?;
823        let (length, remaining) = u16::try_parse(remaining)?;
824        let (reason, remaining) = crate::x11_utils::parse_u8_list(remaining, reason_len.try_to_usize()?)?;
825        let reason = reason.to_vec();
826        let result = SetupFailed { status, protocol_major_version, protocol_minor_version, length, reason };
827        Ok((result, remaining))
828    }
829}
830impl Serialize for SetupFailed {
831    type Bytes = Vec<u8>;
832    fn serialize(&self) -> Vec<u8> {
833        let mut result = Vec::new();
834        self.serialize_into(&mut result);
835        result
836    }
837    fn serialize_into(&self, bytes: &mut Vec<u8>) {
838        bytes.reserve(8);
839        self.status.serialize_into(bytes);
840        let reason_len = u8::try_from(self.reason.len()).expect("`reason` has too many elements");
841        reason_len.serialize_into(bytes);
842        self.protocol_major_version.serialize_into(bytes);
843        self.protocol_minor_version.serialize_into(bytes);
844        self.length.serialize_into(bytes);
845        bytes.extend_from_slice(&self.reason);
846    }
847}
848impl SetupFailed {
849    /// Get the value of the `reason_len` field.
850    ///
851    /// The `reason_len` field is used as the length field of the `reason` field.
852    /// This function computes the field's value again based on the length of the list.
853    ///
854    /// # Panics
855    ///
856    /// Panics if the value cannot be represented in the target type. This
857    /// cannot happen with values of the struct received from the X11 server.
858    pub fn reason_len(&self) -> u8 {
859        self.reason.len()
860            .try_into().unwrap()
861    }
862}
863
864#[derive(Clone, Default)]
865#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
866#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
867pub struct SetupAuthenticate {
868    pub status: u8,
869    pub reason: Vec<u8>,
870}
871impl_debug_if_no_extra_traits!(SetupAuthenticate, "SetupAuthenticate");
872impl TryParse for SetupAuthenticate {
873    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
874        let (status, remaining) = u8::try_parse(remaining)?;
875        let remaining = remaining.get(5..).ok_or(ParseError::InsufficientData)?;
876        let (length, remaining) = u16::try_parse(remaining)?;
877        let (reason, remaining) = crate::x11_utils::parse_u8_list(remaining, u32::from(length).checked_mul(4u32).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
878        let reason = reason.to_vec();
879        let result = SetupAuthenticate { status, reason };
880        Ok((result, remaining))
881    }
882}
883impl Serialize for SetupAuthenticate {
884    type Bytes = Vec<u8>;
885    fn serialize(&self) -> Vec<u8> {
886        let mut result = Vec::new();
887        self.serialize_into(&mut result);
888        result
889    }
890    fn serialize_into(&self, bytes: &mut Vec<u8>) {
891        bytes.reserve(8);
892        self.status.serialize_into(bytes);
893        bytes.extend_from_slice(&[0; 5]);
894        assert_eq!(self.reason.len() % 4, 0, "`reason` has an incorrect length, must be a multiple of 4");
895        let length = u16::try_from(self.reason.len() / 4).expect("`reason` has too many elements");
896        length.serialize_into(bytes);
897        bytes.extend_from_slice(&self.reason);
898    }
899}
900impl SetupAuthenticate {
901    /// Get the value of the `length` field.
902    ///
903    /// The `length` field is used as the length field of the `reason` field.
904    /// This function computes the field's value again based on the length of the list.
905    ///
906    /// # Panics
907    ///
908    /// Panics if the value cannot be represented in the target type. This
909    /// cannot happen with values of the struct received from the X11 server.
910    pub fn length(&self) -> u16 {
911        self.reason.len()
912            .checked_div(4).unwrap()
913            .try_into().unwrap()
914    }
915}
916
917#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
918#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
919pub struct ImageOrder(u8);
920impl ImageOrder {
921    pub const LSB_FIRST: Self = Self(0);
922    pub const MSB_FIRST: Self = Self(1);
923}
924impl From<ImageOrder> for u8 {
925    #[inline]
926    fn from(input: ImageOrder) -> Self {
927        input.0
928    }
929}
930impl From<ImageOrder> for Option<u8> {
931    #[inline]
932    fn from(input: ImageOrder) -> Self {
933        Some(input.0)
934    }
935}
936impl From<ImageOrder> for u16 {
937    #[inline]
938    fn from(input: ImageOrder) -> Self {
939        u16::from(input.0)
940    }
941}
942impl From<ImageOrder> for Option<u16> {
943    #[inline]
944    fn from(input: ImageOrder) -> Self {
945        Some(u16::from(input.0))
946    }
947}
948impl From<ImageOrder> for u32 {
949    #[inline]
950    fn from(input: ImageOrder) -> Self {
951        u32::from(input.0)
952    }
953}
954impl From<ImageOrder> for Option<u32> {
955    #[inline]
956    fn from(input: ImageOrder) -> Self {
957        Some(u32::from(input.0))
958    }
959}
960impl From<u8> for ImageOrder {
961    #[inline]
962    fn from(value: u8) -> Self {
963        Self(value)
964    }
965}
966impl core::fmt::Debug for ImageOrder  {
967    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
968        let variants = [
969            (Self::LSB_FIRST.0.into(), "LSB_FIRST", "LSBFirst"),
970            (Self::MSB_FIRST.0.into(), "MSB_FIRST", "MSBFirst"),
971        ];
972        pretty_print_enum(fmt, self.0.into(), &variants)
973    }
974}
975
976#[derive(Clone, Default)]
977#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
978#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
979pub struct Setup {
980    pub status: u8,
981    pub protocol_major_version: u16,
982    pub protocol_minor_version: u16,
983    pub length: u16,
984    pub release_number: u32,
985    pub resource_id_base: u32,
986    pub resource_id_mask: u32,
987    pub motion_buffer_size: u32,
988    pub maximum_request_length: u16,
989    pub image_byte_order: ImageOrder,
990    pub bitmap_format_bit_order: ImageOrder,
991    pub bitmap_format_scanline_unit: u8,
992    pub bitmap_format_scanline_pad: u8,
993    pub min_keycode: Keycode,
994    pub max_keycode: Keycode,
995    pub vendor: Vec<u8>,
996    pub pixmap_formats: Vec<Format>,
997    pub roots: Vec<Screen>,
998}
999impl_debug_if_no_extra_traits!(Setup, "Setup");
1000impl TryParse for Setup {
1001    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1002        let value = remaining;
1003        let (status, remaining) = u8::try_parse(remaining)?;
1004        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1005        let (protocol_major_version, remaining) = u16::try_parse(remaining)?;
1006        let (protocol_minor_version, remaining) = u16::try_parse(remaining)?;
1007        let (length, remaining) = u16::try_parse(remaining)?;
1008        let (release_number, remaining) = u32::try_parse(remaining)?;
1009        let (resource_id_base, remaining) = u32::try_parse(remaining)?;
1010        let (resource_id_mask, remaining) = u32::try_parse(remaining)?;
1011        let (motion_buffer_size, remaining) = u32::try_parse(remaining)?;
1012        let (vendor_len, remaining) = u16::try_parse(remaining)?;
1013        let (maximum_request_length, remaining) = u16::try_parse(remaining)?;
1014        let (roots_len, remaining) = u8::try_parse(remaining)?;
1015        let (pixmap_formats_len, remaining) = u8::try_parse(remaining)?;
1016        let (image_byte_order, remaining) = u8::try_parse(remaining)?;
1017        let (bitmap_format_bit_order, remaining) = u8::try_parse(remaining)?;
1018        let (bitmap_format_scanline_unit, remaining) = u8::try_parse(remaining)?;
1019        let (bitmap_format_scanline_pad, remaining) = u8::try_parse(remaining)?;
1020        let (min_keycode, remaining) = Keycode::try_parse(remaining)?;
1021        let (max_keycode, remaining) = Keycode::try_parse(remaining)?;
1022        let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
1023        let (vendor, remaining) = crate::x11_utils::parse_u8_list(remaining, vendor_len.try_to_usize()?)?;
1024        let vendor = vendor.to_vec();
1025        // Align offset to multiple of 4
1026        let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
1027        let misalignment = (4 - (offset % 4)) % 4;
1028        let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
1029        let (pixmap_formats, remaining) = crate::x11_utils::parse_list::<Format>(remaining, pixmap_formats_len.try_to_usize()?)?;
1030        let (roots, remaining) = crate::x11_utils::parse_list::<Screen>(remaining, roots_len.try_to_usize()?)?;
1031        let image_byte_order = image_byte_order.into();
1032        let bitmap_format_bit_order = bitmap_format_bit_order.into();
1033        let result = Setup { status, protocol_major_version, protocol_minor_version, length, release_number, resource_id_base, resource_id_mask, motion_buffer_size, maximum_request_length, image_byte_order, bitmap_format_bit_order, bitmap_format_scanline_unit, bitmap_format_scanline_pad, min_keycode, max_keycode, vendor, pixmap_formats, roots };
1034        Ok((result, remaining))
1035    }
1036}
1037impl Serialize for Setup {
1038    type Bytes = Vec<u8>;
1039    fn serialize(&self) -> Vec<u8> {
1040        let mut result = Vec::new();
1041        self.serialize_into(&mut result);
1042        result
1043    }
1044    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1045        bytes.reserve(40);
1046        self.status.serialize_into(bytes);
1047        bytes.extend_from_slice(&[0; 1]);
1048        self.protocol_major_version.serialize_into(bytes);
1049        self.protocol_minor_version.serialize_into(bytes);
1050        self.length.serialize_into(bytes);
1051        self.release_number.serialize_into(bytes);
1052        self.resource_id_base.serialize_into(bytes);
1053        self.resource_id_mask.serialize_into(bytes);
1054        self.motion_buffer_size.serialize_into(bytes);
1055        let vendor_len = u16::try_from(self.vendor.len()).expect("`vendor` has too many elements");
1056        vendor_len.serialize_into(bytes);
1057        self.maximum_request_length.serialize_into(bytes);
1058        let roots_len = u8::try_from(self.roots.len()).expect("`roots` has too many elements");
1059        roots_len.serialize_into(bytes);
1060        let pixmap_formats_len = u8::try_from(self.pixmap_formats.len()).expect("`pixmap_formats` has too many elements");
1061        pixmap_formats_len.serialize_into(bytes);
1062        u8::from(self.image_byte_order).serialize_into(bytes);
1063        u8::from(self.bitmap_format_bit_order).serialize_into(bytes);
1064        self.bitmap_format_scanline_unit.serialize_into(bytes);
1065        self.bitmap_format_scanline_pad.serialize_into(bytes);
1066        self.min_keycode.serialize_into(bytes);
1067        self.max_keycode.serialize_into(bytes);
1068        bytes.extend_from_slice(&[0; 4]);
1069        bytes.extend_from_slice(&self.vendor);
1070        bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
1071        self.pixmap_formats.serialize_into(bytes);
1072        self.roots.serialize_into(bytes);
1073    }
1074}
1075impl Setup {
1076    /// Get the value of the `vendor_len` field.
1077    ///
1078    /// The `vendor_len` field is used as the length field of the `vendor` field.
1079    /// This function computes the field's value again based on the length of the list.
1080    ///
1081    /// # Panics
1082    ///
1083    /// Panics if the value cannot be represented in the target type. This
1084    /// cannot happen with values of the struct received from the X11 server.
1085    pub fn vendor_len(&self) -> u16 {
1086        self.vendor.len()
1087            .try_into().unwrap()
1088    }
1089    /// Get the value of the `roots_len` field.
1090    ///
1091    /// The `roots_len` field is used as the length field of the `roots` field.
1092    /// This function computes the field's value again based on the length of the list.
1093    ///
1094    /// # Panics
1095    ///
1096    /// Panics if the value cannot be represented in the target type. This
1097    /// cannot happen with values of the struct received from the X11 server.
1098    pub fn roots_len(&self) -> u8 {
1099        self.roots.len()
1100            .try_into().unwrap()
1101    }
1102    /// Get the value of the `pixmap_formats_len` field.
1103    ///
1104    /// The `pixmap_formats_len` field is used as the length field of the `pixmap_formats` field.
1105    /// This function computes the field's value again based on the length of the list.
1106    ///
1107    /// # Panics
1108    ///
1109    /// Panics if the value cannot be represented in the target type. This
1110    /// cannot happen with values of the struct received from the X11 server.
1111    pub fn pixmap_formats_len(&self) -> u8 {
1112        self.pixmap_formats.len()
1113            .try_into().unwrap()
1114    }
1115}
1116
1117#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
1118#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1119pub struct ModMask(u16);
1120impl ModMask {
1121    pub const SHIFT: Self = Self(1 << 0);
1122    pub const LOCK: Self = Self(1 << 1);
1123    pub const CONTROL: Self = Self(1 << 2);
1124    pub const M1: Self = Self(1 << 3);
1125    pub const M2: Self = Self(1 << 4);
1126    pub const M3: Self = Self(1 << 5);
1127    pub const M4: Self = Self(1 << 6);
1128    pub const M5: Self = Self(1 << 7);
1129    pub const ANY: Self = Self(1 << 15);
1130}
1131impl From<ModMask> for u16 {
1132    #[inline]
1133    fn from(input: ModMask) -> Self {
1134        input.0
1135    }
1136}
1137impl From<ModMask> for Option<u16> {
1138    #[inline]
1139    fn from(input: ModMask) -> Self {
1140        Some(input.0)
1141    }
1142}
1143impl From<ModMask> for u32 {
1144    #[inline]
1145    fn from(input: ModMask) -> Self {
1146        u32::from(input.0)
1147    }
1148}
1149impl From<ModMask> for Option<u32> {
1150    #[inline]
1151    fn from(input: ModMask) -> Self {
1152        Some(u32::from(input.0))
1153    }
1154}
1155impl From<u8> for ModMask {
1156    #[inline]
1157    fn from(value: u8) -> Self {
1158        Self(value.into())
1159    }
1160}
1161impl From<u16> for ModMask {
1162    #[inline]
1163    fn from(value: u16) -> Self {
1164        Self(value)
1165    }
1166}
1167impl core::fmt::Debug for ModMask  {
1168    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1169        let variants = [
1170            (Self::SHIFT.0.into(), "SHIFT", "Shift"),
1171            (Self::LOCK.0.into(), "LOCK", "Lock"),
1172            (Self::CONTROL.0.into(), "CONTROL", "Control"),
1173            (Self::M1.0.into(), "M1", "M1"),
1174            (Self::M2.0.into(), "M2", "M2"),
1175            (Self::M3.0.into(), "M3", "M3"),
1176            (Self::M4.0.into(), "M4", "M4"),
1177            (Self::M5.0.into(), "M5", "M5"),
1178            (Self::ANY.0.into(), "ANY", "Any"),
1179        ];
1180        pretty_print_bitmask(fmt, self.0.into(), &variants)
1181    }
1182}
1183bitmask_binop!(ModMask, u16);
1184
1185#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
1186#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1187pub struct KeyButMask(u16);
1188impl KeyButMask {
1189    pub const SHIFT: Self = Self(1 << 0);
1190    pub const LOCK: Self = Self(1 << 1);
1191    pub const CONTROL: Self = Self(1 << 2);
1192    pub const MOD1: Self = Self(1 << 3);
1193    pub const MOD2: Self = Self(1 << 4);
1194    pub const MOD3: Self = Self(1 << 5);
1195    pub const MOD4: Self = Self(1 << 6);
1196    pub const MOD5: Self = Self(1 << 7);
1197    pub const BUTTON1: Self = Self(1 << 8);
1198    pub const BUTTON2: Self = Self(1 << 9);
1199    pub const BUTTON3: Self = Self(1 << 10);
1200    pub const BUTTON4: Self = Self(1 << 11);
1201    pub const BUTTON5: Self = Self(1 << 12);
1202}
1203impl From<KeyButMask> for u16 {
1204    #[inline]
1205    fn from(input: KeyButMask) -> Self {
1206        input.0
1207    }
1208}
1209impl From<KeyButMask> for Option<u16> {
1210    #[inline]
1211    fn from(input: KeyButMask) -> Self {
1212        Some(input.0)
1213    }
1214}
1215impl From<KeyButMask> for u32 {
1216    #[inline]
1217    fn from(input: KeyButMask) -> Self {
1218        u32::from(input.0)
1219    }
1220}
1221impl From<KeyButMask> for Option<u32> {
1222    #[inline]
1223    fn from(input: KeyButMask) -> Self {
1224        Some(u32::from(input.0))
1225    }
1226}
1227impl From<u8> for KeyButMask {
1228    #[inline]
1229    fn from(value: u8) -> Self {
1230        Self(value.into())
1231    }
1232}
1233impl From<u16> for KeyButMask {
1234    #[inline]
1235    fn from(value: u16) -> Self {
1236        Self(value)
1237    }
1238}
1239impl core::fmt::Debug for KeyButMask  {
1240    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1241        let variants = [
1242            (Self::SHIFT.0.into(), "SHIFT", "Shift"),
1243            (Self::LOCK.0.into(), "LOCK", "Lock"),
1244            (Self::CONTROL.0.into(), "CONTROL", "Control"),
1245            (Self::MOD1.0.into(), "MOD1", "Mod1"),
1246            (Self::MOD2.0.into(), "MOD2", "Mod2"),
1247            (Self::MOD3.0.into(), "MOD3", "Mod3"),
1248            (Self::MOD4.0.into(), "MOD4", "Mod4"),
1249            (Self::MOD5.0.into(), "MOD5", "Mod5"),
1250            (Self::BUTTON1.0.into(), "BUTTON1", "Button1"),
1251            (Self::BUTTON2.0.into(), "BUTTON2", "Button2"),
1252            (Self::BUTTON3.0.into(), "BUTTON3", "Button3"),
1253            (Self::BUTTON4.0.into(), "BUTTON4", "Button4"),
1254            (Self::BUTTON5.0.into(), "BUTTON5", "Button5"),
1255        ];
1256        pretty_print_bitmask(fmt, self.0.into(), &variants)
1257    }
1258}
1259bitmask_binop!(KeyButMask, u16);
1260
1261#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
1262#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1263pub struct WindowEnum(u8);
1264impl WindowEnum {
1265    pub const NONE: Self = Self(0);
1266}
1267impl From<WindowEnum> for u8 {
1268    #[inline]
1269    fn from(input: WindowEnum) -> Self {
1270        input.0
1271    }
1272}
1273impl From<WindowEnum> for Option<u8> {
1274    #[inline]
1275    fn from(input: WindowEnum) -> Self {
1276        Some(input.0)
1277    }
1278}
1279impl From<WindowEnum> for u16 {
1280    #[inline]
1281    fn from(input: WindowEnum) -> Self {
1282        u16::from(input.0)
1283    }
1284}
1285impl From<WindowEnum> for Option<u16> {
1286    #[inline]
1287    fn from(input: WindowEnum) -> Self {
1288        Some(u16::from(input.0))
1289    }
1290}
1291impl From<WindowEnum> for u32 {
1292    #[inline]
1293    fn from(input: WindowEnum) -> Self {
1294        u32::from(input.0)
1295    }
1296}
1297impl From<WindowEnum> for Option<u32> {
1298    #[inline]
1299    fn from(input: WindowEnum) -> Self {
1300        Some(u32::from(input.0))
1301    }
1302}
1303impl From<u8> for WindowEnum {
1304    #[inline]
1305    fn from(value: u8) -> Self {
1306        Self(value)
1307    }
1308}
1309impl core::fmt::Debug for WindowEnum  {
1310    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1311        let variants = [
1312            (Self::NONE.0.into(), "NONE", "None"),
1313        ];
1314        pretty_print_enum(fmt, self.0.into(), &variants)
1315    }
1316}
1317
1318/// Opcode for the KeyPress event
1319pub const KEY_PRESS_EVENT: u8 = 2;
1320/// a key was pressed/released.
1321///
1322/// # Fields
1323///
1324/// * `detail` - The keycode (a number representing a physical key on the keyboard) of the key
1325/// which was pressed.
1326/// * `time` - Time when the event was generated (in milliseconds).
1327/// * `root` - The root window of `child`.
1328/// * `same_screen` - Whether the `event` window is on the same screen as the `root` window.
1329/// * `event_x` - If `same_screen` is true, this is the X coordinate relative to the `event`
1330/// window's origin. Otherwise, `event_x` will be set to zero.
1331/// * `event_y` - If `same_screen` is true, this is the Y coordinate relative to the `event`
1332/// window's origin. Otherwise, `event_y` will be set to zero.
1333/// * `root_x` - The X coordinate of the pointer relative to the `root` window at the time of
1334/// the event.
1335/// * `root_y` - The Y coordinate of the pointer relative to the `root` window at the time of
1336/// the event.
1337/// * `state` - The logical state of the pointer buttons and modifier keys just prior to the
1338/// event.
1339///
1340/// # See
1341///
1342/// * `GrabKey`: request
1343/// * `GrabKeyboard`: request
1344#[derive(Clone, Copy, Default)]
1345#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1346#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1347pub struct KeyPressEvent {
1348    pub response_type: u8,
1349    pub detail: Keycode,
1350    pub sequence: u16,
1351    pub time: Timestamp,
1352    pub root: Window,
1353    pub event: Window,
1354    pub child: Window,
1355    pub root_x: i16,
1356    pub root_y: i16,
1357    pub event_x: i16,
1358    pub event_y: i16,
1359    pub state: KeyButMask,
1360    pub same_screen: bool,
1361}
1362impl_debug_if_no_extra_traits!(KeyPressEvent, "KeyPressEvent");
1363impl TryParse for KeyPressEvent {
1364    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1365        let remaining = initial_value;
1366        let (response_type, remaining) = u8::try_parse(remaining)?;
1367        let (detail, remaining) = Keycode::try_parse(remaining)?;
1368        let (sequence, remaining) = u16::try_parse(remaining)?;
1369        let (time, remaining) = Timestamp::try_parse(remaining)?;
1370        let (root, remaining) = Window::try_parse(remaining)?;
1371        let (event, remaining) = Window::try_parse(remaining)?;
1372        let (child, remaining) = Window::try_parse(remaining)?;
1373        let (root_x, remaining) = i16::try_parse(remaining)?;
1374        let (root_y, remaining) = i16::try_parse(remaining)?;
1375        let (event_x, remaining) = i16::try_parse(remaining)?;
1376        let (event_y, remaining) = i16::try_parse(remaining)?;
1377        let (state, remaining) = u16::try_parse(remaining)?;
1378        let (same_screen, remaining) = bool::try_parse(remaining)?;
1379        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1380        let state = state.into();
1381        let result = KeyPressEvent { response_type, detail, sequence, time, root, event, child, root_x, root_y, event_x, event_y, state, same_screen };
1382        let _ = remaining;
1383        let remaining = initial_value.get(32..)
1384            .ok_or(ParseError::InsufficientData)?;
1385        Ok((result, remaining))
1386    }
1387}
1388impl Serialize for KeyPressEvent {
1389    type Bytes = [u8; 32];
1390    fn serialize(&self) -> [u8; 32] {
1391        let response_type_bytes = self.response_type.serialize();
1392        let detail_bytes = self.detail.serialize();
1393        let sequence_bytes = self.sequence.serialize();
1394        let time_bytes = self.time.serialize();
1395        let root_bytes = self.root.serialize();
1396        let event_bytes = self.event.serialize();
1397        let child_bytes = self.child.serialize();
1398        let root_x_bytes = self.root_x.serialize();
1399        let root_y_bytes = self.root_y.serialize();
1400        let event_x_bytes = self.event_x.serialize();
1401        let event_y_bytes = self.event_y.serialize();
1402        let state_bytes = u16::from(self.state).serialize();
1403        let same_screen_bytes = self.same_screen.serialize();
1404        [
1405            response_type_bytes[0],
1406            detail_bytes[0],
1407            sequence_bytes[0],
1408            sequence_bytes[1],
1409            time_bytes[0],
1410            time_bytes[1],
1411            time_bytes[2],
1412            time_bytes[3],
1413            root_bytes[0],
1414            root_bytes[1],
1415            root_bytes[2],
1416            root_bytes[3],
1417            event_bytes[0],
1418            event_bytes[1],
1419            event_bytes[2],
1420            event_bytes[3],
1421            child_bytes[0],
1422            child_bytes[1],
1423            child_bytes[2],
1424            child_bytes[3],
1425            root_x_bytes[0],
1426            root_x_bytes[1],
1427            root_y_bytes[0],
1428            root_y_bytes[1],
1429            event_x_bytes[0],
1430            event_x_bytes[1],
1431            event_y_bytes[0],
1432            event_y_bytes[1],
1433            state_bytes[0],
1434            state_bytes[1],
1435            same_screen_bytes[0],
1436            0,
1437        ]
1438    }
1439    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1440        bytes.reserve(32);
1441        self.response_type.serialize_into(bytes);
1442        self.detail.serialize_into(bytes);
1443        self.sequence.serialize_into(bytes);
1444        self.time.serialize_into(bytes);
1445        self.root.serialize_into(bytes);
1446        self.event.serialize_into(bytes);
1447        self.child.serialize_into(bytes);
1448        self.root_x.serialize_into(bytes);
1449        self.root_y.serialize_into(bytes);
1450        self.event_x.serialize_into(bytes);
1451        self.event_y.serialize_into(bytes);
1452        u16::from(self.state).serialize_into(bytes);
1453        self.same_screen.serialize_into(bytes);
1454        bytes.extend_from_slice(&[0; 1]);
1455    }
1456}
1457impl From<&KeyPressEvent> for [u8; 32] {
1458    fn from(input: &KeyPressEvent) -> Self {
1459        let response_type_bytes = input.response_type.serialize();
1460        let detail_bytes = input.detail.serialize();
1461        let sequence_bytes = input.sequence.serialize();
1462        let time_bytes = input.time.serialize();
1463        let root_bytes = input.root.serialize();
1464        let event_bytes = input.event.serialize();
1465        let child_bytes = input.child.serialize();
1466        let root_x_bytes = input.root_x.serialize();
1467        let root_y_bytes = input.root_y.serialize();
1468        let event_x_bytes = input.event_x.serialize();
1469        let event_y_bytes = input.event_y.serialize();
1470        let state_bytes = u16::from(input.state).serialize();
1471        let same_screen_bytes = input.same_screen.serialize();
1472        [
1473            response_type_bytes[0],
1474            detail_bytes[0],
1475            sequence_bytes[0],
1476            sequence_bytes[1],
1477            time_bytes[0],
1478            time_bytes[1],
1479            time_bytes[2],
1480            time_bytes[3],
1481            root_bytes[0],
1482            root_bytes[1],
1483            root_bytes[2],
1484            root_bytes[3],
1485            event_bytes[0],
1486            event_bytes[1],
1487            event_bytes[2],
1488            event_bytes[3],
1489            child_bytes[0],
1490            child_bytes[1],
1491            child_bytes[2],
1492            child_bytes[3],
1493            root_x_bytes[0],
1494            root_x_bytes[1],
1495            root_y_bytes[0],
1496            root_y_bytes[1],
1497            event_x_bytes[0],
1498            event_x_bytes[1],
1499            event_y_bytes[0],
1500            event_y_bytes[1],
1501            state_bytes[0],
1502            state_bytes[1],
1503            same_screen_bytes[0],
1504            0,
1505        ]
1506    }
1507}
1508impl From<KeyPressEvent> for [u8; 32] {
1509    fn from(input: KeyPressEvent) -> Self {
1510        Self::from(&input)
1511    }
1512}
1513
1514/// Opcode for the KeyRelease event
1515pub const KEY_RELEASE_EVENT: u8 = 3;
1516pub type KeyReleaseEvent = KeyPressEvent;
1517
1518#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
1519#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1520pub struct ButtonMask(u16);
1521impl ButtonMask {
1522    pub const M1: Self = Self(1 << 8);
1523    pub const M2: Self = Self(1 << 9);
1524    pub const M3: Self = Self(1 << 10);
1525    pub const M4: Self = Self(1 << 11);
1526    pub const M5: Self = Self(1 << 12);
1527    pub const ANY: Self = Self(1 << 15);
1528}
1529impl From<ButtonMask> for u16 {
1530    #[inline]
1531    fn from(input: ButtonMask) -> Self {
1532        input.0
1533    }
1534}
1535impl From<ButtonMask> for Option<u16> {
1536    #[inline]
1537    fn from(input: ButtonMask) -> Self {
1538        Some(input.0)
1539    }
1540}
1541impl From<ButtonMask> for u32 {
1542    #[inline]
1543    fn from(input: ButtonMask) -> Self {
1544        u32::from(input.0)
1545    }
1546}
1547impl From<ButtonMask> for Option<u32> {
1548    #[inline]
1549    fn from(input: ButtonMask) -> Self {
1550        Some(u32::from(input.0))
1551    }
1552}
1553impl From<u8> for ButtonMask {
1554    #[inline]
1555    fn from(value: u8) -> Self {
1556        Self(value.into())
1557    }
1558}
1559impl From<u16> for ButtonMask {
1560    #[inline]
1561    fn from(value: u16) -> Self {
1562        Self(value)
1563    }
1564}
1565impl core::fmt::Debug for ButtonMask  {
1566    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1567        let variants = [
1568            (Self::M1.0.into(), "M1", "M1"),
1569            (Self::M2.0.into(), "M2", "M2"),
1570            (Self::M3.0.into(), "M3", "M3"),
1571            (Self::M4.0.into(), "M4", "M4"),
1572            (Self::M5.0.into(), "M5", "M5"),
1573            (Self::ANY.0.into(), "ANY", "Any"),
1574        ];
1575        pretty_print_bitmask(fmt, self.0.into(), &variants)
1576    }
1577}
1578bitmask_binop!(ButtonMask, u16);
1579
1580/// Opcode for the ButtonPress event
1581pub const BUTTON_PRESS_EVENT: u8 = 4;
1582/// a mouse button was pressed/released.
1583///
1584/// # Fields
1585///
1586/// * `detail` - The keycode (a number representing a physical key on the keyboard) of the key
1587/// which was pressed.
1588/// * `time` - Time when the event was generated (in milliseconds).
1589/// * `root` - The root window of `child`.
1590/// * `same_screen` - Whether the `event` window is on the same screen as the `root` window.
1591/// * `event_x` - If `same_screen` is true, this is the X coordinate relative to the `event`
1592/// window's origin. Otherwise, `event_x` will be set to zero.
1593/// * `event_y` - If `same_screen` is true, this is the Y coordinate relative to the `event`
1594/// window's origin. Otherwise, `event_y` will be set to zero.
1595/// * `root_x` - The X coordinate of the pointer relative to the `root` window at the time of
1596/// the event.
1597/// * `root_y` - The Y coordinate of the pointer relative to the `root` window at the time of
1598/// the event.
1599/// * `state` - The logical state of the pointer buttons and modifier keys just prior to the
1600/// event.
1601///
1602/// # See
1603///
1604/// * `GrabButton`: request
1605/// * `GrabPointer`: request
1606#[derive(Clone, Copy, Default)]
1607#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1608#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1609pub struct ButtonPressEvent {
1610    pub response_type: u8,
1611    pub detail: Button,
1612    pub sequence: u16,
1613    pub time: Timestamp,
1614    pub root: Window,
1615    pub event: Window,
1616    pub child: Window,
1617    pub root_x: i16,
1618    pub root_y: i16,
1619    pub event_x: i16,
1620    pub event_y: i16,
1621    pub state: KeyButMask,
1622    pub same_screen: bool,
1623}
1624impl_debug_if_no_extra_traits!(ButtonPressEvent, "ButtonPressEvent");
1625impl TryParse for ButtonPressEvent {
1626    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1627        let remaining = initial_value;
1628        let (response_type, remaining) = u8::try_parse(remaining)?;
1629        let (detail, remaining) = Button::try_parse(remaining)?;
1630        let (sequence, remaining) = u16::try_parse(remaining)?;
1631        let (time, remaining) = Timestamp::try_parse(remaining)?;
1632        let (root, remaining) = Window::try_parse(remaining)?;
1633        let (event, remaining) = Window::try_parse(remaining)?;
1634        let (child, remaining) = Window::try_parse(remaining)?;
1635        let (root_x, remaining) = i16::try_parse(remaining)?;
1636        let (root_y, remaining) = i16::try_parse(remaining)?;
1637        let (event_x, remaining) = i16::try_parse(remaining)?;
1638        let (event_y, remaining) = i16::try_parse(remaining)?;
1639        let (state, remaining) = u16::try_parse(remaining)?;
1640        let (same_screen, remaining) = bool::try_parse(remaining)?;
1641        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1642        let state = state.into();
1643        let result = ButtonPressEvent { response_type, detail, sequence, time, root, event, child, root_x, root_y, event_x, event_y, state, same_screen };
1644        let _ = remaining;
1645        let remaining = initial_value.get(32..)
1646            .ok_or(ParseError::InsufficientData)?;
1647        Ok((result, remaining))
1648    }
1649}
1650impl Serialize for ButtonPressEvent {
1651    type Bytes = [u8; 32];
1652    fn serialize(&self) -> [u8; 32] {
1653        let response_type_bytes = self.response_type.serialize();
1654        let detail_bytes = self.detail.serialize();
1655        let sequence_bytes = self.sequence.serialize();
1656        let time_bytes = self.time.serialize();
1657        let root_bytes = self.root.serialize();
1658        let event_bytes = self.event.serialize();
1659        let child_bytes = self.child.serialize();
1660        let root_x_bytes = self.root_x.serialize();
1661        let root_y_bytes = self.root_y.serialize();
1662        let event_x_bytes = self.event_x.serialize();
1663        let event_y_bytes = self.event_y.serialize();
1664        let state_bytes = u16::from(self.state).serialize();
1665        let same_screen_bytes = self.same_screen.serialize();
1666        [
1667            response_type_bytes[0],
1668            detail_bytes[0],
1669            sequence_bytes[0],
1670            sequence_bytes[1],
1671            time_bytes[0],
1672            time_bytes[1],
1673            time_bytes[2],
1674            time_bytes[3],
1675            root_bytes[0],
1676            root_bytes[1],
1677            root_bytes[2],
1678            root_bytes[3],
1679            event_bytes[0],
1680            event_bytes[1],
1681            event_bytes[2],
1682            event_bytes[3],
1683            child_bytes[0],
1684            child_bytes[1],
1685            child_bytes[2],
1686            child_bytes[3],
1687            root_x_bytes[0],
1688            root_x_bytes[1],
1689            root_y_bytes[0],
1690            root_y_bytes[1],
1691            event_x_bytes[0],
1692            event_x_bytes[1],
1693            event_y_bytes[0],
1694            event_y_bytes[1],
1695            state_bytes[0],
1696            state_bytes[1],
1697            same_screen_bytes[0],
1698            0,
1699        ]
1700    }
1701    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1702        bytes.reserve(32);
1703        self.response_type.serialize_into(bytes);
1704        self.detail.serialize_into(bytes);
1705        self.sequence.serialize_into(bytes);
1706        self.time.serialize_into(bytes);
1707        self.root.serialize_into(bytes);
1708        self.event.serialize_into(bytes);
1709        self.child.serialize_into(bytes);
1710        self.root_x.serialize_into(bytes);
1711        self.root_y.serialize_into(bytes);
1712        self.event_x.serialize_into(bytes);
1713        self.event_y.serialize_into(bytes);
1714        u16::from(self.state).serialize_into(bytes);
1715        self.same_screen.serialize_into(bytes);
1716        bytes.extend_from_slice(&[0; 1]);
1717    }
1718}
1719impl From<&ButtonPressEvent> for [u8; 32] {
1720    fn from(input: &ButtonPressEvent) -> Self {
1721        let response_type_bytes = input.response_type.serialize();
1722        let detail_bytes = input.detail.serialize();
1723        let sequence_bytes = input.sequence.serialize();
1724        let time_bytes = input.time.serialize();
1725        let root_bytes = input.root.serialize();
1726        let event_bytes = input.event.serialize();
1727        let child_bytes = input.child.serialize();
1728        let root_x_bytes = input.root_x.serialize();
1729        let root_y_bytes = input.root_y.serialize();
1730        let event_x_bytes = input.event_x.serialize();
1731        let event_y_bytes = input.event_y.serialize();
1732        let state_bytes = u16::from(input.state).serialize();
1733        let same_screen_bytes = input.same_screen.serialize();
1734        [
1735            response_type_bytes[0],
1736            detail_bytes[0],
1737            sequence_bytes[0],
1738            sequence_bytes[1],
1739            time_bytes[0],
1740            time_bytes[1],
1741            time_bytes[2],
1742            time_bytes[3],
1743            root_bytes[0],
1744            root_bytes[1],
1745            root_bytes[2],
1746            root_bytes[3],
1747            event_bytes[0],
1748            event_bytes[1],
1749            event_bytes[2],
1750            event_bytes[3],
1751            child_bytes[0],
1752            child_bytes[1],
1753            child_bytes[2],
1754            child_bytes[3],
1755            root_x_bytes[0],
1756            root_x_bytes[1],
1757            root_y_bytes[0],
1758            root_y_bytes[1],
1759            event_x_bytes[0],
1760            event_x_bytes[1],
1761            event_y_bytes[0],
1762            event_y_bytes[1],
1763            state_bytes[0],
1764            state_bytes[1],
1765            same_screen_bytes[0],
1766            0,
1767        ]
1768    }
1769}
1770impl From<ButtonPressEvent> for [u8; 32] {
1771    fn from(input: ButtonPressEvent) -> Self {
1772        Self::from(&input)
1773    }
1774}
1775
1776/// Opcode for the ButtonRelease event
1777pub const BUTTON_RELEASE_EVENT: u8 = 5;
1778pub type ButtonReleaseEvent = ButtonPressEvent;
1779
1780#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
1781#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1782pub struct Motion(u8);
1783impl Motion {
1784    pub const NORMAL: Self = Self(0);
1785    pub const HINT: Self = Self(1);
1786}
1787impl From<Motion> for u8 {
1788    #[inline]
1789    fn from(input: Motion) -> Self {
1790        input.0
1791    }
1792}
1793impl From<Motion> for Option<u8> {
1794    #[inline]
1795    fn from(input: Motion) -> Self {
1796        Some(input.0)
1797    }
1798}
1799impl From<Motion> for u16 {
1800    #[inline]
1801    fn from(input: Motion) -> Self {
1802        u16::from(input.0)
1803    }
1804}
1805impl From<Motion> for Option<u16> {
1806    #[inline]
1807    fn from(input: Motion) -> Self {
1808        Some(u16::from(input.0))
1809    }
1810}
1811impl From<Motion> for u32 {
1812    #[inline]
1813    fn from(input: Motion) -> Self {
1814        u32::from(input.0)
1815    }
1816}
1817impl From<Motion> for Option<u32> {
1818    #[inline]
1819    fn from(input: Motion) -> Self {
1820        Some(u32::from(input.0))
1821    }
1822}
1823impl From<u8> for Motion {
1824    #[inline]
1825    fn from(value: u8) -> Self {
1826        Self(value)
1827    }
1828}
1829impl core::fmt::Debug for Motion  {
1830    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1831        let variants = [
1832            (Self::NORMAL.0.into(), "NORMAL", "Normal"),
1833            (Self::HINT.0.into(), "HINT", "Hint"),
1834        ];
1835        pretty_print_enum(fmt, self.0.into(), &variants)
1836    }
1837}
1838
1839/// Opcode for the MotionNotify event
1840pub const MOTION_NOTIFY_EVENT: u8 = 6;
1841/// a key was pressed.
1842///
1843/// # Fields
1844///
1845/// * `detail` - The keycode (a number representing a physical key on the keyboard) of the key
1846/// which was pressed.
1847/// * `time` - Time when the event was generated (in milliseconds).
1848/// * `root` - The root window of `child`.
1849/// * `same_screen` - Whether the `event` window is on the same screen as the `root` window.
1850/// * `event_x` - If `same_screen` is true, this is the X coordinate relative to the `event`
1851/// window's origin. Otherwise, `event_x` will be set to zero.
1852/// * `event_y` - If `same_screen` is true, this is the Y coordinate relative to the `event`
1853/// window's origin. Otherwise, `event_y` will be set to zero.
1854/// * `root_x` - The X coordinate of the pointer relative to the `root` window at the time of
1855/// the event.
1856/// * `root_y` - The Y coordinate of the pointer relative to the `root` window at the time of
1857/// the event.
1858/// * `state` - The logical state of the pointer buttons and modifier keys just prior to the
1859/// event.
1860///
1861/// # See
1862///
1863/// * `GrabKey`: request
1864/// * `GrabKeyboard`: request
1865#[derive(Clone, Copy, Default)]
1866#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1867#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1868pub struct MotionNotifyEvent {
1869    pub response_type: u8,
1870    pub detail: Motion,
1871    pub sequence: u16,
1872    pub time: Timestamp,
1873    pub root: Window,
1874    pub event: Window,
1875    pub child: Window,
1876    pub root_x: i16,
1877    pub root_y: i16,
1878    pub event_x: i16,
1879    pub event_y: i16,
1880    pub state: KeyButMask,
1881    pub same_screen: bool,
1882}
1883impl_debug_if_no_extra_traits!(MotionNotifyEvent, "MotionNotifyEvent");
1884impl TryParse for MotionNotifyEvent {
1885    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1886        let remaining = initial_value;
1887        let (response_type, remaining) = u8::try_parse(remaining)?;
1888        let (detail, remaining) = u8::try_parse(remaining)?;
1889        let (sequence, remaining) = u16::try_parse(remaining)?;
1890        let (time, remaining) = Timestamp::try_parse(remaining)?;
1891        let (root, remaining) = Window::try_parse(remaining)?;
1892        let (event, remaining) = Window::try_parse(remaining)?;
1893        let (child, remaining) = Window::try_parse(remaining)?;
1894        let (root_x, remaining) = i16::try_parse(remaining)?;
1895        let (root_y, remaining) = i16::try_parse(remaining)?;
1896        let (event_x, remaining) = i16::try_parse(remaining)?;
1897        let (event_y, remaining) = i16::try_parse(remaining)?;
1898        let (state, remaining) = u16::try_parse(remaining)?;
1899        let (same_screen, remaining) = bool::try_parse(remaining)?;
1900        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1901        let detail = detail.into();
1902        let state = state.into();
1903        let result = MotionNotifyEvent { response_type, detail, sequence, time, root, event, child, root_x, root_y, event_x, event_y, state, same_screen };
1904        let _ = remaining;
1905        let remaining = initial_value.get(32..)
1906            .ok_or(ParseError::InsufficientData)?;
1907        Ok((result, remaining))
1908    }
1909}
1910impl Serialize for MotionNotifyEvent {
1911    type Bytes = [u8; 32];
1912    fn serialize(&self) -> [u8; 32] {
1913        let response_type_bytes = self.response_type.serialize();
1914        let detail_bytes = u8::from(self.detail).serialize();
1915        let sequence_bytes = self.sequence.serialize();
1916        let time_bytes = self.time.serialize();
1917        let root_bytes = self.root.serialize();
1918        let event_bytes = self.event.serialize();
1919        let child_bytes = self.child.serialize();
1920        let root_x_bytes = self.root_x.serialize();
1921        let root_y_bytes = self.root_y.serialize();
1922        let event_x_bytes = self.event_x.serialize();
1923        let event_y_bytes = self.event_y.serialize();
1924        let state_bytes = u16::from(self.state).serialize();
1925        let same_screen_bytes = self.same_screen.serialize();
1926        [
1927            response_type_bytes[0],
1928            detail_bytes[0],
1929            sequence_bytes[0],
1930            sequence_bytes[1],
1931            time_bytes[0],
1932            time_bytes[1],
1933            time_bytes[2],
1934            time_bytes[3],
1935            root_bytes[0],
1936            root_bytes[1],
1937            root_bytes[2],
1938            root_bytes[3],
1939            event_bytes[0],
1940            event_bytes[1],
1941            event_bytes[2],
1942            event_bytes[3],
1943            child_bytes[0],
1944            child_bytes[1],
1945            child_bytes[2],
1946            child_bytes[3],
1947            root_x_bytes[0],
1948            root_x_bytes[1],
1949            root_y_bytes[0],
1950            root_y_bytes[1],
1951            event_x_bytes[0],
1952            event_x_bytes[1],
1953            event_y_bytes[0],
1954            event_y_bytes[1],
1955            state_bytes[0],
1956            state_bytes[1],
1957            same_screen_bytes[0],
1958            0,
1959        ]
1960    }
1961    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1962        bytes.reserve(32);
1963        self.response_type.serialize_into(bytes);
1964        u8::from(self.detail).serialize_into(bytes);
1965        self.sequence.serialize_into(bytes);
1966        self.time.serialize_into(bytes);
1967        self.root.serialize_into(bytes);
1968        self.event.serialize_into(bytes);
1969        self.child.serialize_into(bytes);
1970        self.root_x.serialize_into(bytes);
1971        self.root_y.serialize_into(bytes);
1972        self.event_x.serialize_into(bytes);
1973        self.event_y.serialize_into(bytes);
1974        u16::from(self.state).serialize_into(bytes);
1975        self.same_screen.serialize_into(bytes);
1976        bytes.extend_from_slice(&[0; 1]);
1977    }
1978}
1979impl From<&MotionNotifyEvent> for [u8; 32] {
1980    fn from(input: &MotionNotifyEvent) -> Self {
1981        let response_type_bytes = input.response_type.serialize();
1982        let detail_bytes = u8::from(input.detail).serialize();
1983        let sequence_bytes = input.sequence.serialize();
1984        let time_bytes = input.time.serialize();
1985        let root_bytes = input.root.serialize();
1986        let event_bytes = input.event.serialize();
1987        let child_bytes = input.child.serialize();
1988        let root_x_bytes = input.root_x.serialize();
1989        let root_y_bytes = input.root_y.serialize();
1990        let event_x_bytes = input.event_x.serialize();
1991        let event_y_bytes = input.event_y.serialize();
1992        let state_bytes = u16::from(input.state).serialize();
1993        let same_screen_bytes = input.same_screen.serialize();
1994        [
1995            response_type_bytes[0],
1996            detail_bytes[0],
1997            sequence_bytes[0],
1998            sequence_bytes[1],
1999            time_bytes[0],
2000            time_bytes[1],
2001            time_bytes[2],
2002            time_bytes[3],
2003            root_bytes[0],
2004            root_bytes[1],
2005            root_bytes[2],
2006            root_bytes[3],
2007            event_bytes[0],
2008            event_bytes[1],
2009            event_bytes[2],
2010            event_bytes[3],
2011            child_bytes[0],
2012            child_bytes[1],
2013            child_bytes[2],
2014            child_bytes[3],
2015            root_x_bytes[0],
2016            root_x_bytes[1],
2017            root_y_bytes[0],
2018            root_y_bytes[1],
2019            event_x_bytes[0],
2020            event_x_bytes[1],
2021            event_y_bytes[0],
2022            event_y_bytes[1],
2023            state_bytes[0],
2024            state_bytes[1],
2025            same_screen_bytes[0],
2026            0,
2027        ]
2028    }
2029}
2030impl From<MotionNotifyEvent> for [u8; 32] {
2031    fn from(input: MotionNotifyEvent) -> Self {
2032        Self::from(&input)
2033    }
2034}
2035
2036#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
2037#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2038pub struct NotifyDetail(u8);
2039impl NotifyDetail {
2040    pub const ANCESTOR: Self = Self(0);
2041    pub const VIRTUAL: Self = Self(1);
2042    pub const INFERIOR: Self = Self(2);
2043    pub const NONLINEAR: Self = Self(3);
2044    pub const NONLINEAR_VIRTUAL: Self = Self(4);
2045    pub const POINTER: Self = Self(5);
2046    pub const POINTER_ROOT: Self = Self(6);
2047    pub const NONE: Self = Self(7);
2048}
2049impl From<NotifyDetail> for u8 {
2050    #[inline]
2051    fn from(input: NotifyDetail) -> Self {
2052        input.0
2053    }
2054}
2055impl From<NotifyDetail> for Option<u8> {
2056    #[inline]
2057    fn from(input: NotifyDetail) -> Self {
2058        Some(input.0)
2059    }
2060}
2061impl From<NotifyDetail> for u16 {
2062    #[inline]
2063    fn from(input: NotifyDetail) -> Self {
2064        u16::from(input.0)
2065    }
2066}
2067impl From<NotifyDetail> for Option<u16> {
2068    #[inline]
2069    fn from(input: NotifyDetail) -> Self {
2070        Some(u16::from(input.0))
2071    }
2072}
2073impl From<NotifyDetail> for u32 {
2074    #[inline]
2075    fn from(input: NotifyDetail) -> Self {
2076        u32::from(input.0)
2077    }
2078}
2079impl From<NotifyDetail> for Option<u32> {
2080    #[inline]
2081    fn from(input: NotifyDetail) -> Self {
2082        Some(u32::from(input.0))
2083    }
2084}
2085impl From<u8> for NotifyDetail {
2086    #[inline]
2087    fn from(value: u8) -> Self {
2088        Self(value)
2089    }
2090}
2091impl core::fmt::Debug for NotifyDetail  {
2092    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
2093        let variants = [
2094            (Self::ANCESTOR.0.into(), "ANCESTOR", "Ancestor"),
2095            (Self::VIRTUAL.0.into(), "VIRTUAL", "Virtual"),
2096            (Self::INFERIOR.0.into(), "INFERIOR", "Inferior"),
2097            (Self::NONLINEAR.0.into(), "NONLINEAR", "Nonlinear"),
2098            (Self::NONLINEAR_VIRTUAL.0.into(), "NONLINEAR_VIRTUAL", "NonlinearVirtual"),
2099            (Self::POINTER.0.into(), "POINTER", "Pointer"),
2100            (Self::POINTER_ROOT.0.into(), "POINTER_ROOT", "PointerRoot"),
2101            (Self::NONE.0.into(), "NONE", "None"),
2102        ];
2103        pretty_print_enum(fmt, self.0.into(), &variants)
2104    }
2105}
2106
2107#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
2108#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2109pub struct NotifyMode(u8);
2110impl NotifyMode {
2111    pub const NORMAL: Self = Self(0);
2112    pub const GRAB: Self = Self(1);
2113    pub const UNGRAB: Self = Self(2);
2114    pub const WHILE_GRABBED: Self = Self(3);
2115}
2116impl From<NotifyMode> for u8 {
2117    #[inline]
2118    fn from(input: NotifyMode) -> Self {
2119        input.0
2120    }
2121}
2122impl From<NotifyMode> for Option<u8> {
2123    #[inline]
2124    fn from(input: NotifyMode) -> Self {
2125        Some(input.0)
2126    }
2127}
2128impl From<NotifyMode> for u16 {
2129    #[inline]
2130    fn from(input: NotifyMode) -> Self {
2131        u16::from(input.0)
2132    }
2133}
2134impl From<NotifyMode> for Option<u16> {
2135    #[inline]
2136    fn from(input: NotifyMode) -> Self {
2137        Some(u16::from(input.0))
2138    }
2139}
2140impl From<NotifyMode> for u32 {
2141    #[inline]
2142    fn from(input: NotifyMode) -> Self {
2143        u32::from(input.0)
2144    }
2145}
2146impl From<NotifyMode> for Option<u32> {
2147    #[inline]
2148    fn from(input: NotifyMode) -> Self {
2149        Some(u32::from(input.0))
2150    }
2151}
2152impl From<u8> for NotifyMode {
2153    #[inline]
2154    fn from(value: u8) -> Self {
2155        Self(value)
2156    }
2157}
2158impl core::fmt::Debug for NotifyMode  {
2159    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
2160        let variants = [
2161            (Self::NORMAL.0.into(), "NORMAL", "Normal"),
2162            (Self::GRAB.0.into(), "GRAB", "Grab"),
2163            (Self::UNGRAB.0.into(), "UNGRAB", "Ungrab"),
2164            (Self::WHILE_GRABBED.0.into(), "WHILE_GRABBED", "WhileGrabbed"),
2165        ];
2166        pretty_print_enum(fmt, self.0.into(), &variants)
2167    }
2168}
2169
2170/// Opcode for the EnterNotify event
2171pub const ENTER_NOTIFY_EVENT: u8 = 7;
2172/// the pointer is in a different window.
2173///
2174/// # Fields
2175///
2176/// * `event` - The window on which the event was generated.
2177/// * `child` - If the `event` window has subwindows and the final pointer position is in one
2178/// of them, then `child` is set to that subwindow, `XCB_WINDOW_NONE` otherwise.
2179/// * `root` - The root window for the final cursor position.
2180/// * `root_x` - The pointer X coordinate relative to `root`'s origin at the time of the event.
2181/// * `root_y` - The pointer Y coordinate relative to `root`'s origin at the time of the event.
2182/// * `event_x` - If `event` is on the same screen as `root`, this is the pointer X coordinate
2183/// relative to the event window's origin.
2184/// * `event_y` - If `event` is on the same screen as `root`, this is the pointer Y coordinate
2185/// relative to the event window's origin.
2186/// * `mode` -
2187#[derive(Clone, Copy, Default)]
2188#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2189#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2190pub struct EnterNotifyEvent {
2191    pub response_type: u8,
2192    pub detail: NotifyDetail,
2193    pub sequence: u16,
2194    pub time: Timestamp,
2195    pub root: Window,
2196    pub event: Window,
2197    pub child: Window,
2198    pub root_x: i16,
2199    pub root_y: i16,
2200    pub event_x: i16,
2201    pub event_y: i16,
2202    pub state: KeyButMask,
2203    pub mode: NotifyMode,
2204    pub same_screen_focus: u8,
2205}
2206impl_debug_if_no_extra_traits!(EnterNotifyEvent, "EnterNotifyEvent");
2207impl TryParse for EnterNotifyEvent {
2208    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2209        let remaining = initial_value;
2210        let (response_type, remaining) = u8::try_parse(remaining)?;
2211        let (detail, remaining) = u8::try_parse(remaining)?;
2212        let (sequence, remaining) = u16::try_parse(remaining)?;
2213        let (time, remaining) = Timestamp::try_parse(remaining)?;
2214        let (root, remaining) = Window::try_parse(remaining)?;
2215        let (event, remaining) = Window::try_parse(remaining)?;
2216        let (child, remaining) = Window::try_parse(remaining)?;
2217        let (root_x, remaining) = i16::try_parse(remaining)?;
2218        let (root_y, remaining) = i16::try_parse(remaining)?;
2219        let (event_x, remaining) = i16::try_parse(remaining)?;
2220        let (event_y, remaining) = i16::try_parse(remaining)?;
2221        let (state, remaining) = u16::try_parse(remaining)?;
2222        let (mode, remaining) = u8::try_parse(remaining)?;
2223        let (same_screen_focus, remaining) = u8::try_parse(remaining)?;
2224        let detail = detail.into();
2225        let state = state.into();
2226        let mode = mode.into();
2227        let result = EnterNotifyEvent { response_type, detail, sequence, time, root, event, child, root_x, root_y, event_x, event_y, state, mode, same_screen_focus };
2228        let _ = remaining;
2229        let remaining = initial_value.get(32..)
2230            .ok_or(ParseError::InsufficientData)?;
2231        Ok((result, remaining))
2232    }
2233}
2234impl Serialize for EnterNotifyEvent {
2235    type Bytes = [u8; 32];
2236    fn serialize(&self) -> [u8; 32] {
2237        let response_type_bytes = self.response_type.serialize();
2238        let detail_bytes = u8::from(self.detail).serialize();
2239        let sequence_bytes = self.sequence.serialize();
2240        let time_bytes = self.time.serialize();
2241        let root_bytes = self.root.serialize();
2242        let event_bytes = self.event.serialize();
2243        let child_bytes = self.child.serialize();
2244        let root_x_bytes = self.root_x.serialize();
2245        let root_y_bytes = self.root_y.serialize();
2246        let event_x_bytes = self.event_x.serialize();
2247        let event_y_bytes = self.event_y.serialize();
2248        let state_bytes = u16::from(self.state).serialize();
2249        let mode_bytes = u8::from(self.mode).serialize();
2250        let same_screen_focus_bytes = self.same_screen_focus.serialize();
2251        [
2252            response_type_bytes[0],
2253            detail_bytes[0],
2254            sequence_bytes[0],
2255            sequence_bytes[1],
2256            time_bytes[0],
2257            time_bytes[1],
2258            time_bytes[2],
2259            time_bytes[3],
2260            root_bytes[0],
2261            root_bytes[1],
2262            root_bytes[2],
2263            root_bytes[3],
2264            event_bytes[0],
2265            event_bytes[1],
2266            event_bytes[2],
2267            event_bytes[3],
2268            child_bytes[0],
2269            child_bytes[1],
2270            child_bytes[2],
2271            child_bytes[3],
2272            root_x_bytes[0],
2273            root_x_bytes[1],
2274            root_y_bytes[0],
2275            root_y_bytes[1],
2276            event_x_bytes[0],
2277            event_x_bytes[1],
2278            event_y_bytes[0],
2279            event_y_bytes[1],
2280            state_bytes[0],
2281            state_bytes[1],
2282            mode_bytes[0],
2283            same_screen_focus_bytes[0],
2284        ]
2285    }
2286    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2287        bytes.reserve(32);
2288        self.response_type.serialize_into(bytes);
2289        u8::from(self.detail).serialize_into(bytes);
2290        self.sequence.serialize_into(bytes);
2291        self.time.serialize_into(bytes);
2292        self.root.serialize_into(bytes);
2293        self.event.serialize_into(bytes);
2294        self.child.serialize_into(bytes);
2295        self.root_x.serialize_into(bytes);
2296        self.root_y.serialize_into(bytes);
2297        self.event_x.serialize_into(bytes);
2298        self.event_y.serialize_into(bytes);
2299        u16::from(self.state).serialize_into(bytes);
2300        u8::from(self.mode).serialize_into(bytes);
2301        self.same_screen_focus.serialize_into(bytes);
2302    }
2303}
2304impl From<&EnterNotifyEvent> for [u8; 32] {
2305    fn from(input: &EnterNotifyEvent) -> Self {
2306        let response_type_bytes = input.response_type.serialize();
2307        let detail_bytes = u8::from(input.detail).serialize();
2308        let sequence_bytes = input.sequence.serialize();
2309        let time_bytes = input.time.serialize();
2310        let root_bytes = input.root.serialize();
2311        let event_bytes = input.event.serialize();
2312        let child_bytes = input.child.serialize();
2313        let root_x_bytes = input.root_x.serialize();
2314        let root_y_bytes = input.root_y.serialize();
2315        let event_x_bytes = input.event_x.serialize();
2316        let event_y_bytes = input.event_y.serialize();
2317        let state_bytes = u16::from(input.state).serialize();
2318        let mode_bytes = u8::from(input.mode).serialize();
2319        let same_screen_focus_bytes = input.same_screen_focus.serialize();
2320        [
2321            response_type_bytes[0],
2322            detail_bytes[0],
2323            sequence_bytes[0],
2324            sequence_bytes[1],
2325            time_bytes[0],
2326            time_bytes[1],
2327            time_bytes[2],
2328            time_bytes[3],
2329            root_bytes[0],
2330            root_bytes[1],
2331            root_bytes[2],
2332            root_bytes[3],
2333            event_bytes[0],
2334            event_bytes[1],
2335            event_bytes[2],
2336            event_bytes[3],
2337            child_bytes[0],
2338            child_bytes[1],
2339            child_bytes[2],
2340            child_bytes[3],
2341            root_x_bytes[0],
2342            root_x_bytes[1],
2343            root_y_bytes[0],
2344            root_y_bytes[1],
2345            event_x_bytes[0],
2346            event_x_bytes[1],
2347            event_y_bytes[0],
2348            event_y_bytes[1],
2349            state_bytes[0],
2350            state_bytes[1],
2351            mode_bytes[0],
2352            same_screen_focus_bytes[0],
2353        ]
2354    }
2355}
2356impl From<EnterNotifyEvent> for [u8; 32] {
2357    fn from(input: EnterNotifyEvent) -> Self {
2358        Self::from(&input)
2359    }
2360}
2361
2362/// Opcode for the LeaveNotify event
2363pub const LEAVE_NOTIFY_EVENT: u8 = 8;
2364pub type LeaveNotifyEvent = EnterNotifyEvent;
2365
2366/// Opcode for the FocusIn event
2367pub const FOCUS_IN_EVENT: u8 = 9;
2368/// NOT YET DOCUMENTED.
2369///
2370/// # Fields
2371///
2372/// * `event` - The window on which the focus event was generated. This is the window used by
2373/// the X server to report the event.
2374/// * `detail` -
2375/// * `mode` -
2376#[derive(Clone, Copy, Default)]
2377#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2378#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2379pub struct FocusInEvent {
2380    pub response_type: u8,
2381    pub detail: NotifyDetail,
2382    pub sequence: u16,
2383    pub event: Window,
2384    pub mode: NotifyMode,
2385}
2386impl_debug_if_no_extra_traits!(FocusInEvent, "FocusInEvent");
2387impl TryParse for FocusInEvent {
2388    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2389        let remaining = initial_value;
2390        let (response_type, remaining) = u8::try_parse(remaining)?;
2391        let (detail, remaining) = u8::try_parse(remaining)?;
2392        let (sequence, remaining) = u16::try_parse(remaining)?;
2393        let (event, remaining) = Window::try_parse(remaining)?;
2394        let (mode, remaining) = u8::try_parse(remaining)?;
2395        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
2396        let detail = detail.into();
2397        let mode = mode.into();
2398        let result = FocusInEvent { response_type, detail, sequence, event, mode };
2399        let _ = remaining;
2400        let remaining = initial_value.get(32..)
2401            .ok_or(ParseError::InsufficientData)?;
2402        Ok((result, remaining))
2403    }
2404}
2405impl Serialize for FocusInEvent {
2406    type Bytes = [u8; 12];
2407    fn serialize(&self) -> [u8; 12] {
2408        let response_type_bytes = self.response_type.serialize();
2409        let detail_bytes = u8::from(self.detail).serialize();
2410        let sequence_bytes = self.sequence.serialize();
2411        let event_bytes = self.event.serialize();
2412        let mode_bytes = u8::from(self.mode).serialize();
2413        [
2414            response_type_bytes[0],
2415            detail_bytes[0],
2416            sequence_bytes[0],
2417            sequence_bytes[1],
2418            event_bytes[0],
2419            event_bytes[1],
2420            event_bytes[2],
2421            event_bytes[3],
2422            mode_bytes[0],
2423            0,
2424            0,
2425            0,
2426        ]
2427    }
2428    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2429        bytes.reserve(12);
2430        self.response_type.serialize_into(bytes);
2431        u8::from(self.detail).serialize_into(bytes);
2432        self.sequence.serialize_into(bytes);
2433        self.event.serialize_into(bytes);
2434        u8::from(self.mode).serialize_into(bytes);
2435        bytes.extend_from_slice(&[0; 3]);
2436    }
2437}
2438impl From<&FocusInEvent> for [u8; 32] {
2439    fn from(input: &FocusInEvent) -> Self {
2440        let response_type_bytes = input.response_type.serialize();
2441        let detail_bytes = u8::from(input.detail).serialize();
2442        let sequence_bytes = input.sequence.serialize();
2443        let event_bytes = input.event.serialize();
2444        let mode_bytes = u8::from(input.mode).serialize();
2445        [
2446            response_type_bytes[0],
2447            detail_bytes[0],
2448            sequence_bytes[0],
2449            sequence_bytes[1],
2450            event_bytes[0],
2451            event_bytes[1],
2452            event_bytes[2],
2453            event_bytes[3],
2454            mode_bytes[0],
2455            0,
2456            0,
2457            0,
2458            // trailing padding
2459            0,
2460            0,
2461            0,
2462            0,
2463            0,
2464            0,
2465            0,
2466            0,
2467            0,
2468            0,
2469            0,
2470            0,
2471            0,
2472            0,
2473            0,
2474            0,
2475            0,
2476            0,
2477            0,
2478            0,
2479        ]
2480    }
2481}
2482impl From<FocusInEvent> for [u8; 32] {
2483    fn from(input: FocusInEvent) -> Self {
2484        Self::from(&input)
2485    }
2486}
2487
2488/// Opcode for the FocusOut event
2489pub const FOCUS_OUT_EVENT: u8 = 10;
2490pub type FocusOutEvent = FocusInEvent;
2491
2492/// Opcode for the KeymapNotify event
2493pub const KEYMAP_NOTIFY_EVENT: u8 = 11;
2494#[derive(Clone, Copy, Default)]
2495#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2496#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2497pub struct KeymapNotifyEvent {
2498    pub response_type: u8,
2499    pub keys: [u8; 31],
2500}
2501impl_debug_if_no_extra_traits!(KeymapNotifyEvent, "KeymapNotifyEvent");
2502impl TryParse for KeymapNotifyEvent {
2503    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2504        let remaining = initial_value;
2505        let (response_type, remaining) = u8::try_parse(remaining)?;
2506        let (keys, remaining) = crate::x11_utils::parse_u8_array::<31>(remaining)?;
2507        let result = KeymapNotifyEvent { response_type, keys };
2508        let _ = remaining;
2509        let remaining = initial_value.get(32..)
2510            .ok_or(ParseError::InsufficientData)?;
2511        Ok((result, remaining))
2512    }
2513}
2514impl Serialize for KeymapNotifyEvent {
2515    type Bytes = [u8; 32];
2516    fn serialize(&self) -> [u8; 32] {
2517        let response_type_bytes = self.response_type.serialize();
2518        [
2519            response_type_bytes[0],
2520            self.keys[0],
2521            self.keys[1],
2522            self.keys[2],
2523            self.keys[3],
2524            self.keys[4],
2525            self.keys[5],
2526            self.keys[6],
2527            self.keys[7],
2528            self.keys[8],
2529            self.keys[9],
2530            self.keys[10],
2531            self.keys[11],
2532            self.keys[12],
2533            self.keys[13],
2534            self.keys[14],
2535            self.keys[15],
2536            self.keys[16],
2537            self.keys[17],
2538            self.keys[18],
2539            self.keys[19],
2540            self.keys[20],
2541            self.keys[21],
2542            self.keys[22],
2543            self.keys[23],
2544            self.keys[24],
2545            self.keys[25],
2546            self.keys[26],
2547            self.keys[27],
2548            self.keys[28],
2549            self.keys[29],
2550            self.keys[30],
2551        ]
2552    }
2553    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2554        bytes.reserve(32);
2555        self.response_type.serialize_into(bytes);
2556        bytes.extend_from_slice(&self.keys);
2557    }
2558}
2559impl From<&KeymapNotifyEvent> for [u8; 32] {
2560    fn from(input: &KeymapNotifyEvent) -> Self {
2561        let response_type_bytes = input.response_type.serialize();
2562        [
2563            response_type_bytes[0],
2564            input.keys[0],
2565            input.keys[1],
2566            input.keys[2],
2567            input.keys[3],
2568            input.keys[4],
2569            input.keys[5],
2570            input.keys[6],
2571            input.keys[7],
2572            input.keys[8],
2573            input.keys[9],
2574            input.keys[10],
2575            input.keys[11],
2576            input.keys[12],
2577            input.keys[13],
2578            input.keys[14],
2579            input.keys[15],
2580            input.keys[16],
2581            input.keys[17],
2582            input.keys[18],
2583            input.keys[19],
2584            input.keys[20],
2585            input.keys[21],
2586            input.keys[22],
2587            input.keys[23],
2588            input.keys[24],
2589            input.keys[25],
2590            input.keys[26],
2591            input.keys[27],
2592            input.keys[28],
2593            input.keys[29],
2594            input.keys[30],
2595        ]
2596    }
2597}
2598impl From<KeymapNotifyEvent> for [u8; 32] {
2599    fn from(input: KeymapNotifyEvent) -> Self {
2600        Self::from(&input)
2601    }
2602}
2603
2604/// Opcode for the Expose event
2605pub const EXPOSE_EVENT: u8 = 12;
2606/// NOT YET DOCUMENTED.
2607///
2608/// # Fields
2609///
2610/// * `window` - The exposed (damaged) window.
2611/// * `x` - The X coordinate of the left-upper corner of the exposed rectangle, relative to
2612/// the `window`'s origin.
2613/// * `y` - The Y coordinate of the left-upper corner of the exposed rectangle, relative to
2614/// the `window`'s origin.
2615/// * `width` - The width of the exposed rectangle.
2616/// * `height` - The height of the exposed rectangle.
2617/// * `count` - The amount of `Expose` events following this one. Simple applications that do
2618/// not want to optimize redisplay by distinguishing between subareas of its window
2619/// can just ignore all Expose events with nonzero counts and perform full
2620/// redisplays on events with zero counts.
2621#[derive(Clone, Copy, Default)]
2622#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2623#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2624pub struct ExposeEvent {
2625    pub response_type: u8,
2626    pub sequence: u16,
2627    pub window: Window,
2628    pub x: u16,
2629    pub y: u16,
2630    pub width: u16,
2631    pub height: u16,
2632    pub count: u16,
2633}
2634impl_debug_if_no_extra_traits!(ExposeEvent, "ExposeEvent");
2635impl TryParse for ExposeEvent {
2636    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2637        let remaining = initial_value;
2638        let (response_type, remaining) = u8::try_parse(remaining)?;
2639        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2640        let (sequence, remaining) = u16::try_parse(remaining)?;
2641        let (window, remaining) = Window::try_parse(remaining)?;
2642        let (x, remaining) = u16::try_parse(remaining)?;
2643        let (y, remaining) = u16::try_parse(remaining)?;
2644        let (width, remaining) = u16::try_parse(remaining)?;
2645        let (height, remaining) = u16::try_parse(remaining)?;
2646        let (count, remaining) = u16::try_parse(remaining)?;
2647        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
2648        let result = ExposeEvent { response_type, sequence, window, x, y, width, height, count };
2649        let _ = remaining;
2650        let remaining = initial_value.get(32..)
2651            .ok_or(ParseError::InsufficientData)?;
2652        Ok((result, remaining))
2653    }
2654}
2655impl Serialize for ExposeEvent {
2656    type Bytes = [u8; 20];
2657    fn serialize(&self) -> [u8; 20] {
2658        let response_type_bytes = self.response_type.serialize();
2659        let sequence_bytes = self.sequence.serialize();
2660        let window_bytes = self.window.serialize();
2661        let x_bytes = self.x.serialize();
2662        let y_bytes = self.y.serialize();
2663        let width_bytes = self.width.serialize();
2664        let height_bytes = self.height.serialize();
2665        let count_bytes = self.count.serialize();
2666        [
2667            response_type_bytes[0],
2668            0,
2669            sequence_bytes[0],
2670            sequence_bytes[1],
2671            window_bytes[0],
2672            window_bytes[1],
2673            window_bytes[2],
2674            window_bytes[3],
2675            x_bytes[0],
2676            x_bytes[1],
2677            y_bytes[0],
2678            y_bytes[1],
2679            width_bytes[0],
2680            width_bytes[1],
2681            height_bytes[0],
2682            height_bytes[1],
2683            count_bytes[0],
2684            count_bytes[1],
2685            0,
2686            0,
2687        ]
2688    }
2689    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2690        bytes.reserve(20);
2691        self.response_type.serialize_into(bytes);
2692        bytes.extend_from_slice(&[0; 1]);
2693        self.sequence.serialize_into(bytes);
2694        self.window.serialize_into(bytes);
2695        self.x.serialize_into(bytes);
2696        self.y.serialize_into(bytes);
2697        self.width.serialize_into(bytes);
2698        self.height.serialize_into(bytes);
2699        self.count.serialize_into(bytes);
2700        bytes.extend_from_slice(&[0; 2]);
2701    }
2702}
2703impl From<&ExposeEvent> for [u8; 32] {
2704    fn from(input: &ExposeEvent) -> Self {
2705        let response_type_bytes = input.response_type.serialize();
2706        let sequence_bytes = input.sequence.serialize();
2707        let window_bytes = input.window.serialize();
2708        let x_bytes = input.x.serialize();
2709        let y_bytes = input.y.serialize();
2710        let width_bytes = input.width.serialize();
2711        let height_bytes = input.height.serialize();
2712        let count_bytes = input.count.serialize();
2713        [
2714            response_type_bytes[0],
2715            0,
2716            sequence_bytes[0],
2717            sequence_bytes[1],
2718            window_bytes[0],
2719            window_bytes[1],
2720            window_bytes[2],
2721            window_bytes[3],
2722            x_bytes[0],
2723            x_bytes[1],
2724            y_bytes[0],
2725            y_bytes[1],
2726            width_bytes[0],
2727            width_bytes[1],
2728            height_bytes[0],
2729            height_bytes[1],
2730            count_bytes[0],
2731            count_bytes[1],
2732            0,
2733            0,
2734            // trailing padding
2735            0,
2736            0,
2737            0,
2738            0,
2739            0,
2740            0,
2741            0,
2742            0,
2743            0,
2744            0,
2745            0,
2746            0,
2747        ]
2748    }
2749}
2750impl From<ExposeEvent> for [u8; 32] {
2751    fn from(input: ExposeEvent) -> Self {
2752        Self::from(&input)
2753    }
2754}
2755
2756/// Opcode for the GraphicsExposure event
2757pub const GRAPHICS_EXPOSURE_EVENT: u8 = 13;
2758#[derive(Clone, Copy, Default)]
2759#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2760#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2761pub struct GraphicsExposureEvent {
2762    pub response_type: u8,
2763    pub sequence: u16,
2764    pub drawable: Drawable,
2765    pub x: u16,
2766    pub y: u16,
2767    pub width: u16,
2768    pub height: u16,
2769    pub minor_opcode: u16,
2770    pub count: u16,
2771    pub major_opcode: u8,
2772}
2773impl_debug_if_no_extra_traits!(GraphicsExposureEvent, "GraphicsExposureEvent");
2774impl TryParse for GraphicsExposureEvent {
2775    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2776        let remaining = initial_value;
2777        let (response_type, remaining) = u8::try_parse(remaining)?;
2778        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2779        let (sequence, remaining) = u16::try_parse(remaining)?;
2780        let (drawable, remaining) = Drawable::try_parse(remaining)?;
2781        let (x, remaining) = u16::try_parse(remaining)?;
2782        let (y, remaining) = u16::try_parse(remaining)?;
2783        let (width, remaining) = u16::try_parse(remaining)?;
2784        let (height, remaining) = u16::try_parse(remaining)?;
2785        let (minor_opcode, remaining) = u16::try_parse(remaining)?;
2786        let (count, remaining) = u16::try_parse(remaining)?;
2787        let (major_opcode, remaining) = u8::try_parse(remaining)?;
2788        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
2789        let result = GraphicsExposureEvent { response_type, sequence, drawable, x, y, width, height, minor_opcode, count, major_opcode };
2790        let _ = remaining;
2791        let remaining = initial_value.get(32..)
2792            .ok_or(ParseError::InsufficientData)?;
2793        Ok((result, remaining))
2794    }
2795}
2796impl Serialize for GraphicsExposureEvent {
2797    type Bytes = [u8; 24];
2798    fn serialize(&self) -> [u8; 24] {
2799        let response_type_bytes = self.response_type.serialize();
2800        let sequence_bytes = self.sequence.serialize();
2801        let drawable_bytes = self.drawable.serialize();
2802        let x_bytes = self.x.serialize();
2803        let y_bytes = self.y.serialize();
2804        let width_bytes = self.width.serialize();
2805        let height_bytes = self.height.serialize();
2806        let minor_opcode_bytes = self.minor_opcode.serialize();
2807        let count_bytes = self.count.serialize();
2808        let major_opcode_bytes = self.major_opcode.serialize();
2809        [
2810            response_type_bytes[0],
2811            0,
2812            sequence_bytes[0],
2813            sequence_bytes[1],
2814            drawable_bytes[0],
2815            drawable_bytes[1],
2816            drawable_bytes[2],
2817            drawable_bytes[3],
2818            x_bytes[0],
2819            x_bytes[1],
2820            y_bytes[0],
2821            y_bytes[1],
2822            width_bytes[0],
2823            width_bytes[1],
2824            height_bytes[0],
2825            height_bytes[1],
2826            minor_opcode_bytes[0],
2827            minor_opcode_bytes[1],
2828            count_bytes[0],
2829            count_bytes[1],
2830            major_opcode_bytes[0],
2831            0,
2832            0,
2833            0,
2834        ]
2835    }
2836    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2837        bytes.reserve(24);
2838        self.response_type.serialize_into(bytes);
2839        bytes.extend_from_slice(&[0; 1]);
2840        self.sequence.serialize_into(bytes);
2841        self.drawable.serialize_into(bytes);
2842        self.x.serialize_into(bytes);
2843        self.y.serialize_into(bytes);
2844        self.width.serialize_into(bytes);
2845        self.height.serialize_into(bytes);
2846        self.minor_opcode.serialize_into(bytes);
2847        self.count.serialize_into(bytes);
2848        self.major_opcode.serialize_into(bytes);
2849        bytes.extend_from_slice(&[0; 3]);
2850    }
2851}
2852impl From<&GraphicsExposureEvent> for [u8; 32] {
2853    fn from(input: &GraphicsExposureEvent) -> Self {
2854        let response_type_bytes = input.response_type.serialize();
2855        let sequence_bytes = input.sequence.serialize();
2856        let drawable_bytes = input.drawable.serialize();
2857        let x_bytes = input.x.serialize();
2858        let y_bytes = input.y.serialize();
2859        let width_bytes = input.width.serialize();
2860        let height_bytes = input.height.serialize();
2861        let minor_opcode_bytes = input.minor_opcode.serialize();
2862        let count_bytes = input.count.serialize();
2863        let major_opcode_bytes = input.major_opcode.serialize();
2864        [
2865            response_type_bytes[0],
2866            0,
2867            sequence_bytes[0],
2868            sequence_bytes[1],
2869            drawable_bytes[0],
2870            drawable_bytes[1],
2871            drawable_bytes[2],
2872            drawable_bytes[3],
2873            x_bytes[0],
2874            x_bytes[1],
2875            y_bytes[0],
2876            y_bytes[1],
2877            width_bytes[0],
2878            width_bytes[1],
2879            height_bytes[0],
2880            height_bytes[1],
2881            minor_opcode_bytes[0],
2882            minor_opcode_bytes[1],
2883            count_bytes[0],
2884            count_bytes[1],
2885            major_opcode_bytes[0],
2886            0,
2887            0,
2888            0,
2889            // trailing padding
2890            0,
2891            0,
2892            0,
2893            0,
2894            0,
2895            0,
2896            0,
2897            0,
2898        ]
2899    }
2900}
2901impl From<GraphicsExposureEvent> for [u8; 32] {
2902    fn from(input: GraphicsExposureEvent) -> Self {
2903        Self::from(&input)
2904    }
2905}
2906
2907/// Opcode for the NoExposure event
2908pub const NO_EXPOSURE_EVENT: u8 = 14;
2909#[derive(Clone, Copy, Default)]
2910#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2911#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2912pub struct NoExposureEvent {
2913    pub response_type: u8,
2914    pub sequence: u16,
2915    pub drawable: Drawable,
2916    pub minor_opcode: u16,
2917    pub major_opcode: u8,
2918}
2919impl_debug_if_no_extra_traits!(NoExposureEvent, "NoExposureEvent");
2920impl TryParse for NoExposureEvent {
2921    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2922        let remaining = initial_value;
2923        let (response_type, remaining) = u8::try_parse(remaining)?;
2924        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2925        let (sequence, remaining) = u16::try_parse(remaining)?;
2926        let (drawable, remaining) = Drawable::try_parse(remaining)?;
2927        let (minor_opcode, remaining) = u16::try_parse(remaining)?;
2928        let (major_opcode, remaining) = u8::try_parse(remaining)?;
2929        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2930        let result = NoExposureEvent { response_type, sequence, drawable, minor_opcode, major_opcode };
2931        let _ = remaining;
2932        let remaining = initial_value.get(32..)
2933            .ok_or(ParseError::InsufficientData)?;
2934        Ok((result, remaining))
2935    }
2936}
2937impl Serialize for NoExposureEvent {
2938    type Bytes = [u8; 12];
2939    fn serialize(&self) -> [u8; 12] {
2940        let response_type_bytes = self.response_type.serialize();
2941        let sequence_bytes = self.sequence.serialize();
2942        let drawable_bytes = self.drawable.serialize();
2943        let minor_opcode_bytes = self.minor_opcode.serialize();
2944        let major_opcode_bytes = self.major_opcode.serialize();
2945        [
2946            response_type_bytes[0],
2947            0,
2948            sequence_bytes[0],
2949            sequence_bytes[1],
2950            drawable_bytes[0],
2951            drawable_bytes[1],
2952            drawable_bytes[2],
2953            drawable_bytes[3],
2954            minor_opcode_bytes[0],
2955            minor_opcode_bytes[1],
2956            major_opcode_bytes[0],
2957            0,
2958        ]
2959    }
2960    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2961        bytes.reserve(12);
2962        self.response_type.serialize_into(bytes);
2963        bytes.extend_from_slice(&[0; 1]);
2964        self.sequence.serialize_into(bytes);
2965        self.drawable.serialize_into(bytes);
2966        self.minor_opcode.serialize_into(bytes);
2967        self.major_opcode.serialize_into(bytes);
2968        bytes.extend_from_slice(&[0; 1]);
2969    }
2970}
2971impl From<&NoExposureEvent> for [u8; 32] {
2972    fn from(input: &NoExposureEvent) -> Self {
2973        let response_type_bytes = input.response_type.serialize();
2974        let sequence_bytes = input.sequence.serialize();
2975        let drawable_bytes = input.drawable.serialize();
2976        let minor_opcode_bytes = input.minor_opcode.serialize();
2977        let major_opcode_bytes = input.major_opcode.serialize();
2978        [
2979            response_type_bytes[0],
2980            0,
2981            sequence_bytes[0],
2982            sequence_bytes[1],
2983            drawable_bytes[0],
2984            drawable_bytes[1],
2985            drawable_bytes[2],
2986            drawable_bytes[3],
2987            minor_opcode_bytes[0],
2988            minor_opcode_bytes[1],
2989            major_opcode_bytes[0],
2990            0,
2991            // trailing padding
2992            0,
2993            0,
2994            0,
2995            0,
2996            0,
2997            0,
2998            0,
2999            0,
3000            0,
3001            0,
3002            0,
3003            0,
3004            0,
3005            0,
3006            0,
3007            0,
3008            0,
3009            0,
3010            0,
3011            0,
3012        ]
3013    }
3014}
3015impl From<NoExposureEvent> for [u8; 32] {
3016    fn from(input: NoExposureEvent) -> Self {
3017        Self::from(&input)
3018    }
3019}
3020
3021#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
3022#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3023pub struct Visibility(u8);
3024impl Visibility {
3025    pub const UNOBSCURED: Self = Self(0);
3026    pub const PARTIALLY_OBSCURED: Self = Self(1);
3027    pub const FULLY_OBSCURED: Self = Self(2);
3028}
3029impl From<Visibility> for u8 {
3030    #[inline]
3031    fn from(input: Visibility) -> Self {
3032        input.0
3033    }
3034}
3035impl From<Visibility> for Option<u8> {
3036    #[inline]
3037    fn from(input: Visibility) -> Self {
3038        Some(input.0)
3039    }
3040}
3041impl From<Visibility> for u16 {
3042    #[inline]
3043    fn from(input: Visibility) -> Self {
3044        u16::from(input.0)
3045    }
3046}
3047impl From<Visibility> for Option<u16> {
3048    #[inline]
3049    fn from(input: Visibility) -> Self {
3050        Some(u16::from(input.0))
3051    }
3052}
3053impl From<Visibility> for u32 {
3054    #[inline]
3055    fn from(input: Visibility) -> Self {
3056        u32::from(input.0)
3057    }
3058}
3059impl From<Visibility> for Option<u32> {
3060    #[inline]
3061    fn from(input: Visibility) -> Self {
3062        Some(u32::from(input.0))
3063    }
3064}
3065impl From<u8> for Visibility {
3066    #[inline]
3067    fn from(value: u8) -> Self {
3068        Self(value)
3069    }
3070}
3071impl core::fmt::Debug for Visibility  {
3072    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
3073        let variants = [
3074            (Self::UNOBSCURED.0.into(), "UNOBSCURED", "Unobscured"),
3075            (Self::PARTIALLY_OBSCURED.0.into(), "PARTIALLY_OBSCURED", "PartiallyObscured"),
3076            (Self::FULLY_OBSCURED.0.into(), "FULLY_OBSCURED", "FullyObscured"),
3077        ];
3078        pretty_print_enum(fmt, self.0.into(), &variants)
3079    }
3080}
3081
3082/// Opcode for the VisibilityNotify event
3083pub const VISIBILITY_NOTIFY_EVENT: u8 = 15;
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 VisibilityNotifyEvent {
3088    pub response_type: u8,
3089    pub sequence: u16,
3090    pub window: Window,
3091    pub state: Visibility,
3092}
3093impl_debug_if_no_extra_traits!(VisibilityNotifyEvent, "VisibilityNotifyEvent");
3094impl TryParse for VisibilityNotifyEvent {
3095    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3096        let remaining = initial_value;
3097        let (response_type, remaining) = u8::try_parse(remaining)?;
3098        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
3099        let (sequence, remaining) = u16::try_parse(remaining)?;
3100        let (window, remaining) = Window::try_parse(remaining)?;
3101        let (state, remaining) = u8::try_parse(remaining)?;
3102        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
3103        let state = state.into();
3104        let result = VisibilityNotifyEvent { response_type, sequence, window, state };
3105        let _ = remaining;
3106        let remaining = initial_value.get(32..)
3107            .ok_or(ParseError::InsufficientData)?;
3108        Ok((result, remaining))
3109    }
3110}
3111impl Serialize for VisibilityNotifyEvent {
3112    type Bytes = [u8; 12];
3113    fn serialize(&self) -> [u8; 12] {
3114        let response_type_bytes = self.response_type.serialize();
3115        let sequence_bytes = self.sequence.serialize();
3116        let window_bytes = self.window.serialize();
3117        let state_bytes = u8::from(self.state).serialize();
3118        [
3119            response_type_bytes[0],
3120            0,
3121            sequence_bytes[0],
3122            sequence_bytes[1],
3123            window_bytes[0],
3124            window_bytes[1],
3125            window_bytes[2],
3126            window_bytes[3],
3127            state_bytes[0],
3128            0,
3129            0,
3130            0,
3131        ]
3132    }
3133    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3134        bytes.reserve(12);
3135        self.response_type.serialize_into(bytes);
3136        bytes.extend_from_slice(&[0; 1]);
3137        self.sequence.serialize_into(bytes);
3138        self.window.serialize_into(bytes);
3139        u8::from(self.state).serialize_into(bytes);
3140        bytes.extend_from_slice(&[0; 3]);
3141    }
3142}
3143impl From<&VisibilityNotifyEvent> for [u8; 32] {
3144    fn from(input: &VisibilityNotifyEvent) -> Self {
3145        let response_type_bytes = input.response_type.serialize();
3146        let sequence_bytes = input.sequence.serialize();
3147        let window_bytes = input.window.serialize();
3148        let state_bytes = u8::from(input.state).serialize();
3149        [
3150            response_type_bytes[0],
3151            0,
3152            sequence_bytes[0],
3153            sequence_bytes[1],
3154            window_bytes[0],
3155            window_bytes[1],
3156            window_bytes[2],
3157            window_bytes[3],
3158            state_bytes[0],
3159            0,
3160            0,
3161            0,
3162            // trailing padding
3163            0,
3164            0,
3165            0,
3166            0,
3167            0,
3168            0,
3169            0,
3170            0,
3171            0,
3172            0,
3173            0,
3174            0,
3175            0,
3176            0,
3177            0,
3178            0,
3179            0,
3180            0,
3181            0,
3182            0,
3183        ]
3184    }
3185}
3186impl From<VisibilityNotifyEvent> for [u8; 32] {
3187    fn from(input: VisibilityNotifyEvent) -> Self {
3188        Self::from(&input)
3189    }
3190}
3191
3192/// Opcode for the CreateNotify event
3193pub const CREATE_NOTIFY_EVENT: u8 = 16;
3194#[derive(Clone, Copy, Default)]
3195#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3196#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3197pub struct CreateNotifyEvent {
3198    pub response_type: u8,
3199    pub sequence: u16,
3200    pub parent: Window,
3201    pub window: Window,
3202    pub x: i16,
3203    pub y: i16,
3204    pub width: u16,
3205    pub height: u16,
3206    pub border_width: u16,
3207    pub override_redirect: bool,
3208}
3209impl_debug_if_no_extra_traits!(CreateNotifyEvent, "CreateNotifyEvent");
3210impl TryParse for CreateNotifyEvent {
3211    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3212        let remaining = initial_value;
3213        let (response_type, remaining) = u8::try_parse(remaining)?;
3214        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
3215        let (sequence, remaining) = u16::try_parse(remaining)?;
3216        let (parent, remaining) = Window::try_parse(remaining)?;
3217        let (window, remaining) = Window::try_parse(remaining)?;
3218        let (x, remaining) = i16::try_parse(remaining)?;
3219        let (y, remaining) = i16::try_parse(remaining)?;
3220        let (width, remaining) = u16::try_parse(remaining)?;
3221        let (height, remaining) = u16::try_parse(remaining)?;
3222        let (border_width, remaining) = u16::try_parse(remaining)?;
3223        let (override_redirect, remaining) = bool::try_parse(remaining)?;
3224        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
3225        let result = CreateNotifyEvent { response_type, sequence, parent, window, x, y, width, height, border_width, override_redirect };
3226        let _ = remaining;
3227        let remaining = initial_value.get(32..)
3228            .ok_or(ParseError::InsufficientData)?;
3229        Ok((result, remaining))
3230    }
3231}
3232impl Serialize for CreateNotifyEvent {
3233    type Bytes = [u8; 24];
3234    fn serialize(&self) -> [u8; 24] {
3235        let response_type_bytes = self.response_type.serialize();
3236        let sequence_bytes = self.sequence.serialize();
3237        let parent_bytes = self.parent.serialize();
3238        let window_bytes = self.window.serialize();
3239        let x_bytes = self.x.serialize();
3240        let y_bytes = self.y.serialize();
3241        let width_bytes = self.width.serialize();
3242        let height_bytes = self.height.serialize();
3243        let border_width_bytes = self.border_width.serialize();
3244        let override_redirect_bytes = self.override_redirect.serialize();
3245        [
3246            response_type_bytes[0],
3247            0,
3248            sequence_bytes[0],
3249            sequence_bytes[1],
3250            parent_bytes[0],
3251            parent_bytes[1],
3252            parent_bytes[2],
3253            parent_bytes[3],
3254            window_bytes[0],
3255            window_bytes[1],
3256            window_bytes[2],
3257            window_bytes[3],
3258            x_bytes[0],
3259            x_bytes[1],
3260            y_bytes[0],
3261            y_bytes[1],
3262            width_bytes[0],
3263            width_bytes[1],
3264            height_bytes[0],
3265            height_bytes[1],
3266            border_width_bytes[0],
3267            border_width_bytes[1],
3268            override_redirect_bytes[0],
3269            0,
3270        ]
3271    }
3272    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3273        bytes.reserve(24);
3274        self.response_type.serialize_into(bytes);
3275        bytes.extend_from_slice(&[0; 1]);
3276        self.sequence.serialize_into(bytes);
3277        self.parent.serialize_into(bytes);
3278        self.window.serialize_into(bytes);
3279        self.x.serialize_into(bytes);
3280        self.y.serialize_into(bytes);
3281        self.width.serialize_into(bytes);
3282        self.height.serialize_into(bytes);
3283        self.border_width.serialize_into(bytes);
3284        self.override_redirect.serialize_into(bytes);
3285        bytes.extend_from_slice(&[0; 1]);
3286    }
3287}
3288impl From<&CreateNotifyEvent> for [u8; 32] {
3289    fn from(input: &CreateNotifyEvent) -> Self {
3290        let response_type_bytes = input.response_type.serialize();
3291        let sequence_bytes = input.sequence.serialize();
3292        let parent_bytes = input.parent.serialize();
3293        let window_bytes = input.window.serialize();
3294        let x_bytes = input.x.serialize();
3295        let y_bytes = input.y.serialize();
3296        let width_bytes = input.width.serialize();
3297        let height_bytes = input.height.serialize();
3298        let border_width_bytes = input.border_width.serialize();
3299        let override_redirect_bytes = input.override_redirect.serialize();
3300        [
3301            response_type_bytes[0],
3302            0,
3303            sequence_bytes[0],
3304            sequence_bytes[1],
3305            parent_bytes[0],
3306            parent_bytes[1],
3307            parent_bytes[2],
3308            parent_bytes[3],
3309            window_bytes[0],
3310            window_bytes[1],
3311            window_bytes[2],
3312            window_bytes[3],
3313            x_bytes[0],
3314            x_bytes[1],
3315            y_bytes[0],
3316            y_bytes[1],
3317            width_bytes[0],
3318            width_bytes[1],
3319            height_bytes[0],
3320            height_bytes[1],
3321            border_width_bytes[0],
3322            border_width_bytes[1],
3323            override_redirect_bytes[0],
3324            0,
3325            // trailing padding
3326            0,
3327            0,
3328            0,
3329            0,
3330            0,
3331            0,
3332            0,
3333            0,
3334        ]
3335    }
3336}
3337impl From<CreateNotifyEvent> for [u8; 32] {
3338    fn from(input: CreateNotifyEvent) -> Self {
3339        Self::from(&input)
3340    }
3341}
3342
3343/// Opcode for the DestroyNotify event
3344pub const DESTROY_NOTIFY_EVENT: u8 = 17;
3345/// a window is destroyed.
3346///
3347/// # Fields
3348///
3349/// * `event` - The reconfigured window or its parent, depending on whether `StructureNotify`
3350/// or `SubstructureNotify` was selected.
3351/// * `window` - The window that is destroyed.
3352///
3353/// # See
3354///
3355/// * `DestroyWindow`: request
3356#[derive(Clone, Copy, Default)]
3357#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3358#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3359pub struct DestroyNotifyEvent {
3360    pub response_type: u8,
3361    pub sequence: u16,
3362    pub event: Window,
3363    pub window: Window,
3364}
3365impl_debug_if_no_extra_traits!(DestroyNotifyEvent, "DestroyNotifyEvent");
3366impl TryParse for DestroyNotifyEvent {
3367    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3368        let remaining = initial_value;
3369        let (response_type, remaining) = u8::try_parse(remaining)?;
3370        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
3371        let (sequence, remaining) = u16::try_parse(remaining)?;
3372        let (event, remaining) = Window::try_parse(remaining)?;
3373        let (window, remaining) = Window::try_parse(remaining)?;
3374        let result = DestroyNotifyEvent { response_type, sequence, event, window };
3375        let _ = remaining;
3376        let remaining = initial_value.get(32..)
3377            .ok_or(ParseError::InsufficientData)?;
3378        Ok((result, remaining))
3379    }
3380}
3381impl Serialize for DestroyNotifyEvent {
3382    type Bytes = [u8; 12];
3383    fn serialize(&self) -> [u8; 12] {
3384        let response_type_bytes = self.response_type.serialize();
3385        let sequence_bytes = self.sequence.serialize();
3386        let event_bytes = self.event.serialize();
3387        let window_bytes = self.window.serialize();
3388        [
3389            response_type_bytes[0],
3390            0,
3391            sequence_bytes[0],
3392            sequence_bytes[1],
3393            event_bytes[0],
3394            event_bytes[1],
3395            event_bytes[2],
3396            event_bytes[3],
3397            window_bytes[0],
3398            window_bytes[1],
3399            window_bytes[2],
3400            window_bytes[3],
3401        ]
3402    }
3403    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3404        bytes.reserve(12);
3405        self.response_type.serialize_into(bytes);
3406        bytes.extend_from_slice(&[0; 1]);
3407        self.sequence.serialize_into(bytes);
3408        self.event.serialize_into(bytes);
3409        self.window.serialize_into(bytes);
3410    }
3411}
3412impl From<&DestroyNotifyEvent> for [u8; 32] {
3413    fn from(input: &DestroyNotifyEvent) -> Self {
3414        let response_type_bytes = input.response_type.serialize();
3415        let sequence_bytes = input.sequence.serialize();
3416        let event_bytes = input.event.serialize();
3417        let window_bytes = input.window.serialize();
3418        [
3419            response_type_bytes[0],
3420            0,
3421            sequence_bytes[0],
3422            sequence_bytes[1],
3423            event_bytes[0],
3424            event_bytes[1],
3425            event_bytes[2],
3426            event_bytes[3],
3427            window_bytes[0],
3428            window_bytes[1],
3429            window_bytes[2],
3430            window_bytes[3],
3431            // trailing padding
3432            0,
3433            0,
3434            0,
3435            0,
3436            0,
3437            0,
3438            0,
3439            0,
3440            0,
3441            0,
3442            0,
3443            0,
3444            0,
3445            0,
3446            0,
3447            0,
3448            0,
3449            0,
3450            0,
3451            0,
3452        ]
3453    }
3454}
3455impl From<DestroyNotifyEvent> for [u8; 32] {
3456    fn from(input: DestroyNotifyEvent) -> Self {
3457        Self::from(&input)
3458    }
3459}
3460
3461/// Opcode for the UnmapNotify event
3462pub const UNMAP_NOTIFY_EVENT: u8 = 18;
3463/// a window is unmapped.
3464///
3465/// # Fields
3466///
3467/// * `event` - The reconfigured window or its parent, depending on whether `StructureNotify`
3468/// or `SubstructureNotify` was selected.
3469/// * `window` - The window that was unmapped.
3470/// * `from_configure` - Set to 1 if the event was generated as a result of a resizing of the window's
3471/// parent when `window` had a win_gravity of `UnmapGravity`.
3472///
3473/// # See
3474///
3475/// * `UnmapWindow`: request
3476#[derive(Clone, Copy, Default)]
3477#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3478#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3479pub struct UnmapNotifyEvent {
3480    pub response_type: u8,
3481    pub sequence: u16,
3482    pub event: Window,
3483    pub window: Window,
3484    pub from_configure: bool,
3485}
3486impl_debug_if_no_extra_traits!(UnmapNotifyEvent, "UnmapNotifyEvent");
3487impl TryParse for UnmapNotifyEvent {
3488    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3489        let remaining = initial_value;
3490        let (response_type, remaining) = u8::try_parse(remaining)?;
3491        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
3492        let (sequence, remaining) = u16::try_parse(remaining)?;
3493        let (event, remaining) = Window::try_parse(remaining)?;
3494        let (window, remaining) = Window::try_parse(remaining)?;
3495        let (from_configure, remaining) = bool::try_parse(remaining)?;
3496        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
3497        let result = UnmapNotifyEvent { response_type, sequence, event, window, from_configure };
3498        let _ = remaining;
3499        let remaining = initial_value.get(32..)
3500            .ok_or(ParseError::InsufficientData)?;
3501        Ok((result, remaining))
3502    }
3503}
3504impl Serialize for UnmapNotifyEvent {
3505    type Bytes = [u8; 16];
3506    fn serialize(&self) -> [u8; 16] {
3507        let response_type_bytes = self.response_type.serialize();
3508        let sequence_bytes = self.sequence.serialize();
3509        let event_bytes = self.event.serialize();
3510        let window_bytes = self.window.serialize();
3511        let from_configure_bytes = self.from_configure.serialize();
3512        [
3513            response_type_bytes[0],
3514            0,
3515            sequence_bytes[0],
3516            sequence_bytes[1],
3517            event_bytes[0],
3518            event_bytes[1],
3519            event_bytes[2],
3520            event_bytes[3],
3521            window_bytes[0],
3522            window_bytes[1],
3523            window_bytes[2],
3524            window_bytes[3],
3525            from_configure_bytes[0],
3526            0,
3527            0,
3528            0,
3529        ]
3530    }
3531    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3532        bytes.reserve(16);
3533        self.response_type.serialize_into(bytes);
3534        bytes.extend_from_slice(&[0; 1]);
3535        self.sequence.serialize_into(bytes);
3536        self.event.serialize_into(bytes);
3537        self.window.serialize_into(bytes);
3538        self.from_configure.serialize_into(bytes);
3539        bytes.extend_from_slice(&[0; 3]);
3540    }
3541}
3542impl From<&UnmapNotifyEvent> for [u8; 32] {
3543    fn from(input: &UnmapNotifyEvent) -> Self {
3544        let response_type_bytes = input.response_type.serialize();
3545        let sequence_bytes = input.sequence.serialize();
3546        let event_bytes = input.event.serialize();
3547        let window_bytes = input.window.serialize();
3548        let from_configure_bytes = input.from_configure.serialize();
3549        [
3550            response_type_bytes[0],
3551            0,
3552            sequence_bytes[0],
3553            sequence_bytes[1],
3554            event_bytes[0],
3555            event_bytes[1],
3556            event_bytes[2],
3557            event_bytes[3],
3558            window_bytes[0],
3559            window_bytes[1],
3560            window_bytes[2],
3561            window_bytes[3],
3562            from_configure_bytes[0],
3563            0,
3564            0,
3565            0,
3566            // trailing padding
3567            0,
3568            0,
3569            0,
3570            0,
3571            0,
3572            0,
3573            0,
3574            0,
3575            0,
3576            0,
3577            0,
3578            0,
3579            0,
3580            0,
3581            0,
3582            0,
3583        ]
3584    }
3585}
3586impl From<UnmapNotifyEvent> for [u8; 32] {
3587    fn from(input: UnmapNotifyEvent) -> Self {
3588        Self::from(&input)
3589    }
3590}
3591
3592/// Opcode for the MapNotify event
3593pub const MAP_NOTIFY_EVENT: u8 = 19;
3594/// a window was mapped.
3595///
3596/// # Fields
3597///
3598/// * `event` - The window which was mapped or its parent, depending on whether
3599/// `StructureNotify` or `SubstructureNotify` was selected.
3600/// * `window` - The window that was mapped.
3601/// * `override_redirect` - Window managers should ignore this window if `override_redirect` is 1.
3602///
3603/// # See
3604///
3605/// * `MapWindow`: request
3606#[derive(Clone, Copy, Default)]
3607#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3608#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3609pub struct MapNotifyEvent {
3610    pub response_type: u8,
3611    pub sequence: u16,
3612    pub event: Window,
3613    pub window: Window,
3614    pub override_redirect: bool,
3615}
3616impl_debug_if_no_extra_traits!(MapNotifyEvent, "MapNotifyEvent");
3617impl TryParse for MapNotifyEvent {
3618    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3619        let remaining = initial_value;
3620        let (response_type, remaining) = u8::try_parse(remaining)?;
3621        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
3622        let (sequence, remaining) = u16::try_parse(remaining)?;
3623        let (event, remaining) = Window::try_parse(remaining)?;
3624        let (window, remaining) = Window::try_parse(remaining)?;
3625        let (override_redirect, remaining) = bool::try_parse(remaining)?;
3626        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
3627        let result = MapNotifyEvent { response_type, sequence, event, window, override_redirect };
3628        let _ = remaining;
3629        let remaining = initial_value.get(32..)
3630            .ok_or(ParseError::InsufficientData)?;
3631        Ok((result, remaining))
3632    }
3633}
3634impl Serialize for MapNotifyEvent {
3635    type Bytes = [u8; 16];
3636    fn serialize(&self) -> [u8; 16] {
3637        let response_type_bytes = self.response_type.serialize();
3638        let sequence_bytes = self.sequence.serialize();
3639        let event_bytes = self.event.serialize();
3640        let window_bytes = self.window.serialize();
3641        let override_redirect_bytes = self.override_redirect.serialize();
3642        [
3643            response_type_bytes[0],
3644            0,
3645            sequence_bytes[0],
3646            sequence_bytes[1],
3647            event_bytes[0],
3648            event_bytes[1],
3649            event_bytes[2],
3650            event_bytes[3],
3651            window_bytes[0],
3652            window_bytes[1],
3653            window_bytes[2],
3654            window_bytes[3],
3655            override_redirect_bytes[0],
3656            0,
3657            0,
3658            0,
3659        ]
3660    }
3661    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3662        bytes.reserve(16);
3663        self.response_type.serialize_into(bytes);
3664        bytes.extend_from_slice(&[0; 1]);
3665        self.sequence.serialize_into(bytes);
3666        self.event.serialize_into(bytes);
3667        self.window.serialize_into(bytes);
3668        self.override_redirect.serialize_into(bytes);
3669        bytes.extend_from_slice(&[0; 3]);
3670    }
3671}
3672impl From<&MapNotifyEvent> for [u8; 32] {
3673    fn from(input: &MapNotifyEvent) -> Self {
3674        let response_type_bytes = input.response_type.serialize();
3675        let sequence_bytes = input.sequence.serialize();
3676        let event_bytes = input.event.serialize();
3677        let window_bytes = input.window.serialize();
3678        let override_redirect_bytes = input.override_redirect.serialize();
3679        [
3680            response_type_bytes[0],
3681            0,
3682            sequence_bytes[0],
3683            sequence_bytes[1],
3684            event_bytes[0],
3685            event_bytes[1],
3686            event_bytes[2],
3687            event_bytes[3],
3688            window_bytes[0],
3689            window_bytes[1],
3690            window_bytes[2],
3691            window_bytes[3],
3692            override_redirect_bytes[0],
3693            0,
3694            0,
3695            0,
3696            // trailing padding
3697            0,
3698            0,
3699            0,
3700            0,
3701            0,
3702            0,
3703            0,
3704            0,
3705            0,
3706            0,
3707            0,
3708            0,
3709            0,
3710            0,
3711            0,
3712            0,
3713        ]
3714    }
3715}
3716impl From<MapNotifyEvent> for [u8; 32] {
3717    fn from(input: MapNotifyEvent) -> Self {
3718        Self::from(&input)
3719    }
3720}
3721
3722/// Opcode for the MapRequest event
3723pub const MAP_REQUEST_EVENT: u8 = 20;
3724/// window wants to be mapped.
3725///
3726/// # Fields
3727///
3728/// * `parent` - The parent of `window`.
3729/// * `window` - The window to be mapped.
3730///
3731/// # See
3732///
3733/// * `MapWindow`: request
3734#[derive(Clone, Copy, Default)]
3735#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3736#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3737pub struct MapRequestEvent {
3738    pub response_type: u8,
3739    pub sequence: u16,
3740    pub parent: Window,
3741    pub window: Window,
3742}
3743impl_debug_if_no_extra_traits!(MapRequestEvent, "MapRequestEvent");
3744impl TryParse for MapRequestEvent {
3745    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3746        let remaining = initial_value;
3747        let (response_type, remaining) = u8::try_parse(remaining)?;
3748        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
3749        let (sequence, remaining) = u16::try_parse(remaining)?;
3750        let (parent, remaining) = Window::try_parse(remaining)?;
3751        let (window, remaining) = Window::try_parse(remaining)?;
3752        let result = MapRequestEvent { response_type, sequence, parent, window };
3753        let _ = remaining;
3754        let remaining = initial_value.get(32..)
3755            .ok_or(ParseError::InsufficientData)?;
3756        Ok((result, remaining))
3757    }
3758}
3759impl Serialize for MapRequestEvent {
3760    type Bytes = [u8; 12];
3761    fn serialize(&self) -> [u8; 12] {
3762        let response_type_bytes = self.response_type.serialize();
3763        let sequence_bytes = self.sequence.serialize();
3764        let parent_bytes = self.parent.serialize();
3765        let window_bytes = self.window.serialize();
3766        [
3767            response_type_bytes[0],
3768            0,
3769            sequence_bytes[0],
3770            sequence_bytes[1],
3771            parent_bytes[0],
3772            parent_bytes[1],
3773            parent_bytes[2],
3774            parent_bytes[3],
3775            window_bytes[0],
3776            window_bytes[1],
3777            window_bytes[2],
3778            window_bytes[3],
3779        ]
3780    }
3781    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3782        bytes.reserve(12);
3783        self.response_type.serialize_into(bytes);
3784        bytes.extend_from_slice(&[0; 1]);
3785        self.sequence.serialize_into(bytes);
3786        self.parent.serialize_into(bytes);
3787        self.window.serialize_into(bytes);
3788    }
3789}
3790impl From<&MapRequestEvent> for [u8; 32] {
3791    fn from(input: &MapRequestEvent) -> Self {
3792        let response_type_bytes = input.response_type.serialize();
3793        let sequence_bytes = input.sequence.serialize();
3794        let parent_bytes = input.parent.serialize();
3795        let window_bytes = input.window.serialize();
3796        [
3797            response_type_bytes[0],
3798            0,
3799            sequence_bytes[0],
3800            sequence_bytes[1],
3801            parent_bytes[0],
3802            parent_bytes[1],
3803            parent_bytes[2],
3804            parent_bytes[3],
3805            window_bytes[0],
3806            window_bytes[1],
3807            window_bytes[2],
3808            window_bytes[3],
3809            // trailing padding
3810            0,
3811            0,
3812            0,
3813            0,
3814            0,
3815            0,
3816            0,
3817            0,
3818            0,
3819            0,
3820            0,
3821            0,
3822            0,
3823            0,
3824            0,
3825            0,
3826            0,
3827            0,
3828            0,
3829            0,
3830        ]
3831    }
3832}
3833impl From<MapRequestEvent> for [u8; 32] {
3834    fn from(input: MapRequestEvent) -> Self {
3835        Self::from(&input)
3836    }
3837}
3838
3839/// Opcode for the ReparentNotify event
3840pub const REPARENT_NOTIFY_EVENT: u8 = 21;
3841#[derive(Clone, Copy, Default)]
3842#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3843#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3844pub struct ReparentNotifyEvent {
3845    pub response_type: u8,
3846    pub sequence: u16,
3847    pub event: Window,
3848    pub window: Window,
3849    pub parent: Window,
3850    pub x: i16,
3851    pub y: i16,
3852    pub override_redirect: bool,
3853}
3854impl_debug_if_no_extra_traits!(ReparentNotifyEvent, "ReparentNotifyEvent");
3855impl TryParse for ReparentNotifyEvent {
3856    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3857        let remaining = initial_value;
3858        let (response_type, remaining) = u8::try_parse(remaining)?;
3859        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
3860        let (sequence, remaining) = u16::try_parse(remaining)?;
3861        let (event, remaining) = Window::try_parse(remaining)?;
3862        let (window, remaining) = Window::try_parse(remaining)?;
3863        let (parent, remaining) = Window::try_parse(remaining)?;
3864        let (x, remaining) = i16::try_parse(remaining)?;
3865        let (y, remaining) = i16::try_parse(remaining)?;
3866        let (override_redirect, remaining) = bool::try_parse(remaining)?;
3867        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
3868        let result = ReparentNotifyEvent { response_type, sequence, event, window, parent, x, y, override_redirect };
3869        let _ = remaining;
3870        let remaining = initial_value.get(32..)
3871            .ok_or(ParseError::InsufficientData)?;
3872        Ok((result, remaining))
3873    }
3874}
3875impl Serialize for ReparentNotifyEvent {
3876    type Bytes = [u8; 24];
3877    fn serialize(&self) -> [u8; 24] {
3878        let response_type_bytes = self.response_type.serialize();
3879        let sequence_bytes = self.sequence.serialize();
3880        let event_bytes = self.event.serialize();
3881        let window_bytes = self.window.serialize();
3882        let parent_bytes = self.parent.serialize();
3883        let x_bytes = self.x.serialize();
3884        let y_bytes = self.y.serialize();
3885        let override_redirect_bytes = self.override_redirect.serialize();
3886        [
3887            response_type_bytes[0],
3888            0,
3889            sequence_bytes[0],
3890            sequence_bytes[1],
3891            event_bytes[0],
3892            event_bytes[1],
3893            event_bytes[2],
3894            event_bytes[3],
3895            window_bytes[0],
3896            window_bytes[1],
3897            window_bytes[2],
3898            window_bytes[3],
3899            parent_bytes[0],
3900            parent_bytes[1],
3901            parent_bytes[2],
3902            parent_bytes[3],
3903            x_bytes[0],
3904            x_bytes[1],
3905            y_bytes[0],
3906            y_bytes[1],
3907            override_redirect_bytes[0],
3908            0,
3909            0,
3910            0,
3911        ]
3912    }
3913    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3914        bytes.reserve(24);
3915        self.response_type.serialize_into(bytes);
3916        bytes.extend_from_slice(&[0; 1]);
3917        self.sequence.serialize_into(bytes);
3918        self.event.serialize_into(bytes);
3919        self.window.serialize_into(bytes);
3920        self.parent.serialize_into(bytes);
3921        self.x.serialize_into(bytes);
3922        self.y.serialize_into(bytes);
3923        self.override_redirect.serialize_into(bytes);
3924        bytes.extend_from_slice(&[0; 3]);
3925    }
3926}
3927impl From<&ReparentNotifyEvent> for [u8; 32] {
3928    fn from(input: &ReparentNotifyEvent) -> Self {
3929        let response_type_bytes = input.response_type.serialize();
3930        let sequence_bytes = input.sequence.serialize();
3931        let event_bytes = input.event.serialize();
3932        let window_bytes = input.window.serialize();
3933        let parent_bytes = input.parent.serialize();
3934        let x_bytes = input.x.serialize();
3935        let y_bytes = input.y.serialize();
3936        let override_redirect_bytes = input.override_redirect.serialize();
3937        [
3938            response_type_bytes[0],
3939            0,
3940            sequence_bytes[0],
3941            sequence_bytes[1],
3942            event_bytes[0],
3943            event_bytes[1],
3944            event_bytes[2],
3945            event_bytes[3],
3946            window_bytes[0],
3947            window_bytes[1],
3948            window_bytes[2],
3949            window_bytes[3],
3950            parent_bytes[0],
3951            parent_bytes[1],
3952            parent_bytes[2],
3953            parent_bytes[3],
3954            x_bytes[0],
3955            x_bytes[1],
3956            y_bytes[0],
3957            y_bytes[1],
3958            override_redirect_bytes[0],
3959            0,
3960            0,
3961            0,
3962            // trailing padding
3963            0,
3964            0,
3965            0,
3966            0,
3967            0,
3968            0,
3969            0,
3970            0,
3971        ]
3972    }
3973}
3974impl From<ReparentNotifyEvent> for [u8; 32] {
3975    fn from(input: ReparentNotifyEvent) -> Self {
3976        Self::from(&input)
3977    }
3978}
3979
3980/// Opcode for the ConfigureNotify event
3981pub const CONFIGURE_NOTIFY_EVENT: u8 = 22;
3982/// NOT YET DOCUMENTED.
3983///
3984/// # Fields
3985///
3986/// * `event` - The reconfigured window or its parent, depending on whether `StructureNotify`
3987/// or `SubstructureNotify` was selected.
3988/// * `window` - The window whose size, position, border, and/or stacking order was changed.
3989/// * `above_sibling` - If `XCB_NONE`, the `window` is on the bottom of the stack with respect to
3990/// sibling windows. However, if set to a sibling window, the `window` is placed on
3991/// top of this sibling window.
3992/// * `x` - The X coordinate of the upper-left outside corner of `window`, relative to the
3993/// parent window's origin.
3994/// * `y` - The Y coordinate of the upper-left outside corner of `window`, relative to the
3995/// parent window's origin.
3996/// * `width` - The inside width of `window`, not including the border.
3997/// * `height` - The inside height of `window`, not including the border.
3998/// * `border_width` - The border width of `window`.
3999/// * `override_redirect` - Window managers should ignore this window if `override_redirect` is 1.
4000///
4001/// # See
4002///
4003/// * `FreeColormap`: request
4004#[derive(Clone, Copy, Default)]
4005#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4006#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4007pub struct ConfigureNotifyEvent {
4008    pub response_type: u8,
4009    pub sequence: u16,
4010    pub event: Window,
4011    pub window: Window,
4012    pub above_sibling: Window,
4013    pub x: i16,
4014    pub y: i16,
4015    pub width: u16,
4016    pub height: u16,
4017    pub border_width: u16,
4018    pub override_redirect: bool,
4019}
4020impl_debug_if_no_extra_traits!(ConfigureNotifyEvent, "ConfigureNotifyEvent");
4021impl TryParse for ConfigureNotifyEvent {
4022    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4023        let remaining = initial_value;
4024        let (response_type, remaining) = u8::try_parse(remaining)?;
4025        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
4026        let (sequence, remaining) = u16::try_parse(remaining)?;
4027        let (event, remaining) = Window::try_parse(remaining)?;
4028        let (window, remaining) = Window::try_parse(remaining)?;
4029        let (above_sibling, remaining) = Window::try_parse(remaining)?;
4030        let (x, remaining) = i16::try_parse(remaining)?;
4031        let (y, remaining) = i16::try_parse(remaining)?;
4032        let (width, remaining) = u16::try_parse(remaining)?;
4033        let (height, remaining) = u16::try_parse(remaining)?;
4034        let (border_width, remaining) = u16::try_parse(remaining)?;
4035        let (override_redirect, remaining) = bool::try_parse(remaining)?;
4036        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
4037        let result = ConfigureNotifyEvent { response_type, sequence, event, window, above_sibling, x, y, width, height, border_width, override_redirect };
4038        let _ = remaining;
4039        let remaining = initial_value.get(32..)
4040            .ok_or(ParseError::InsufficientData)?;
4041        Ok((result, remaining))
4042    }
4043}
4044impl Serialize for ConfigureNotifyEvent {
4045    type Bytes = [u8; 28];
4046    fn serialize(&self) -> [u8; 28] {
4047        let response_type_bytes = self.response_type.serialize();
4048        let sequence_bytes = self.sequence.serialize();
4049        let event_bytes = self.event.serialize();
4050        let window_bytes = self.window.serialize();
4051        let above_sibling_bytes = self.above_sibling.serialize();
4052        let x_bytes = self.x.serialize();
4053        let y_bytes = self.y.serialize();
4054        let width_bytes = self.width.serialize();
4055        let height_bytes = self.height.serialize();
4056        let border_width_bytes = self.border_width.serialize();
4057        let override_redirect_bytes = self.override_redirect.serialize();
4058        [
4059            response_type_bytes[0],
4060            0,
4061            sequence_bytes[0],
4062            sequence_bytes[1],
4063            event_bytes[0],
4064            event_bytes[1],
4065            event_bytes[2],
4066            event_bytes[3],
4067            window_bytes[0],
4068            window_bytes[1],
4069            window_bytes[2],
4070            window_bytes[3],
4071            above_sibling_bytes[0],
4072            above_sibling_bytes[1],
4073            above_sibling_bytes[2],
4074            above_sibling_bytes[3],
4075            x_bytes[0],
4076            x_bytes[1],
4077            y_bytes[0],
4078            y_bytes[1],
4079            width_bytes[0],
4080            width_bytes[1],
4081            height_bytes[0],
4082            height_bytes[1],
4083            border_width_bytes[0],
4084            border_width_bytes[1],
4085            override_redirect_bytes[0],
4086            0,
4087        ]
4088    }
4089    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4090        bytes.reserve(28);
4091        self.response_type.serialize_into(bytes);
4092        bytes.extend_from_slice(&[0; 1]);
4093        self.sequence.serialize_into(bytes);
4094        self.event.serialize_into(bytes);
4095        self.window.serialize_into(bytes);
4096        self.above_sibling.serialize_into(bytes);
4097        self.x.serialize_into(bytes);
4098        self.y.serialize_into(bytes);
4099        self.width.serialize_into(bytes);
4100        self.height.serialize_into(bytes);
4101        self.border_width.serialize_into(bytes);
4102        self.override_redirect.serialize_into(bytes);
4103        bytes.extend_from_slice(&[0; 1]);
4104    }
4105}
4106impl From<&ConfigureNotifyEvent> for [u8; 32] {
4107    fn from(input: &ConfigureNotifyEvent) -> Self {
4108        let response_type_bytes = input.response_type.serialize();
4109        let sequence_bytes = input.sequence.serialize();
4110        let event_bytes = input.event.serialize();
4111        let window_bytes = input.window.serialize();
4112        let above_sibling_bytes = input.above_sibling.serialize();
4113        let x_bytes = input.x.serialize();
4114        let y_bytes = input.y.serialize();
4115        let width_bytes = input.width.serialize();
4116        let height_bytes = input.height.serialize();
4117        let border_width_bytes = input.border_width.serialize();
4118        let override_redirect_bytes = input.override_redirect.serialize();
4119        [
4120            response_type_bytes[0],
4121            0,
4122            sequence_bytes[0],
4123            sequence_bytes[1],
4124            event_bytes[0],
4125            event_bytes[1],
4126            event_bytes[2],
4127            event_bytes[3],
4128            window_bytes[0],
4129            window_bytes[1],
4130            window_bytes[2],
4131            window_bytes[3],
4132            above_sibling_bytes[0],
4133            above_sibling_bytes[1],
4134            above_sibling_bytes[2],
4135            above_sibling_bytes[3],
4136            x_bytes[0],
4137            x_bytes[1],
4138            y_bytes[0],
4139            y_bytes[1],
4140            width_bytes[0],
4141            width_bytes[1],
4142            height_bytes[0],
4143            height_bytes[1],
4144            border_width_bytes[0],
4145            border_width_bytes[1],
4146            override_redirect_bytes[0],
4147            0,
4148            // trailing padding
4149            0,
4150            0,
4151            0,
4152            0,
4153        ]
4154    }
4155}
4156impl From<ConfigureNotifyEvent> for [u8; 32] {
4157    fn from(input: ConfigureNotifyEvent) -> Self {
4158        Self::from(&input)
4159    }
4160}
4161
4162/// Opcode for the ConfigureRequest event
4163pub const CONFIGURE_REQUEST_EVENT: u8 = 23;
4164#[derive(Clone, Copy, Default)]
4165#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4166#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4167pub struct ConfigureRequestEvent {
4168    pub response_type: u8,
4169    pub stack_mode: StackMode,
4170    pub sequence: u16,
4171    pub parent: Window,
4172    pub window: Window,
4173    pub sibling: Window,
4174    pub x: i16,
4175    pub y: i16,
4176    pub width: u16,
4177    pub height: u16,
4178    pub border_width: u16,
4179    pub value_mask: ConfigWindow,
4180}
4181impl_debug_if_no_extra_traits!(ConfigureRequestEvent, "ConfigureRequestEvent");
4182impl TryParse for ConfigureRequestEvent {
4183    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4184        let remaining = initial_value;
4185        let (response_type, remaining) = u8::try_parse(remaining)?;
4186        let (stack_mode, remaining) = u8::try_parse(remaining)?;
4187        let (sequence, remaining) = u16::try_parse(remaining)?;
4188        let (parent, remaining) = Window::try_parse(remaining)?;
4189        let (window, remaining) = Window::try_parse(remaining)?;
4190        let (sibling, remaining) = Window::try_parse(remaining)?;
4191        let (x, remaining) = i16::try_parse(remaining)?;
4192        let (y, remaining) = i16::try_parse(remaining)?;
4193        let (width, remaining) = u16::try_parse(remaining)?;
4194        let (height, remaining) = u16::try_parse(remaining)?;
4195        let (border_width, remaining) = u16::try_parse(remaining)?;
4196        let (value_mask, remaining) = u16::try_parse(remaining)?;
4197        let stack_mode = stack_mode.into();
4198        let value_mask = value_mask.into();
4199        let result = ConfigureRequestEvent { response_type, stack_mode, sequence, parent, window, sibling, x, y, width, height, border_width, value_mask };
4200        let _ = remaining;
4201        let remaining = initial_value.get(32..)
4202            .ok_or(ParseError::InsufficientData)?;
4203        Ok((result, remaining))
4204    }
4205}
4206impl Serialize for ConfigureRequestEvent {
4207    type Bytes = [u8; 28];
4208    fn serialize(&self) -> [u8; 28] {
4209        let response_type_bytes = self.response_type.serialize();
4210        let stack_mode_bytes = (u32::from(self.stack_mode) as u8).serialize();
4211        let sequence_bytes = self.sequence.serialize();
4212        let parent_bytes = self.parent.serialize();
4213        let window_bytes = self.window.serialize();
4214        let sibling_bytes = self.sibling.serialize();
4215        let x_bytes = self.x.serialize();
4216        let y_bytes = self.y.serialize();
4217        let width_bytes = self.width.serialize();
4218        let height_bytes = self.height.serialize();
4219        let border_width_bytes = self.border_width.serialize();
4220        let value_mask_bytes = u16::from(self.value_mask).serialize();
4221        [
4222            response_type_bytes[0],
4223            stack_mode_bytes[0],
4224            sequence_bytes[0],
4225            sequence_bytes[1],
4226            parent_bytes[0],
4227            parent_bytes[1],
4228            parent_bytes[2],
4229            parent_bytes[3],
4230            window_bytes[0],
4231            window_bytes[1],
4232            window_bytes[2],
4233            window_bytes[3],
4234            sibling_bytes[0],
4235            sibling_bytes[1],
4236            sibling_bytes[2],
4237            sibling_bytes[3],
4238            x_bytes[0],
4239            x_bytes[1],
4240            y_bytes[0],
4241            y_bytes[1],
4242            width_bytes[0],
4243            width_bytes[1],
4244            height_bytes[0],
4245            height_bytes[1],
4246            border_width_bytes[0],
4247            border_width_bytes[1],
4248            value_mask_bytes[0],
4249            value_mask_bytes[1],
4250        ]
4251    }
4252    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4253        bytes.reserve(28);
4254        self.response_type.serialize_into(bytes);
4255        (u32::from(self.stack_mode) as u8).serialize_into(bytes);
4256        self.sequence.serialize_into(bytes);
4257        self.parent.serialize_into(bytes);
4258        self.window.serialize_into(bytes);
4259        self.sibling.serialize_into(bytes);
4260        self.x.serialize_into(bytes);
4261        self.y.serialize_into(bytes);
4262        self.width.serialize_into(bytes);
4263        self.height.serialize_into(bytes);
4264        self.border_width.serialize_into(bytes);
4265        u16::from(self.value_mask).serialize_into(bytes);
4266    }
4267}
4268impl From<&ConfigureRequestEvent> for [u8; 32] {
4269    fn from(input: &ConfigureRequestEvent) -> Self {
4270        let response_type_bytes = input.response_type.serialize();
4271        let stack_mode_bytes = (u32::from(input.stack_mode) as u8).serialize();
4272        let sequence_bytes = input.sequence.serialize();
4273        let parent_bytes = input.parent.serialize();
4274        let window_bytes = input.window.serialize();
4275        let sibling_bytes = input.sibling.serialize();
4276        let x_bytes = input.x.serialize();
4277        let y_bytes = input.y.serialize();
4278        let width_bytes = input.width.serialize();
4279        let height_bytes = input.height.serialize();
4280        let border_width_bytes = input.border_width.serialize();
4281        let value_mask_bytes = u16::from(input.value_mask).serialize();
4282        [
4283            response_type_bytes[0],
4284            stack_mode_bytes[0],
4285            sequence_bytes[0],
4286            sequence_bytes[1],
4287            parent_bytes[0],
4288            parent_bytes[1],
4289            parent_bytes[2],
4290            parent_bytes[3],
4291            window_bytes[0],
4292            window_bytes[1],
4293            window_bytes[2],
4294            window_bytes[3],
4295            sibling_bytes[0],
4296            sibling_bytes[1],
4297            sibling_bytes[2],
4298            sibling_bytes[3],
4299            x_bytes[0],
4300            x_bytes[1],
4301            y_bytes[0],
4302            y_bytes[1],
4303            width_bytes[0],
4304            width_bytes[1],
4305            height_bytes[0],
4306            height_bytes[1],
4307            border_width_bytes[0],
4308            border_width_bytes[1],
4309            value_mask_bytes[0],
4310            value_mask_bytes[1],
4311            // trailing padding
4312            0,
4313            0,
4314            0,
4315            0,
4316        ]
4317    }
4318}
4319impl From<ConfigureRequestEvent> for [u8; 32] {
4320    fn from(input: ConfigureRequestEvent) -> Self {
4321        Self::from(&input)
4322    }
4323}
4324
4325/// Opcode for the GravityNotify event
4326pub const GRAVITY_NOTIFY_EVENT: u8 = 24;
4327#[derive(Clone, Copy, Default)]
4328#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4329#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4330pub struct GravityNotifyEvent {
4331    pub response_type: u8,
4332    pub sequence: u16,
4333    pub event: Window,
4334    pub window: Window,
4335    pub x: i16,
4336    pub y: i16,
4337}
4338impl_debug_if_no_extra_traits!(GravityNotifyEvent, "GravityNotifyEvent");
4339impl TryParse for GravityNotifyEvent {
4340    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4341        let remaining = initial_value;
4342        let (response_type, remaining) = u8::try_parse(remaining)?;
4343        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
4344        let (sequence, remaining) = u16::try_parse(remaining)?;
4345        let (event, remaining) = Window::try_parse(remaining)?;
4346        let (window, remaining) = Window::try_parse(remaining)?;
4347        let (x, remaining) = i16::try_parse(remaining)?;
4348        let (y, remaining) = i16::try_parse(remaining)?;
4349        let result = GravityNotifyEvent { response_type, sequence, event, window, x, y };
4350        let _ = remaining;
4351        let remaining = initial_value.get(32..)
4352            .ok_or(ParseError::InsufficientData)?;
4353        Ok((result, remaining))
4354    }
4355}
4356impl Serialize for GravityNotifyEvent {
4357    type Bytes = [u8; 16];
4358    fn serialize(&self) -> [u8; 16] {
4359        let response_type_bytes = self.response_type.serialize();
4360        let sequence_bytes = self.sequence.serialize();
4361        let event_bytes = self.event.serialize();
4362        let window_bytes = self.window.serialize();
4363        let x_bytes = self.x.serialize();
4364        let y_bytes = self.y.serialize();
4365        [
4366            response_type_bytes[0],
4367            0,
4368            sequence_bytes[0],
4369            sequence_bytes[1],
4370            event_bytes[0],
4371            event_bytes[1],
4372            event_bytes[2],
4373            event_bytes[3],
4374            window_bytes[0],
4375            window_bytes[1],
4376            window_bytes[2],
4377            window_bytes[3],
4378            x_bytes[0],
4379            x_bytes[1],
4380            y_bytes[0],
4381            y_bytes[1],
4382        ]
4383    }
4384    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4385        bytes.reserve(16);
4386        self.response_type.serialize_into(bytes);
4387        bytes.extend_from_slice(&[0; 1]);
4388        self.sequence.serialize_into(bytes);
4389        self.event.serialize_into(bytes);
4390        self.window.serialize_into(bytes);
4391        self.x.serialize_into(bytes);
4392        self.y.serialize_into(bytes);
4393    }
4394}
4395impl From<&GravityNotifyEvent> for [u8; 32] {
4396    fn from(input: &GravityNotifyEvent) -> Self {
4397        let response_type_bytes = input.response_type.serialize();
4398        let sequence_bytes = input.sequence.serialize();
4399        let event_bytes = input.event.serialize();
4400        let window_bytes = input.window.serialize();
4401        let x_bytes = input.x.serialize();
4402        let y_bytes = input.y.serialize();
4403        [
4404            response_type_bytes[0],
4405            0,
4406            sequence_bytes[0],
4407            sequence_bytes[1],
4408            event_bytes[0],
4409            event_bytes[1],
4410            event_bytes[2],
4411            event_bytes[3],
4412            window_bytes[0],
4413            window_bytes[1],
4414            window_bytes[2],
4415            window_bytes[3],
4416            x_bytes[0],
4417            x_bytes[1],
4418            y_bytes[0],
4419            y_bytes[1],
4420            // trailing padding
4421            0,
4422            0,
4423            0,
4424            0,
4425            0,
4426            0,
4427            0,
4428            0,
4429            0,
4430            0,
4431            0,
4432            0,
4433            0,
4434            0,
4435            0,
4436            0,
4437        ]
4438    }
4439}
4440impl From<GravityNotifyEvent> for [u8; 32] {
4441    fn from(input: GravityNotifyEvent) -> Self {
4442        Self::from(&input)
4443    }
4444}
4445
4446/// Opcode for the ResizeRequest event
4447pub const RESIZE_REQUEST_EVENT: u8 = 25;
4448#[derive(Clone, Copy, Default)]
4449#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4450#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4451pub struct ResizeRequestEvent {
4452    pub response_type: u8,
4453    pub sequence: u16,
4454    pub window: Window,
4455    pub width: u16,
4456    pub height: u16,
4457}
4458impl_debug_if_no_extra_traits!(ResizeRequestEvent, "ResizeRequestEvent");
4459impl TryParse for ResizeRequestEvent {
4460    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4461        let remaining = initial_value;
4462        let (response_type, remaining) = u8::try_parse(remaining)?;
4463        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
4464        let (sequence, remaining) = u16::try_parse(remaining)?;
4465        let (window, remaining) = Window::try_parse(remaining)?;
4466        let (width, remaining) = u16::try_parse(remaining)?;
4467        let (height, remaining) = u16::try_parse(remaining)?;
4468        let result = ResizeRequestEvent { response_type, sequence, window, width, height };
4469        let _ = remaining;
4470        let remaining = initial_value.get(32..)
4471            .ok_or(ParseError::InsufficientData)?;
4472        Ok((result, remaining))
4473    }
4474}
4475impl Serialize for ResizeRequestEvent {
4476    type Bytes = [u8; 12];
4477    fn serialize(&self) -> [u8; 12] {
4478        let response_type_bytes = self.response_type.serialize();
4479        let sequence_bytes = self.sequence.serialize();
4480        let window_bytes = self.window.serialize();
4481        let width_bytes = self.width.serialize();
4482        let height_bytes = self.height.serialize();
4483        [
4484            response_type_bytes[0],
4485            0,
4486            sequence_bytes[0],
4487            sequence_bytes[1],
4488            window_bytes[0],
4489            window_bytes[1],
4490            window_bytes[2],
4491            window_bytes[3],
4492            width_bytes[0],
4493            width_bytes[1],
4494            height_bytes[0],
4495            height_bytes[1],
4496        ]
4497    }
4498    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4499        bytes.reserve(12);
4500        self.response_type.serialize_into(bytes);
4501        bytes.extend_from_slice(&[0; 1]);
4502        self.sequence.serialize_into(bytes);
4503        self.window.serialize_into(bytes);
4504        self.width.serialize_into(bytes);
4505        self.height.serialize_into(bytes);
4506    }
4507}
4508impl From<&ResizeRequestEvent> for [u8; 32] {
4509    fn from(input: &ResizeRequestEvent) -> Self {
4510        let response_type_bytes = input.response_type.serialize();
4511        let sequence_bytes = input.sequence.serialize();
4512        let window_bytes = input.window.serialize();
4513        let width_bytes = input.width.serialize();
4514        let height_bytes = input.height.serialize();
4515        [
4516            response_type_bytes[0],
4517            0,
4518            sequence_bytes[0],
4519            sequence_bytes[1],
4520            window_bytes[0],
4521            window_bytes[1],
4522            window_bytes[2],
4523            window_bytes[3],
4524            width_bytes[0],
4525            width_bytes[1],
4526            height_bytes[0],
4527            height_bytes[1],
4528            // trailing padding
4529            0,
4530            0,
4531            0,
4532            0,
4533            0,
4534            0,
4535            0,
4536            0,
4537            0,
4538            0,
4539            0,
4540            0,
4541            0,
4542            0,
4543            0,
4544            0,
4545            0,
4546            0,
4547            0,
4548            0,
4549        ]
4550    }
4551}
4552impl From<ResizeRequestEvent> for [u8; 32] {
4553    fn from(input: ResizeRequestEvent) -> Self {
4554        Self::from(&input)
4555    }
4556}
4557
4558/// # Fields
4559///
4560/// * `OnTop` - The window is now on top of all siblings.
4561/// * `OnBottom` - The window is now below all siblings.
4562#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
4563#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4564pub struct Place(u8);
4565impl Place {
4566    pub const ON_TOP: Self = Self(0);
4567    pub const ON_BOTTOM: Self = Self(1);
4568}
4569impl From<Place> for u8 {
4570    #[inline]
4571    fn from(input: Place) -> Self {
4572        input.0
4573    }
4574}
4575impl From<Place> for Option<u8> {
4576    #[inline]
4577    fn from(input: Place) -> Self {
4578        Some(input.0)
4579    }
4580}
4581impl From<Place> for u16 {
4582    #[inline]
4583    fn from(input: Place) -> Self {
4584        u16::from(input.0)
4585    }
4586}
4587impl From<Place> for Option<u16> {
4588    #[inline]
4589    fn from(input: Place) -> Self {
4590        Some(u16::from(input.0))
4591    }
4592}
4593impl From<Place> for u32 {
4594    #[inline]
4595    fn from(input: Place) -> Self {
4596        u32::from(input.0)
4597    }
4598}
4599impl From<Place> for Option<u32> {
4600    #[inline]
4601    fn from(input: Place) -> Self {
4602        Some(u32::from(input.0))
4603    }
4604}
4605impl From<u8> for Place {
4606    #[inline]
4607    fn from(value: u8) -> Self {
4608        Self(value)
4609    }
4610}
4611impl core::fmt::Debug for Place  {
4612    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
4613        let variants = [
4614            (Self::ON_TOP.0.into(), "ON_TOP", "OnTop"),
4615            (Self::ON_BOTTOM.0.into(), "ON_BOTTOM", "OnBottom"),
4616        ];
4617        pretty_print_enum(fmt, self.0.into(), &variants)
4618    }
4619}
4620
4621/// Opcode for the CirculateNotify event
4622pub const CIRCULATE_NOTIFY_EVENT: u8 = 26;
4623/// NOT YET DOCUMENTED.
4624///
4625/// # Fields
4626///
4627/// * `event` - Either the restacked window or its parent, depending on whether
4628/// `StructureNotify` or `SubstructureNotify` was selected.
4629/// * `window` - The restacked window.
4630/// * `place` -
4631///
4632/// # See
4633///
4634/// * `CirculateWindow`: request
4635#[derive(Clone, Copy, Default)]
4636#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4637#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4638pub struct CirculateNotifyEvent {
4639    pub response_type: u8,
4640    pub sequence: u16,
4641    pub event: Window,
4642    pub window: Window,
4643    pub place: Place,
4644}
4645impl_debug_if_no_extra_traits!(CirculateNotifyEvent, "CirculateNotifyEvent");
4646impl TryParse for CirculateNotifyEvent {
4647    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4648        let remaining = initial_value;
4649        let (response_type, remaining) = u8::try_parse(remaining)?;
4650        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
4651        let (sequence, remaining) = u16::try_parse(remaining)?;
4652        let (event, remaining) = Window::try_parse(remaining)?;
4653        let (window, remaining) = Window::try_parse(remaining)?;
4654        let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
4655        let (place, remaining) = u8::try_parse(remaining)?;
4656        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
4657        let place = place.into();
4658        let result = CirculateNotifyEvent { response_type, sequence, event, window, place };
4659        let _ = remaining;
4660        let remaining = initial_value.get(32..)
4661            .ok_or(ParseError::InsufficientData)?;
4662        Ok((result, remaining))
4663    }
4664}
4665impl Serialize for CirculateNotifyEvent {
4666    type Bytes = [u8; 20];
4667    fn serialize(&self) -> [u8; 20] {
4668        let response_type_bytes = self.response_type.serialize();
4669        let sequence_bytes = self.sequence.serialize();
4670        let event_bytes = self.event.serialize();
4671        let window_bytes = self.window.serialize();
4672        let place_bytes = u8::from(self.place).serialize();
4673        [
4674            response_type_bytes[0],
4675            0,
4676            sequence_bytes[0],
4677            sequence_bytes[1],
4678            event_bytes[0],
4679            event_bytes[1],
4680            event_bytes[2],
4681            event_bytes[3],
4682            window_bytes[0],
4683            window_bytes[1],
4684            window_bytes[2],
4685            window_bytes[3],
4686            0,
4687            0,
4688            0,
4689            0,
4690            place_bytes[0],
4691            0,
4692            0,
4693            0,
4694        ]
4695    }
4696    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4697        bytes.reserve(20);
4698        self.response_type.serialize_into(bytes);
4699        bytes.extend_from_slice(&[0; 1]);
4700        self.sequence.serialize_into(bytes);
4701        self.event.serialize_into(bytes);
4702        self.window.serialize_into(bytes);
4703        bytes.extend_from_slice(&[0; 4]);
4704        u8::from(self.place).serialize_into(bytes);
4705        bytes.extend_from_slice(&[0; 3]);
4706    }
4707}
4708impl From<&CirculateNotifyEvent> for [u8; 32] {
4709    fn from(input: &CirculateNotifyEvent) -> Self {
4710        let response_type_bytes = input.response_type.serialize();
4711        let sequence_bytes = input.sequence.serialize();
4712        let event_bytes = input.event.serialize();
4713        let window_bytes = input.window.serialize();
4714        let place_bytes = u8::from(input.place).serialize();
4715        [
4716            response_type_bytes[0],
4717            0,
4718            sequence_bytes[0],
4719            sequence_bytes[1],
4720            event_bytes[0],
4721            event_bytes[1],
4722            event_bytes[2],
4723            event_bytes[3],
4724            window_bytes[0],
4725            window_bytes[1],
4726            window_bytes[2],
4727            window_bytes[3],
4728            0,
4729            0,
4730            0,
4731            0,
4732            place_bytes[0],
4733            0,
4734            0,
4735            0,
4736            // trailing padding
4737            0,
4738            0,
4739            0,
4740            0,
4741            0,
4742            0,
4743            0,
4744            0,
4745            0,
4746            0,
4747            0,
4748            0,
4749        ]
4750    }
4751}
4752impl From<CirculateNotifyEvent> for [u8; 32] {
4753    fn from(input: CirculateNotifyEvent) -> Self {
4754        Self::from(&input)
4755    }
4756}
4757
4758/// Opcode for the CirculateRequest event
4759pub const CIRCULATE_REQUEST_EVENT: u8 = 27;
4760pub type CirculateRequestEvent = CirculateNotifyEvent;
4761
4762#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
4763#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4764pub struct Property(u8);
4765impl Property {
4766    pub const NEW_VALUE: Self = Self(0);
4767    pub const DELETE: Self = Self(1);
4768}
4769impl From<Property> for u8 {
4770    #[inline]
4771    fn from(input: Property) -> Self {
4772        input.0
4773    }
4774}
4775impl From<Property> for Option<u8> {
4776    #[inline]
4777    fn from(input: Property) -> Self {
4778        Some(input.0)
4779    }
4780}
4781impl From<Property> for u16 {
4782    #[inline]
4783    fn from(input: Property) -> Self {
4784        u16::from(input.0)
4785    }
4786}
4787impl From<Property> for Option<u16> {
4788    #[inline]
4789    fn from(input: Property) -> Self {
4790        Some(u16::from(input.0))
4791    }
4792}
4793impl From<Property> for u32 {
4794    #[inline]
4795    fn from(input: Property) -> Self {
4796        u32::from(input.0)
4797    }
4798}
4799impl From<Property> for Option<u32> {
4800    #[inline]
4801    fn from(input: Property) -> Self {
4802        Some(u32::from(input.0))
4803    }
4804}
4805impl From<u8> for Property {
4806    #[inline]
4807    fn from(value: u8) -> Self {
4808        Self(value)
4809    }
4810}
4811impl core::fmt::Debug for Property  {
4812    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
4813        let variants = [
4814            (Self::NEW_VALUE.0.into(), "NEW_VALUE", "NewValue"),
4815            (Self::DELETE.0.into(), "DELETE", "Delete"),
4816        ];
4817        pretty_print_enum(fmt, self.0.into(), &variants)
4818    }
4819}
4820
4821/// Opcode for the PropertyNotify event
4822pub const PROPERTY_NOTIFY_EVENT: u8 = 28;
4823/// a window property changed.
4824///
4825/// # Fields
4826///
4827/// * `window` - The window whose associated property was changed.
4828/// * `atom` - The property's atom, to indicate which property was changed.
4829/// * `time` - A timestamp of the server time when the property was changed.
4830/// * `state` -
4831///
4832/// # See
4833///
4834/// * `ChangeProperty`: request
4835#[derive(Clone, Copy, Default)]
4836#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4837#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4838pub struct PropertyNotifyEvent {
4839    pub response_type: u8,
4840    pub sequence: u16,
4841    pub window: Window,
4842    pub atom: Atom,
4843    pub time: Timestamp,
4844    pub state: Property,
4845}
4846impl_debug_if_no_extra_traits!(PropertyNotifyEvent, "PropertyNotifyEvent");
4847impl TryParse for PropertyNotifyEvent {
4848    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4849        let remaining = initial_value;
4850        let (response_type, remaining) = u8::try_parse(remaining)?;
4851        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
4852        let (sequence, remaining) = u16::try_parse(remaining)?;
4853        let (window, remaining) = Window::try_parse(remaining)?;
4854        let (atom, remaining) = Atom::try_parse(remaining)?;
4855        let (time, remaining) = Timestamp::try_parse(remaining)?;
4856        let (state, remaining) = u8::try_parse(remaining)?;
4857        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
4858        let state = state.into();
4859        let result = PropertyNotifyEvent { response_type, sequence, window, atom, time, state };
4860        let _ = remaining;
4861        let remaining = initial_value.get(32..)
4862            .ok_or(ParseError::InsufficientData)?;
4863        Ok((result, remaining))
4864    }
4865}
4866impl Serialize for PropertyNotifyEvent {
4867    type Bytes = [u8; 20];
4868    fn serialize(&self) -> [u8; 20] {
4869        let response_type_bytes = self.response_type.serialize();
4870        let sequence_bytes = self.sequence.serialize();
4871        let window_bytes = self.window.serialize();
4872        let atom_bytes = self.atom.serialize();
4873        let time_bytes = self.time.serialize();
4874        let state_bytes = u8::from(self.state).serialize();
4875        [
4876            response_type_bytes[0],
4877            0,
4878            sequence_bytes[0],
4879            sequence_bytes[1],
4880            window_bytes[0],
4881            window_bytes[1],
4882            window_bytes[2],
4883            window_bytes[3],
4884            atom_bytes[0],
4885            atom_bytes[1],
4886            atom_bytes[2],
4887            atom_bytes[3],
4888            time_bytes[0],
4889            time_bytes[1],
4890            time_bytes[2],
4891            time_bytes[3],
4892            state_bytes[0],
4893            0,
4894            0,
4895            0,
4896        ]
4897    }
4898    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4899        bytes.reserve(20);
4900        self.response_type.serialize_into(bytes);
4901        bytes.extend_from_slice(&[0; 1]);
4902        self.sequence.serialize_into(bytes);
4903        self.window.serialize_into(bytes);
4904        self.atom.serialize_into(bytes);
4905        self.time.serialize_into(bytes);
4906        u8::from(self.state).serialize_into(bytes);
4907        bytes.extend_from_slice(&[0; 3]);
4908    }
4909}
4910impl From<&PropertyNotifyEvent> for [u8; 32] {
4911    fn from(input: &PropertyNotifyEvent) -> Self {
4912        let response_type_bytes = input.response_type.serialize();
4913        let sequence_bytes = input.sequence.serialize();
4914        let window_bytes = input.window.serialize();
4915        let atom_bytes = input.atom.serialize();
4916        let time_bytes = input.time.serialize();
4917        let state_bytes = u8::from(input.state).serialize();
4918        [
4919            response_type_bytes[0],
4920            0,
4921            sequence_bytes[0],
4922            sequence_bytes[1],
4923            window_bytes[0],
4924            window_bytes[1],
4925            window_bytes[2],
4926            window_bytes[3],
4927            atom_bytes[0],
4928            atom_bytes[1],
4929            atom_bytes[2],
4930            atom_bytes[3],
4931            time_bytes[0],
4932            time_bytes[1],
4933            time_bytes[2],
4934            time_bytes[3],
4935            state_bytes[0],
4936            0,
4937            0,
4938            0,
4939            // trailing padding
4940            0,
4941            0,
4942            0,
4943            0,
4944            0,
4945            0,
4946            0,
4947            0,
4948            0,
4949            0,
4950            0,
4951            0,
4952        ]
4953    }
4954}
4955impl From<PropertyNotifyEvent> for [u8; 32] {
4956    fn from(input: PropertyNotifyEvent) -> Self {
4957        Self::from(&input)
4958    }
4959}
4960
4961/// Opcode for the SelectionClear event
4962pub const SELECTION_CLEAR_EVENT: u8 = 29;
4963#[derive(Clone, Copy, Default)]
4964#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4965#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4966pub struct SelectionClearEvent {
4967    pub response_type: u8,
4968    pub sequence: u16,
4969    pub time: Timestamp,
4970    pub owner: Window,
4971    pub selection: Atom,
4972}
4973impl_debug_if_no_extra_traits!(SelectionClearEvent, "SelectionClearEvent");
4974impl TryParse for SelectionClearEvent {
4975    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4976        let remaining = initial_value;
4977        let (response_type, remaining) = u8::try_parse(remaining)?;
4978        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
4979        let (sequence, remaining) = u16::try_parse(remaining)?;
4980        let (time, remaining) = Timestamp::try_parse(remaining)?;
4981        let (owner, remaining) = Window::try_parse(remaining)?;
4982        let (selection, remaining) = Atom::try_parse(remaining)?;
4983        let result = SelectionClearEvent { response_type, sequence, time, owner, selection };
4984        let _ = remaining;
4985        let remaining = initial_value.get(32..)
4986            .ok_or(ParseError::InsufficientData)?;
4987        Ok((result, remaining))
4988    }
4989}
4990impl Serialize for SelectionClearEvent {
4991    type Bytes = [u8; 16];
4992    fn serialize(&self) -> [u8; 16] {
4993        let response_type_bytes = self.response_type.serialize();
4994        let sequence_bytes = self.sequence.serialize();
4995        let time_bytes = self.time.serialize();
4996        let owner_bytes = self.owner.serialize();
4997        let selection_bytes = self.selection.serialize();
4998        [
4999            response_type_bytes[0],
5000            0,
5001            sequence_bytes[0],
5002            sequence_bytes[1],
5003            time_bytes[0],
5004            time_bytes[1],
5005            time_bytes[2],
5006            time_bytes[3],
5007            owner_bytes[0],
5008            owner_bytes[1],
5009            owner_bytes[2],
5010            owner_bytes[3],
5011            selection_bytes[0],
5012            selection_bytes[1],
5013            selection_bytes[2],
5014            selection_bytes[3],
5015        ]
5016    }
5017    fn serialize_into(&self, bytes: &mut Vec<u8>) {
5018        bytes.reserve(16);
5019        self.response_type.serialize_into(bytes);
5020        bytes.extend_from_slice(&[0; 1]);
5021        self.sequence.serialize_into(bytes);
5022        self.time.serialize_into(bytes);
5023        self.owner.serialize_into(bytes);
5024        self.selection.serialize_into(bytes);
5025    }
5026}
5027impl From<&SelectionClearEvent> for [u8; 32] {
5028    fn from(input: &SelectionClearEvent) -> Self {
5029        let response_type_bytes = input.response_type.serialize();
5030        let sequence_bytes = input.sequence.serialize();
5031        let time_bytes = input.time.serialize();
5032        let owner_bytes = input.owner.serialize();
5033        let selection_bytes = input.selection.serialize();
5034        [
5035            response_type_bytes[0],
5036            0,
5037            sequence_bytes[0],
5038            sequence_bytes[1],
5039            time_bytes[0],
5040            time_bytes[1],
5041            time_bytes[2],
5042            time_bytes[3],
5043            owner_bytes[0],
5044            owner_bytes[1],
5045            owner_bytes[2],
5046            owner_bytes[3],
5047            selection_bytes[0],
5048            selection_bytes[1],
5049            selection_bytes[2],
5050            selection_bytes[3],
5051            // trailing padding
5052            0,
5053            0,
5054            0,
5055            0,
5056            0,
5057            0,
5058            0,
5059            0,
5060            0,
5061            0,
5062            0,
5063            0,
5064            0,
5065            0,
5066            0,
5067            0,
5068        ]
5069    }
5070}
5071impl From<SelectionClearEvent> for [u8; 32] {
5072    fn from(input: SelectionClearEvent) -> Self {
5073        Self::from(&input)
5074    }
5075}
5076
5077#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
5078#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5079pub struct Time(u8);
5080impl Time {
5081    pub const CURRENT_TIME: Self = Self(0);
5082}
5083impl From<Time> for u8 {
5084    #[inline]
5085    fn from(input: Time) -> Self {
5086        input.0
5087    }
5088}
5089impl From<Time> for Option<u8> {
5090    #[inline]
5091    fn from(input: Time) -> Self {
5092        Some(input.0)
5093    }
5094}
5095impl From<Time> for u16 {
5096    #[inline]
5097    fn from(input: Time) -> Self {
5098        u16::from(input.0)
5099    }
5100}
5101impl From<Time> for Option<u16> {
5102    #[inline]
5103    fn from(input: Time) -> Self {
5104        Some(u16::from(input.0))
5105    }
5106}
5107impl From<Time> for u32 {
5108    #[inline]
5109    fn from(input: Time) -> Self {
5110        u32::from(input.0)
5111    }
5112}
5113impl From<Time> for Option<u32> {
5114    #[inline]
5115    fn from(input: Time) -> Self {
5116        Some(u32::from(input.0))
5117    }
5118}
5119impl From<u8> for Time {
5120    #[inline]
5121    fn from(value: u8) -> Self {
5122        Self(value)
5123    }
5124}
5125impl core::fmt::Debug for Time  {
5126    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
5127        let variants = [
5128            (Self::CURRENT_TIME.0.into(), "CURRENT_TIME", "CurrentTime"),
5129        ];
5130        pretty_print_enum(fmt, self.0.into(), &variants)
5131    }
5132}
5133
5134#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
5135#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5136pub struct AtomEnum(u8);
5137impl AtomEnum {
5138    pub const NONE: Self = Self(0);
5139    pub const ANY: Self = Self(0);
5140    pub const PRIMARY: Self = Self(1);
5141    pub const SECONDARY: Self = Self(2);
5142    pub const ARC: Self = Self(3);
5143    pub const ATOM: Self = Self(4);
5144    pub const BITMAP: Self = Self(5);
5145    pub const CARDINAL: Self = Self(6);
5146    pub const COLORMAP: Self = Self(7);
5147    pub const CURSOR: Self = Self(8);
5148    pub const CUT_BUFFE_R0: Self = Self(9);
5149    pub const CUT_BUFFE_R1: Self = Self(10);
5150    pub const CUT_BUFFE_R2: Self = Self(11);
5151    pub const CUT_BUFFE_R3: Self = Self(12);
5152    pub const CUT_BUFFE_R4: Self = Self(13);
5153    pub const CUT_BUFFE_R5: Self = Self(14);
5154    pub const CUT_BUFFE_R6: Self = Self(15);
5155    pub const CUT_BUFFE_R7: Self = Self(16);
5156    pub const DRAWABLE: Self = Self(17);
5157    pub const FONT: Self = Self(18);
5158    pub const INTEGER: Self = Self(19);
5159    pub const PIXMAP: Self = Self(20);
5160    pub const POINT: Self = Self(21);
5161    pub const RECTANGLE: Self = Self(22);
5162    pub const RESOURCE_MANAGER: Self = Self(23);
5163    pub const RGB_COLOR_MAP: Self = Self(24);
5164    pub const RGB_BEST_MAP: Self = Self(25);
5165    pub const RGB_BLUE_MAP: Self = Self(26);
5166    pub const RGB_DEFAULT_MAP: Self = Self(27);
5167    pub const RGB_GRAY_MAP: Self = Self(28);
5168    pub const RGB_GREEN_MAP: Self = Self(29);
5169    pub const RGB_RED_MAP: Self = Self(30);
5170    pub const STRING: Self = Self(31);
5171    pub const VISUALID: Self = Self(32);
5172    pub const WINDOW: Self = Self(33);
5173    pub const WM_COMMAND: Self = Self(34);
5174    pub const WM_HINTS: Self = Self(35);
5175    pub const WM_CLIENT_MACHINE: Self = Self(36);
5176    pub const WM_ICON_NAME: Self = Self(37);
5177    pub const WM_ICON_SIZE: Self = Self(38);
5178    pub const WM_NAME: Self = Self(39);
5179    pub const WM_NORMAL_HINTS: Self = Self(40);
5180    pub const WM_SIZE_HINTS: Self = Self(41);
5181    pub const WM_ZOOM_HINTS: Self = Self(42);
5182    pub const MIN_SPACE: Self = Self(43);
5183    pub const NORM_SPACE: Self = Self(44);
5184    pub const MAX_SPACE: Self = Self(45);
5185    pub const END_SPACE: Self = Self(46);
5186    pub const SUPERSCRIPT_X: Self = Self(47);
5187    pub const SUPERSCRIPT_Y: Self = Self(48);
5188    pub const SUBSCRIPT_X: Self = Self(49);
5189    pub const SUBSCRIPT_Y: Self = Self(50);
5190    pub const UNDERLINE_POSITION: Self = Self(51);
5191    pub const UNDERLINE_THICKNESS: Self = Self(52);
5192    pub const STRIKEOUT_ASCENT: Self = Self(53);
5193    pub const STRIKEOUT_DESCENT: Self = Self(54);
5194    pub const ITALIC_ANGLE: Self = Self(55);
5195    pub const X_HEIGHT: Self = Self(56);
5196    pub const QUAD_WIDTH: Self = Self(57);
5197    pub const WEIGHT: Self = Self(58);
5198    pub const POINT_SIZE: Self = Self(59);
5199    pub const RESOLUTION: Self = Self(60);
5200    pub const COPYRIGHT: Self = Self(61);
5201    pub const NOTICE: Self = Self(62);
5202    pub const FONT_NAME: Self = Self(63);
5203    pub const FAMILY_NAME: Self = Self(64);
5204    pub const FULL_NAME: Self = Self(65);
5205    pub const CAP_HEIGHT: Self = Self(66);
5206    pub const WM_CLASS: Self = Self(67);
5207    pub const WM_TRANSIENT_FOR: Self = Self(68);
5208}
5209impl From<AtomEnum> for u8 {
5210    #[inline]
5211    fn from(input: AtomEnum) -> Self {
5212        input.0
5213    }
5214}
5215impl From<AtomEnum> for Option<u8> {
5216    #[inline]
5217    fn from(input: AtomEnum) -> Self {
5218        Some(input.0)
5219    }
5220}
5221impl From<AtomEnum> for u16 {
5222    #[inline]
5223    fn from(input: AtomEnum) -> Self {
5224        u16::from(input.0)
5225    }
5226}
5227impl From<AtomEnum> for Option<u16> {
5228    #[inline]
5229    fn from(input: AtomEnum) -> Self {
5230        Some(u16::from(input.0))
5231    }
5232}
5233impl From<AtomEnum> for u32 {
5234    #[inline]
5235    fn from(input: AtomEnum) -> Self {
5236        u32::from(input.0)
5237    }
5238}
5239impl From<AtomEnum> for Option<u32> {
5240    #[inline]
5241    fn from(input: AtomEnum) -> Self {
5242        Some(u32::from(input.0))
5243    }
5244}
5245impl From<u8> for AtomEnum {
5246    #[inline]
5247    fn from(value: u8) -> Self {
5248        Self(value)
5249    }
5250}
5251impl core::fmt::Debug for AtomEnum  {
5252    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
5253        let variants = [
5254            (Self::NONE.0.into(), "NONE", "None"),
5255            (Self::ANY.0.into(), "ANY", "Any"),
5256            (Self::PRIMARY.0.into(), "PRIMARY", "PRIMARY"),
5257            (Self::SECONDARY.0.into(), "SECONDARY", "SECONDARY"),
5258            (Self::ARC.0.into(), "ARC", "ARC"),
5259            (Self::ATOM.0.into(), "ATOM", "ATOM"),
5260            (Self::BITMAP.0.into(), "BITMAP", "BITMAP"),
5261            (Self::CARDINAL.0.into(), "CARDINAL", "CARDINAL"),
5262            (Self::COLORMAP.0.into(), "COLORMAP", "COLORMAP"),
5263            (Self::CURSOR.0.into(), "CURSOR", "CURSOR"),
5264            (Self::CUT_BUFFE_R0.0.into(), "CUT_BUFFE_R0", "CUT_BUFFER0"),
5265            (Self::CUT_BUFFE_R1.0.into(), "CUT_BUFFE_R1", "CUT_BUFFER1"),
5266            (Self::CUT_BUFFE_R2.0.into(), "CUT_BUFFE_R2", "CUT_BUFFER2"),
5267            (Self::CUT_BUFFE_R3.0.into(), "CUT_BUFFE_R3", "CUT_BUFFER3"),
5268            (Self::CUT_BUFFE_R4.0.into(), "CUT_BUFFE_R4", "CUT_BUFFER4"),
5269            (Self::CUT_BUFFE_R5.0.into(), "CUT_BUFFE_R5", "CUT_BUFFER5"),
5270            (Self::CUT_BUFFE_R6.0.into(), "CUT_BUFFE_R6", "CUT_BUFFER6"),
5271            (Self::CUT_BUFFE_R7.0.into(), "CUT_BUFFE_R7", "CUT_BUFFER7"),
5272            (Self::DRAWABLE.0.into(), "DRAWABLE", "DRAWABLE"),
5273            (Self::FONT.0.into(), "FONT", "FONT"),
5274            (Self::INTEGER.0.into(), "INTEGER", "INTEGER"),
5275            (Self::PIXMAP.0.into(), "PIXMAP", "PIXMAP"),
5276            (Self::POINT.0.into(), "POINT", "POINT"),
5277            (Self::RECTANGLE.0.into(), "RECTANGLE", "RECTANGLE"),
5278            (Self::RESOURCE_MANAGER.0.into(), "RESOURCE_MANAGER", "RESOURCE_MANAGER"),
5279            (Self::RGB_COLOR_MAP.0.into(), "RGB_COLOR_MAP", "RGB_COLOR_MAP"),
5280            (Self::RGB_BEST_MAP.0.into(), "RGB_BEST_MAP", "RGB_BEST_MAP"),
5281            (Self::RGB_BLUE_MAP.0.into(), "RGB_BLUE_MAP", "RGB_BLUE_MAP"),
5282            (Self::RGB_DEFAULT_MAP.0.into(), "RGB_DEFAULT_MAP", "RGB_DEFAULT_MAP"),
5283            (Self::RGB_GRAY_MAP.0.into(), "RGB_GRAY_MAP", "RGB_GRAY_MAP"),
5284            (Self::RGB_GREEN_MAP.0.into(), "RGB_GREEN_MAP", "RGB_GREEN_MAP"),
5285            (Self::RGB_RED_MAP.0.into(), "RGB_RED_MAP", "RGB_RED_MAP"),
5286            (Self::STRING.0.into(), "STRING", "STRING"),
5287            (Self::VISUALID.0.into(), "VISUALID", "VISUALID"),
5288            (Self::WINDOW.0.into(), "WINDOW", "WINDOW"),
5289            (Self::WM_COMMAND.0.into(), "WM_COMMAND", "WM_COMMAND"),
5290            (Self::WM_HINTS.0.into(), "WM_HINTS", "WM_HINTS"),
5291            (Self::WM_CLIENT_MACHINE.0.into(), "WM_CLIENT_MACHINE", "WM_CLIENT_MACHINE"),
5292            (Self::WM_ICON_NAME.0.into(), "WM_ICON_NAME", "WM_ICON_NAME"),
5293            (Self::WM_ICON_SIZE.0.into(), "WM_ICON_SIZE", "WM_ICON_SIZE"),
5294            (Self::WM_NAME.0.into(), "WM_NAME", "WM_NAME"),
5295            (Self::WM_NORMAL_HINTS.0.into(), "WM_NORMAL_HINTS", "WM_NORMAL_HINTS"),
5296            (Self::WM_SIZE_HINTS.0.into(), "WM_SIZE_HINTS", "WM_SIZE_HINTS"),
5297            (Self::WM_ZOOM_HINTS.0.into(), "WM_ZOOM_HINTS", "WM_ZOOM_HINTS"),
5298            (Self::MIN_SPACE.0.into(), "MIN_SPACE", "MIN_SPACE"),
5299            (Self::NORM_SPACE.0.into(), "NORM_SPACE", "NORM_SPACE"),
5300            (Self::MAX_SPACE.0.into(), "MAX_SPACE", "MAX_SPACE"),
5301            (Self::END_SPACE.0.into(), "END_SPACE", "END_SPACE"),
5302            (Self::SUPERSCRIPT_X.0.into(), "SUPERSCRIPT_X", "SUPERSCRIPT_X"),
5303            (Self::SUPERSCRIPT_Y.0.into(), "SUPERSCRIPT_Y", "SUPERSCRIPT_Y"),
5304            (Self::SUBSCRIPT_X.0.into(), "SUBSCRIPT_X", "SUBSCRIPT_X"),
5305            (Self::SUBSCRIPT_Y.0.into(), "SUBSCRIPT_Y", "SUBSCRIPT_Y"),
5306            (Self::UNDERLINE_POSITION.0.into(), "UNDERLINE_POSITION", "UNDERLINE_POSITION"),
5307            (Self::UNDERLINE_THICKNESS.0.into(), "UNDERLINE_THICKNESS", "UNDERLINE_THICKNESS"),
5308            (Self::STRIKEOUT_ASCENT.0.into(), "STRIKEOUT_ASCENT", "STRIKEOUT_ASCENT"),
5309            (Self::STRIKEOUT_DESCENT.0.into(), "STRIKEOUT_DESCENT", "STRIKEOUT_DESCENT"),
5310            (Self::ITALIC_ANGLE.0.into(), "ITALIC_ANGLE", "ITALIC_ANGLE"),
5311            (Self::X_HEIGHT.0.into(), "X_HEIGHT", "X_HEIGHT"),
5312            (Self::QUAD_WIDTH.0.into(), "QUAD_WIDTH", "QUAD_WIDTH"),
5313            (Self::WEIGHT.0.into(), "WEIGHT", "WEIGHT"),
5314            (Self::POINT_SIZE.0.into(), "POINT_SIZE", "POINT_SIZE"),
5315            (Self::RESOLUTION.0.into(), "RESOLUTION", "RESOLUTION"),
5316            (Self::COPYRIGHT.0.into(), "COPYRIGHT", "COPYRIGHT"),
5317            (Self::NOTICE.0.into(), "NOTICE", "NOTICE"),
5318            (Self::FONT_NAME.0.into(), "FONT_NAME", "FONT_NAME"),
5319            (Self::FAMILY_NAME.0.into(), "FAMILY_NAME", "FAMILY_NAME"),
5320            (Self::FULL_NAME.0.into(), "FULL_NAME", "FULL_NAME"),
5321            (Self::CAP_HEIGHT.0.into(), "CAP_HEIGHT", "CAP_HEIGHT"),
5322            (Self::WM_CLASS.0.into(), "WM_CLASS", "WM_CLASS"),
5323            (Self::WM_TRANSIENT_FOR.0.into(), "WM_TRANSIENT_FOR", "WM_TRANSIENT_FOR"),
5324        ];
5325        pretty_print_enum(fmt, self.0.into(), &variants)
5326    }
5327}
5328
5329/// Opcode for the SelectionRequest event
5330pub const SELECTION_REQUEST_EVENT: u8 = 30;
5331#[derive(Clone, Copy, Default)]
5332#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5333#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5334pub struct SelectionRequestEvent {
5335    pub response_type: u8,
5336    pub sequence: u16,
5337    pub time: Timestamp,
5338    pub owner: Window,
5339    pub requestor: Window,
5340    pub selection: Atom,
5341    pub target: Atom,
5342    pub property: Atom,
5343}
5344impl_debug_if_no_extra_traits!(SelectionRequestEvent, "SelectionRequestEvent");
5345impl TryParse for SelectionRequestEvent {
5346    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
5347        let remaining = initial_value;
5348        let (response_type, remaining) = u8::try_parse(remaining)?;
5349        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
5350        let (sequence, remaining) = u16::try_parse(remaining)?;
5351        let (time, remaining) = Timestamp::try_parse(remaining)?;
5352        let (owner, remaining) = Window::try_parse(remaining)?;
5353        let (requestor, remaining) = Window::try_parse(remaining)?;
5354        let (selection, remaining) = Atom::try_parse(remaining)?;
5355        let (target, remaining) = Atom::try_parse(remaining)?;
5356        let (property, remaining) = Atom::try_parse(remaining)?;
5357        let result = SelectionRequestEvent { response_type, sequence, time, owner, requestor, selection, target, property };
5358        let _ = remaining;
5359        let remaining = initial_value.get(32..)
5360            .ok_or(ParseError::InsufficientData)?;
5361        Ok((result, remaining))
5362    }
5363}
5364impl Serialize for SelectionRequestEvent {
5365    type Bytes = [u8; 28];
5366    fn serialize(&self) -> [u8; 28] {
5367        let response_type_bytes = self.response_type.serialize();
5368        let sequence_bytes = self.sequence.serialize();
5369        let time_bytes = self.time.serialize();
5370        let owner_bytes = self.owner.serialize();
5371        let requestor_bytes = self.requestor.serialize();
5372        let selection_bytes = self.selection.serialize();
5373        let target_bytes = self.target.serialize();
5374        let property_bytes = self.property.serialize();
5375        [
5376            response_type_bytes[0],
5377            0,
5378            sequence_bytes[0],
5379            sequence_bytes[1],
5380            time_bytes[0],
5381            time_bytes[1],
5382            time_bytes[2],
5383            time_bytes[3],
5384            owner_bytes[0],
5385            owner_bytes[1],
5386            owner_bytes[2],
5387            owner_bytes[3],
5388            requestor_bytes[0],
5389            requestor_bytes[1],
5390            requestor_bytes[2],
5391            requestor_bytes[3],
5392            selection_bytes[0],
5393            selection_bytes[1],
5394            selection_bytes[2],
5395            selection_bytes[3],
5396            target_bytes[0],
5397            target_bytes[1],
5398            target_bytes[2],
5399            target_bytes[3],
5400            property_bytes[0],
5401            property_bytes[1],
5402            property_bytes[2],
5403            property_bytes[3],
5404        ]
5405    }
5406    fn serialize_into(&self, bytes: &mut Vec<u8>) {
5407        bytes.reserve(28);
5408        self.response_type.serialize_into(bytes);
5409        bytes.extend_from_slice(&[0; 1]);
5410        self.sequence.serialize_into(bytes);
5411        self.time.serialize_into(bytes);
5412        self.owner.serialize_into(bytes);
5413        self.requestor.serialize_into(bytes);
5414        self.selection.serialize_into(bytes);
5415        self.target.serialize_into(bytes);
5416        self.property.serialize_into(bytes);
5417    }
5418}
5419impl From<&SelectionRequestEvent> for [u8; 32] {
5420    fn from(input: &SelectionRequestEvent) -> Self {
5421        let response_type_bytes = input.response_type.serialize();
5422        let sequence_bytes = input.sequence.serialize();
5423        let time_bytes = input.time.serialize();
5424        let owner_bytes = input.owner.serialize();
5425        let requestor_bytes = input.requestor.serialize();
5426        let selection_bytes = input.selection.serialize();
5427        let target_bytes = input.target.serialize();
5428        let property_bytes = input.property.serialize();
5429        [
5430            response_type_bytes[0],
5431            0,
5432            sequence_bytes[0],
5433            sequence_bytes[1],
5434            time_bytes[0],
5435            time_bytes[1],
5436            time_bytes[2],
5437            time_bytes[3],
5438            owner_bytes[0],
5439            owner_bytes[1],
5440            owner_bytes[2],
5441            owner_bytes[3],
5442            requestor_bytes[0],
5443            requestor_bytes[1],
5444            requestor_bytes[2],
5445            requestor_bytes[3],
5446            selection_bytes[0],
5447            selection_bytes[1],
5448            selection_bytes[2],
5449            selection_bytes[3],
5450            target_bytes[0],
5451            target_bytes[1],
5452            target_bytes[2],
5453            target_bytes[3],
5454            property_bytes[0],
5455            property_bytes[1],
5456            property_bytes[2],
5457            property_bytes[3],
5458            // trailing padding
5459            0,
5460            0,
5461            0,
5462            0,
5463        ]
5464    }
5465}
5466impl From<SelectionRequestEvent> for [u8; 32] {
5467    fn from(input: SelectionRequestEvent) -> Self {
5468        Self::from(&input)
5469    }
5470}
5471
5472/// Opcode for the SelectionNotify event
5473pub const SELECTION_NOTIFY_EVENT: u8 = 31;
5474#[derive(Clone, Copy, Default)]
5475#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5476#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5477pub struct SelectionNotifyEvent {
5478    pub response_type: u8,
5479    pub sequence: u16,
5480    pub time: Timestamp,
5481    pub requestor: Window,
5482    pub selection: Atom,
5483    pub target: Atom,
5484    pub property: Atom,
5485}
5486impl_debug_if_no_extra_traits!(SelectionNotifyEvent, "SelectionNotifyEvent");
5487impl TryParse for SelectionNotifyEvent {
5488    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
5489        let remaining = initial_value;
5490        let (response_type, remaining) = u8::try_parse(remaining)?;
5491        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
5492        let (sequence, remaining) = u16::try_parse(remaining)?;
5493        let (time, remaining) = Timestamp::try_parse(remaining)?;
5494        let (requestor, remaining) = Window::try_parse(remaining)?;
5495        let (selection, remaining) = Atom::try_parse(remaining)?;
5496        let (target, remaining) = Atom::try_parse(remaining)?;
5497        let (property, remaining) = Atom::try_parse(remaining)?;
5498        let result = SelectionNotifyEvent { response_type, sequence, time, requestor, selection, target, property };
5499        let _ = remaining;
5500        let remaining = initial_value.get(32..)
5501            .ok_or(ParseError::InsufficientData)?;
5502        Ok((result, remaining))
5503    }
5504}
5505impl Serialize for SelectionNotifyEvent {
5506    type Bytes = [u8; 24];
5507    fn serialize(&self) -> [u8; 24] {
5508        let response_type_bytes = self.response_type.serialize();
5509        let sequence_bytes = self.sequence.serialize();
5510        let time_bytes = self.time.serialize();
5511        let requestor_bytes = self.requestor.serialize();
5512        let selection_bytes = self.selection.serialize();
5513        let target_bytes = self.target.serialize();
5514        let property_bytes = self.property.serialize();
5515        [
5516            response_type_bytes[0],
5517            0,
5518            sequence_bytes[0],
5519            sequence_bytes[1],
5520            time_bytes[0],
5521            time_bytes[1],
5522            time_bytes[2],
5523            time_bytes[3],
5524            requestor_bytes[0],
5525            requestor_bytes[1],
5526            requestor_bytes[2],
5527            requestor_bytes[3],
5528            selection_bytes[0],
5529            selection_bytes[1],
5530            selection_bytes[2],
5531            selection_bytes[3],
5532            target_bytes[0],
5533            target_bytes[1],
5534            target_bytes[2],
5535            target_bytes[3],
5536            property_bytes[0],
5537            property_bytes[1],
5538            property_bytes[2],
5539            property_bytes[3],
5540        ]
5541    }
5542    fn serialize_into(&self, bytes: &mut Vec<u8>) {
5543        bytes.reserve(24);
5544        self.response_type.serialize_into(bytes);
5545        bytes.extend_from_slice(&[0; 1]);
5546        self.sequence.serialize_into(bytes);
5547        self.time.serialize_into(bytes);
5548        self.requestor.serialize_into(bytes);
5549        self.selection.serialize_into(bytes);
5550        self.target.serialize_into(bytes);
5551        self.property.serialize_into(bytes);
5552    }
5553}
5554impl From<&SelectionNotifyEvent> for [u8; 32] {
5555    fn from(input: &SelectionNotifyEvent) -> Self {
5556        let response_type_bytes = input.response_type.serialize();
5557        let sequence_bytes = input.sequence.serialize();
5558        let time_bytes = input.time.serialize();
5559        let requestor_bytes = input.requestor.serialize();
5560        let selection_bytes = input.selection.serialize();
5561        let target_bytes = input.target.serialize();
5562        let property_bytes = input.property.serialize();
5563        [
5564            response_type_bytes[0],
5565            0,
5566            sequence_bytes[0],
5567            sequence_bytes[1],
5568            time_bytes[0],
5569            time_bytes[1],
5570            time_bytes[2],
5571            time_bytes[3],
5572            requestor_bytes[0],
5573            requestor_bytes[1],
5574            requestor_bytes[2],
5575            requestor_bytes[3],
5576            selection_bytes[0],
5577            selection_bytes[1],
5578            selection_bytes[2],
5579            selection_bytes[3],
5580            target_bytes[0],
5581            target_bytes[1],
5582            target_bytes[2],
5583            target_bytes[3],
5584            property_bytes[0],
5585            property_bytes[1],
5586            property_bytes[2],
5587            property_bytes[3],
5588            // trailing padding
5589            0,
5590            0,
5591            0,
5592            0,
5593            0,
5594            0,
5595            0,
5596            0,
5597        ]
5598    }
5599}
5600impl From<SelectionNotifyEvent> for [u8; 32] {
5601    fn from(input: SelectionNotifyEvent) -> Self {
5602        Self::from(&input)
5603    }
5604}
5605
5606/// # Fields
5607///
5608/// * `Uninstalled` - The colormap was uninstalled.
5609/// * `Installed` - The colormap was installed.
5610#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
5611#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5612pub struct ColormapState(u8);
5613impl ColormapState {
5614    pub const UNINSTALLED: Self = Self(0);
5615    pub const INSTALLED: Self = Self(1);
5616}
5617impl From<ColormapState> for u8 {
5618    #[inline]
5619    fn from(input: ColormapState) -> Self {
5620        input.0
5621    }
5622}
5623impl From<ColormapState> for Option<u8> {
5624    #[inline]
5625    fn from(input: ColormapState) -> Self {
5626        Some(input.0)
5627    }
5628}
5629impl From<ColormapState> for u16 {
5630    #[inline]
5631    fn from(input: ColormapState) -> Self {
5632        u16::from(input.0)
5633    }
5634}
5635impl From<ColormapState> for Option<u16> {
5636    #[inline]
5637    fn from(input: ColormapState) -> Self {
5638        Some(u16::from(input.0))
5639    }
5640}
5641impl From<ColormapState> for u32 {
5642    #[inline]
5643    fn from(input: ColormapState) -> Self {
5644        u32::from(input.0)
5645    }
5646}
5647impl From<ColormapState> for Option<u32> {
5648    #[inline]
5649    fn from(input: ColormapState) -> Self {
5650        Some(u32::from(input.0))
5651    }
5652}
5653impl From<u8> for ColormapState {
5654    #[inline]
5655    fn from(value: u8) -> Self {
5656        Self(value)
5657    }
5658}
5659impl core::fmt::Debug for ColormapState  {
5660    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
5661        let variants = [
5662            (Self::UNINSTALLED.0.into(), "UNINSTALLED", "Uninstalled"),
5663            (Self::INSTALLED.0.into(), "INSTALLED", "Installed"),
5664        ];
5665        pretty_print_enum(fmt, self.0.into(), &variants)
5666    }
5667}
5668
5669#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
5670#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5671pub struct ColormapEnum(u8);
5672impl ColormapEnum {
5673    pub const NONE: Self = Self(0);
5674}
5675impl From<ColormapEnum> for u8 {
5676    #[inline]
5677    fn from(input: ColormapEnum) -> Self {
5678        input.0
5679    }
5680}
5681impl From<ColormapEnum> for Option<u8> {
5682    #[inline]
5683    fn from(input: ColormapEnum) -> Self {
5684        Some(input.0)
5685    }
5686}
5687impl From<ColormapEnum> for u16 {
5688    #[inline]
5689    fn from(input: ColormapEnum) -> Self {
5690        u16::from(input.0)
5691    }
5692}
5693impl From<ColormapEnum> for Option<u16> {
5694    #[inline]
5695    fn from(input: ColormapEnum) -> Self {
5696        Some(u16::from(input.0))
5697    }
5698}
5699impl From<ColormapEnum> for u32 {
5700    #[inline]
5701    fn from(input: ColormapEnum) -> Self {
5702        u32::from(input.0)
5703    }
5704}
5705impl From<ColormapEnum> for Option<u32> {
5706    #[inline]
5707    fn from(input: ColormapEnum) -> Self {
5708        Some(u32::from(input.0))
5709    }
5710}
5711impl From<u8> for ColormapEnum {
5712    #[inline]
5713    fn from(value: u8) -> Self {
5714        Self(value)
5715    }
5716}
5717impl core::fmt::Debug for ColormapEnum  {
5718    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
5719        let variants = [
5720            (Self::NONE.0.into(), "NONE", "None"),
5721        ];
5722        pretty_print_enum(fmt, self.0.into(), &variants)
5723    }
5724}
5725
5726/// Opcode for the ColormapNotify event
5727pub const COLORMAP_NOTIFY_EVENT: u8 = 32;
5728/// the colormap for some window changed.
5729///
5730/// # Fields
5731///
5732/// * `window` - The window whose associated colormap is changed, installed or uninstalled.
5733/// * `colormap` - The colormap which is changed, installed or uninstalled. This is `XCB_NONE`
5734/// when the colormap is changed by a call to `FreeColormap`.
5735/// * `_new` - Indicates whether the colormap was changed (1) or installed/uninstalled (0).
5736/// * `state` -
5737///
5738/// # See
5739///
5740/// * `FreeColormap`: request
5741#[derive(Clone, Copy, Default)]
5742#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5743#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5744pub struct ColormapNotifyEvent {
5745    pub response_type: u8,
5746    pub sequence: u16,
5747    pub window: Window,
5748    pub colormap: Colormap,
5749    pub new: bool,
5750    pub state: ColormapState,
5751}
5752impl_debug_if_no_extra_traits!(ColormapNotifyEvent, "ColormapNotifyEvent");
5753impl TryParse for ColormapNotifyEvent {
5754    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
5755        let remaining = initial_value;
5756        let (response_type, remaining) = u8::try_parse(remaining)?;
5757        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
5758        let (sequence, remaining) = u16::try_parse(remaining)?;
5759        let (window, remaining) = Window::try_parse(remaining)?;
5760        let (colormap, remaining) = Colormap::try_parse(remaining)?;
5761        let (new, remaining) = bool::try_parse(remaining)?;
5762        let (state, remaining) = u8::try_parse(remaining)?;
5763        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
5764        let state = state.into();
5765        let result = ColormapNotifyEvent { response_type, sequence, window, colormap, new, state };
5766        let _ = remaining;
5767        let remaining = initial_value.get(32..)
5768            .ok_or(ParseError::InsufficientData)?;
5769        Ok((result, remaining))
5770    }
5771}
5772impl Serialize for ColormapNotifyEvent {
5773    type Bytes = [u8; 16];
5774    fn serialize(&self) -> [u8; 16] {
5775        let response_type_bytes = self.response_type.serialize();
5776        let sequence_bytes = self.sequence.serialize();
5777        let window_bytes = self.window.serialize();
5778        let colormap_bytes = self.colormap.serialize();
5779        let new_bytes = self.new.serialize();
5780        let state_bytes = u8::from(self.state).serialize();
5781        [
5782            response_type_bytes[0],
5783            0,
5784            sequence_bytes[0],
5785            sequence_bytes[1],
5786            window_bytes[0],
5787            window_bytes[1],
5788            window_bytes[2],
5789            window_bytes[3],
5790            colormap_bytes[0],
5791            colormap_bytes[1],
5792            colormap_bytes[2],
5793            colormap_bytes[3],
5794            new_bytes[0],
5795            state_bytes[0],
5796            0,
5797            0,
5798        ]
5799    }
5800    fn serialize_into(&self, bytes: &mut Vec<u8>) {
5801        bytes.reserve(16);
5802        self.response_type.serialize_into(bytes);
5803        bytes.extend_from_slice(&[0; 1]);
5804        self.sequence.serialize_into(bytes);
5805        self.window.serialize_into(bytes);
5806        self.colormap.serialize_into(bytes);
5807        self.new.serialize_into(bytes);
5808        u8::from(self.state).serialize_into(bytes);
5809        bytes.extend_from_slice(&[0; 2]);
5810    }
5811}
5812impl From<&ColormapNotifyEvent> for [u8; 32] {
5813    fn from(input: &ColormapNotifyEvent) -> Self {
5814        let response_type_bytes = input.response_type.serialize();
5815        let sequence_bytes = input.sequence.serialize();
5816        let window_bytes = input.window.serialize();
5817        let colormap_bytes = input.colormap.serialize();
5818        let new_bytes = input.new.serialize();
5819        let state_bytes = u8::from(input.state).serialize();
5820        [
5821            response_type_bytes[0],
5822            0,
5823            sequence_bytes[0],
5824            sequence_bytes[1],
5825            window_bytes[0],
5826            window_bytes[1],
5827            window_bytes[2],
5828            window_bytes[3],
5829            colormap_bytes[0],
5830            colormap_bytes[1],
5831            colormap_bytes[2],
5832            colormap_bytes[3],
5833            new_bytes[0],
5834            state_bytes[0],
5835            0,
5836            0,
5837            // trailing padding
5838            0,
5839            0,
5840            0,
5841            0,
5842            0,
5843            0,
5844            0,
5845            0,
5846            0,
5847            0,
5848            0,
5849            0,
5850            0,
5851            0,
5852            0,
5853            0,
5854        ]
5855    }
5856}
5857impl From<ColormapNotifyEvent> for [u8; 32] {
5858    fn from(input: ColormapNotifyEvent) -> Self {
5859        Self::from(&input)
5860    }
5861}
5862
5863#[derive(Debug, Copy, Clone)]
5864#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5865pub struct ClientMessageData([u8; 20]);
5866impl ClientMessageData {
5867    pub fn as_data8(&self) -> [u8; 20] {
5868        fn do_the_parse(remaining: &[u8]) -> Result<[u8; 20], ParseError> {
5869            let (data8, remaining) = crate::x11_utils::parse_u8_array::<20>(remaining)?;
5870            let _ = remaining;
5871            Ok(data8)
5872        }
5873        do_the_parse(&self.0).unwrap()
5874    }
5875    pub fn as_data16(&self) -> [u16; 10] {
5876        fn do_the_parse(remaining: &[u8]) -> Result<[u16; 10], ParseError> {
5877            let (data16_0, remaining) = u16::try_parse(remaining)?;
5878            let (data16_1, remaining) = u16::try_parse(remaining)?;
5879            let (data16_2, remaining) = u16::try_parse(remaining)?;
5880            let (data16_3, remaining) = u16::try_parse(remaining)?;
5881            let (data16_4, remaining) = u16::try_parse(remaining)?;
5882            let (data16_5, remaining) = u16::try_parse(remaining)?;
5883            let (data16_6, remaining) = u16::try_parse(remaining)?;
5884            let (data16_7, remaining) = u16::try_parse(remaining)?;
5885            let (data16_8, remaining) = u16::try_parse(remaining)?;
5886            let (data16_9, remaining) = u16::try_parse(remaining)?;
5887            let data16 = [
5888                data16_0,
5889                data16_1,
5890                data16_2,
5891                data16_3,
5892                data16_4,
5893                data16_5,
5894                data16_6,
5895                data16_7,
5896                data16_8,
5897                data16_9,
5898            ];
5899            let _ = remaining;
5900            Ok(data16)
5901        }
5902        do_the_parse(&self.0).unwrap()
5903    }
5904    pub fn as_data32(&self) -> [u32; 5] {
5905        fn do_the_parse(remaining: &[u8]) -> Result<[u32; 5], ParseError> {
5906            let (data32_0, remaining) = u32::try_parse(remaining)?;
5907            let (data32_1, remaining) = u32::try_parse(remaining)?;
5908            let (data32_2, remaining) = u32::try_parse(remaining)?;
5909            let (data32_3, remaining) = u32::try_parse(remaining)?;
5910            let (data32_4, remaining) = u32::try_parse(remaining)?;
5911            let data32 = [
5912                data32_0,
5913                data32_1,
5914                data32_2,
5915                data32_3,
5916                data32_4,
5917            ];
5918            let _ = remaining;
5919            Ok(data32)
5920        }
5921        do_the_parse(&self.0).unwrap()
5922    }
5923}
5924impl Serialize for ClientMessageData {
5925    type Bytes = [u8; 20];
5926    fn serialize(&self) -> [u8; 20] {
5927        self.0
5928    }
5929    fn serialize_into(&self, bytes: &mut Vec<u8>) {
5930        bytes.extend_from_slice(&self.0);
5931    }
5932}
5933impl TryParse for ClientMessageData {
5934    fn try_parse(value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
5935        let inner: [u8; 20] = value.get(..20)
5936            .ok_or(ParseError::InsufficientData)?
5937            .try_into()
5938            .unwrap();
5939        let result = ClientMessageData(inner);
5940        Ok((result, &value[20..]))
5941    }
5942}
5943impl From<[u8; 20]> for ClientMessageData {
5944    fn from(data8: [u8; 20]) -> Self {
5945        Self(data8)
5946    }
5947}
5948impl From<[u16; 10]> for ClientMessageData {
5949    fn from(data16: [u16; 10]) -> Self {
5950        let data16_0_bytes = data16[0].serialize();
5951        let data16_1_bytes = data16[1].serialize();
5952        let data16_2_bytes = data16[2].serialize();
5953        let data16_3_bytes = data16[3].serialize();
5954        let data16_4_bytes = data16[4].serialize();
5955        let data16_5_bytes = data16[5].serialize();
5956        let data16_6_bytes = data16[6].serialize();
5957        let data16_7_bytes = data16[7].serialize();
5958        let data16_8_bytes = data16[8].serialize();
5959        let data16_9_bytes = data16[9].serialize();
5960        let value = [
5961            data16_0_bytes[0],
5962            data16_0_bytes[1],
5963            data16_1_bytes[0],
5964            data16_1_bytes[1],
5965            data16_2_bytes[0],
5966            data16_2_bytes[1],
5967            data16_3_bytes[0],
5968            data16_3_bytes[1],
5969            data16_4_bytes[0],
5970            data16_4_bytes[1],
5971            data16_5_bytes[0],
5972            data16_5_bytes[1],
5973            data16_6_bytes[0],
5974            data16_6_bytes[1],
5975            data16_7_bytes[0],
5976            data16_7_bytes[1],
5977            data16_8_bytes[0],
5978            data16_8_bytes[1],
5979            data16_9_bytes[0],
5980            data16_9_bytes[1],
5981        ];
5982        Self(value)
5983    }
5984}
5985impl From<[u32; 5]> for ClientMessageData {
5986    fn from(data32: [u32; 5]) -> Self {
5987        let data32_0_bytes = data32[0].serialize();
5988        let data32_1_bytes = data32[1].serialize();
5989        let data32_2_bytes = data32[2].serialize();
5990        let data32_3_bytes = data32[3].serialize();
5991        let data32_4_bytes = data32[4].serialize();
5992        let value = [
5993            data32_0_bytes[0],
5994            data32_0_bytes[1],
5995            data32_0_bytes[2],
5996            data32_0_bytes[3],
5997            data32_1_bytes[0],
5998            data32_1_bytes[1],
5999            data32_1_bytes[2],
6000            data32_1_bytes[3],
6001            data32_2_bytes[0],
6002            data32_2_bytes[1],
6003            data32_2_bytes[2],
6004            data32_2_bytes[3],
6005            data32_3_bytes[0],
6006            data32_3_bytes[1],
6007            data32_3_bytes[2],
6008            data32_3_bytes[3],
6009            data32_4_bytes[0],
6010            data32_4_bytes[1],
6011            data32_4_bytes[2],
6012            data32_4_bytes[3],
6013        ];
6014        Self(value)
6015    }
6016}
6017
6018/// Opcode for the ClientMessage event
6019pub const CLIENT_MESSAGE_EVENT: u8 = 33;
6020/// NOT YET DOCUMENTED.
6021///
6022/// This event represents a ClientMessage, sent by another X11 client. An example
6023/// is a client sending the `_NET_WM_STATE` ClientMessage to the root window
6024/// to indicate the fullscreen window state, effectively requesting that the window
6025/// manager puts it into fullscreen mode.
6026///
6027/// # Fields
6028///
6029/// * `format` - Specifies how to interpret `data`. Can be either 8, 16 or 32.
6030/// * `type` - An atom which indicates how the data should be interpreted by the receiving
6031/// client.
6032/// * `data` - The data itself (20 bytes max).
6033///
6034/// # See
6035///
6036/// * `SendEvent`: request
6037#[derive(Clone, Copy)]
6038#[cfg_attr(feature = "extra-traits", derive(Debug))]
6039#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6040pub struct ClientMessageEvent {
6041    pub response_type: u8,
6042    pub format: u8,
6043    pub sequence: u16,
6044    pub window: Window,
6045    pub type_: Atom,
6046    pub data: ClientMessageData,
6047}
6048impl_debug_if_no_extra_traits!(ClientMessageEvent, "ClientMessageEvent");
6049impl TryParse for ClientMessageEvent {
6050    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
6051        let remaining = initial_value;
6052        let (response_type, remaining) = u8::try_parse(remaining)?;
6053        let (format, remaining) = u8::try_parse(remaining)?;
6054        let (sequence, remaining) = u16::try_parse(remaining)?;
6055        let (window, remaining) = Window::try_parse(remaining)?;
6056        let (type_, remaining) = Atom::try_parse(remaining)?;
6057        let (data, remaining) = ClientMessageData::try_parse(remaining)?;
6058        let result = ClientMessageEvent { response_type, format, sequence, window, type_, data };
6059        let _ = remaining;
6060        let remaining = initial_value.get(32..)
6061            .ok_or(ParseError::InsufficientData)?;
6062        Ok((result, remaining))
6063    }
6064}
6065impl Serialize for ClientMessageEvent {
6066    type Bytes = [u8; 32];
6067    fn serialize(&self) -> [u8; 32] {
6068        let response_type_bytes = self.response_type.serialize();
6069        let format_bytes = self.format.serialize();
6070        let sequence_bytes = self.sequence.serialize();
6071        let window_bytes = self.window.serialize();
6072        let type_bytes = self.type_.serialize();
6073        let data_bytes = self.data.serialize();
6074        [
6075            response_type_bytes[0],
6076            format_bytes[0],
6077            sequence_bytes[0],
6078            sequence_bytes[1],
6079            window_bytes[0],
6080            window_bytes[1],
6081            window_bytes[2],
6082            window_bytes[3],
6083            type_bytes[0],
6084            type_bytes[1],
6085            type_bytes[2],
6086            type_bytes[3],
6087            data_bytes[0],
6088            data_bytes[1],
6089            data_bytes[2],
6090            data_bytes[3],
6091            data_bytes[4],
6092            data_bytes[5],
6093            data_bytes[6],
6094            data_bytes[7],
6095            data_bytes[8],
6096            data_bytes[9],
6097            data_bytes[10],
6098            data_bytes[11],
6099            data_bytes[12],
6100            data_bytes[13],
6101            data_bytes[14],
6102            data_bytes[15],
6103            data_bytes[16],
6104            data_bytes[17],
6105            data_bytes[18],
6106            data_bytes[19],
6107        ]
6108    }
6109    fn serialize_into(&self, bytes: &mut Vec<u8>) {
6110        bytes.reserve(32);
6111        self.response_type.serialize_into(bytes);
6112        self.format.serialize_into(bytes);
6113        self.sequence.serialize_into(bytes);
6114        self.window.serialize_into(bytes);
6115        self.type_.serialize_into(bytes);
6116        self.data.serialize_into(bytes);
6117    }
6118}
6119impl From<&ClientMessageEvent> for [u8; 32] {
6120    fn from(input: &ClientMessageEvent) -> Self {
6121        let response_type_bytes = input.response_type.serialize();
6122        let format_bytes = input.format.serialize();
6123        let sequence_bytes = input.sequence.serialize();
6124        let window_bytes = input.window.serialize();
6125        let type_bytes = input.type_.serialize();
6126        let data_bytes = input.data.serialize();
6127        [
6128            response_type_bytes[0],
6129            format_bytes[0],
6130            sequence_bytes[0],
6131            sequence_bytes[1],
6132            window_bytes[0],
6133            window_bytes[1],
6134            window_bytes[2],
6135            window_bytes[3],
6136            type_bytes[0],
6137            type_bytes[1],
6138            type_bytes[2],
6139            type_bytes[3],
6140            data_bytes[0],
6141            data_bytes[1],
6142            data_bytes[2],
6143            data_bytes[3],
6144            data_bytes[4],
6145            data_bytes[5],
6146            data_bytes[6],
6147            data_bytes[7],
6148            data_bytes[8],
6149            data_bytes[9],
6150            data_bytes[10],
6151            data_bytes[11],
6152            data_bytes[12],
6153            data_bytes[13],
6154            data_bytes[14],
6155            data_bytes[15],
6156            data_bytes[16],
6157            data_bytes[17],
6158            data_bytes[18],
6159            data_bytes[19],
6160        ]
6161    }
6162}
6163impl From<ClientMessageEvent> for [u8; 32] {
6164    fn from(input: ClientMessageEvent) -> Self {
6165        Self::from(&input)
6166    }
6167}
6168impl ClientMessageEvent {
6169    /// Create a new `ClientMessageEvent`.
6170    ///
6171    /// This function simplifies the creation of a `ClientMessageEvent` by applying
6172    /// some useful defaults:
6173    /// - `response_type = CLIENT_MESSAGE_EVENT`
6174    /// - `sequence = 0`
6175    ///
6176    /// The other fields are set from the parameters given to this function.
6177    pub fn new(format: u8, window: Window, type_: impl Into<Atom>, data: impl Into<ClientMessageData>) -> Self {
6178        Self {
6179            response_type: CLIENT_MESSAGE_EVENT,
6180            format,
6181            sequence: 0,
6182            window,
6183            type_: type_.into(),
6184            data: data.into(),
6185        }
6186    }
6187}
6188
6189#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
6190#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6191pub struct Mapping(u8);
6192impl Mapping {
6193    pub const MODIFIER: Self = Self(0);
6194    pub const KEYBOARD: Self = Self(1);
6195    pub const POINTER: Self = Self(2);
6196}
6197impl From<Mapping> for u8 {
6198    #[inline]
6199    fn from(input: Mapping) -> Self {
6200        input.0
6201    }
6202}
6203impl From<Mapping> for Option<u8> {
6204    #[inline]
6205    fn from(input: Mapping) -> Self {
6206        Some(input.0)
6207    }
6208}
6209impl From<Mapping> for u16 {
6210    #[inline]
6211    fn from(input: Mapping) -> Self {
6212        u16::from(input.0)
6213    }
6214}
6215impl From<Mapping> for Option<u16> {
6216    #[inline]
6217    fn from(input: Mapping) -> Self {
6218        Some(u16::from(input.0))
6219    }
6220}
6221impl From<Mapping> for u32 {
6222    #[inline]
6223    fn from(input: Mapping) -> Self {
6224        u32::from(input.0)
6225    }
6226}
6227impl From<Mapping> for Option<u32> {
6228    #[inline]
6229    fn from(input: Mapping) -> Self {
6230        Some(u32::from(input.0))
6231    }
6232}
6233impl From<u8> for Mapping {
6234    #[inline]
6235    fn from(value: u8) -> Self {
6236        Self(value)
6237    }
6238}
6239impl core::fmt::Debug for Mapping  {
6240    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
6241        let variants = [
6242            (Self::MODIFIER.0.into(), "MODIFIER", "Modifier"),
6243            (Self::KEYBOARD.0.into(), "KEYBOARD", "Keyboard"),
6244            (Self::POINTER.0.into(), "POINTER", "Pointer"),
6245        ];
6246        pretty_print_enum(fmt, self.0.into(), &variants)
6247    }
6248}
6249
6250/// Opcode for the MappingNotify event
6251pub const MAPPING_NOTIFY_EVENT: u8 = 34;
6252/// keyboard mapping changed.
6253///
6254/// # Fields
6255///
6256/// * `request` -
6257/// * `first_keycode` - The first number in the range of the altered mapping.
6258/// * `count` - The number of keycodes altered.
6259#[derive(Clone, Copy, Default)]
6260#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6261#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6262pub struct MappingNotifyEvent {
6263    pub response_type: u8,
6264    pub sequence: u16,
6265    pub request: Mapping,
6266    pub first_keycode: Keycode,
6267    pub count: u8,
6268}
6269impl_debug_if_no_extra_traits!(MappingNotifyEvent, "MappingNotifyEvent");
6270impl TryParse for MappingNotifyEvent {
6271    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
6272        let remaining = initial_value;
6273        let (response_type, remaining) = u8::try_parse(remaining)?;
6274        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
6275        let (sequence, remaining) = u16::try_parse(remaining)?;
6276        let (request, remaining) = u8::try_parse(remaining)?;
6277        let (first_keycode, remaining) = Keycode::try_parse(remaining)?;
6278        let (count, remaining) = u8::try_parse(remaining)?;
6279        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
6280        let request = request.into();
6281        let result = MappingNotifyEvent { response_type, sequence, request, first_keycode, count };
6282        let _ = remaining;
6283        let remaining = initial_value.get(32..)
6284            .ok_or(ParseError::InsufficientData)?;
6285        Ok((result, remaining))
6286    }
6287}
6288impl Serialize for MappingNotifyEvent {
6289    type Bytes = [u8; 8];
6290    fn serialize(&self) -> [u8; 8] {
6291        let response_type_bytes = self.response_type.serialize();
6292        let sequence_bytes = self.sequence.serialize();
6293        let request_bytes = u8::from(self.request).serialize();
6294        let first_keycode_bytes = self.first_keycode.serialize();
6295        let count_bytes = self.count.serialize();
6296        [
6297            response_type_bytes[0],
6298            0,
6299            sequence_bytes[0],
6300            sequence_bytes[1],
6301            request_bytes[0],
6302            first_keycode_bytes[0],
6303            count_bytes[0],
6304            0,
6305        ]
6306    }
6307    fn serialize_into(&self, bytes: &mut Vec<u8>) {
6308        bytes.reserve(8);
6309        self.response_type.serialize_into(bytes);
6310        bytes.extend_from_slice(&[0; 1]);
6311        self.sequence.serialize_into(bytes);
6312        u8::from(self.request).serialize_into(bytes);
6313        self.first_keycode.serialize_into(bytes);
6314        self.count.serialize_into(bytes);
6315        bytes.extend_from_slice(&[0; 1]);
6316    }
6317}
6318impl From<&MappingNotifyEvent> for [u8; 32] {
6319    fn from(input: &MappingNotifyEvent) -> Self {
6320        let response_type_bytes = input.response_type.serialize();
6321        let sequence_bytes = input.sequence.serialize();
6322        let request_bytes = u8::from(input.request).serialize();
6323        let first_keycode_bytes = input.first_keycode.serialize();
6324        let count_bytes = input.count.serialize();
6325        [
6326            response_type_bytes[0],
6327            0,
6328            sequence_bytes[0],
6329            sequence_bytes[1],
6330            request_bytes[0],
6331            first_keycode_bytes[0],
6332            count_bytes[0],
6333            0,
6334            // trailing padding
6335            0,
6336            0,
6337            0,
6338            0,
6339            0,
6340            0,
6341            0,
6342            0,
6343            0,
6344            0,
6345            0,
6346            0,
6347            0,
6348            0,
6349            0,
6350            0,
6351            0,
6352            0,
6353            0,
6354            0,
6355            0,
6356            0,
6357            0,
6358            0,
6359        ]
6360    }
6361}
6362impl From<MappingNotifyEvent> for [u8; 32] {
6363    fn from(input: MappingNotifyEvent) -> Self {
6364        Self::from(&input)
6365    }
6366}
6367
6368/// Opcode for the GeGeneric event
6369pub const GE_GENERIC_EVENT: u8 = 35;
6370/// generic event (with length).
6371///
6372/// # Fields
6373///
6374/// * `extension` - The major opcode of the extension creating this event
6375/// * `length` - The amount (in 4-byte units) of data beyond 32 bytes
6376/// * `evtype` - The extension-specific event type
6377#[derive(Clone, Copy, Default)]
6378#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6379#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6380pub struct GeGenericEvent {
6381    pub response_type: u8,
6382    pub extension: u8,
6383    pub sequence: u16,
6384    pub length: u32,
6385    pub event_type: u16,
6386}
6387impl_debug_if_no_extra_traits!(GeGenericEvent, "GeGenericEvent");
6388impl TryParse for GeGenericEvent {
6389    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
6390        let remaining = initial_value;
6391        let (response_type, remaining) = u8::try_parse(remaining)?;
6392        let (extension, remaining) = u8::try_parse(remaining)?;
6393        let (sequence, remaining) = u16::try_parse(remaining)?;
6394        let (length, remaining) = u32::try_parse(remaining)?;
6395        let (event_type, remaining) = u16::try_parse(remaining)?;
6396        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
6397        let result = GeGenericEvent { response_type, extension, sequence, length, event_type };
6398        let _ = remaining;
6399        let remaining = initial_value.get(32 + length as usize * 4..)
6400            .ok_or(ParseError::InsufficientData)?;
6401        Ok((result, remaining))
6402    }
6403}
6404impl Serialize for GeGenericEvent {
6405    type Bytes = [u8; 32];
6406    fn serialize(&self) -> [u8; 32] {
6407        let response_type_bytes = self.response_type.serialize();
6408        let extension_bytes = self.extension.serialize();
6409        let sequence_bytes = self.sequence.serialize();
6410        let length_bytes = self.length.serialize();
6411        let event_type_bytes = self.event_type.serialize();
6412        [
6413            response_type_bytes[0],
6414            extension_bytes[0],
6415            sequence_bytes[0],
6416            sequence_bytes[1],
6417            length_bytes[0],
6418            length_bytes[1],
6419            length_bytes[2],
6420            length_bytes[3],
6421            event_type_bytes[0],
6422            event_type_bytes[1],
6423            0,
6424            0,
6425            0,
6426            0,
6427            0,
6428            0,
6429            0,
6430            0,
6431            0,
6432            0,
6433            0,
6434            0,
6435            0,
6436            0,
6437            0,
6438            0,
6439            0,
6440            0,
6441            0,
6442            0,
6443            0,
6444            0,
6445        ]
6446    }
6447    fn serialize_into(&self, bytes: &mut Vec<u8>) {
6448        bytes.reserve(32);
6449        self.response_type.serialize_into(bytes);
6450        self.extension.serialize_into(bytes);
6451        self.sequence.serialize_into(bytes);
6452        self.length.serialize_into(bytes);
6453        self.event_type.serialize_into(bytes);
6454        bytes.extend_from_slice(&[0; 22]);
6455    }
6456}
6457
6458/// Opcode for the Request error
6459pub const REQUEST_ERROR: u8 = 1;
6460
6461/// Opcode for the Value error
6462pub const VALUE_ERROR: u8 = 2;
6463
6464/// Opcode for the Window error
6465pub const WINDOW_ERROR: u8 = 3;
6466
6467/// Opcode for the Pixmap error
6468pub const PIXMAP_ERROR: u8 = 4;
6469
6470/// Opcode for the Atom error
6471pub const ATOM_ERROR: u8 = 5;
6472
6473/// Opcode for the Cursor error
6474pub const CURSOR_ERROR: u8 = 6;
6475
6476/// Opcode for the Font error
6477pub const FONT_ERROR: u8 = 7;
6478
6479/// Opcode for the Match error
6480pub const MATCH_ERROR: u8 = 8;
6481
6482/// Opcode for the Drawable error
6483pub const DRAWABLE_ERROR: u8 = 9;
6484
6485/// Opcode for the Access error
6486pub const ACCESS_ERROR: u8 = 10;
6487
6488/// Opcode for the Alloc error
6489pub const ALLOC_ERROR: u8 = 11;
6490
6491/// Opcode for the Colormap error
6492pub const COLORMAP_ERROR: u8 = 12;
6493
6494/// Opcode for the GContext error
6495pub const G_CONTEXT_ERROR: u8 = 13;
6496
6497/// Opcode for the IDChoice error
6498pub const ID_CHOICE_ERROR: u8 = 14;
6499
6500/// Opcode for the Name error
6501pub const NAME_ERROR: u8 = 15;
6502
6503/// Opcode for the Length error
6504pub const LENGTH_ERROR: u8 = 16;
6505
6506/// Opcode for the Implementation error
6507pub const IMPLEMENTATION_ERROR: u8 = 17;
6508
6509#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
6510#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6511pub struct WindowClass(u16);
6512impl WindowClass {
6513    pub const COPY_FROM_PARENT: Self = Self(0);
6514    pub const INPUT_OUTPUT: Self = Self(1);
6515    pub const INPUT_ONLY: Self = Self(2);
6516}
6517impl From<WindowClass> for u16 {
6518    #[inline]
6519    fn from(input: WindowClass) -> Self {
6520        input.0
6521    }
6522}
6523impl From<WindowClass> for Option<u16> {
6524    #[inline]
6525    fn from(input: WindowClass) -> Self {
6526        Some(input.0)
6527    }
6528}
6529impl From<WindowClass> for u32 {
6530    #[inline]
6531    fn from(input: WindowClass) -> Self {
6532        u32::from(input.0)
6533    }
6534}
6535impl From<WindowClass> for Option<u32> {
6536    #[inline]
6537    fn from(input: WindowClass) -> Self {
6538        Some(u32::from(input.0))
6539    }
6540}
6541impl From<u8> for WindowClass {
6542    #[inline]
6543    fn from(value: u8) -> Self {
6544        Self(value.into())
6545    }
6546}
6547impl From<u16> for WindowClass {
6548    #[inline]
6549    fn from(value: u16) -> Self {
6550        Self(value)
6551    }
6552}
6553impl core::fmt::Debug for WindowClass  {
6554    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
6555        let variants = [
6556            (Self::COPY_FROM_PARENT.0.into(), "COPY_FROM_PARENT", "CopyFromParent"),
6557            (Self::INPUT_OUTPUT.0.into(), "INPUT_OUTPUT", "InputOutput"),
6558            (Self::INPUT_ONLY.0.into(), "INPUT_ONLY", "InputOnly"),
6559        ];
6560        pretty_print_enum(fmt, self.0.into(), &variants)
6561    }
6562}
6563
6564/// # Fields
6565///
6566/// * `BackPixmap` - Overrides the default background-pixmap. The background pixmap and window must
6567/// have the same root and same depth. Any size pixmap can be used, although some
6568/// sizes may be faster than others.
6569///
6570/// If `XCB_BACK_PIXMAP_NONE` is specified, the window has no defined background.
6571/// The server may fill the contents with the previous screen contents or with
6572/// contents of its own choosing.
6573///
6574/// If `XCB_BACK_PIXMAP_PARENT_RELATIVE` is specified, the parent's background is
6575/// used, but the window must have the same depth as the parent (or a Match error
6576/// results).   The parent's background is tracked, and the current version is
6577/// used each time the window background is required.
6578/// * `BackPixel` - Overrides `BackPixmap`. A pixmap of undefined size filled with the specified
6579/// background pixel is used for the background. Range-checking is not performed,
6580/// the background pixel is truncated to the appropriate number of bits.
6581/// * `BorderPixmap` - Overrides the default border-pixmap. The border pixmap and window must have the
6582/// same root and the same depth. Any size pixmap can be used, although some sizes
6583/// may be faster than others.
6584///
6585/// The special value `XCB_COPY_FROM_PARENT` means the parent's border pixmap is
6586/// copied (subsequent changes to the parent's border attribute do not affect the
6587/// child), but the window must have the same depth as the parent.
6588/// * `BorderPixel` - Overrides `BorderPixmap`. A pixmap of undefined size filled with the specified
6589/// border pixel is used for the border. Range checking is not performed on the
6590/// border-pixel value, it is truncated to the appropriate number of bits.
6591/// * `BitGravity` - Defines which region of the window should be retained if the window is resized.
6592/// * `WinGravity` - Defines how the window should be repositioned if the parent is resized (see
6593/// `ConfigureWindow`).
6594/// * `BackingStore` - A backing-store of `WhenMapped` advises the server that maintaining contents of
6595/// obscured regions when the window is mapped would be beneficial. A backing-store
6596/// of `Always` advises the server that maintaining contents even when the window
6597/// is unmapped would be beneficial. In this case, the server may generate an
6598/// exposure event when the window is created. A value of `NotUseful` advises the
6599/// server that maintaining contents is unnecessary, although a server may still
6600/// choose to maintain contents while the window is mapped. Note that if the server
6601/// maintains contents, then the server should maintain complete contents not just
6602/// the region within the parent boundaries, even if the window is larger than its
6603/// parent. While the server maintains contents, exposure events will not normally
6604/// be generated, but the server may stop maintaining contents at any time.
6605/// * `BackingPlanes` - The backing-planes indicates (with bits set to 1) which bit planes of the
6606/// window hold dynamic data that must be preserved in backing-stores and during
6607/// save-unders.
6608/// * `BackingPixel` - The backing-pixel specifies what value to use in planes not covered by
6609/// backing-planes. The server is free to save only the specified bit planes in the
6610/// backing-store or save-under and regenerate the remaining planes with the
6611/// specified pixel value. Any bits beyond the specified depth of the window in
6612/// these values are simply ignored.
6613/// * `OverrideRedirect` - The override-redirect specifies whether map and configure requests on this
6614/// window should override a SubstructureRedirect on the parent, typically to
6615/// inform a window manager not to tamper with the window.
6616/// * `SaveUnder` - If 1, the server is advised that when this window is mapped, saving the
6617/// contents of windows it obscures would be beneficial.
6618/// * `EventMask` - The event-mask defines which events the client is interested in for this window
6619/// (or for some event types, inferiors of the window).
6620/// * `DontPropagate` - The do-not-propagate-mask defines which events should not be propagated to
6621/// ancestor windows when no client has the event type selected in this window.
6622/// * `Colormap` - The colormap specifies the colormap that best reflects the true colors of the window. Servers
6623/// capable of supporting multiple hardware colormaps may use this information, and window man-
6624/// agers may use it for InstallColormap requests. The colormap must have the same visual type
6625/// and root as the window (or a Match error results). If CopyFromParent is specified, the parent's
6626/// colormap is copied (subsequent changes to the parent's colormap attribute do not affect the child).
6627/// However, the window must have the same visual type as the parent (or a Match error results),
6628/// and the parent must not have a colormap of None (or a Match error results). For an explanation
6629/// of None, see FreeColormap request. The colormap is copied by sharing the colormap object
6630/// between the child and the parent, not by making a complete copy of the colormap contents.
6631/// * `Cursor` - If a cursor is specified, it will be used whenever the pointer is in the window. If None is speci-
6632/// fied, the parent's cursor will be used when the pointer is in the window, and any change in the
6633/// parent's cursor will cause an immediate change in the displayed cursor.
6634#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
6635#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6636pub struct CW(u32);
6637impl CW {
6638    pub const BACK_PIXMAP: Self = Self(1 << 0);
6639    pub const BACK_PIXEL: Self = Self(1 << 1);
6640    pub const BORDER_PIXMAP: Self = Self(1 << 2);
6641    pub const BORDER_PIXEL: Self = Self(1 << 3);
6642    pub const BIT_GRAVITY: Self = Self(1 << 4);
6643    pub const WIN_GRAVITY: Self = Self(1 << 5);
6644    pub const BACKING_STORE: Self = Self(1 << 6);
6645    pub const BACKING_PLANES: Self = Self(1 << 7);
6646    pub const BACKING_PIXEL: Self = Self(1 << 8);
6647    pub const OVERRIDE_REDIRECT: Self = Self(1 << 9);
6648    pub const SAVE_UNDER: Self = Self(1 << 10);
6649    pub const EVENT_MASK: Self = Self(1 << 11);
6650    pub const DONT_PROPAGATE: Self = Self(1 << 12);
6651    pub const COLORMAP: Self = Self(1 << 13);
6652    pub const CURSOR: Self = Self(1 << 14);
6653}
6654impl From<CW> for u32 {
6655    #[inline]
6656    fn from(input: CW) -> Self {
6657        input.0
6658    }
6659}
6660impl From<CW> for Option<u32> {
6661    #[inline]
6662    fn from(input: CW) -> Self {
6663        Some(input.0)
6664    }
6665}
6666impl From<u8> for CW {
6667    #[inline]
6668    fn from(value: u8) -> Self {
6669        Self(value.into())
6670    }
6671}
6672impl From<u16> for CW {
6673    #[inline]
6674    fn from(value: u16) -> Self {
6675        Self(value.into())
6676    }
6677}
6678impl From<u32> for CW {
6679    #[inline]
6680    fn from(value: u32) -> Self {
6681        Self(value)
6682    }
6683}
6684impl core::fmt::Debug for CW  {
6685    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
6686        let variants = [
6687            (Self::BACK_PIXMAP.0, "BACK_PIXMAP", "BackPixmap"),
6688            (Self::BACK_PIXEL.0, "BACK_PIXEL", "BackPixel"),
6689            (Self::BORDER_PIXMAP.0, "BORDER_PIXMAP", "BorderPixmap"),
6690            (Self::BORDER_PIXEL.0, "BORDER_PIXEL", "BorderPixel"),
6691            (Self::BIT_GRAVITY.0, "BIT_GRAVITY", "BitGravity"),
6692            (Self::WIN_GRAVITY.0, "WIN_GRAVITY", "WinGravity"),
6693            (Self::BACKING_STORE.0, "BACKING_STORE", "BackingStore"),
6694            (Self::BACKING_PLANES.0, "BACKING_PLANES", "BackingPlanes"),
6695            (Self::BACKING_PIXEL.0, "BACKING_PIXEL", "BackingPixel"),
6696            (Self::OVERRIDE_REDIRECT.0, "OVERRIDE_REDIRECT", "OverrideRedirect"),
6697            (Self::SAVE_UNDER.0, "SAVE_UNDER", "SaveUnder"),
6698            (Self::EVENT_MASK.0, "EVENT_MASK", "EventMask"),
6699            (Self::DONT_PROPAGATE.0, "DONT_PROPAGATE", "DontPropagate"),
6700            (Self::COLORMAP.0, "COLORMAP", "Colormap"),
6701            (Self::CURSOR.0, "CURSOR", "Cursor"),
6702        ];
6703        pretty_print_bitmask(fmt, self.0, &variants)
6704    }
6705}
6706bitmask_binop!(CW, u32);
6707
6708#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
6709#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6710pub struct BackPixmap(bool);
6711impl BackPixmap {
6712    pub const NONE: Self = Self(false);
6713    pub const PARENT_RELATIVE: Self = Self(true);
6714}
6715impl From<BackPixmap> for bool {
6716    #[inline]
6717    fn from(input: BackPixmap) -> Self {
6718        input.0
6719    }
6720}
6721impl From<BackPixmap> for Option<bool> {
6722    #[inline]
6723    fn from(input: BackPixmap) -> Self {
6724        Some(input.0)
6725    }
6726}
6727impl From<BackPixmap> for u8 {
6728    #[inline]
6729    fn from(input: BackPixmap) -> Self {
6730        u8::from(input.0)
6731    }
6732}
6733impl From<BackPixmap> for Option<u8> {
6734    #[inline]
6735    fn from(input: BackPixmap) -> Self {
6736        Some(u8::from(input.0))
6737    }
6738}
6739impl From<BackPixmap> for u16 {
6740    #[inline]
6741    fn from(input: BackPixmap) -> Self {
6742        u16::from(input.0)
6743    }
6744}
6745impl From<BackPixmap> for Option<u16> {
6746    #[inline]
6747    fn from(input: BackPixmap) -> Self {
6748        Some(u16::from(input.0))
6749    }
6750}
6751impl From<BackPixmap> for u32 {
6752    #[inline]
6753    fn from(input: BackPixmap) -> Self {
6754        u32::from(input.0)
6755    }
6756}
6757impl From<BackPixmap> for Option<u32> {
6758    #[inline]
6759    fn from(input: BackPixmap) -> Self {
6760        Some(u32::from(input.0))
6761    }
6762}
6763impl From<bool> for BackPixmap {
6764    #[inline]
6765    fn from(value: bool) -> Self {
6766        Self(value)
6767    }
6768}
6769impl core::fmt::Debug for BackPixmap  {
6770    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
6771        let variants = [
6772            (Self::NONE.0.into(), "NONE", "None"),
6773            (Self::PARENT_RELATIVE.0.into(), "PARENT_RELATIVE", "ParentRelative"),
6774        ];
6775        pretty_print_enum(fmt, self.0.into(), &variants)
6776    }
6777}
6778
6779#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
6780#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6781pub struct Gravity(u32);
6782impl Gravity {
6783    pub const BIT_FORGET: Self = Self(0);
6784    pub const WIN_UNMAP: Self = Self(0);
6785    pub const NORTH_WEST: Self = Self(1);
6786    pub const NORTH: Self = Self(2);
6787    pub const NORTH_EAST: Self = Self(3);
6788    pub const WEST: Self = Self(4);
6789    pub const CENTER: Self = Self(5);
6790    pub const EAST: Self = Self(6);
6791    pub const SOUTH_WEST: Self = Self(7);
6792    pub const SOUTH: Self = Self(8);
6793    pub const SOUTH_EAST: Self = Self(9);
6794    pub const STATIC: Self = Self(10);
6795}
6796impl From<Gravity> for u32 {
6797    #[inline]
6798    fn from(input: Gravity) -> Self {
6799        input.0
6800    }
6801}
6802impl From<Gravity> for Option<u32> {
6803    #[inline]
6804    fn from(input: Gravity) -> Self {
6805        Some(input.0)
6806    }
6807}
6808impl From<u8> for Gravity {
6809    #[inline]
6810    fn from(value: u8) -> Self {
6811        Self(value.into())
6812    }
6813}
6814impl From<u16> for Gravity {
6815    #[inline]
6816    fn from(value: u16) -> Self {
6817        Self(value.into())
6818    }
6819}
6820impl From<u32> for Gravity {
6821    #[inline]
6822    fn from(value: u32) -> Self {
6823        Self(value)
6824    }
6825}
6826impl core::fmt::Debug for Gravity  {
6827    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
6828        let variants = [
6829            (Self::BIT_FORGET.0, "BIT_FORGET", "BitForget"),
6830            (Self::WIN_UNMAP.0, "WIN_UNMAP", "WinUnmap"),
6831            (Self::NORTH_WEST.0, "NORTH_WEST", "NorthWest"),
6832            (Self::NORTH.0, "NORTH", "North"),
6833            (Self::NORTH_EAST.0, "NORTH_EAST", "NorthEast"),
6834            (Self::WEST.0, "WEST", "West"),
6835            (Self::CENTER.0, "CENTER", "Center"),
6836            (Self::EAST.0, "EAST", "East"),
6837            (Self::SOUTH_WEST.0, "SOUTH_WEST", "SouthWest"),
6838            (Self::SOUTH.0, "SOUTH", "South"),
6839            (Self::SOUTH_EAST.0, "SOUTH_EAST", "SouthEast"),
6840            (Self::STATIC.0, "STATIC", "Static"),
6841        ];
6842        pretty_print_enum(fmt, self.0, &variants)
6843    }
6844}
6845
6846/// Auxiliary and optional information for the `create_window` function
6847#[derive(Clone, Copy, Default)]
6848#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6849#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6850pub struct CreateWindowAux {
6851    pub background_pixmap: Option<Pixmap>,
6852    pub background_pixel: Option<u32>,
6853    pub border_pixmap: Option<Pixmap>,
6854    pub border_pixel: Option<u32>,
6855    pub bit_gravity: Option<Gravity>,
6856    pub win_gravity: Option<Gravity>,
6857    pub backing_store: Option<BackingStore>,
6858    pub backing_planes: Option<u32>,
6859    pub backing_pixel: Option<u32>,
6860    pub override_redirect: Option<Bool32>,
6861    pub save_under: Option<Bool32>,
6862    pub event_mask: Option<EventMask>,
6863    pub do_not_propogate_mask: Option<EventMask>,
6864    pub colormap: Option<Colormap>,
6865    pub cursor: Option<Cursor>,
6866}
6867impl_debug_if_no_extra_traits!(CreateWindowAux, "CreateWindowAux");
6868impl CreateWindowAux {
6869    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
6870    fn try_parse(value: &[u8], value_mask: u32) -> Result<(Self, &[u8]), ParseError> {
6871        let switch_expr = u32::from(value_mask);
6872        let mut outer_remaining = value;
6873        let background_pixmap = if switch_expr & u32::from(CW::BACK_PIXMAP) != 0 {
6874            let remaining = outer_remaining;
6875            let (background_pixmap, remaining) = Pixmap::try_parse(remaining)?;
6876            outer_remaining = remaining;
6877            Some(background_pixmap)
6878        } else {
6879            None
6880        };
6881        let background_pixel = if switch_expr & u32::from(CW::BACK_PIXEL) != 0 {
6882            let remaining = outer_remaining;
6883            let (background_pixel, remaining) = u32::try_parse(remaining)?;
6884            outer_remaining = remaining;
6885            Some(background_pixel)
6886        } else {
6887            None
6888        };
6889        let border_pixmap = if switch_expr & u32::from(CW::BORDER_PIXMAP) != 0 {
6890            let remaining = outer_remaining;
6891            let (border_pixmap, remaining) = Pixmap::try_parse(remaining)?;
6892            outer_remaining = remaining;
6893            Some(border_pixmap)
6894        } else {
6895            None
6896        };
6897        let border_pixel = if switch_expr & u32::from(CW::BORDER_PIXEL) != 0 {
6898            let remaining = outer_remaining;
6899            let (border_pixel, remaining) = u32::try_parse(remaining)?;
6900            outer_remaining = remaining;
6901            Some(border_pixel)
6902        } else {
6903            None
6904        };
6905        let bit_gravity = if switch_expr & u32::from(CW::BIT_GRAVITY) != 0 {
6906            let remaining = outer_remaining;
6907            let (bit_gravity, remaining) = u32::try_parse(remaining)?;
6908            let bit_gravity = bit_gravity.into();
6909            outer_remaining = remaining;
6910            Some(bit_gravity)
6911        } else {
6912            None
6913        };
6914        let win_gravity = if switch_expr & u32::from(CW::WIN_GRAVITY) != 0 {
6915            let remaining = outer_remaining;
6916            let (win_gravity, remaining) = u32::try_parse(remaining)?;
6917            let win_gravity = win_gravity.into();
6918            outer_remaining = remaining;
6919            Some(win_gravity)
6920        } else {
6921            None
6922        };
6923        let backing_store = if switch_expr & u32::from(CW::BACKING_STORE) != 0 {
6924            let remaining = outer_remaining;
6925            let (backing_store, remaining) = u32::try_parse(remaining)?;
6926            let backing_store = backing_store.into();
6927            outer_remaining = remaining;
6928            Some(backing_store)
6929        } else {
6930            None
6931        };
6932        let backing_planes = if switch_expr & u32::from(CW::BACKING_PLANES) != 0 {
6933            let remaining = outer_remaining;
6934            let (backing_planes, remaining) = u32::try_parse(remaining)?;
6935            outer_remaining = remaining;
6936            Some(backing_planes)
6937        } else {
6938            None
6939        };
6940        let backing_pixel = if switch_expr & u32::from(CW::BACKING_PIXEL) != 0 {
6941            let remaining = outer_remaining;
6942            let (backing_pixel, remaining) = u32::try_parse(remaining)?;
6943            outer_remaining = remaining;
6944            Some(backing_pixel)
6945        } else {
6946            None
6947        };
6948        let override_redirect = if switch_expr & u32::from(CW::OVERRIDE_REDIRECT) != 0 {
6949            let remaining = outer_remaining;
6950            let (override_redirect, remaining) = Bool32::try_parse(remaining)?;
6951            outer_remaining = remaining;
6952            Some(override_redirect)
6953        } else {
6954            None
6955        };
6956        let save_under = if switch_expr & u32::from(CW::SAVE_UNDER) != 0 {
6957            let remaining = outer_remaining;
6958            let (save_under, remaining) = Bool32::try_parse(remaining)?;
6959            outer_remaining = remaining;
6960            Some(save_under)
6961        } else {
6962            None
6963        };
6964        let event_mask = if switch_expr & u32::from(CW::EVENT_MASK) != 0 {
6965            let remaining = outer_remaining;
6966            let (event_mask, remaining) = u32::try_parse(remaining)?;
6967            let event_mask = event_mask.into();
6968            outer_remaining = remaining;
6969            Some(event_mask)
6970        } else {
6971            None
6972        };
6973        let do_not_propogate_mask = if switch_expr & u32::from(CW::DONT_PROPAGATE) != 0 {
6974            let remaining = outer_remaining;
6975            let (do_not_propogate_mask, remaining) = u32::try_parse(remaining)?;
6976            let do_not_propogate_mask = do_not_propogate_mask.into();
6977            outer_remaining = remaining;
6978            Some(do_not_propogate_mask)
6979        } else {
6980            None
6981        };
6982        let colormap = if switch_expr & u32::from(CW::COLORMAP) != 0 {
6983            let remaining = outer_remaining;
6984            let (colormap, remaining) = Colormap::try_parse(remaining)?;
6985            outer_remaining = remaining;
6986            Some(colormap)
6987        } else {
6988            None
6989        };
6990        let cursor = if switch_expr & u32::from(CW::CURSOR) != 0 {
6991            let remaining = outer_remaining;
6992            let (cursor, remaining) = Cursor::try_parse(remaining)?;
6993            outer_remaining = remaining;
6994            Some(cursor)
6995        } else {
6996            None
6997        };
6998        let result = CreateWindowAux { background_pixmap, background_pixel, border_pixmap, border_pixel, bit_gravity, win_gravity, backing_store, backing_planes, backing_pixel, override_redirect, save_under, event_mask, do_not_propogate_mask, colormap, cursor };
6999        Ok((result, outer_remaining))
7000    }
7001}
7002impl CreateWindowAux {
7003    #[allow(dead_code)]
7004    fn serialize(&self, value_mask: u32) -> Vec<u8> {
7005        let mut result = Vec::new();
7006        self.serialize_into(&mut result, u32::from(value_mask));
7007        result
7008    }
7009    fn serialize_into(&self, bytes: &mut Vec<u8>, value_mask: u32) {
7010        assert_eq!(self.switch_expr(), u32::from(value_mask), "switch `value_list` has an inconsistent discriminant");
7011        if let Some(background_pixmap) = self.background_pixmap {
7012            background_pixmap.serialize_into(bytes);
7013        }
7014        if let Some(background_pixel) = self.background_pixel {
7015            background_pixel.serialize_into(bytes);
7016        }
7017        if let Some(border_pixmap) = self.border_pixmap {
7018            border_pixmap.serialize_into(bytes);
7019        }
7020        if let Some(border_pixel) = self.border_pixel {
7021            border_pixel.serialize_into(bytes);
7022        }
7023        if let Some(bit_gravity) = self.bit_gravity {
7024            u32::from(bit_gravity).serialize_into(bytes);
7025        }
7026        if let Some(win_gravity) = self.win_gravity {
7027            u32::from(win_gravity).serialize_into(bytes);
7028        }
7029        if let Some(backing_store) = self.backing_store {
7030            u32::from(backing_store).serialize_into(bytes);
7031        }
7032        if let Some(backing_planes) = self.backing_planes {
7033            backing_planes.serialize_into(bytes);
7034        }
7035        if let Some(backing_pixel) = self.backing_pixel {
7036            backing_pixel.serialize_into(bytes);
7037        }
7038        if let Some(override_redirect) = self.override_redirect {
7039            override_redirect.serialize_into(bytes);
7040        }
7041        if let Some(save_under) = self.save_under {
7042            save_under.serialize_into(bytes);
7043        }
7044        if let Some(event_mask) = self.event_mask {
7045            u32::from(event_mask).serialize_into(bytes);
7046        }
7047        if let Some(do_not_propogate_mask) = self.do_not_propogate_mask {
7048            u32::from(do_not_propogate_mask).serialize_into(bytes);
7049        }
7050        if let Some(colormap) = self.colormap {
7051            colormap.serialize_into(bytes);
7052        }
7053        if let Some(cursor) = self.cursor {
7054            cursor.serialize_into(bytes);
7055        }
7056    }
7057}
7058impl CreateWindowAux {
7059    fn switch_expr(&self) -> u32 {
7060        let mut expr_value = 0;
7061        if self.background_pixmap.is_some() {
7062            expr_value |= u32::from(CW::BACK_PIXMAP);
7063        }
7064        if self.background_pixel.is_some() {
7065            expr_value |= u32::from(CW::BACK_PIXEL);
7066        }
7067        if self.border_pixmap.is_some() {
7068            expr_value |= u32::from(CW::BORDER_PIXMAP);
7069        }
7070        if self.border_pixel.is_some() {
7071            expr_value |= u32::from(CW::BORDER_PIXEL);
7072        }
7073        if self.bit_gravity.is_some() {
7074            expr_value |= u32::from(CW::BIT_GRAVITY);
7075        }
7076        if self.win_gravity.is_some() {
7077            expr_value |= u32::from(CW::WIN_GRAVITY);
7078        }
7079        if self.backing_store.is_some() {
7080            expr_value |= u32::from(CW::BACKING_STORE);
7081        }
7082        if self.backing_planes.is_some() {
7083            expr_value |= u32::from(CW::BACKING_PLANES);
7084        }
7085        if self.backing_pixel.is_some() {
7086            expr_value |= u32::from(CW::BACKING_PIXEL);
7087        }
7088        if self.override_redirect.is_some() {
7089            expr_value |= u32::from(CW::OVERRIDE_REDIRECT);
7090        }
7091        if self.save_under.is_some() {
7092            expr_value |= u32::from(CW::SAVE_UNDER);
7093        }
7094        if self.event_mask.is_some() {
7095            expr_value |= u32::from(CW::EVENT_MASK);
7096        }
7097        if self.do_not_propogate_mask.is_some() {
7098            expr_value |= u32::from(CW::DONT_PROPAGATE);
7099        }
7100        if self.colormap.is_some() {
7101            expr_value |= u32::from(CW::COLORMAP);
7102        }
7103        if self.cursor.is_some() {
7104            expr_value |= u32::from(CW::CURSOR);
7105        }
7106        expr_value
7107    }
7108}
7109impl CreateWindowAux {
7110    /// Create a new instance with all fields unset / not present.
7111    pub fn new() -> Self {
7112        Default::default()
7113    }
7114    /// Set the `background_pixmap` field of this structure.
7115    #[must_use]
7116    pub fn background_pixmap<I>(mut self, value: I) -> Self where I: Into<Option<Pixmap>> {
7117        self.background_pixmap = value.into();
7118        self
7119    }
7120    /// Set the `background_pixel` field of this structure.
7121    #[must_use]
7122    pub fn background_pixel<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
7123        self.background_pixel = value.into();
7124        self
7125    }
7126    /// Set the `border_pixmap` field of this structure.
7127    #[must_use]
7128    pub fn border_pixmap<I>(mut self, value: I) -> Self where I: Into<Option<Pixmap>> {
7129        self.border_pixmap = value.into();
7130        self
7131    }
7132    /// Set the `border_pixel` field of this structure.
7133    #[must_use]
7134    pub fn border_pixel<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
7135        self.border_pixel = value.into();
7136        self
7137    }
7138    /// Set the `bit_gravity` field of this structure.
7139    #[must_use]
7140    pub fn bit_gravity<I>(mut self, value: I) -> Self where I: Into<Option<Gravity>> {
7141        self.bit_gravity = value.into();
7142        self
7143    }
7144    /// Set the `win_gravity` field of this structure.
7145    #[must_use]
7146    pub fn win_gravity<I>(mut self, value: I) -> Self where I: Into<Option<Gravity>> {
7147        self.win_gravity = value.into();
7148        self
7149    }
7150    /// Set the `backing_store` field of this structure.
7151    #[must_use]
7152    pub fn backing_store<I>(mut self, value: I) -> Self where I: Into<Option<BackingStore>> {
7153        self.backing_store = value.into();
7154        self
7155    }
7156    /// Set the `backing_planes` field of this structure.
7157    #[must_use]
7158    pub fn backing_planes<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
7159        self.backing_planes = value.into();
7160        self
7161    }
7162    /// Set the `backing_pixel` field of this structure.
7163    #[must_use]
7164    pub fn backing_pixel<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
7165        self.backing_pixel = value.into();
7166        self
7167    }
7168    /// Set the `override_redirect` field of this structure.
7169    #[must_use]
7170    pub fn override_redirect<I>(mut self, value: I) -> Self where I: Into<Option<Bool32>> {
7171        self.override_redirect = value.into();
7172        self
7173    }
7174    /// Set the `save_under` field of this structure.
7175    #[must_use]
7176    pub fn save_under<I>(mut self, value: I) -> Self where I: Into<Option<Bool32>> {
7177        self.save_under = value.into();
7178        self
7179    }
7180    /// Set the `event_mask` field of this structure.
7181    #[must_use]
7182    pub fn event_mask<I>(mut self, value: I) -> Self where I: Into<Option<EventMask>> {
7183        self.event_mask = value.into();
7184        self
7185    }
7186    /// Set the `do_not_propogate_mask` field of this structure.
7187    #[must_use]
7188    pub fn do_not_propogate_mask<I>(mut self, value: I) -> Self where I: Into<Option<EventMask>> {
7189        self.do_not_propogate_mask = value.into();
7190        self
7191    }
7192    /// Set the `colormap` field of this structure.
7193    #[must_use]
7194    pub fn colormap<I>(mut self, value: I) -> Self where I: Into<Option<Colormap>> {
7195        self.colormap = value.into();
7196        self
7197    }
7198    /// Set the `cursor` field of this structure.
7199    #[must_use]
7200    pub fn cursor<I>(mut self, value: I) -> Self where I: Into<Option<Cursor>> {
7201        self.cursor = value.into();
7202        self
7203    }
7204}
7205
7206/// Opcode for the CreateWindow request
7207pub const CREATE_WINDOW_REQUEST: u8 = 1;
7208/// Creates a window.
7209///
7210/// Creates an unmapped window as child of the specified `parent` window. A
7211/// CreateNotify event will be generated. The new window is placed on top in the
7212/// stacking order with respect to siblings.
7213///
7214/// The coordinate system has the X axis horizontal and the Y axis vertical with
7215/// the origin [0, 0] at the upper-left corner. Coordinates are integral, in terms
7216/// of pixels, and coincide with pixel centers. Each window and pixmap has its own
7217/// coordinate system. For a window, the origin is inside the border at the inside,
7218/// upper-left corner.
7219///
7220/// The created window is not yet displayed (mapped), call `xcb_map_window` to
7221/// display it.
7222///
7223/// The created window will initially use the same cursor as its parent.
7224///
7225/// # Fields
7226///
7227/// * `wid` - The ID with which you will refer to the new window, created by
7228/// `xcb_generate_id`.
7229/// * `depth` - Specifies the new window's depth (TODO: what unit?).
7230///
7231/// The special value `XCB_COPY_FROM_PARENT` means the depth is taken from the
7232/// `parent` window.
7233/// * `visual` - Specifies the id for the new window's visual.
7234///
7235/// The special value `XCB_COPY_FROM_PARENT` means the visual is taken from the
7236/// `parent` window.
7237/// * `class` -
7238/// * `parent` - The parent window of the new window.
7239/// * `border_width` - TODO:
7240///
7241/// Must be zero if the `class` is `InputOnly` or a `xcb_match_error_t` occurs.
7242/// * `x` - The X coordinate of the new window.
7243/// * `y` - The Y coordinate of the new window.
7244/// * `width` - The width of the new window.
7245/// * `height` - The height of the new window.
7246///
7247/// # Errors
7248///
7249/// * `Colormap` - TODO: reasons?
7250/// * `Match` - TODO: reasons?
7251/// * `Cursor` - TODO: reasons?
7252/// * `Pixmap` - TODO: reasons?
7253/// * `Value` - TODO: reasons?
7254/// * `Window` - TODO: reasons?
7255/// * `Alloc` - The X server could not allocate the requested resources (no memory?).
7256///
7257/// # See
7258///
7259/// * `xcb_generate_id`: function
7260/// * `MapWindow`: request
7261/// * `CreateNotify`: event
7262#[derive(Clone, Default)]
7263#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7264#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7265pub struct CreateWindowRequest<'input> {
7266    pub depth: u8,
7267    pub wid: Window,
7268    pub parent: Window,
7269    pub x: i16,
7270    pub y: i16,
7271    pub width: u16,
7272    pub height: u16,
7273    pub border_width: u16,
7274    pub class: WindowClass,
7275    pub visual: Visualid,
7276    pub value_list: Cow<'input, CreateWindowAux>,
7277}
7278impl_debug_if_no_extra_traits!(CreateWindowRequest<'_>, "CreateWindowRequest");
7279impl<'input> CreateWindowRequest<'input> {
7280    /// Serialize this request into bytes for the provided connection
7281    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
7282        let length_so_far = 0;
7283        let depth_bytes = self.depth.serialize();
7284        let wid_bytes = self.wid.serialize();
7285        let parent_bytes = self.parent.serialize();
7286        let x_bytes = self.x.serialize();
7287        let y_bytes = self.y.serialize();
7288        let width_bytes = self.width.serialize();
7289        let height_bytes = self.height.serialize();
7290        let border_width_bytes = self.border_width.serialize();
7291        let class_bytes = u16::from(self.class).serialize();
7292        let visual_bytes = self.visual.serialize();
7293        let value_mask: u32 = self.value_list.switch_expr();
7294        let value_mask_bytes = value_mask.serialize();
7295        let mut request0 = vec![
7296            CREATE_WINDOW_REQUEST,
7297            depth_bytes[0],
7298            0,
7299            0,
7300            wid_bytes[0],
7301            wid_bytes[1],
7302            wid_bytes[2],
7303            wid_bytes[3],
7304            parent_bytes[0],
7305            parent_bytes[1],
7306            parent_bytes[2],
7307            parent_bytes[3],
7308            x_bytes[0],
7309            x_bytes[1],
7310            y_bytes[0],
7311            y_bytes[1],
7312            width_bytes[0],
7313            width_bytes[1],
7314            height_bytes[0],
7315            height_bytes[1],
7316            border_width_bytes[0],
7317            border_width_bytes[1],
7318            class_bytes[0],
7319            class_bytes[1],
7320            visual_bytes[0],
7321            visual_bytes[1],
7322            visual_bytes[2],
7323            visual_bytes[3],
7324            value_mask_bytes[0],
7325            value_mask_bytes[1],
7326            value_mask_bytes[2],
7327            value_mask_bytes[3],
7328        ];
7329        let length_so_far = length_so_far + request0.len();
7330        let value_list_bytes = self.value_list.serialize(u32::from(value_mask));
7331        let length_so_far = length_so_far + value_list_bytes.len();
7332        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
7333        let length_so_far = length_so_far + padding0.len();
7334        assert_eq!(length_so_far % 4, 0);
7335        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
7336        request0[2..4].copy_from_slice(&length.to_ne_bytes());
7337        ([request0.into(), value_list_bytes.into(), padding0.into()], vec![])
7338    }
7339    /// Parse this request given its header, its body, and any fds that go along with it
7340    #[cfg(feature = "request-parsing")]
7341    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
7342        if header.major_opcode != CREATE_WINDOW_REQUEST {
7343            return Err(ParseError::InvalidValue);
7344        }
7345        let remaining = &[header.minor_opcode];
7346        let (depth, remaining) = u8::try_parse(remaining)?;
7347        let _ = remaining;
7348        let (wid, remaining) = Window::try_parse(value)?;
7349        let (parent, remaining) = Window::try_parse(remaining)?;
7350        let (x, remaining) = i16::try_parse(remaining)?;
7351        let (y, remaining) = i16::try_parse(remaining)?;
7352        let (width, remaining) = u16::try_parse(remaining)?;
7353        let (height, remaining) = u16::try_parse(remaining)?;
7354        let (border_width, remaining) = u16::try_parse(remaining)?;
7355        let (class, remaining) = u16::try_parse(remaining)?;
7356        let class = class.into();
7357        let (visual, remaining) = Visualid::try_parse(remaining)?;
7358        let (value_mask, remaining) = u32::try_parse(remaining)?;
7359        let (value_list, remaining) = CreateWindowAux::try_parse(remaining, u32::from(value_mask))?;
7360        let _ = remaining;
7361        Ok(CreateWindowRequest {
7362            depth,
7363            wid,
7364            parent,
7365            x,
7366            y,
7367            width,
7368            height,
7369            border_width,
7370            class,
7371            visual,
7372            value_list: Cow::Owned(value_list),
7373        })
7374    }
7375    /// Clone all borrowed data in this CreateWindowRequest.
7376    pub fn into_owned(self) -> CreateWindowRequest<'static> {
7377        CreateWindowRequest {
7378            depth: self.depth,
7379            wid: self.wid,
7380            parent: self.parent,
7381            x: self.x,
7382            y: self.y,
7383            width: self.width,
7384            height: self.height,
7385            border_width: self.border_width,
7386            class: self.class,
7387            visual: self.visual,
7388            value_list: Cow::Owned(self.value_list.into_owned()),
7389        }
7390    }
7391}
7392impl<'input> Request for CreateWindowRequest<'input> {
7393    const EXTENSION_NAME: Option<&'static str> = None;
7394
7395    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
7396        let (bufs, fds) = self.serialize();
7397        // Flatten the buffers into a single vector
7398        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
7399        (buf, fds)
7400    }
7401}
7402impl<'input> crate::x11_utils::VoidRequest for CreateWindowRequest<'input> {
7403}
7404
7405/// Auxiliary and optional information for the `change_window_attributes` function
7406#[derive(Clone, Copy, Default)]
7407#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7408#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7409pub struct ChangeWindowAttributesAux {
7410    pub background_pixmap: Option<Pixmap>,
7411    pub background_pixel: Option<u32>,
7412    pub border_pixmap: Option<Pixmap>,
7413    pub border_pixel: Option<u32>,
7414    pub bit_gravity: Option<Gravity>,
7415    pub win_gravity: Option<Gravity>,
7416    pub backing_store: Option<BackingStore>,
7417    pub backing_planes: Option<u32>,
7418    pub backing_pixel: Option<u32>,
7419    pub override_redirect: Option<Bool32>,
7420    pub save_under: Option<Bool32>,
7421    pub event_mask: Option<EventMask>,
7422    pub do_not_propogate_mask: Option<EventMask>,
7423    pub colormap: Option<Colormap>,
7424    pub cursor: Option<Cursor>,
7425}
7426impl_debug_if_no_extra_traits!(ChangeWindowAttributesAux, "ChangeWindowAttributesAux");
7427impl ChangeWindowAttributesAux {
7428    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
7429    fn try_parse(value: &[u8], value_mask: u32) -> Result<(Self, &[u8]), ParseError> {
7430        let switch_expr = u32::from(value_mask);
7431        let mut outer_remaining = value;
7432        let background_pixmap = if switch_expr & u32::from(CW::BACK_PIXMAP) != 0 {
7433            let remaining = outer_remaining;
7434            let (background_pixmap, remaining) = Pixmap::try_parse(remaining)?;
7435            outer_remaining = remaining;
7436            Some(background_pixmap)
7437        } else {
7438            None
7439        };
7440        let background_pixel = if switch_expr & u32::from(CW::BACK_PIXEL) != 0 {
7441            let remaining = outer_remaining;
7442            let (background_pixel, remaining) = u32::try_parse(remaining)?;
7443            outer_remaining = remaining;
7444            Some(background_pixel)
7445        } else {
7446            None
7447        };
7448        let border_pixmap = if switch_expr & u32::from(CW::BORDER_PIXMAP) != 0 {
7449            let remaining = outer_remaining;
7450            let (border_pixmap, remaining) = Pixmap::try_parse(remaining)?;
7451            outer_remaining = remaining;
7452            Some(border_pixmap)
7453        } else {
7454            None
7455        };
7456        let border_pixel = if switch_expr & u32::from(CW::BORDER_PIXEL) != 0 {
7457            let remaining = outer_remaining;
7458            let (border_pixel, remaining) = u32::try_parse(remaining)?;
7459            outer_remaining = remaining;
7460            Some(border_pixel)
7461        } else {
7462            None
7463        };
7464        let bit_gravity = if switch_expr & u32::from(CW::BIT_GRAVITY) != 0 {
7465            let remaining = outer_remaining;
7466            let (bit_gravity, remaining) = u32::try_parse(remaining)?;
7467            let bit_gravity = bit_gravity.into();
7468            outer_remaining = remaining;
7469            Some(bit_gravity)
7470        } else {
7471            None
7472        };
7473        let win_gravity = if switch_expr & u32::from(CW::WIN_GRAVITY) != 0 {
7474            let remaining = outer_remaining;
7475            let (win_gravity, remaining) = u32::try_parse(remaining)?;
7476            let win_gravity = win_gravity.into();
7477            outer_remaining = remaining;
7478            Some(win_gravity)
7479        } else {
7480            None
7481        };
7482        let backing_store = if switch_expr & u32::from(CW::BACKING_STORE) != 0 {
7483            let remaining = outer_remaining;
7484            let (backing_store, remaining) = u32::try_parse(remaining)?;
7485            let backing_store = backing_store.into();
7486            outer_remaining = remaining;
7487            Some(backing_store)
7488        } else {
7489            None
7490        };
7491        let backing_planes = if switch_expr & u32::from(CW::BACKING_PLANES) != 0 {
7492            let remaining = outer_remaining;
7493            let (backing_planes, remaining) = u32::try_parse(remaining)?;
7494            outer_remaining = remaining;
7495            Some(backing_planes)
7496        } else {
7497            None
7498        };
7499        let backing_pixel = if switch_expr & u32::from(CW::BACKING_PIXEL) != 0 {
7500            let remaining = outer_remaining;
7501            let (backing_pixel, remaining) = u32::try_parse(remaining)?;
7502            outer_remaining = remaining;
7503            Some(backing_pixel)
7504        } else {
7505            None
7506        };
7507        let override_redirect = if switch_expr & u32::from(CW::OVERRIDE_REDIRECT) != 0 {
7508            let remaining = outer_remaining;
7509            let (override_redirect, remaining) = Bool32::try_parse(remaining)?;
7510            outer_remaining = remaining;
7511            Some(override_redirect)
7512        } else {
7513            None
7514        };
7515        let save_under = if switch_expr & u32::from(CW::SAVE_UNDER) != 0 {
7516            let remaining = outer_remaining;
7517            let (save_under, remaining) = Bool32::try_parse(remaining)?;
7518            outer_remaining = remaining;
7519            Some(save_under)
7520        } else {
7521            None
7522        };
7523        let event_mask = if switch_expr & u32::from(CW::EVENT_MASK) != 0 {
7524            let remaining = outer_remaining;
7525            let (event_mask, remaining) = u32::try_parse(remaining)?;
7526            let event_mask = event_mask.into();
7527            outer_remaining = remaining;
7528            Some(event_mask)
7529        } else {
7530            None
7531        };
7532        let do_not_propogate_mask = if switch_expr & u32::from(CW::DONT_PROPAGATE) != 0 {
7533            let remaining = outer_remaining;
7534            let (do_not_propogate_mask, remaining) = u32::try_parse(remaining)?;
7535            let do_not_propogate_mask = do_not_propogate_mask.into();
7536            outer_remaining = remaining;
7537            Some(do_not_propogate_mask)
7538        } else {
7539            None
7540        };
7541        let colormap = if switch_expr & u32::from(CW::COLORMAP) != 0 {
7542            let remaining = outer_remaining;
7543            let (colormap, remaining) = Colormap::try_parse(remaining)?;
7544            outer_remaining = remaining;
7545            Some(colormap)
7546        } else {
7547            None
7548        };
7549        let cursor = if switch_expr & u32::from(CW::CURSOR) != 0 {
7550            let remaining = outer_remaining;
7551            let (cursor, remaining) = Cursor::try_parse(remaining)?;
7552            outer_remaining = remaining;
7553            Some(cursor)
7554        } else {
7555            None
7556        };
7557        let result = ChangeWindowAttributesAux { background_pixmap, background_pixel, border_pixmap, border_pixel, bit_gravity, win_gravity, backing_store, backing_planes, backing_pixel, override_redirect, save_under, event_mask, do_not_propogate_mask, colormap, cursor };
7558        Ok((result, outer_remaining))
7559    }
7560}
7561impl ChangeWindowAttributesAux {
7562    #[allow(dead_code)]
7563    fn serialize(&self, value_mask: u32) -> Vec<u8> {
7564        let mut result = Vec::new();
7565        self.serialize_into(&mut result, u32::from(value_mask));
7566        result
7567    }
7568    fn serialize_into(&self, bytes: &mut Vec<u8>, value_mask: u32) {
7569        assert_eq!(self.switch_expr(), u32::from(value_mask), "switch `value_list` has an inconsistent discriminant");
7570        if let Some(background_pixmap) = self.background_pixmap {
7571            background_pixmap.serialize_into(bytes);
7572        }
7573        if let Some(background_pixel) = self.background_pixel {
7574            background_pixel.serialize_into(bytes);
7575        }
7576        if let Some(border_pixmap) = self.border_pixmap {
7577            border_pixmap.serialize_into(bytes);
7578        }
7579        if let Some(border_pixel) = self.border_pixel {
7580            border_pixel.serialize_into(bytes);
7581        }
7582        if let Some(bit_gravity) = self.bit_gravity {
7583            u32::from(bit_gravity).serialize_into(bytes);
7584        }
7585        if let Some(win_gravity) = self.win_gravity {
7586            u32::from(win_gravity).serialize_into(bytes);
7587        }
7588        if let Some(backing_store) = self.backing_store {
7589            u32::from(backing_store).serialize_into(bytes);
7590        }
7591        if let Some(backing_planes) = self.backing_planes {
7592            backing_planes.serialize_into(bytes);
7593        }
7594        if let Some(backing_pixel) = self.backing_pixel {
7595            backing_pixel.serialize_into(bytes);
7596        }
7597        if let Some(override_redirect) = self.override_redirect {
7598            override_redirect.serialize_into(bytes);
7599        }
7600        if let Some(save_under) = self.save_under {
7601            save_under.serialize_into(bytes);
7602        }
7603        if let Some(event_mask) = self.event_mask {
7604            u32::from(event_mask).serialize_into(bytes);
7605        }
7606        if let Some(do_not_propogate_mask) = self.do_not_propogate_mask {
7607            u32::from(do_not_propogate_mask).serialize_into(bytes);
7608        }
7609        if let Some(colormap) = self.colormap {
7610            colormap.serialize_into(bytes);
7611        }
7612        if let Some(cursor) = self.cursor {
7613            cursor.serialize_into(bytes);
7614        }
7615    }
7616}
7617impl ChangeWindowAttributesAux {
7618    fn switch_expr(&self) -> u32 {
7619        let mut expr_value = 0;
7620        if self.background_pixmap.is_some() {
7621            expr_value |= u32::from(CW::BACK_PIXMAP);
7622        }
7623        if self.background_pixel.is_some() {
7624            expr_value |= u32::from(CW::BACK_PIXEL);
7625        }
7626        if self.border_pixmap.is_some() {
7627            expr_value |= u32::from(CW::BORDER_PIXMAP);
7628        }
7629        if self.border_pixel.is_some() {
7630            expr_value |= u32::from(CW::BORDER_PIXEL);
7631        }
7632        if self.bit_gravity.is_some() {
7633            expr_value |= u32::from(CW::BIT_GRAVITY);
7634        }
7635        if self.win_gravity.is_some() {
7636            expr_value |= u32::from(CW::WIN_GRAVITY);
7637        }
7638        if self.backing_store.is_some() {
7639            expr_value |= u32::from(CW::BACKING_STORE);
7640        }
7641        if self.backing_planes.is_some() {
7642            expr_value |= u32::from(CW::BACKING_PLANES);
7643        }
7644        if self.backing_pixel.is_some() {
7645            expr_value |= u32::from(CW::BACKING_PIXEL);
7646        }
7647        if self.override_redirect.is_some() {
7648            expr_value |= u32::from(CW::OVERRIDE_REDIRECT);
7649        }
7650        if self.save_under.is_some() {
7651            expr_value |= u32::from(CW::SAVE_UNDER);
7652        }
7653        if self.event_mask.is_some() {
7654            expr_value |= u32::from(CW::EVENT_MASK);
7655        }
7656        if self.do_not_propogate_mask.is_some() {
7657            expr_value |= u32::from(CW::DONT_PROPAGATE);
7658        }
7659        if self.colormap.is_some() {
7660            expr_value |= u32::from(CW::COLORMAP);
7661        }
7662        if self.cursor.is_some() {
7663            expr_value |= u32::from(CW::CURSOR);
7664        }
7665        expr_value
7666    }
7667}
7668impl ChangeWindowAttributesAux {
7669    /// Create a new instance with all fields unset / not present.
7670    pub fn new() -> Self {
7671        Default::default()
7672    }
7673    /// Set the `background_pixmap` field of this structure.
7674    #[must_use]
7675    pub fn background_pixmap<I>(mut self, value: I) -> Self where I: Into<Option<Pixmap>> {
7676        self.background_pixmap = value.into();
7677        self
7678    }
7679    /// Set the `background_pixel` field of this structure.
7680    #[must_use]
7681    pub fn background_pixel<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
7682        self.background_pixel = value.into();
7683        self
7684    }
7685    /// Set the `border_pixmap` field of this structure.
7686    #[must_use]
7687    pub fn border_pixmap<I>(mut self, value: I) -> Self where I: Into<Option<Pixmap>> {
7688        self.border_pixmap = value.into();
7689        self
7690    }
7691    /// Set the `border_pixel` field of this structure.
7692    #[must_use]
7693    pub fn border_pixel<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
7694        self.border_pixel = value.into();
7695        self
7696    }
7697    /// Set the `bit_gravity` field of this structure.
7698    #[must_use]
7699    pub fn bit_gravity<I>(mut self, value: I) -> Self where I: Into<Option<Gravity>> {
7700        self.bit_gravity = value.into();
7701        self
7702    }
7703    /// Set the `win_gravity` field of this structure.
7704    #[must_use]
7705    pub fn win_gravity<I>(mut self, value: I) -> Self where I: Into<Option<Gravity>> {
7706        self.win_gravity = value.into();
7707        self
7708    }
7709    /// Set the `backing_store` field of this structure.
7710    #[must_use]
7711    pub fn backing_store<I>(mut self, value: I) -> Self where I: Into<Option<BackingStore>> {
7712        self.backing_store = value.into();
7713        self
7714    }
7715    /// Set the `backing_planes` field of this structure.
7716    #[must_use]
7717    pub fn backing_planes<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
7718        self.backing_planes = value.into();
7719        self
7720    }
7721    /// Set the `backing_pixel` field of this structure.
7722    #[must_use]
7723    pub fn backing_pixel<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
7724        self.backing_pixel = value.into();
7725        self
7726    }
7727    /// Set the `override_redirect` field of this structure.
7728    #[must_use]
7729    pub fn override_redirect<I>(mut self, value: I) -> Self where I: Into<Option<Bool32>> {
7730        self.override_redirect = value.into();
7731        self
7732    }
7733    /// Set the `save_under` field of this structure.
7734    #[must_use]
7735    pub fn save_under<I>(mut self, value: I) -> Self where I: Into<Option<Bool32>> {
7736        self.save_under = value.into();
7737        self
7738    }
7739    /// Set the `event_mask` field of this structure.
7740    #[must_use]
7741    pub fn event_mask<I>(mut self, value: I) -> Self where I: Into<Option<EventMask>> {
7742        self.event_mask = value.into();
7743        self
7744    }
7745    /// Set the `do_not_propogate_mask` field of this structure.
7746    #[must_use]
7747    pub fn do_not_propogate_mask<I>(mut self, value: I) -> Self where I: Into<Option<EventMask>> {
7748        self.do_not_propogate_mask = value.into();
7749        self
7750    }
7751    /// Set the `colormap` field of this structure.
7752    #[must_use]
7753    pub fn colormap<I>(mut self, value: I) -> Self where I: Into<Option<Colormap>> {
7754        self.colormap = value.into();
7755        self
7756    }
7757    /// Set the `cursor` field of this structure.
7758    #[must_use]
7759    pub fn cursor<I>(mut self, value: I) -> Self where I: Into<Option<Cursor>> {
7760        self.cursor = value.into();
7761        self
7762    }
7763}
7764
7765/// Opcode for the ChangeWindowAttributes request
7766pub const CHANGE_WINDOW_ATTRIBUTES_REQUEST: u8 = 2;
7767/// change window attributes.
7768///
7769/// Changes the attributes specified by `value_mask` for the specified `window`.
7770///
7771/// # Fields
7772///
7773/// * `window` - The window to change.
7774/// * `value_list` - Values for each of the attributes specified in the bitmask `value_mask`. The
7775/// order has to correspond to the order of possible `value_mask` bits. See the
7776/// example.
7777///
7778/// # Errors
7779///
7780/// * `Access` - TODO: reasons?
7781/// * `Colormap` - TODO: reasons?
7782/// * `Cursor` - TODO: reasons?
7783/// * `Match` - TODO: reasons?
7784/// * `Pixmap` - TODO: reasons?
7785/// * `Value` - TODO: reasons?
7786/// * `Window` - The specified `window` does not exist.
7787#[derive(Clone, Default)]
7788#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7789#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7790pub struct ChangeWindowAttributesRequest<'input> {
7791    pub window: Window,
7792    pub value_list: Cow<'input, ChangeWindowAttributesAux>,
7793}
7794impl_debug_if_no_extra_traits!(ChangeWindowAttributesRequest<'_>, "ChangeWindowAttributesRequest");
7795impl<'input> ChangeWindowAttributesRequest<'input> {
7796    /// Serialize this request into bytes for the provided connection
7797    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
7798        let length_so_far = 0;
7799        let window_bytes = self.window.serialize();
7800        let value_mask: u32 = self.value_list.switch_expr();
7801        let value_mask_bytes = value_mask.serialize();
7802        let mut request0 = vec![
7803            CHANGE_WINDOW_ATTRIBUTES_REQUEST,
7804            0,
7805            0,
7806            0,
7807            window_bytes[0],
7808            window_bytes[1],
7809            window_bytes[2],
7810            window_bytes[3],
7811            value_mask_bytes[0],
7812            value_mask_bytes[1],
7813            value_mask_bytes[2],
7814            value_mask_bytes[3],
7815        ];
7816        let length_so_far = length_so_far + request0.len();
7817        let value_list_bytes = self.value_list.serialize(u32::from(value_mask));
7818        let length_so_far = length_so_far + value_list_bytes.len();
7819        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
7820        let length_so_far = length_so_far + padding0.len();
7821        assert_eq!(length_so_far % 4, 0);
7822        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
7823        request0[2..4].copy_from_slice(&length.to_ne_bytes());
7824        ([request0.into(), value_list_bytes.into(), padding0.into()], vec![])
7825    }
7826    /// Parse this request given its header, its body, and any fds that go along with it
7827    #[cfg(feature = "request-parsing")]
7828    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
7829        if header.major_opcode != CHANGE_WINDOW_ATTRIBUTES_REQUEST {
7830            return Err(ParseError::InvalidValue);
7831        }
7832        let remaining = &[header.minor_opcode];
7833        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
7834        let _ = remaining;
7835        let (window, remaining) = Window::try_parse(value)?;
7836        let (value_mask, remaining) = u32::try_parse(remaining)?;
7837        let (value_list, remaining) = ChangeWindowAttributesAux::try_parse(remaining, u32::from(value_mask))?;
7838        let _ = remaining;
7839        Ok(ChangeWindowAttributesRequest {
7840            window,
7841            value_list: Cow::Owned(value_list),
7842        })
7843    }
7844    /// Clone all borrowed data in this ChangeWindowAttributesRequest.
7845    pub fn into_owned(self) -> ChangeWindowAttributesRequest<'static> {
7846        ChangeWindowAttributesRequest {
7847            window: self.window,
7848            value_list: Cow::Owned(self.value_list.into_owned()),
7849        }
7850    }
7851}
7852impl<'input> Request for ChangeWindowAttributesRequest<'input> {
7853    const EXTENSION_NAME: Option<&'static str> = None;
7854
7855    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
7856        let (bufs, fds) = self.serialize();
7857        // Flatten the buffers into a single vector
7858        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
7859        (buf, fds)
7860    }
7861}
7862impl<'input> crate::x11_utils::VoidRequest for ChangeWindowAttributesRequest<'input> {
7863}
7864
7865#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
7866#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7867pub struct MapState(u8);
7868impl MapState {
7869    pub const UNMAPPED: Self = Self(0);
7870    pub const UNVIEWABLE: Self = Self(1);
7871    pub const VIEWABLE: Self = Self(2);
7872}
7873impl From<MapState> for u8 {
7874    #[inline]
7875    fn from(input: MapState) -> Self {
7876        input.0
7877    }
7878}
7879impl From<MapState> for Option<u8> {
7880    #[inline]
7881    fn from(input: MapState) -> Self {
7882        Some(input.0)
7883    }
7884}
7885impl From<MapState> for u16 {
7886    #[inline]
7887    fn from(input: MapState) -> Self {
7888        u16::from(input.0)
7889    }
7890}
7891impl From<MapState> for Option<u16> {
7892    #[inline]
7893    fn from(input: MapState) -> Self {
7894        Some(u16::from(input.0))
7895    }
7896}
7897impl From<MapState> for u32 {
7898    #[inline]
7899    fn from(input: MapState) -> Self {
7900        u32::from(input.0)
7901    }
7902}
7903impl From<MapState> for Option<u32> {
7904    #[inline]
7905    fn from(input: MapState) -> Self {
7906        Some(u32::from(input.0))
7907    }
7908}
7909impl From<u8> for MapState {
7910    #[inline]
7911    fn from(value: u8) -> Self {
7912        Self(value)
7913    }
7914}
7915impl core::fmt::Debug for MapState  {
7916    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
7917        let variants = [
7918            (Self::UNMAPPED.0.into(), "UNMAPPED", "Unmapped"),
7919            (Self::UNVIEWABLE.0.into(), "UNVIEWABLE", "Unviewable"),
7920            (Self::VIEWABLE.0.into(), "VIEWABLE", "Viewable"),
7921        ];
7922        pretty_print_enum(fmt, self.0.into(), &variants)
7923    }
7924}
7925
7926/// Opcode for the GetWindowAttributes request
7927pub const GET_WINDOW_ATTRIBUTES_REQUEST: u8 = 3;
7928/// Gets window attributes.
7929///
7930/// Gets the current attributes for the specified `window`.
7931///
7932/// # Fields
7933///
7934/// * `window` - The window to get the attributes from.
7935///
7936/// # Errors
7937///
7938/// * `Window` - The specified `window` does not exist.
7939/// * `Drawable` - TODO: reasons?
7940#[derive(Clone, Copy, Default)]
7941#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7942#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7943pub struct GetWindowAttributesRequest {
7944    pub window: Window,
7945}
7946impl_debug_if_no_extra_traits!(GetWindowAttributesRequest, "GetWindowAttributesRequest");
7947impl GetWindowAttributesRequest {
7948    /// Serialize this request into bytes for the provided connection
7949    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
7950        let length_so_far = 0;
7951        let window_bytes = self.window.serialize();
7952        let mut request0 = vec![
7953            GET_WINDOW_ATTRIBUTES_REQUEST,
7954            0,
7955            0,
7956            0,
7957            window_bytes[0],
7958            window_bytes[1],
7959            window_bytes[2],
7960            window_bytes[3],
7961        ];
7962        let length_so_far = length_so_far + request0.len();
7963        assert_eq!(length_so_far % 4, 0);
7964        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
7965        request0[2..4].copy_from_slice(&length.to_ne_bytes());
7966        ([request0.into()], vec![])
7967    }
7968    /// Parse this request given its header, its body, and any fds that go along with it
7969    #[cfg(feature = "request-parsing")]
7970    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
7971        if header.major_opcode != GET_WINDOW_ATTRIBUTES_REQUEST {
7972            return Err(ParseError::InvalidValue);
7973        }
7974        let remaining = &[header.minor_opcode];
7975        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
7976        let _ = remaining;
7977        let (window, remaining) = Window::try_parse(value)?;
7978        let _ = remaining;
7979        Ok(GetWindowAttributesRequest {
7980            window,
7981        })
7982    }
7983}
7984impl Request for GetWindowAttributesRequest {
7985    const EXTENSION_NAME: Option<&'static str> = None;
7986
7987    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
7988        let (bufs, fds) = self.serialize();
7989        // Flatten the buffers into a single vector
7990        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
7991        (buf, fds)
7992    }
7993}
7994impl crate::x11_utils::ReplyRequest for GetWindowAttributesRequest {
7995    type Reply = GetWindowAttributesReply;
7996}
7997
7998/// # Fields
7999///
8000/// * `override_redirect` - Window managers should ignore this window if `override_redirect` is 1.
8001/// * `visual` - The associated visual structure of `window`.
8002/// * `backing_planes` - Planes to be preserved if possible.
8003/// * `backing_pixel` - Value to be used when restoring planes.
8004/// * `save_under` - Boolean, should bits under be saved?
8005/// * `colormap` - Color map to be associated with window.
8006/// * `all_event_masks` - Set of events all people have interest in.
8007/// * `your_event_mask` - My event mask.
8008/// * `do_not_propagate_mask` - Set of events that should not propagate.
8009/// * `backing_store` -
8010/// * `class` -
8011/// * `bit_gravity` -
8012/// * `win_gravity` -
8013/// * `map_state` -
8014#[derive(Clone, Copy, Default)]
8015#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8016#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8017pub struct GetWindowAttributesReply {
8018    pub backing_store: BackingStore,
8019    pub sequence: u16,
8020    pub length: u32,
8021    pub visual: Visualid,
8022    pub class: WindowClass,
8023    pub bit_gravity: Gravity,
8024    pub win_gravity: Gravity,
8025    pub backing_planes: u32,
8026    pub backing_pixel: u32,
8027    pub save_under: bool,
8028    pub map_is_installed: bool,
8029    pub map_state: MapState,
8030    pub override_redirect: bool,
8031    pub colormap: Colormap,
8032    pub all_event_masks: EventMask,
8033    pub your_event_mask: EventMask,
8034    pub do_not_propagate_mask: EventMask,
8035}
8036impl_debug_if_no_extra_traits!(GetWindowAttributesReply, "GetWindowAttributesReply");
8037impl TryParse for GetWindowAttributesReply {
8038    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
8039        let remaining = initial_value;
8040        let (response_type, remaining) = u8::try_parse(remaining)?;
8041        let (backing_store, remaining) = u8::try_parse(remaining)?;
8042        let (sequence, remaining) = u16::try_parse(remaining)?;
8043        let (length, remaining) = u32::try_parse(remaining)?;
8044        let (visual, remaining) = Visualid::try_parse(remaining)?;
8045        let (class, remaining) = u16::try_parse(remaining)?;
8046        let (bit_gravity, remaining) = u8::try_parse(remaining)?;
8047        let (win_gravity, remaining) = u8::try_parse(remaining)?;
8048        let (backing_planes, remaining) = u32::try_parse(remaining)?;
8049        let (backing_pixel, remaining) = u32::try_parse(remaining)?;
8050        let (save_under, remaining) = bool::try_parse(remaining)?;
8051        let (map_is_installed, remaining) = bool::try_parse(remaining)?;
8052        let (map_state, remaining) = u8::try_parse(remaining)?;
8053        let (override_redirect, remaining) = bool::try_parse(remaining)?;
8054        let (colormap, remaining) = Colormap::try_parse(remaining)?;
8055        let (all_event_masks, remaining) = u32::try_parse(remaining)?;
8056        let (your_event_mask, remaining) = u32::try_parse(remaining)?;
8057        let (do_not_propagate_mask, remaining) = u16::try_parse(remaining)?;
8058        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
8059        if response_type != 1 {
8060            return Err(ParseError::InvalidValue);
8061        }
8062        let backing_store = backing_store.into();
8063        let class = class.into();
8064        let bit_gravity = bit_gravity.into();
8065        let win_gravity = win_gravity.into();
8066        let map_state = map_state.into();
8067        let all_event_masks = all_event_masks.into();
8068        let your_event_mask = your_event_mask.into();
8069        let do_not_propagate_mask = do_not_propagate_mask.into();
8070        let result = GetWindowAttributesReply { backing_store, sequence, length, visual, class, bit_gravity, win_gravity, backing_planes, backing_pixel, save_under, map_is_installed, map_state, override_redirect, colormap, all_event_masks, your_event_mask, do_not_propagate_mask };
8071        let _ = remaining;
8072        let remaining = initial_value.get(32 + length as usize * 4..)
8073            .ok_or(ParseError::InsufficientData)?;
8074        Ok((result, remaining))
8075    }
8076}
8077impl Serialize for GetWindowAttributesReply {
8078    type Bytes = [u8; 44];
8079    fn serialize(&self) -> [u8; 44] {
8080        let response_type_bytes = &[1];
8081        let backing_store_bytes = (u32::from(self.backing_store) as u8).serialize();
8082        let sequence_bytes = self.sequence.serialize();
8083        let length_bytes = self.length.serialize();
8084        let visual_bytes = self.visual.serialize();
8085        let class_bytes = u16::from(self.class).serialize();
8086        let bit_gravity_bytes = (u32::from(self.bit_gravity) as u8).serialize();
8087        let win_gravity_bytes = (u32::from(self.win_gravity) as u8).serialize();
8088        let backing_planes_bytes = self.backing_planes.serialize();
8089        let backing_pixel_bytes = self.backing_pixel.serialize();
8090        let save_under_bytes = self.save_under.serialize();
8091        let map_is_installed_bytes = self.map_is_installed.serialize();
8092        let map_state_bytes = u8::from(self.map_state).serialize();
8093        let override_redirect_bytes = self.override_redirect.serialize();
8094        let colormap_bytes = self.colormap.serialize();
8095        let all_event_masks_bytes = u32::from(self.all_event_masks).serialize();
8096        let your_event_mask_bytes = u32::from(self.your_event_mask).serialize();
8097        let do_not_propagate_mask_bytes = (u32::from(self.do_not_propagate_mask) as u16).serialize();
8098        [
8099            response_type_bytes[0],
8100            backing_store_bytes[0],
8101            sequence_bytes[0],
8102            sequence_bytes[1],
8103            length_bytes[0],
8104            length_bytes[1],
8105            length_bytes[2],
8106            length_bytes[3],
8107            visual_bytes[0],
8108            visual_bytes[1],
8109            visual_bytes[2],
8110            visual_bytes[3],
8111            class_bytes[0],
8112            class_bytes[1],
8113            bit_gravity_bytes[0],
8114            win_gravity_bytes[0],
8115            backing_planes_bytes[0],
8116            backing_planes_bytes[1],
8117            backing_planes_bytes[2],
8118            backing_planes_bytes[3],
8119            backing_pixel_bytes[0],
8120            backing_pixel_bytes[1],
8121            backing_pixel_bytes[2],
8122            backing_pixel_bytes[3],
8123            save_under_bytes[0],
8124            map_is_installed_bytes[0],
8125            map_state_bytes[0],
8126            override_redirect_bytes[0],
8127            colormap_bytes[0],
8128            colormap_bytes[1],
8129            colormap_bytes[2],
8130            colormap_bytes[3],
8131            all_event_masks_bytes[0],
8132            all_event_masks_bytes[1],
8133            all_event_masks_bytes[2],
8134            all_event_masks_bytes[3],
8135            your_event_mask_bytes[0],
8136            your_event_mask_bytes[1],
8137            your_event_mask_bytes[2],
8138            your_event_mask_bytes[3],
8139            do_not_propagate_mask_bytes[0],
8140            do_not_propagate_mask_bytes[1],
8141            0,
8142            0,
8143        ]
8144    }
8145    fn serialize_into(&self, bytes: &mut Vec<u8>) {
8146        bytes.reserve(44);
8147        let response_type_bytes = &[1];
8148        bytes.push(response_type_bytes[0]);
8149        (u32::from(self.backing_store) as u8).serialize_into(bytes);
8150        self.sequence.serialize_into(bytes);
8151        self.length.serialize_into(bytes);
8152        self.visual.serialize_into(bytes);
8153        u16::from(self.class).serialize_into(bytes);
8154        (u32::from(self.bit_gravity) as u8).serialize_into(bytes);
8155        (u32::from(self.win_gravity) as u8).serialize_into(bytes);
8156        self.backing_planes.serialize_into(bytes);
8157        self.backing_pixel.serialize_into(bytes);
8158        self.save_under.serialize_into(bytes);
8159        self.map_is_installed.serialize_into(bytes);
8160        u8::from(self.map_state).serialize_into(bytes);
8161        self.override_redirect.serialize_into(bytes);
8162        self.colormap.serialize_into(bytes);
8163        u32::from(self.all_event_masks).serialize_into(bytes);
8164        u32::from(self.your_event_mask).serialize_into(bytes);
8165        (u32::from(self.do_not_propagate_mask) as u16).serialize_into(bytes);
8166        bytes.extend_from_slice(&[0; 2]);
8167    }
8168}
8169
8170/// Opcode for the DestroyWindow request
8171pub const DESTROY_WINDOW_REQUEST: u8 = 4;
8172/// Destroys a window.
8173///
8174/// Destroys the specified window and all of its subwindows. A DestroyNotify event
8175/// is generated for each destroyed window (a DestroyNotify event is first generated
8176/// for any given window's inferiors). If the window was mapped, it will be
8177/// automatically unmapped before destroying.
8178///
8179/// Calling DestroyWindow on the root window will do nothing.
8180///
8181/// # Fields
8182///
8183/// * `window` - The window to destroy.
8184///
8185/// # Errors
8186///
8187/// * `Window` - The specified window does not exist.
8188///
8189/// # See
8190///
8191/// * `DestroyNotify`: event
8192/// * `MapWindow`: request
8193/// * `UnmapWindow`: request
8194#[derive(Clone, Copy, Default)]
8195#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8196#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8197pub struct DestroyWindowRequest {
8198    pub window: Window,
8199}
8200impl_debug_if_no_extra_traits!(DestroyWindowRequest, "DestroyWindowRequest");
8201impl DestroyWindowRequest {
8202    /// Serialize this request into bytes for the provided connection
8203    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
8204        let length_so_far = 0;
8205        let window_bytes = self.window.serialize();
8206        let mut request0 = vec![
8207            DESTROY_WINDOW_REQUEST,
8208            0,
8209            0,
8210            0,
8211            window_bytes[0],
8212            window_bytes[1],
8213            window_bytes[2],
8214            window_bytes[3],
8215        ];
8216        let length_so_far = length_so_far + request0.len();
8217        assert_eq!(length_so_far % 4, 0);
8218        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
8219        request0[2..4].copy_from_slice(&length.to_ne_bytes());
8220        ([request0.into()], vec![])
8221    }
8222    /// Parse this request given its header, its body, and any fds that go along with it
8223    #[cfg(feature = "request-parsing")]
8224    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
8225        if header.major_opcode != DESTROY_WINDOW_REQUEST {
8226            return Err(ParseError::InvalidValue);
8227        }
8228        let remaining = &[header.minor_opcode];
8229        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
8230        let _ = remaining;
8231        let (window, remaining) = Window::try_parse(value)?;
8232        let _ = remaining;
8233        Ok(DestroyWindowRequest {
8234            window,
8235        })
8236    }
8237}
8238impl Request for DestroyWindowRequest {
8239    const EXTENSION_NAME: Option<&'static str> = None;
8240
8241    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
8242        let (bufs, fds) = self.serialize();
8243        // Flatten the buffers into a single vector
8244        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
8245        (buf, fds)
8246    }
8247}
8248impl crate::x11_utils::VoidRequest for DestroyWindowRequest {
8249}
8250
8251/// Opcode for the DestroySubwindows request
8252pub const DESTROY_SUBWINDOWS_REQUEST: u8 = 5;
8253#[derive(Clone, Copy, Default)]
8254#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8255#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8256pub struct DestroySubwindowsRequest {
8257    pub window: Window,
8258}
8259impl_debug_if_no_extra_traits!(DestroySubwindowsRequest, "DestroySubwindowsRequest");
8260impl DestroySubwindowsRequest {
8261    /// Serialize this request into bytes for the provided connection
8262    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
8263        let length_so_far = 0;
8264        let window_bytes = self.window.serialize();
8265        let mut request0 = vec![
8266            DESTROY_SUBWINDOWS_REQUEST,
8267            0,
8268            0,
8269            0,
8270            window_bytes[0],
8271            window_bytes[1],
8272            window_bytes[2],
8273            window_bytes[3],
8274        ];
8275        let length_so_far = length_so_far + request0.len();
8276        assert_eq!(length_so_far % 4, 0);
8277        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
8278        request0[2..4].copy_from_slice(&length.to_ne_bytes());
8279        ([request0.into()], vec![])
8280    }
8281    /// Parse this request given its header, its body, and any fds that go along with it
8282    #[cfg(feature = "request-parsing")]
8283    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
8284        if header.major_opcode != DESTROY_SUBWINDOWS_REQUEST {
8285            return Err(ParseError::InvalidValue);
8286        }
8287        let remaining = &[header.minor_opcode];
8288        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
8289        let _ = remaining;
8290        let (window, remaining) = Window::try_parse(value)?;
8291        let _ = remaining;
8292        Ok(DestroySubwindowsRequest {
8293            window,
8294        })
8295    }
8296}
8297impl Request for DestroySubwindowsRequest {
8298    const EXTENSION_NAME: Option<&'static str> = None;
8299
8300    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
8301        let (bufs, fds) = self.serialize();
8302        // Flatten the buffers into a single vector
8303        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
8304        (buf, fds)
8305    }
8306}
8307impl crate::x11_utils::VoidRequest for DestroySubwindowsRequest {
8308}
8309
8310#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
8311#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8312pub struct SetMode(u8);
8313impl SetMode {
8314    pub const INSERT: Self = Self(0);
8315    pub const DELETE: Self = Self(1);
8316}
8317impl From<SetMode> for u8 {
8318    #[inline]
8319    fn from(input: SetMode) -> Self {
8320        input.0
8321    }
8322}
8323impl From<SetMode> for Option<u8> {
8324    #[inline]
8325    fn from(input: SetMode) -> Self {
8326        Some(input.0)
8327    }
8328}
8329impl From<SetMode> for u16 {
8330    #[inline]
8331    fn from(input: SetMode) -> Self {
8332        u16::from(input.0)
8333    }
8334}
8335impl From<SetMode> for Option<u16> {
8336    #[inline]
8337    fn from(input: SetMode) -> Self {
8338        Some(u16::from(input.0))
8339    }
8340}
8341impl From<SetMode> for u32 {
8342    #[inline]
8343    fn from(input: SetMode) -> Self {
8344        u32::from(input.0)
8345    }
8346}
8347impl From<SetMode> for Option<u32> {
8348    #[inline]
8349    fn from(input: SetMode) -> Self {
8350        Some(u32::from(input.0))
8351    }
8352}
8353impl From<u8> for SetMode {
8354    #[inline]
8355    fn from(value: u8) -> Self {
8356        Self(value)
8357    }
8358}
8359impl core::fmt::Debug for SetMode  {
8360    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
8361        let variants = [
8362            (Self::INSERT.0.into(), "INSERT", "Insert"),
8363            (Self::DELETE.0.into(), "DELETE", "Delete"),
8364        ];
8365        pretty_print_enum(fmt, self.0.into(), &variants)
8366    }
8367}
8368
8369/// Opcode for the ChangeSaveSet request
8370pub const CHANGE_SAVE_SET_REQUEST: u8 = 6;
8371/// Changes a client's save set.
8372///
8373/// TODO: explain what the save set is for.
8374///
8375/// This function either adds or removes the specified window to the client's (your
8376/// application's) save set.
8377///
8378/// # Fields
8379///
8380/// * `mode` - Insert to add the specified window to the save set or Delete to delete it from the save set.
8381/// * `window` - The window to add or delete to/from your save set.
8382///
8383/// # Errors
8384///
8385/// * `Match` - You created the specified window. This does not make sense, you can only add
8386/// windows created by other clients to your save set.
8387/// * `Value` - You specified an invalid mode.
8388/// * `Window` - The specified window does not exist.
8389///
8390/// # See
8391///
8392/// * `ReparentWindow`: request
8393#[derive(Clone, Copy, Default)]
8394#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8395#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8396pub struct ChangeSaveSetRequest {
8397    pub mode: SetMode,
8398    pub window: Window,
8399}
8400impl_debug_if_no_extra_traits!(ChangeSaveSetRequest, "ChangeSaveSetRequest");
8401impl ChangeSaveSetRequest {
8402    /// Serialize this request into bytes for the provided connection
8403    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
8404        let length_so_far = 0;
8405        let mode_bytes = u8::from(self.mode).serialize();
8406        let window_bytes = self.window.serialize();
8407        let mut request0 = vec![
8408            CHANGE_SAVE_SET_REQUEST,
8409            mode_bytes[0],
8410            0,
8411            0,
8412            window_bytes[0],
8413            window_bytes[1],
8414            window_bytes[2],
8415            window_bytes[3],
8416        ];
8417        let length_so_far = length_so_far + request0.len();
8418        assert_eq!(length_so_far % 4, 0);
8419        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
8420        request0[2..4].copy_from_slice(&length.to_ne_bytes());
8421        ([request0.into()], vec![])
8422    }
8423    /// Parse this request given its header, its body, and any fds that go along with it
8424    #[cfg(feature = "request-parsing")]
8425    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
8426        if header.major_opcode != CHANGE_SAVE_SET_REQUEST {
8427            return Err(ParseError::InvalidValue);
8428        }
8429        let remaining = &[header.minor_opcode];
8430        let (mode, remaining) = u8::try_parse(remaining)?;
8431        let mode = mode.into();
8432        let _ = remaining;
8433        let (window, remaining) = Window::try_parse(value)?;
8434        let _ = remaining;
8435        Ok(ChangeSaveSetRequest {
8436            mode,
8437            window,
8438        })
8439    }
8440}
8441impl Request for ChangeSaveSetRequest {
8442    const EXTENSION_NAME: Option<&'static str> = None;
8443
8444    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
8445        let (bufs, fds) = self.serialize();
8446        // Flatten the buffers into a single vector
8447        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
8448        (buf, fds)
8449    }
8450}
8451impl crate::x11_utils::VoidRequest for ChangeSaveSetRequest {
8452}
8453
8454/// Opcode for the ReparentWindow request
8455pub const REPARENT_WINDOW_REQUEST: u8 = 7;
8456/// Reparents a window.
8457///
8458/// Makes the specified window a child of the specified parent window. If the
8459/// window is mapped, it will automatically be unmapped before reparenting and
8460/// re-mapped after reparenting. The window is placed in the stacking order on top
8461/// with respect to sibling windows.
8462///
8463/// After reparenting, a ReparentNotify event is generated.
8464///
8465/// # Fields
8466///
8467/// * `window` - The window to reparent.
8468/// * `parent` - The new parent of the window.
8469/// * `x` - The X position of the window within its new parent.
8470/// * `y` - The Y position of the window within its new parent.
8471///
8472/// # Errors
8473///
8474/// * `Match` - The new parent window is not on the same screen as the old parent window.
8475/// 
8476/// The new parent window is the specified window or an inferior of the specified window.
8477/// 
8478/// The new parent is InputOnly and the window is not.
8479/// 
8480/// The specified window has a ParentRelative background and the new parent window is not the same depth as the specified window.
8481/// * `Window` - The specified window does not exist.
8482///
8483/// # See
8484///
8485/// * `ReparentNotify`: event
8486/// * `MapWindow`: request
8487/// * `UnmapWindow`: request
8488#[derive(Clone, Copy, Default)]
8489#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8490#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8491pub struct ReparentWindowRequest {
8492    pub window: Window,
8493    pub parent: Window,
8494    pub x: i16,
8495    pub y: i16,
8496}
8497impl_debug_if_no_extra_traits!(ReparentWindowRequest, "ReparentWindowRequest");
8498impl ReparentWindowRequest {
8499    /// Serialize this request into bytes for the provided connection
8500    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
8501        let length_so_far = 0;
8502        let window_bytes = self.window.serialize();
8503        let parent_bytes = self.parent.serialize();
8504        let x_bytes = self.x.serialize();
8505        let y_bytes = self.y.serialize();
8506        let mut request0 = vec![
8507            REPARENT_WINDOW_REQUEST,
8508            0,
8509            0,
8510            0,
8511            window_bytes[0],
8512            window_bytes[1],
8513            window_bytes[2],
8514            window_bytes[3],
8515            parent_bytes[0],
8516            parent_bytes[1],
8517            parent_bytes[2],
8518            parent_bytes[3],
8519            x_bytes[0],
8520            x_bytes[1],
8521            y_bytes[0],
8522            y_bytes[1],
8523        ];
8524        let length_so_far = length_so_far + request0.len();
8525        assert_eq!(length_so_far % 4, 0);
8526        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
8527        request0[2..4].copy_from_slice(&length.to_ne_bytes());
8528        ([request0.into()], vec![])
8529    }
8530    /// Parse this request given its header, its body, and any fds that go along with it
8531    #[cfg(feature = "request-parsing")]
8532    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
8533        if header.major_opcode != REPARENT_WINDOW_REQUEST {
8534            return Err(ParseError::InvalidValue);
8535        }
8536        let remaining = &[header.minor_opcode];
8537        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
8538        let _ = remaining;
8539        let (window, remaining) = Window::try_parse(value)?;
8540        let (parent, remaining) = Window::try_parse(remaining)?;
8541        let (x, remaining) = i16::try_parse(remaining)?;
8542        let (y, remaining) = i16::try_parse(remaining)?;
8543        let _ = remaining;
8544        Ok(ReparentWindowRequest {
8545            window,
8546            parent,
8547            x,
8548            y,
8549        })
8550    }
8551}
8552impl Request for ReparentWindowRequest {
8553    const EXTENSION_NAME: Option<&'static str> = None;
8554
8555    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
8556        let (bufs, fds) = self.serialize();
8557        // Flatten the buffers into a single vector
8558        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
8559        (buf, fds)
8560    }
8561}
8562impl crate::x11_utils::VoidRequest for ReparentWindowRequest {
8563}
8564
8565/// Opcode for the MapWindow request
8566pub const MAP_WINDOW_REQUEST: u8 = 8;
8567/// Makes a window visible.
8568///
8569/// Maps the specified window. This means making the window visible (as long as its
8570/// parent is visible).
8571///
8572/// This MapWindow request will be translated to a MapRequest request if a window
8573/// manager is running. The window manager then decides to either map the window or
8574/// not. Set the override-redirect window attribute to true if you want to bypass
8575/// this mechanism.
8576///
8577/// If the window manager decides to map the window (or if no window manager is
8578/// running), a MapNotify event is generated.
8579///
8580/// If the window becomes viewable and no earlier contents for it are remembered,
8581/// the X server tiles the window with its background. If the window's background
8582/// is undefined, the existing screen contents are not altered, and the X server
8583/// generates zero or more Expose events.
8584///
8585/// If the window type is InputOutput, an Expose event will be generated when the
8586/// window becomes visible. The normal response to an Expose event should be to
8587/// repaint the window.
8588///
8589/// # Fields
8590///
8591/// * `window` - The window to make visible.
8592///
8593/// # Errors
8594///
8595/// * `Match` - The specified window does not exist.
8596///
8597/// # See
8598///
8599/// * `MapNotify`: event
8600/// * `Expose`: event
8601/// * `UnmapWindow`: request
8602#[derive(Clone, Copy, Default)]
8603#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8604#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8605pub struct MapWindowRequest {
8606    pub window: Window,
8607}
8608impl_debug_if_no_extra_traits!(MapWindowRequest, "MapWindowRequest");
8609impl MapWindowRequest {
8610    /// Serialize this request into bytes for the provided connection
8611    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
8612        let length_so_far = 0;
8613        let window_bytes = self.window.serialize();
8614        let mut request0 = vec![
8615            MAP_WINDOW_REQUEST,
8616            0,
8617            0,
8618            0,
8619            window_bytes[0],
8620            window_bytes[1],
8621            window_bytes[2],
8622            window_bytes[3],
8623        ];
8624        let length_so_far = length_so_far + request0.len();
8625        assert_eq!(length_so_far % 4, 0);
8626        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
8627        request0[2..4].copy_from_slice(&length.to_ne_bytes());
8628        ([request0.into()], vec![])
8629    }
8630    /// Parse this request given its header, its body, and any fds that go along with it
8631    #[cfg(feature = "request-parsing")]
8632    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
8633        if header.major_opcode != MAP_WINDOW_REQUEST {
8634            return Err(ParseError::InvalidValue);
8635        }
8636        let remaining = &[header.minor_opcode];
8637        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
8638        let _ = remaining;
8639        let (window, remaining) = Window::try_parse(value)?;
8640        let _ = remaining;
8641        Ok(MapWindowRequest {
8642            window,
8643        })
8644    }
8645}
8646impl Request for MapWindowRequest {
8647    const EXTENSION_NAME: Option<&'static str> = None;
8648
8649    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
8650        let (bufs, fds) = self.serialize();
8651        // Flatten the buffers into a single vector
8652        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
8653        (buf, fds)
8654    }
8655}
8656impl crate::x11_utils::VoidRequest for MapWindowRequest {
8657}
8658
8659/// Opcode for the MapSubwindows request
8660pub const MAP_SUBWINDOWS_REQUEST: u8 = 9;
8661#[derive(Clone, Copy, Default)]
8662#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8663#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8664pub struct MapSubwindowsRequest {
8665    pub window: Window,
8666}
8667impl_debug_if_no_extra_traits!(MapSubwindowsRequest, "MapSubwindowsRequest");
8668impl MapSubwindowsRequest {
8669    /// Serialize this request into bytes for the provided connection
8670    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
8671        let length_so_far = 0;
8672        let window_bytes = self.window.serialize();
8673        let mut request0 = vec![
8674            MAP_SUBWINDOWS_REQUEST,
8675            0,
8676            0,
8677            0,
8678            window_bytes[0],
8679            window_bytes[1],
8680            window_bytes[2],
8681            window_bytes[3],
8682        ];
8683        let length_so_far = length_so_far + request0.len();
8684        assert_eq!(length_so_far % 4, 0);
8685        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
8686        request0[2..4].copy_from_slice(&length.to_ne_bytes());
8687        ([request0.into()], vec![])
8688    }
8689    /// Parse this request given its header, its body, and any fds that go along with it
8690    #[cfg(feature = "request-parsing")]
8691    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
8692        if header.major_opcode != MAP_SUBWINDOWS_REQUEST {
8693            return Err(ParseError::InvalidValue);
8694        }
8695        let remaining = &[header.minor_opcode];
8696        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
8697        let _ = remaining;
8698        let (window, remaining) = Window::try_parse(value)?;
8699        let _ = remaining;
8700        Ok(MapSubwindowsRequest {
8701            window,
8702        })
8703    }
8704}
8705impl Request for MapSubwindowsRequest {
8706    const EXTENSION_NAME: Option<&'static str> = None;
8707
8708    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
8709        let (bufs, fds) = self.serialize();
8710        // Flatten the buffers into a single vector
8711        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
8712        (buf, fds)
8713    }
8714}
8715impl crate::x11_utils::VoidRequest for MapSubwindowsRequest {
8716}
8717
8718/// Opcode for the UnmapWindow request
8719pub const UNMAP_WINDOW_REQUEST: u8 = 10;
8720/// Makes a window invisible.
8721///
8722/// Unmaps the specified window. This means making the window invisible (and all
8723/// its child windows).
8724///
8725/// Unmapping a window leads to the `UnmapNotify` event being generated. Also,
8726/// `Expose` events are generated for formerly obscured windows.
8727///
8728/// # Fields
8729///
8730/// * `window` - The window to make invisible.
8731///
8732/// # Errors
8733///
8734/// * `Window` - The specified window does not exist.
8735///
8736/// # See
8737///
8738/// * `UnmapNotify`: event
8739/// * `Expose`: event
8740/// * `MapWindow`: request
8741#[derive(Clone, Copy, Default)]
8742#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8743#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8744pub struct UnmapWindowRequest {
8745    pub window: Window,
8746}
8747impl_debug_if_no_extra_traits!(UnmapWindowRequest, "UnmapWindowRequest");
8748impl UnmapWindowRequest {
8749    /// Serialize this request into bytes for the provided connection
8750    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
8751        let length_so_far = 0;
8752        let window_bytes = self.window.serialize();
8753        let mut request0 = vec![
8754            UNMAP_WINDOW_REQUEST,
8755            0,
8756            0,
8757            0,
8758            window_bytes[0],
8759            window_bytes[1],
8760            window_bytes[2],
8761            window_bytes[3],
8762        ];
8763        let length_so_far = length_so_far + request0.len();
8764        assert_eq!(length_so_far % 4, 0);
8765        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
8766        request0[2..4].copy_from_slice(&length.to_ne_bytes());
8767        ([request0.into()], vec![])
8768    }
8769    /// Parse this request given its header, its body, and any fds that go along with it
8770    #[cfg(feature = "request-parsing")]
8771    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
8772        if header.major_opcode != UNMAP_WINDOW_REQUEST {
8773            return Err(ParseError::InvalidValue);
8774        }
8775        let remaining = &[header.minor_opcode];
8776        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
8777        let _ = remaining;
8778        let (window, remaining) = Window::try_parse(value)?;
8779        let _ = remaining;
8780        Ok(UnmapWindowRequest {
8781            window,
8782        })
8783    }
8784}
8785impl Request for UnmapWindowRequest {
8786    const EXTENSION_NAME: Option<&'static str> = None;
8787
8788    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
8789        let (bufs, fds) = self.serialize();
8790        // Flatten the buffers into a single vector
8791        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
8792        (buf, fds)
8793    }
8794}
8795impl crate::x11_utils::VoidRequest for UnmapWindowRequest {
8796}
8797
8798/// Opcode for the UnmapSubwindows request
8799pub const UNMAP_SUBWINDOWS_REQUEST: u8 = 11;
8800#[derive(Clone, Copy, Default)]
8801#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8802#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8803pub struct UnmapSubwindowsRequest {
8804    pub window: Window,
8805}
8806impl_debug_if_no_extra_traits!(UnmapSubwindowsRequest, "UnmapSubwindowsRequest");
8807impl UnmapSubwindowsRequest {
8808    /// Serialize this request into bytes for the provided connection
8809    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
8810        let length_so_far = 0;
8811        let window_bytes = self.window.serialize();
8812        let mut request0 = vec![
8813            UNMAP_SUBWINDOWS_REQUEST,
8814            0,
8815            0,
8816            0,
8817            window_bytes[0],
8818            window_bytes[1],
8819            window_bytes[2],
8820            window_bytes[3],
8821        ];
8822        let length_so_far = length_so_far + request0.len();
8823        assert_eq!(length_so_far % 4, 0);
8824        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
8825        request0[2..4].copy_from_slice(&length.to_ne_bytes());
8826        ([request0.into()], vec![])
8827    }
8828    /// Parse this request given its header, its body, and any fds that go along with it
8829    #[cfg(feature = "request-parsing")]
8830    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
8831        if header.major_opcode != UNMAP_SUBWINDOWS_REQUEST {
8832            return Err(ParseError::InvalidValue);
8833        }
8834        let remaining = &[header.minor_opcode];
8835        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
8836        let _ = remaining;
8837        let (window, remaining) = Window::try_parse(value)?;
8838        let _ = remaining;
8839        Ok(UnmapSubwindowsRequest {
8840            window,
8841        })
8842    }
8843}
8844impl Request for UnmapSubwindowsRequest {
8845    const EXTENSION_NAME: Option<&'static str> = None;
8846
8847    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
8848        let (bufs, fds) = self.serialize();
8849        // Flatten the buffers into a single vector
8850        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
8851        (buf, fds)
8852    }
8853}
8854impl crate::x11_utils::VoidRequest for UnmapSubwindowsRequest {
8855}
8856
8857#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
8858#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8859pub struct ConfigWindow(u16);
8860impl ConfigWindow {
8861    pub const X: Self = Self(1 << 0);
8862    pub const Y: Self = Self(1 << 1);
8863    pub const WIDTH: Self = Self(1 << 2);
8864    pub const HEIGHT: Self = Self(1 << 3);
8865    pub const BORDER_WIDTH: Self = Self(1 << 4);
8866    pub const SIBLING: Self = Self(1 << 5);
8867    pub const STACK_MODE: Self = Self(1 << 6);
8868}
8869impl From<ConfigWindow> for u16 {
8870    #[inline]
8871    fn from(input: ConfigWindow) -> Self {
8872        input.0
8873    }
8874}
8875impl From<ConfigWindow> for Option<u16> {
8876    #[inline]
8877    fn from(input: ConfigWindow) -> Self {
8878        Some(input.0)
8879    }
8880}
8881impl From<ConfigWindow> for u32 {
8882    #[inline]
8883    fn from(input: ConfigWindow) -> Self {
8884        u32::from(input.0)
8885    }
8886}
8887impl From<ConfigWindow> for Option<u32> {
8888    #[inline]
8889    fn from(input: ConfigWindow) -> Self {
8890        Some(u32::from(input.0))
8891    }
8892}
8893impl From<u8> for ConfigWindow {
8894    #[inline]
8895    fn from(value: u8) -> Self {
8896        Self(value.into())
8897    }
8898}
8899impl From<u16> for ConfigWindow {
8900    #[inline]
8901    fn from(value: u16) -> Self {
8902        Self(value)
8903    }
8904}
8905impl core::fmt::Debug for ConfigWindow  {
8906    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
8907        let variants = [
8908            (Self::X.0.into(), "X", "X"),
8909            (Self::Y.0.into(), "Y", "Y"),
8910            (Self::WIDTH.0.into(), "WIDTH", "Width"),
8911            (Self::HEIGHT.0.into(), "HEIGHT", "Height"),
8912            (Self::BORDER_WIDTH.0.into(), "BORDER_WIDTH", "BorderWidth"),
8913            (Self::SIBLING.0.into(), "SIBLING", "Sibling"),
8914            (Self::STACK_MODE.0.into(), "STACK_MODE", "StackMode"),
8915        ];
8916        pretty_print_bitmask(fmt, self.0.into(), &variants)
8917    }
8918}
8919bitmask_binop!(ConfigWindow, u16);
8920
8921#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
8922#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8923pub struct StackMode(u32);
8924impl StackMode {
8925    pub const ABOVE: Self = Self(0);
8926    pub const BELOW: Self = Self(1);
8927    pub const TOP_IF: Self = Self(2);
8928    pub const BOTTOM_IF: Self = Self(3);
8929    pub const OPPOSITE: Self = Self(4);
8930}
8931impl From<StackMode> for u32 {
8932    #[inline]
8933    fn from(input: StackMode) -> Self {
8934        input.0
8935    }
8936}
8937impl From<StackMode> for Option<u32> {
8938    #[inline]
8939    fn from(input: StackMode) -> Self {
8940        Some(input.0)
8941    }
8942}
8943impl From<u8> for StackMode {
8944    #[inline]
8945    fn from(value: u8) -> Self {
8946        Self(value.into())
8947    }
8948}
8949impl From<u16> for StackMode {
8950    #[inline]
8951    fn from(value: u16) -> Self {
8952        Self(value.into())
8953    }
8954}
8955impl From<u32> for StackMode {
8956    #[inline]
8957    fn from(value: u32) -> Self {
8958        Self(value)
8959    }
8960}
8961impl core::fmt::Debug for StackMode  {
8962    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
8963        let variants = [
8964            (Self::ABOVE.0, "ABOVE", "Above"),
8965            (Self::BELOW.0, "BELOW", "Below"),
8966            (Self::TOP_IF.0, "TOP_IF", "TopIf"),
8967            (Self::BOTTOM_IF.0, "BOTTOM_IF", "BottomIf"),
8968            (Self::OPPOSITE.0, "OPPOSITE", "Opposite"),
8969        ];
8970        pretty_print_enum(fmt, self.0, &variants)
8971    }
8972}
8973
8974/// Auxiliary and optional information for the `configure_window` function
8975#[derive(Clone, Copy, Default)]
8976#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8977#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8978pub struct ConfigureWindowAux {
8979    pub x: Option<i32>,
8980    pub y: Option<i32>,
8981    pub width: Option<u32>,
8982    pub height: Option<u32>,
8983    pub border_width: Option<u32>,
8984    pub sibling: Option<Window>,
8985    pub stack_mode: Option<StackMode>,
8986}
8987impl_debug_if_no_extra_traits!(ConfigureWindowAux, "ConfigureWindowAux");
8988impl ConfigureWindowAux {
8989    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
8990    fn try_parse(value: &[u8], value_mask: u16) -> Result<(Self, &[u8]), ParseError> {
8991        let switch_expr = u16::from(value_mask);
8992        let mut outer_remaining = value;
8993        let x = if switch_expr & u16::from(ConfigWindow::X) != 0 {
8994            let remaining = outer_remaining;
8995            let (x, remaining) = i32::try_parse(remaining)?;
8996            outer_remaining = remaining;
8997            Some(x)
8998        } else {
8999            None
9000        };
9001        let y = if switch_expr & u16::from(ConfigWindow::Y) != 0 {
9002            let remaining = outer_remaining;
9003            let (y, remaining) = i32::try_parse(remaining)?;
9004            outer_remaining = remaining;
9005            Some(y)
9006        } else {
9007            None
9008        };
9009        let width = if switch_expr & u16::from(ConfigWindow::WIDTH) != 0 {
9010            let remaining = outer_remaining;
9011            let (width, remaining) = u32::try_parse(remaining)?;
9012            outer_remaining = remaining;
9013            Some(width)
9014        } else {
9015            None
9016        };
9017        let height = if switch_expr & u16::from(ConfigWindow::HEIGHT) != 0 {
9018            let remaining = outer_remaining;
9019            let (height, remaining) = u32::try_parse(remaining)?;
9020            outer_remaining = remaining;
9021            Some(height)
9022        } else {
9023            None
9024        };
9025        let border_width = if switch_expr & u16::from(ConfigWindow::BORDER_WIDTH) != 0 {
9026            let remaining = outer_remaining;
9027            let (border_width, remaining) = u32::try_parse(remaining)?;
9028            outer_remaining = remaining;
9029            Some(border_width)
9030        } else {
9031            None
9032        };
9033        let sibling = if switch_expr & u16::from(ConfigWindow::SIBLING) != 0 {
9034            let remaining = outer_remaining;
9035            let (sibling, remaining) = Window::try_parse(remaining)?;
9036            outer_remaining = remaining;
9037            Some(sibling)
9038        } else {
9039            None
9040        };
9041        let stack_mode = if switch_expr & u16::from(ConfigWindow::STACK_MODE) != 0 {
9042            let remaining = outer_remaining;
9043            let (stack_mode, remaining) = u32::try_parse(remaining)?;
9044            let stack_mode = stack_mode.into();
9045            outer_remaining = remaining;
9046            Some(stack_mode)
9047        } else {
9048            None
9049        };
9050        let result = ConfigureWindowAux { x, y, width, height, border_width, sibling, stack_mode };
9051        Ok((result, outer_remaining))
9052    }
9053}
9054impl ConfigureWindowAux {
9055    #[allow(dead_code)]
9056    fn serialize(&self, value_mask: u16) -> Vec<u8> {
9057        let mut result = Vec::new();
9058        self.serialize_into(&mut result, u16::from(value_mask));
9059        result
9060    }
9061    fn serialize_into(&self, bytes: &mut Vec<u8>, value_mask: u16) {
9062        assert_eq!(self.switch_expr(), u16::from(value_mask), "switch `value_list` has an inconsistent discriminant");
9063        if let Some(x) = self.x {
9064            x.serialize_into(bytes);
9065        }
9066        if let Some(y) = self.y {
9067            y.serialize_into(bytes);
9068        }
9069        if let Some(width) = self.width {
9070            width.serialize_into(bytes);
9071        }
9072        if let Some(height) = self.height {
9073            height.serialize_into(bytes);
9074        }
9075        if let Some(border_width) = self.border_width {
9076            border_width.serialize_into(bytes);
9077        }
9078        if let Some(sibling) = self.sibling {
9079            sibling.serialize_into(bytes);
9080        }
9081        if let Some(stack_mode) = self.stack_mode {
9082            u32::from(stack_mode).serialize_into(bytes);
9083        }
9084    }
9085}
9086impl ConfigureWindowAux {
9087    fn switch_expr(&self) -> u16 {
9088        let mut expr_value = 0;
9089        if self.x.is_some() {
9090            expr_value |= u16::from(ConfigWindow::X);
9091        }
9092        if self.y.is_some() {
9093            expr_value |= u16::from(ConfigWindow::Y);
9094        }
9095        if self.width.is_some() {
9096            expr_value |= u16::from(ConfigWindow::WIDTH);
9097        }
9098        if self.height.is_some() {
9099            expr_value |= u16::from(ConfigWindow::HEIGHT);
9100        }
9101        if self.border_width.is_some() {
9102            expr_value |= u16::from(ConfigWindow::BORDER_WIDTH);
9103        }
9104        if self.sibling.is_some() {
9105            expr_value |= u16::from(ConfigWindow::SIBLING);
9106        }
9107        if self.stack_mode.is_some() {
9108            expr_value |= u16::from(ConfigWindow::STACK_MODE);
9109        }
9110        expr_value
9111    }
9112}
9113impl ConfigureWindowAux {
9114    /// Create a new instance with all fields unset / not present.
9115    pub fn new() -> Self {
9116        Default::default()
9117    }
9118    /// Set the `x` field of this structure.
9119    #[must_use]
9120    pub fn x<I>(mut self, value: I) -> Self where I: Into<Option<i32>> {
9121        self.x = value.into();
9122        self
9123    }
9124    /// Set the `y` field of this structure.
9125    #[must_use]
9126    pub fn y<I>(mut self, value: I) -> Self where I: Into<Option<i32>> {
9127        self.y = value.into();
9128        self
9129    }
9130    /// Set the `width` field of this structure.
9131    #[must_use]
9132    pub fn width<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
9133        self.width = value.into();
9134        self
9135    }
9136    /// Set the `height` field of this structure.
9137    #[must_use]
9138    pub fn height<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
9139        self.height = value.into();
9140        self
9141    }
9142    /// Set the `border_width` field of this structure.
9143    #[must_use]
9144    pub fn border_width<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
9145        self.border_width = value.into();
9146        self
9147    }
9148    /// Set the `sibling` field of this structure.
9149    #[must_use]
9150    pub fn sibling<I>(mut self, value: I) -> Self where I: Into<Option<Window>> {
9151        self.sibling = value.into();
9152        self
9153    }
9154    /// Set the `stack_mode` field of this structure.
9155    #[must_use]
9156    pub fn stack_mode<I>(mut self, value: I) -> Self where I: Into<Option<StackMode>> {
9157        self.stack_mode = value.into();
9158        self
9159    }
9160}
9161impl ConfigureWindowAux {
9162    /// Construct from a [`ConfigureRequestEvent`].
9163    ///
9164    /// This function construct a new `ConfigureWindowAux` instance by accepting all requested
9165    /// changes from a `ConfigureRequestEvent`. This function is useful for window managers that want
9166    /// to handle `ConfigureRequestEvent`s.
9167    pub fn from_configure_request(event: &ConfigureRequestEvent) -> Self {
9168        let mut result = Self::new();
9169        let value_mask = u16::from(event.value_mask);
9170        if value_mask & u16::from(ConfigWindow::X) != 0 {
9171            result = result.x(i32::from(event.x));
9172        }
9173        if value_mask & u16::from(ConfigWindow::Y) != 0 {
9174            result = result.y(i32::from(event.y));
9175        }
9176        if value_mask & u16::from(ConfigWindow::WIDTH) != 0 {
9177            result = result.width(u32::from(event.width));
9178        }
9179        if value_mask & u16::from(ConfigWindow::HEIGHT) != 0 {
9180            result = result.height(u32::from(event.height));
9181        }
9182        if value_mask & u16::from(ConfigWindow::BORDER_WIDTH) != 0 {
9183            result = result.border_width(u32::from(event.border_width));
9184        }
9185        if value_mask & u16::from(ConfigWindow::SIBLING) != 0 {
9186            result = result.sibling(event.sibling);
9187        }
9188        if value_mask & u16::from(ConfigWindow::STACK_MODE) != 0 {
9189            result = result.stack_mode(event.stack_mode);
9190        }
9191        result
9192    }
9193}
9194
9195/// Opcode for the ConfigureWindow request
9196pub const CONFIGURE_WINDOW_REQUEST: u8 = 12;
9197/// Configures window attributes.
9198///
9199/// Configures a window's size, position, border width and stacking order.
9200///
9201/// # Fields
9202///
9203/// * `window` - The window to configure.
9204/// * `value_list` - New values, corresponding to the attributes in value_mask. The order has to
9205/// correspond to the order of possible `value_mask` bits. See the example.
9206///
9207/// # Errors
9208///
9209/// * `Match` - You specified a Sibling without also specifying StackMode or the window is not
9210/// actually a Sibling.
9211/// * `Window` - The specified window does not exist. TODO: any other reason?
9212/// * `Value` - TODO: reasons?
9213///
9214/// # See
9215///
9216/// * `MapNotify`: event
9217/// * `Expose`: event
9218///
9219/// # Example
9220///
9221/// ```text
9222/// /*
9223///  * Configures the given window to the left upper corner
9224///  * with a size of 1024x768 pixels.
9225///  *
9226///  */
9227/// void my_example(xcb_connection_t *c, xcb_window_t window) {
9228///     uint16_t mask = 0;
9229///
9230///     mask |= XCB_CONFIG_WINDOW_X;
9231///     mask |= XCB_CONFIG_WINDOW_Y;
9232///     mask |= XCB_CONFIG_WINDOW_WIDTH;
9233///     mask |= XCB_CONFIG_WINDOW_HEIGHT;
9234///
9235///     const uint32_t values[] = {
9236///         0,    /* x */
9237///         0,    /* y */
9238///         1024, /* width */
9239///         768   /* height */
9240///     };
9241///
9242///     xcb_configure_window(c, window, mask, values);
9243///     xcb_flush(c);
9244/// }
9245/// ```
9246#[derive(Clone, Default)]
9247#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9248#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9249pub struct ConfigureWindowRequest<'input> {
9250    pub window: Window,
9251    pub value_list: Cow<'input, ConfigureWindowAux>,
9252}
9253impl_debug_if_no_extra_traits!(ConfigureWindowRequest<'_>, "ConfigureWindowRequest");
9254impl<'input> ConfigureWindowRequest<'input> {
9255    /// Serialize this request into bytes for the provided connection
9256    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
9257        let length_so_far = 0;
9258        let window_bytes = self.window.serialize();
9259        let value_mask: u16 = self.value_list.switch_expr();
9260        let value_mask_bytes = value_mask.serialize();
9261        let mut request0 = vec![
9262            CONFIGURE_WINDOW_REQUEST,
9263            0,
9264            0,
9265            0,
9266            window_bytes[0],
9267            window_bytes[1],
9268            window_bytes[2],
9269            window_bytes[3],
9270            value_mask_bytes[0],
9271            value_mask_bytes[1],
9272            0,
9273            0,
9274        ];
9275        let length_so_far = length_so_far + request0.len();
9276        let value_list_bytes = self.value_list.serialize(u16::from(value_mask));
9277        let length_so_far = length_so_far + value_list_bytes.len();
9278        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
9279        let length_so_far = length_so_far + padding0.len();
9280        assert_eq!(length_so_far % 4, 0);
9281        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
9282        request0[2..4].copy_from_slice(&length.to_ne_bytes());
9283        ([request0.into(), value_list_bytes.into(), padding0.into()], vec![])
9284    }
9285    /// Parse this request given its header, its body, and any fds that go along with it
9286    #[cfg(feature = "request-parsing")]
9287    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
9288        if header.major_opcode != CONFIGURE_WINDOW_REQUEST {
9289            return Err(ParseError::InvalidValue);
9290        }
9291        let remaining = &[header.minor_opcode];
9292        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
9293        let _ = remaining;
9294        let (window, remaining) = Window::try_parse(value)?;
9295        let (value_mask, remaining) = u16::try_parse(remaining)?;
9296        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
9297        let (value_list, remaining) = ConfigureWindowAux::try_parse(remaining, u16::from(value_mask))?;
9298        let _ = remaining;
9299        Ok(ConfigureWindowRequest {
9300            window,
9301            value_list: Cow::Owned(value_list),
9302        })
9303    }
9304    /// Clone all borrowed data in this ConfigureWindowRequest.
9305    pub fn into_owned(self) -> ConfigureWindowRequest<'static> {
9306        ConfigureWindowRequest {
9307            window: self.window,
9308            value_list: Cow::Owned(self.value_list.into_owned()),
9309        }
9310    }
9311}
9312impl<'input> Request for ConfigureWindowRequest<'input> {
9313    const EXTENSION_NAME: Option<&'static str> = None;
9314
9315    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
9316        let (bufs, fds) = self.serialize();
9317        // Flatten the buffers into a single vector
9318        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
9319        (buf, fds)
9320    }
9321}
9322impl<'input> crate::x11_utils::VoidRequest for ConfigureWindowRequest<'input> {
9323}
9324
9325#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
9326#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9327pub struct Circulate(u8);
9328impl Circulate {
9329    pub const RAISE_LOWEST: Self = Self(0);
9330    pub const LOWER_HIGHEST: Self = Self(1);
9331}
9332impl From<Circulate> for u8 {
9333    #[inline]
9334    fn from(input: Circulate) -> Self {
9335        input.0
9336    }
9337}
9338impl From<Circulate> for Option<u8> {
9339    #[inline]
9340    fn from(input: Circulate) -> Self {
9341        Some(input.0)
9342    }
9343}
9344impl From<Circulate> for u16 {
9345    #[inline]
9346    fn from(input: Circulate) -> Self {
9347        u16::from(input.0)
9348    }
9349}
9350impl From<Circulate> for Option<u16> {
9351    #[inline]
9352    fn from(input: Circulate) -> Self {
9353        Some(u16::from(input.0))
9354    }
9355}
9356impl From<Circulate> for u32 {
9357    #[inline]
9358    fn from(input: Circulate) -> Self {
9359        u32::from(input.0)
9360    }
9361}
9362impl From<Circulate> for Option<u32> {
9363    #[inline]
9364    fn from(input: Circulate) -> Self {
9365        Some(u32::from(input.0))
9366    }
9367}
9368impl From<u8> for Circulate {
9369    #[inline]
9370    fn from(value: u8) -> Self {
9371        Self(value)
9372    }
9373}
9374impl core::fmt::Debug for Circulate  {
9375    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
9376        let variants = [
9377            (Self::RAISE_LOWEST.0.into(), "RAISE_LOWEST", "RaiseLowest"),
9378            (Self::LOWER_HIGHEST.0.into(), "LOWER_HIGHEST", "LowerHighest"),
9379        ];
9380        pretty_print_enum(fmt, self.0.into(), &variants)
9381    }
9382}
9383
9384/// Opcode for the CirculateWindow request
9385pub const CIRCULATE_WINDOW_REQUEST: u8 = 13;
9386/// Change window stacking order.
9387///
9388/// If `direction` is `XCB_CIRCULATE_RAISE_LOWEST`, the lowest mapped child (if
9389/// any) will be raised to the top of the stack.
9390///
9391/// If `direction` is `XCB_CIRCULATE_LOWER_HIGHEST`, the highest mapped child will
9392/// be lowered to the bottom of the stack.
9393///
9394/// # Fields
9395///
9396/// * `direction` -
9397/// * `window` - The window to raise/lower (depending on `direction`).
9398///
9399/// # Errors
9400///
9401/// * `Window` - The specified `window` does not exist.
9402/// * `Value` - The specified `direction` is invalid.
9403#[derive(Clone, Copy, Default)]
9404#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9405#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9406pub struct CirculateWindowRequest {
9407    pub direction: Circulate,
9408    pub window: Window,
9409}
9410impl_debug_if_no_extra_traits!(CirculateWindowRequest, "CirculateWindowRequest");
9411impl CirculateWindowRequest {
9412    /// Serialize this request into bytes for the provided connection
9413    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
9414        let length_so_far = 0;
9415        let direction_bytes = u8::from(self.direction).serialize();
9416        let window_bytes = self.window.serialize();
9417        let mut request0 = vec![
9418            CIRCULATE_WINDOW_REQUEST,
9419            direction_bytes[0],
9420            0,
9421            0,
9422            window_bytes[0],
9423            window_bytes[1],
9424            window_bytes[2],
9425            window_bytes[3],
9426        ];
9427        let length_so_far = length_so_far + request0.len();
9428        assert_eq!(length_so_far % 4, 0);
9429        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
9430        request0[2..4].copy_from_slice(&length.to_ne_bytes());
9431        ([request0.into()], vec![])
9432    }
9433    /// Parse this request given its header, its body, and any fds that go along with it
9434    #[cfg(feature = "request-parsing")]
9435    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
9436        if header.major_opcode != CIRCULATE_WINDOW_REQUEST {
9437            return Err(ParseError::InvalidValue);
9438        }
9439        let remaining = &[header.minor_opcode];
9440        let (direction, remaining) = u8::try_parse(remaining)?;
9441        let direction = direction.into();
9442        let _ = remaining;
9443        let (window, remaining) = Window::try_parse(value)?;
9444        let _ = remaining;
9445        Ok(CirculateWindowRequest {
9446            direction,
9447            window,
9448        })
9449    }
9450}
9451impl Request for CirculateWindowRequest {
9452    const EXTENSION_NAME: Option<&'static str> = None;
9453
9454    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
9455        let (bufs, fds) = self.serialize();
9456        // Flatten the buffers into a single vector
9457        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
9458        (buf, fds)
9459    }
9460}
9461impl crate::x11_utils::VoidRequest for CirculateWindowRequest {
9462}
9463
9464/// Opcode for the GetGeometry request
9465pub const GET_GEOMETRY_REQUEST: u8 = 14;
9466/// Get current window geometry.
9467///
9468/// Gets the current geometry of the specified drawable (either `Window` or `Pixmap`).
9469///
9470/// # Fields
9471///
9472/// * `drawable` - The drawable (`Window` or `Pixmap`) of which the geometry will be received.
9473///
9474/// # Errors
9475///
9476/// * `Drawable` - TODO: reasons?
9477/// * `Window` - TODO: reasons?
9478///
9479/// # See
9480///
9481/// * `xwininfo`: program
9482///
9483/// # Example
9484///
9485/// ```text
9486/// /*
9487///  * Displays the x and y position of the given window.
9488///  *
9489///  */
9490/// void my_example(xcb_connection_t *c, xcb_window_t window) {
9491///     xcb_get_geometry_cookie_t cookie;
9492///     xcb_get_geometry_reply_t *reply;
9493///
9494///     cookie = xcb_get_geometry(c, window);
9495///     /* ... do other work here if possible ... */
9496///     if ((reply = xcb_get_geometry_reply(c, cookie, NULL))) {
9497///         printf("This window is at %d, %d\\n", reply->x, reply->y);
9498///     }
9499///     free(reply);
9500/// }
9501/// ```
9502#[derive(Clone, Copy, Default)]
9503#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9504#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9505pub struct GetGeometryRequest {
9506    pub drawable: Drawable,
9507}
9508impl_debug_if_no_extra_traits!(GetGeometryRequest, "GetGeometryRequest");
9509impl GetGeometryRequest {
9510    /// Serialize this request into bytes for the provided connection
9511    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
9512        let length_so_far = 0;
9513        let drawable_bytes = self.drawable.serialize();
9514        let mut request0 = vec![
9515            GET_GEOMETRY_REQUEST,
9516            0,
9517            0,
9518            0,
9519            drawable_bytes[0],
9520            drawable_bytes[1],
9521            drawable_bytes[2],
9522            drawable_bytes[3],
9523        ];
9524        let length_so_far = length_so_far + request0.len();
9525        assert_eq!(length_so_far % 4, 0);
9526        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
9527        request0[2..4].copy_from_slice(&length.to_ne_bytes());
9528        ([request0.into()], vec![])
9529    }
9530    /// Parse this request given its header, its body, and any fds that go along with it
9531    #[cfg(feature = "request-parsing")]
9532    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
9533        if header.major_opcode != GET_GEOMETRY_REQUEST {
9534            return Err(ParseError::InvalidValue);
9535        }
9536        let remaining = &[header.minor_opcode];
9537        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
9538        let _ = remaining;
9539        let (drawable, remaining) = Drawable::try_parse(value)?;
9540        let _ = remaining;
9541        Ok(GetGeometryRequest {
9542            drawable,
9543        })
9544    }
9545}
9546impl Request for GetGeometryRequest {
9547    const EXTENSION_NAME: Option<&'static str> = None;
9548
9549    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
9550        let (bufs, fds) = self.serialize();
9551        // Flatten the buffers into a single vector
9552        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
9553        (buf, fds)
9554    }
9555}
9556impl crate::x11_utils::ReplyRequest for GetGeometryRequest {
9557    type Reply = GetGeometryReply;
9558}
9559
9560/// # Fields
9561///
9562/// * `root` - Root window of the screen containing `drawable`.
9563/// * `x` - The X coordinate of `drawable`. If `drawable` is a window, the coordinate
9564/// specifies the upper-left outer corner relative to its parent's origin. If
9565/// `drawable` is a pixmap, the X coordinate is always 0.
9566/// * `y` - The Y coordinate of `drawable`. If `drawable` is a window, the coordinate
9567/// specifies the upper-left outer corner relative to its parent's origin. If
9568/// `drawable` is a pixmap, the Y coordinate is always 0.
9569/// * `width` - The width of `drawable`.
9570/// * `height` - The height of `drawable`.
9571/// * `border_width` - The border width (in pixels).
9572/// * `depth` - The depth of the drawable (bits per pixel for the object).
9573#[derive(Clone, Copy, Default)]
9574#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9575#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9576pub struct GetGeometryReply {
9577    pub depth: u8,
9578    pub sequence: u16,
9579    pub length: u32,
9580    pub root: Window,
9581    pub x: i16,
9582    pub y: i16,
9583    pub width: u16,
9584    pub height: u16,
9585    pub border_width: u16,
9586}
9587impl_debug_if_no_extra_traits!(GetGeometryReply, "GetGeometryReply");
9588impl TryParse for GetGeometryReply {
9589    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
9590        let remaining = initial_value;
9591        let (response_type, remaining) = u8::try_parse(remaining)?;
9592        let (depth, remaining) = u8::try_parse(remaining)?;
9593        let (sequence, remaining) = u16::try_parse(remaining)?;
9594        let (length, remaining) = u32::try_parse(remaining)?;
9595        let (root, remaining) = Window::try_parse(remaining)?;
9596        let (x, remaining) = i16::try_parse(remaining)?;
9597        let (y, remaining) = i16::try_parse(remaining)?;
9598        let (width, remaining) = u16::try_parse(remaining)?;
9599        let (height, remaining) = u16::try_parse(remaining)?;
9600        let (border_width, remaining) = u16::try_parse(remaining)?;
9601        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
9602        if response_type != 1 {
9603            return Err(ParseError::InvalidValue);
9604        }
9605        let result = GetGeometryReply { depth, sequence, length, root, x, y, width, height, border_width };
9606        let _ = remaining;
9607        let remaining = initial_value.get(32 + length as usize * 4..)
9608            .ok_or(ParseError::InsufficientData)?;
9609        Ok((result, remaining))
9610    }
9611}
9612impl Serialize for GetGeometryReply {
9613    type Bytes = [u8; 24];
9614    fn serialize(&self) -> [u8; 24] {
9615        let response_type_bytes = &[1];
9616        let depth_bytes = self.depth.serialize();
9617        let sequence_bytes = self.sequence.serialize();
9618        let length_bytes = self.length.serialize();
9619        let root_bytes = self.root.serialize();
9620        let x_bytes = self.x.serialize();
9621        let y_bytes = self.y.serialize();
9622        let width_bytes = self.width.serialize();
9623        let height_bytes = self.height.serialize();
9624        let border_width_bytes = self.border_width.serialize();
9625        [
9626            response_type_bytes[0],
9627            depth_bytes[0],
9628            sequence_bytes[0],
9629            sequence_bytes[1],
9630            length_bytes[0],
9631            length_bytes[1],
9632            length_bytes[2],
9633            length_bytes[3],
9634            root_bytes[0],
9635            root_bytes[1],
9636            root_bytes[2],
9637            root_bytes[3],
9638            x_bytes[0],
9639            x_bytes[1],
9640            y_bytes[0],
9641            y_bytes[1],
9642            width_bytes[0],
9643            width_bytes[1],
9644            height_bytes[0],
9645            height_bytes[1],
9646            border_width_bytes[0],
9647            border_width_bytes[1],
9648            0,
9649            0,
9650        ]
9651    }
9652    fn serialize_into(&self, bytes: &mut Vec<u8>) {
9653        bytes.reserve(24);
9654        let response_type_bytes = &[1];
9655        bytes.push(response_type_bytes[0]);
9656        self.depth.serialize_into(bytes);
9657        self.sequence.serialize_into(bytes);
9658        self.length.serialize_into(bytes);
9659        self.root.serialize_into(bytes);
9660        self.x.serialize_into(bytes);
9661        self.y.serialize_into(bytes);
9662        self.width.serialize_into(bytes);
9663        self.height.serialize_into(bytes);
9664        self.border_width.serialize_into(bytes);
9665        bytes.extend_from_slice(&[0; 2]);
9666    }
9667}
9668
9669/// Opcode for the QueryTree request
9670pub const QUERY_TREE_REQUEST: u8 = 15;
9671/// query the window tree.
9672///
9673/// Gets the root window ID, parent window ID and list of children windows for the
9674/// specified `window`. The children are listed in bottom-to-top stacking order.
9675///
9676/// # Fields
9677///
9678/// * `window` - The `window` to query.
9679///
9680/// # See
9681///
9682/// * `xwininfo`: program
9683///
9684/// # Example
9685///
9686/// ```text
9687/// /*
9688///  * Displays the root, parent and children of the specified window.
9689///  *
9690///  */
9691/// void my_example(xcb_connection_t *conn, xcb_window_t window) {
9692///     xcb_query_tree_cookie_t cookie;
9693///     xcb_query_tree_reply_t *reply;
9694///
9695///     cookie = xcb_query_tree(conn, window);
9696///     if ((reply = xcb_query_tree_reply(conn, cookie, NULL))) {
9697///         printf("root = 0x%08x\\n", reply->root);
9698///         printf("parent = 0x%08x\\n", reply->parent);
9699///
9700///         xcb_window_t *children = xcb_query_tree_children(reply);
9701///         for (int i = 0; i < xcb_query_tree_children_length(reply); i++)
9702///             printf("child window = 0x%08x\\n", children[i]);
9703///
9704///         free(reply);
9705///     }
9706/// }
9707/// ```
9708#[derive(Clone, Copy, Default)]
9709#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9710#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9711pub struct QueryTreeRequest {
9712    pub window: Window,
9713}
9714impl_debug_if_no_extra_traits!(QueryTreeRequest, "QueryTreeRequest");
9715impl QueryTreeRequest {
9716    /// Serialize this request into bytes for the provided connection
9717    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
9718        let length_so_far = 0;
9719        let window_bytes = self.window.serialize();
9720        let mut request0 = vec![
9721            QUERY_TREE_REQUEST,
9722            0,
9723            0,
9724            0,
9725            window_bytes[0],
9726            window_bytes[1],
9727            window_bytes[2],
9728            window_bytes[3],
9729        ];
9730        let length_so_far = length_so_far + request0.len();
9731        assert_eq!(length_so_far % 4, 0);
9732        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
9733        request0[2..4].copy_from_slice(&length.to_ne_bytes());
9734        ([request0.into()], vec![])
9735    }
9736    /// Parse this request given its header, its body, and any fds that go along with it
9737    #[cfg(feature = "request-parsing")]
9738    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
9739        if header.major_opcode != QUERY_TREE_REQUEST {
9740            return Err(ParseError::InvalidValue);
9741        }
9742        let remaining = &[header.minor_opcode];
9743        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
9744        let _ = remaining;
9745        let (window, remaining) = Window::try_parse(value)?;
9746        let _ = remaining;
9747        Ok(QueryTreeRequest {
9748            window,
9749        })
9750    }
9751}
9752impl Request for QueryTreeRequest {
9753    const EXTENSION_NAME: Option<&'static str> = None;
9754
9755    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
9756        let (bufs, fds) = self.serialize();
9757        // Flatten the buffers into a single vector
9758        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
9759        (buf, fds)
9760    }
9761}
9762impl crate::x11_utils::ReplyRequest for QueryTreeRequest {
9763    type Reply = QueryTreeReply;
9764}
9765
9766/// # Fields
9767///
9768/// * `root` - The root window of `window`.
9769/// * `parent` - The parent window of `window`.
9770#[derive(Clone, Default)]
9771#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9772#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9773pub struct QueryTreeReply {
9774    pub sequence: u16,
9775    pub length: u32,
9776    pub root: Window,
9777    pub parent: Window,
9778    pub children: Vec<Window>,
9779}
9780impl_debug_if_no_extra_traits!(QueryTreeReply, "QueryTreeReply");
9781impl TryParse for QueryTreeReply {
9782    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
9783        let remaining = initial_value;
9784        let (response_type, remaining) = u8::try_parse(remaining)?;
9785        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
9786        let (sequence, remaining) = u16::try_parse(remaining)?;
9787        let (length, remaining) = u32::try_parse(remaining)?;
9788        let (root, remaining) = Window::try_parse(remaining)?;
9789        let (parent, remaining) = Window::try_parse(remaining)?;
9790        let (children_len, remaining) = u16::try_parse(remaining)?;
9791        let remaining = remaining.get(14..).ok_or(ParseError::InsufficientData)?;
9792        let (children, remaining) = crate::x11_utils::parse_list::<Window>(remaining, children_len.try_to_usize()?)?;
9793        if response_type != 1 {
9794            return Err(ParseError::InvalidValue);
9795        }
9796        let result = QueryTreeReply { sequence, length, root, parent, children };
9797        let _ = remaining;
9798        let remaining = initial_value.get(32 + length as usize * 4..)
9799            .ok_or(ParseError::InsufficientData)?;
9800        Ok((result, remaining))
9801    }
9802}
9803impl Serialize for QueryTreeReply {
9804    type Bytes = Vec<u8>;
9805    fn serialize(&self) -> Vec<u8> {
9806        let mut result = Vec::new();
9807        self.serialize_into(&mut result);
9808        result
9809    }
9810    fn serialize_into(&self, bytes: &mut Vec<u8>) {
9811        bytes.reserve(32);
9812        let response_type_bytes = &[1];
9813        bytes.push(response_type_bytes[0]);
9814        bytes.extend_from_slice(&[0; 1]);
9815        self.sequence.serialize_into(bytes);
9816        self.length.serialize_into(bytes);
9817        self.root.serialize_into(bytes);
9818        self.parent.serialize_into(bytes);
9819        let children_len = u16::try_from(self.children.len()).expect("`children` has too many elements");
9820        children_len.serialize_into(bytes);
9821        bytes.extend_from_slice(&[0; 14]);
9822        self.children.serialize_into(bytes);
9823    }
9824}
9825impl QueryTreeReply {
9826    /// Get the value of the `children_len` field.
9827    ///
9828    /// The `children_len` field is used as the length field of the `children` field.
9829    /// This function computes the field's value again based on the length of the list.
9830    ///
9831    /// # Panics
9832    ///
9833    /// Panics if the value cannot be represented in the target type. This
9834    /// cannot happen with values of the struct received from the X11 server.
9835    pub fn children_len(&self) -> u16 {
9836        self.children.len()
9837            .try_into().unwrap()
9838    }
9839}
9840
9841/// Opcode for the InternAtom request
9842pub const INTERN_ATOM_REQUEST: u8 = 16;
9843/// Get atom identifier by name.
9844///
9845/// Retrieves the identifier (xcb_atom_t TODO) for the atom with the specified
9846/// name. Atoms are used in protocols like EWMH, for example to store window titles
9847/// (`_NET_WM_NAME` atom) as property of a window.
9848///
9849/// If `only_if_exists` is 0, the atom will be created if it does not already exist.
9850/// If `only_if_exists` is 1, `XCB_ATOM_NONE` will be returned if the atom does
9851/// not yet exist.
9852///
9853/// # Fields
9854///
9855/// * `name` - The name of the atom.
9856/// * `only_if_exists` - Return a valid atom id only if the atom already exists.
9857///
9858/// # Errors
9859///
9860/// * `Alloc` - TODO: reasons?
9861/// * `Value` - A value other than 0 or 1 was specified for `only_if_exists`.
9862///
9863/// # See
9864///
9865/// * `xlsatoms`: program
9866/// * `GetAtomName`: request
9867///
9868/// # Example
9869///
9870/// ```text
9871/// /*
9872///  * Resolves the _NET_WM_NAME atom.
9873///  *
9874///  */
9875/// void my_example(xcb_connection_t *c) {
9876///     xcb_intern_atom_cookie_t cookie;
9877///     xcb_intern_atom_reply_t *reply;
9878///
9879///     cookie = xcb_intern_atom(c, 0, strlen("_NET_WM_NAME"), "_NET_WM_NAME");
9880///     /* ... do other work here if possible ... */
9881///     if ((reply = xcb_intern_atom_reply(c, cookie, NULL))) {
9882///         printf("The _NET_WM_NAME atom has ID %u\n", reply->atom);
9883///         free(reply);
9884///     }
9885/// }
9886/// ```
9887#[derive(Clone, Default)]
9888#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9889#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9890pub struct InternAtomRequest<'input> {
9891    pub only_if_exists: bool,
9892    pub name: Cow<'input, [u8]>,
9893}
9894impl_debug_if_no_extra_traits!(InternAtomRequest<'_>, "InternAtomRequest");
9895impl<'input> InternAtomRequest<'input> {
9896    /// Serialize this request into bytes for the provided connection
9897    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
9898        let length_so_far = 0;
9899        let only_if_exists_bytes = self.only_if_exists.serialize();
9900        let name_len = u16::try_from(self.name.len()).expect("`name` has too many elements");
9901        let name_len_bytes = name_len.serialize();
9902        let mut request0 = vec![
9903            INTERN_ATOM_REQUEST,
9904            only_if_exists_bytes[0],
9905            0,
9906            0,
9907            name_len_bytes[0],
9908            name_len_bytes[1],
9909            0,
9910            0,
9911        ];
9912        let length_so_far = length_so_far + request0.len();
9913        let length_so_far = length_so_far + self.name.len();
9914        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
9915        let length_so_far = length_so_far + padding0.len();
9916        assert_eq!(length_so_far % 4, 0);
9917        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
9918        request0[2..4].copy_from_slice(&length.to_ne_bytes());
9919        ([request0.into(), self.name, padding0.into()], vec![])
9920    }
9921    /// Parse this request given its header, its body, and any fds that go along with it
9922    #[cfg(feature = "request-parsing")]
9923    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
9924        if header.major_opcode != INTERN_ATOM_REQUEST {
9925            return Err(ParseError::InvalidValue);
9926        }
9927        let remaining = &[header.minor_opcode];
9928        let (only_if_exists, remaining) = bool::try_parse(remaining)?;
9929        let _ = remaining;
9930        let (name_len, remaining) = u16::try_parse(value)?;
9931        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
9932        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_len.try_to_usize()?)?;
9933        let _ = remaining;
9934        Ok(InternAtomRequest {
9935            only_if_exists,
9936            name: Cow::Borrowed(name),
9937        })
9938    }
9939    /// Clone all borrowed data in this InternAtomRequest.
9940    pub fn into_owned(self) -> InternAtomRequest<'static> {
9941        InternAtomRequest {
9942            only_if_exists: self.only_if_exists,
9943            name: Cow::Owned(self.name.into_owned()),
9944        }
9945    }
9946}
9947impl<'input> Request for InternAtomRequest<'input> {
9948    const EXTENSION_NAME: Option<&'static str> = None;
9949
9950    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
9951        let (bufs, fds) = self.serialize();
9952        // Flatten the buffers into a single vector
9953        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
9954        (buf, fds)
9955    }
9956}
9957impl<'input> crate::x11_utils::ReplyRequest for InternAtomRequest<'input> {
9958    type Reply = InternAtomReply;
9959}
9960
9961#[derive(Clone, Copy, Default)]
9962#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9963#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9964pub struct InternAtomReply {
9965    pub sequence: u16,
9966    pub length: u32,
9967    pub atom: Atom,
9968}
9969impl_debug_if_no_extra_traits!(InternAtomReply, "InternAtomReply");
9970impl TryParse for InternAtomReply {
9971    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
9972        let remaining = initial_value;
9973        let (response_type, remaining) = u8::try_parse(remaining)?;
9974        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
9975        let (sequence, remaining) = u16::try_parse(remaining)?;
9976        let (length, remaining) = u32::try_parse(remaining)?;
9977        let (atom, remaining) = Atom::try_parse(remaining)?;
9978        if response_type != 1 {
9979            return Err(ParseError::InvalidValue);
9980        }
9981        let result = InternAtomReply { sequence, length, atom };
9982        let _ = remaining;
9983        let remaining = initial_value.get(32 + length as usize * 4..)
9984            .ok_or(ParseError::InsufficientData)?;
9985        Ok((result, remaining))
9986    }
9987}
9988impl Serialize for InternAtomReply {
9989    type Bytes = [u8; 12];
9990    fn serialize(&self) -> [u8; 12] {
9991        let response_type_bytes = &[1];
9992        let sequence_bytes = self.sequence.serialize();
9993        let length_bytes = self.length.serialize();
9994        let atom_bytes = self.atom.serialize();
9995        [
9996            response_type_bytes[0],
9997            0,
9998            sequence_bytes[0],
9999            sequence_bytes[1],
10000            length_bytes[0],
10001            length_bytes[1],
10002            length_bytes[2],
10003            length_bytes[3],
10004            atom_bytes[0],
10005            atom_bytes[1],
10006            atom_bytes[2],
10007            atom_bytes[3],
10008        ]
10009    }
10010    fn serialize_into(&self, bytes: &mut Vec<u8>) {
10011        bytes.reserve(12);
10012        let response_type_bytes = &[1];
10013        bytes.push(response_type_bytes[0]);
10014        bytes.extend_from_slice(&[0; 1]);
10015        self.sequence.serialize_into(bytes);
10016        self.length.serialize_into(bytes);
10017        self.atom.serialize_into(bytes);
10018    }
10019}
10020
10021/// Opcode for the GetAtomName request
10022pub const GET_ATOM_NAME_REQUEST: u8 = 17;
10023#[derive(Clone, Copy, Default)]
10024#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10025#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10026pub struct GetAtomNameRequest {
10027    pub atom: Atom,
10028}
10029impl_debug_if_no_extra_traits!(GetAtomNameRequest, "GetAtomNameRequest");
10030impl GetAtomNameRequest {
10031    /// Serialize this request into bytes for the provided connection
10032    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
10033        let length_so_far = 0;
10034        let atom_bytes = self.atom.serialize();
10035        let mut request0 = vec![
10036            GET_ATOM_NAME_REQUEST,
10037            0,
10038            0,
10039            0,
10040            atom_bytes[0],
10041            atom_bytes[1],
10042            atom_bytes[2],
10043            atom_bytes[3],
10044        ];
10045        let length_so_far = length_so_far + request0.len();
10046        assert_eq!(length_so_far % 4, 0);
10047        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
10048        request0[2..4].copy_from_slice(&length.to_ne_bytes());
10049        ([request0.into()], vec![])
10050    }
10051    /// Parse this request given its header, its body, and any fds that go along with it
10052    #[cfg(feature = "request-parsing")]
10053    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
10054        if header.major_opcode != GET_ATOM_NAME_REQUEST {
10055            return Err(ParseError::InvalidValue);
10056        }
10057        let remaining = &[header.minor_opcode];
10058        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
10059        let _ = remaining;
10060        let (atom, remaining) = Atom::try_parse(value)?;
10061        let _ = remaining;
10062        Ok(GetAtomNameRequest {
10063            atom,
10064        })
10065    }
10066}
10067impl Request for GetAtomNameRequest {
10068    const EXTENSION_NAME: Option<&'static str> = None;
10069
10070    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
10071        let (bufs, fds) = self.serialize();
10072        // Flatten the buffers into a single vector
10073        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
10074        (buf, fds)
10075    }
10076}
10077impl crate::x11_utils::ReplyRequest for GetAtomNameRequest {
10078    type Reply = GetAtomNameReply;
10079}
10080
10081#[derive(Clone, Default)]
10082#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10083#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10084pub struct GetAtomNameReply {
10085    pub sequence: u16,
10086    pub length: u32,
10087    pub name: Vec<u8>,
10088}
10089impl_debug_if_no_extra_traits!(GetAtomNameReply, "GetAtomNameReply");
10090impl TryParse for GetAtomNameReply {
10091    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
10092        let remaining = initial_value;
10093        let (response_type, remaining) = u8::try_parse(remaining)?;
10094        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
10095        let (sequence, remaining) = u16::try_parse(remaining)?;
10096        let (length, remaining) = u32::try_parse(remaining)?;
10097        let (name_len, remaining) = u16::try_parse(remaining)?;
10098        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
10099        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_len.try_to_usize()?)?;
10100        let name = name.to_vec();
10101        if response_type != 1 {
10102            return Err(ParseError::InvalidValue);
10103        }
10104        let result = GetAtomNameReply { sequence, length, name };
10105        let _ = remaining;
10106        let remaining = initial_value.get(32 + length as usize * 4..)
10107            .ok_or(ParseError::InsufficientData)?;
10108        Ok((result, remaining))
10109    }
10110}
10111impl Serialize for GetAtomNameReply {
10112    type Bytes = Vec<u8>;
10113    fn serialize(&self) -> Vec<u8> {
10114        let mut result = Vec::new();
10115        self.serialize_into(&mut result);
10116        result
10117    }
10118    fn serialize_into(&self, bytes: &mut Vec<u8>) {
10119        bytes.reserve(32);
10120        let response_type_bytes = &[1];
10121        bytes.push(response_type_bytes[0]);
10122        bytes.extend_from_slice(&[0; 1]);
10123        self.sequence.serialize_into(bytes);
10124        self.length.serialize_into(bytes);
10125        let name_len = u16::try_from(self.name.len()).expect("`name` has too many elements");
10126        name_len.serialize_into(bytes);
10127        bytes.extend_from_slice(&[0; 22]);
10128        bytes.extend_from_slice(&self.name);
10129    }
10130}
10131impl GetAtomNameReply {
10132    /// Get the value of the `name_len` field.
10133    ///
10134    /// The `name_len` field is used as the length field of the `name` field.
10135    /// This function computes the field's value again based on the length of the list.
10136    ///
10137    /// # Panics
10138    ///
10139    /// Panics if the value cannot be represented in the target type. This
10140    /// cannot happen with values of the struct received from the X11 server.
10141    pub fn name_len(&self) -> u16 {
10142        self.name.len()
10143            .try_into().unwrap()
10144    }
10145}
10146
10147/// # Fields
10148///
10149/// * `Replace` - Discard the previous property value and store the new data.
10150/// * `Prepend` - Insert the new data before the beginning of existing data. The `format` must
10151/// match existing property value. If the property is undefined, it is treated as
10152/// defined with the correct type and format with zero-length data.
10153/// * `Append` - Insert the new data after the beginning of existing data. The `format` must
10154/// match existing property value. If the property is undefined, it is treated as
10155/// defined with the correct type and format with zero-length data.
10156#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
10157#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10158pub struct PropMode(u8);
10159impl PropMode {
10160    pub const REPLACE: Self = Self(0);
10161    pub const PREPEND: Self = Self(1);
10162    pub const APPEND: Self = Self(2);
10163}
10164impl From<PropMode> for u8 {
10165    #[inline]
10166    fn from(input: PropMode) -> Self {
10167        input.0
10168    }
10169}
10170impl From<PropMode> for Option<u8> {
10171    #[inline]
10172    fn from(input: PropMode) -> Self {
10173        Some(input.0)
10174    }
10175}
10176impl From<PropMode> for u16 {
10177    #[inline]
10178    fn from(input: PropMode) -> Self {
10179        u16::from(input.0)
10180    }
10181}
10182impl From<PropMode> for Option<u16> {
10183    #[inline]
10184    fn from(input: PropMode) -> Self {
10185        Some(u16::from(input.0))
10186    }
10187}
10188impl From<PropMode> for u32 {
10189    #[inline]
10190    fn from(input: PropMode) -> Self {
10191        u32::from(input.0)
10192    }
10193}
10194impl From<PropMode> for Option<u32> {
10195    #[inline]
10196    fn from(input: PropMode) -> Self {
10197        Some(u32::from(input.0))
10198    }
10199}
10200impl From<u8> for PropMode {
10201    #[inline]
10202    fn from(value: u8) -> Self {
10203        Self(value)
10204    }
10205}
10206impl core::fmt::Debug for PropMode  {
10207    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
10208        let variants = [
10209            (Self::REPLACE.0.into(), "REPLACE", "Replace"),
10210            (Self::PREPEND.0.into(), "PREPEND", "Prepend"),
10211            (Self::APPEND.0.into(), "APPEND", "Append"),
10212        ];
10213        pretty_print_enum(fmt, self.0.into(), &variants)
10214    }
10215}
10216
10217/// Opcode for the ChangeProperty request
10218pub const CHANGE_PROPERTY_REQUEST: u8 = 18;
10219/// Changes a window property.
10220///
10221/// Sets or updates a property on the specified `window`. Properties are for
10222/// example the window title (`WM_NAME`) or its minimum size (`WM_NORMAL_HINTS`).
10223/// Protocols such as EWMH also use properties - for example EWMH defines the
10224/// window title, encoded as UTF-8 string, in the `_NET_WM_NAME` property.
10225///
10226/// # Fields
10227///
10228/// * `window` - The window whose property you want to change.
10229/// * `mode` -
10230/// * `property` - The property you want to change (an atom).
10231/// * `type` - The type of the property you want to change (an atom).
10232/// * `format` - Specifies whether the data should be viewed as a list of 8-bit, 16-bit or
10233/// 32-bit quantities. Possible values are 8, 16 and 32. This information allows
10234/// the X server to correctly perform byte-swap operations as necessary.
10235/// * `data_len` - Specifies the number of elements (see `format`).
10236/// * `data` - The property data.
10237///
10238/// # Errors
10239///
10240/// * `Match` - TODO: reasons?
10241/// * `Value` - TODO: reasons?
10242/// * `Window` - The specified `window` does not exist.
10243/// * `Atom` - `property` or `type` do not refer to a valid atom.
10244/// * `Alloc` - The X server could not store the property (no memory?).
10245///
10246/// # See
10247///
10248/// * `InternAtom`: request
10249/// * `xprop`: program
10250///
10251/// # Example
10252///
10253/// ```text
10254/// /*
10255///  * Sets the WM_NAME property of the window to "XCB Example".
10256///  *
10257///  */
10258/// void my_example(xcb_connection_t *conn, xcb_window_t window) {
10259///     xcb_change_property(conn,
10260///         XCB_PROP_MODE_REPLACE,
10261///         window,
10262///         XCB_ATOM_WM_NAME,
10263///         XCB_ATOM_STRING,
10264///         8,
10265///         strlen("XCB Example"),
10266///         "XCB Example");
10267///     xcb_flush(conn);
10268/// }
10269/// ```
10270#[derive(Clone, Default)]
10271#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10272#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10273pub struct ChangePropertyRequest<'input> {
10274    pub mode: PropMode,
10275    pub window: Window,
10276    pub property: Atom,
10277    pub type_: Atom,
10278    pub format: u8,
10279    pub data_len: u32,
10280    pub data: Cow<'input, [u8]>,
10281}
10282impl_debug_if_no_extra_traits!(ChangePropertyRequest<'_>, "ChangePropertyRequest");
10283impl<'input> ChangePropertyRequest<'input> {
10284    /// Serialize this request into bytes for the provided connection
10285    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
10286        let length_so_far = 0;
10287        let mode_bytes = u8::from(self.mode).serialize();
10288        let window_bytes = self.window.serialize();
10289        let property_bytes = self.property.serialize();
10290        let type_bytes = self.type_.serialize();
10291        let format_bytes = self.format.serialize();
10292        let data_len_bytes = self.data_len.serialize();
10293        let mut request0 = vec![
10294            CHANGE_PROPERTY_REQUEST,
10295            mode_bytes[0],
10296            0,
10297            0,
10298            window_bytes[0],
10299            window_bytes[1],
10300            window_bytes[2],
10301            window_bytes[3],
10302            property_bytes[0],
10303            property_bytes[1],
10304            property_bytes[2],
10305            property_bytes[3],
10306            type_bytes[0],
10307            type_bytes[1],
10308            type_bytes[2],
10309            type_bytes[3],
10310            format_bytes[0],
10311            0,
10312            0,
10313            0,
10314            data_len_bytes[0],
10315            data_len_bytes[1],
10316            data_len_bytes[2],
10317            data_len_bytes[3],
10318        ];
10319        let length_so_far = length_so_far + request0.len();
10320        assert_eq!(self.data.len(), usize::try_from(u32::from(self.data_len).checked_mul(u32::from(self.format)).unwrap().checked_div(8u32).unwrap()).unwrap(), "`data` has an incorrect length");
10321        let length_so_far = length_so_far + self.data.len();
10322        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
10323        let length_so_far = length_so_far + padding0.len();
10324        assert_eq!(length_so_far % 4, 0);
10325        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
10326        request0[2..4].copy_from_slice(&length.to_ne_bytes());
10327        ([request0.into(), self.data, padding0.into()], vec![])
10328    }
10329    /// Parse this request given its header, its body, and any fds that go along with it
10330    #[cfg(feature = "request-parsing")]
10331    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
10332        if header.major_opcode != CHANGE_PROPERTY_REQUEST {
10333            return Err(ParseError::InvalidValue);
10334        }
10335        let remaining = &[header.minor_opcode];
10336        let (mode, remaining) = u8::try_parse(remaining)?;
10337        let mode = mode.into();
10338        let _ = remaining;
10339        let (window, remaining) = Window::try_parse(value)?;
10340        let (property, remaining) = Atom::try_parse(remaining)?;
10341        let (type_, remaining) = Atom::try_parse(remaining)?;
10342        let (format, remaining) = u8::try_parse(remaining)?;
10343        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
10344        let (data_len, remaining) = u32::try_parse(remaining)?;
10345        let (data, remaining) = crate::x11_utils::parse_u8_list(remaining, u32::from(data_len).checked_mul(u32::from(format)).ok_or(ParseError::InvalidExpression)?.checked_div(8u32).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
10346        let _ = remaining;
10347        Ok(ChangePropertyRequest {
10348            mode,
10349            window,
10350            property,
10351            type_,
10352            format,
10353            data_len,
10354            data: Cow::Borrowed(data),
10355        })
10356    }
10357    /// Clone all borrowed data in this ChangePropertyRequest.
10358    pub fn into_owned(self) -> ChangePropertyRequest<'static> {
10359        ChangePropertyRequest {
10360            mode: self.mode,
10361            window: self.window,
10362            property: self.property,
10363            type_: self.type_,
10364            format: self.format,
10365            data_len: self.data_len,
10366            data: Cow::Owned(self.data.into_owned()),
10367        }
10368    }
10369}
10370impl<'input> Request for ChangePropertyRequest<'input> {
10371    const EXTENSION_NAME: Option<&'static str> = None;
10372
10373    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
10374        let (bufs, fds) = self.serialize();
10375        // Flatten the buffers into a single vector
10376        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
10377        (buf, fds)
10378    }
10379}
10380impl<'input> crate::x11_utils::VoidRequest for ChangePropertyRequest<'input> {
10381}
10382
10383/// Opcode for the DeleteProperty request
10384pub const DELETE_PROPERTY_REQUEST: u8 = 19;
10385#[derive(Clone, Copy, Default)]
10386#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10387#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10388pub struct DeletePropertyRequest {
10389    pub window: Window,
10390    pub property: Atom,
10391}
10392impl_debug_if_no_extra_traits!(DeletePropertyRequest, "DeletePropertyRequest");
10393impl DeletePropertyRequest {
10394    /// Serialize this request into bytes for the provided connection
10395    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
10396        let length_so_far = 0;
10397        let window_bytes = self.window.serialize();
10398        let property_bytes = self.property.serialize();
10399        let mut request0 = vec![
10400            DELETE_PROPERTY_REQUEST,
10401            0,
10402            0,
10403            0,
10404            window_bytes[0],
10405            window_bytes[1],
10406            window_bytes[2],
10407            window_bytes[3],
10408            property_bytes[0],
10409            property_bytes[1],
10410            property_bytes[2],
10411            property_bytes[3],
10412        ];
10413        let length_so_far = length_so_far + request0.len();
10414        assert_eq!(length_so_far % 4, 0);
10415        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
10416        request0[2..4].copy_from_slice(&length.to_ne_bytes());
10417        ([request0.into()], vec![])
10418    }
10419    /// Parse this request given its header, its body, and any fds that go along with it
10420    #[cfg(feature = "request-parsing")]
10421    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
10422        if header.major_opcode != DELETE_PROPERTY_REQUEST {
10423            return Err(ParseError::InvalidValue);
10424        }
10425        let remaining = &[header.minor_opcode];
10426        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
10427        let _ = remaining;
10428        let (window, remaining) = Window::try_parse(value)?;
10429        let (property, remaining) = Atom::try_parse(remaining)?;
10430        let _ = remaining;
10431        Ok(DeletePropertyRequest {
10432            window,
10433            property,
10434        })
10435    }
10436}
10437impl Request for DeletePropertyRequest {
10438    const EXTENSION_NAME: Option<&'static str> = None;
10439
10440    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
10441        let (bufs, fds) = self.serialize();
10442        // Flatten the buffers into a single vector
10443        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
10444        (buf, fds)
10445    }
10446}
10447impl crate::x11_utils::VoidRequest for DeletePropertyRequest {
10448}
10449
10450#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
10451#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10452pub struct GetPropertyType(u8);
10453impl GetPropertyType {
10454    pub const ANY: Self = Self(0);
10455}
10456impl From<GetPropertyType> for u8 {
10457    #[inline]
10458    fn from(input: GetPropertyType) -> Self {
10459        input.0
10460    }
10461}
10462impl From<GetPropertyType> for Option<u8> {
10463    #[inline]
10464    fn from(input: GetPropertyType) -> Self {
10465        Some(input.0)
10466    }
10467}
10468impl From<GetPropertyType> for u16 {
10469    #[inline]
10470    fn from(input: GetPropertyType) -> Self {
10471        u16::from(input.0)
10472    }
10473}
10474impl From<GetPropertyType> for Option<u16> {
10475    #[inline]
10476    fn from(input: GetPropertyType) -> Self {
10477        Some(u16::from(input.0))
10478    }
10479}
10480impl From<GetPropertyType> for u32 {
10481    #[inline]
10482    fn from(input: GetPropertyType) -> Self {
10483        u32::from(input.0)
10484    }
10485}
10486impl From<GetPropertyType> for Option<u32> {
10487    #[inline]
10488    fn from(input: GetPropertyType) -> Self {
10489        Some(u32::from(input.0))
10490    }
10491}
10492impl From<u8> for GetPropertyType {
10493    #[inline]
10494    fn from(value: u8) -> Self {
10495        Self(value)
10496    }
10497}
10498impl core::fmt::Debug for GetPropertyType  {
10499    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
10500        let variants = [
10501            (Self::ANY.0.into(), "ANY", "Any"),
10502        ];
10503        pretty_print_enum(fmt, self.0.into(), &variants)
10504    }
10505}
10506
10507/// Opcode for the GetProperty request
10508pub const GET_PROPERTY_REQUEST: u8 = 20;
10509/// Gets a window property.
10510///
10511/// Gets the specified `property` from the specified `window`. Properties are for
10512/// example the window title (`WM_NAME`) or its minimum size (`WM_NORMAL_HINTS`).
10513/// Protocols such as EWMH also use properties - for example EWMH defines the
10514/// window title, encoded as UTF-8 string, in the `_NET_WM_NAME` property.
10515///
10516/// TODO: talk about `type`
10517///
10518/// TODO: talk about `delete`
10519///
10520/// TODO: talk about the offset/length thing. what's a valid use case?
10521///
10522/// # Fields
10523///
10524/// * `window` - The window whose property you want to get.
10525/// * `delete` - Whether the property should actually be deleted. For deleting a property, the
10526/// specified `type` has to match the actual property type.
10527/// * `property` - The property you want to get (an atom).
10528/// * `type` - The type of the property you want to get (an atom).
10529/// * `long_offset` - Specifies the offset (in 32-bit multiples) in the specified property where the
10530/// data is to be retrieved.
10531/// * `long_length` - Specifies how many 32-bit multiples of data should be retrieved (e.g. if you
10532/// set `long_length` to 4, you will receive 16 bytes of data).
10533///
10534/// # Errors
10535///
10536/// * `Window` - The specified `window` does not exist.
10537/// * `Atom` - `property` or `type` do not refer to a valid atom.
10538/// * `Value` - The specified `long_offset` is beyond the actual property length (e.g. the
10539/// property has a length of 3 bytes and you are setting `long_offset` to 1,
10540/// resulting in a byte offset of 4).
10541///
10542/// # See
10543///
10544/// * `InternAtom`: request
10545/// * `xprop`: program
10546///
10547/// # Example
10548///
10549/// ```text
10550/// /*
10551///  * Prints the WM_NAME property of the window.
10552///  *
10553///  */
10554/// void my_example(xcb_connection_t *c, xcb_window_t window) {
10555///     xcb_get_property_cookie_t cookie;
10556///     xcb_get_property_reply_t *reply;
10557///
10558///     /* These atoms are predefined in the X11 protocol. */
10559///     xcb_atom_t property = XCB_ATOM_WM_NAME;
10560///     xcb_atom_t type = XCB_ATOM_STRING;
10561///
10562///     // TODO: a reasonable long_length for WM_NAME?
10563///     cookie = xcb_get_property(c, 0, window, property, type, 0, 0);
10564///     if ((reply = xcb_get_property_reply(c, cookie, NULL))) {
10565///         int len = xcb_get_property_value_length(reply);
10566///         if (len == 0) {
10567///             printf("TODO\\n");
10568///             free(reply);
10569///             return;
10570///         }
10571///         printf("WM_NAME is %.*s\\n", len,
10572///                (char*)xcb_get_property_value(reply));
10573///     }
10574///     free(reply);
10575/// }
10576/// ```
10577#[derive(Clone, Copy, Default)]
10578#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10579#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10580pub struct GetPropertyRequest {
10581    pub delete: bool,
10582    pub window: Window,
10583    pub property: Atom,
10584    pub type_: Atom,
10585    pub long_offset: u32,
10586    pub long_length: u32,
10587}
10588impl_debug_if_no_extra_traits!(GetPropertyRequest, "GetPropertyRequest");
10589impl GetPropertyRequest {
10590    /// Serialize this request into bytes for the provided connection
10591    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
10592        let length_so_far = 0;
10593        let delete_bytes = self.delete.serialize();
10594        let window_bytes = self.window.serialize();
10595        let property_bytes = self.property.serialize();
10596        let type_bytes = self.type_.serialize();
10597        let long_offset_bytes = self.long_offset.serialize();
10598        let long_length_bytes = self.long_length.serialize();
10599        let mut request0 = vec![
10600            GET_PROPERTY_REQUEST,
10601            delete_bytes[0],
10602            0,
10603            0,
10604            window_bytes[0],
10605            window_bytes[1],
10606            window_bytes[2],
10607            window_bytes[3],
10608            property_bytes[0],
10609            property_bytes[1],
10610            property_bytes[2],
10611            property_bytes[3],
10612            type_bytes[0],
10613            type_bytes[1],
10614            type_bytes[2],
10615            type_bytes[3],
10616            long_offset_bytes[0],
10617            long_offset_bytes[1],
10618            long_offset_bytes[2],
10619            long_offset_bytes[3],
10620            long_length_bytes[0],
10621            long_length_bytes[1],
10622            long_length_bytes[2],
10623            long_length_bytes[3],
10624        ];
10625        let length_so_far = length_so_far + request0.len();
10626        assert_eq!(length_so_far % 4, 0);
10627        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
10628        request0[2..4].copy_from_slice(&length.to_ne_bytes());
10629        ([request0.into()], vec![])
10630    }
10631    /// Parse this request given its header, its body, and any fds that go along with it
10632    #[cfg(feature = "request-parsing")]
10633    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
10634        if header.major_opcode != GET_PROPERTY_REQUEST {
10635            return Err(ParseError::InvalidValue);
10636        }
10637        let remaining = &[header.minor_opcode];
10638        let (delete, remaining) = bool::try_parse(remaining)?;
10639        let _ = remaining;
10640        let (window, remaining) = Window::try_parse(value)?;
10641        let (property, remaining) = Atom::try_parse(remaining)?;
10642        let (type_, remaining) = Atom::try_parse(remaining)?;
10643        let (long_offset, remaining) = u32::try_parse(remaining)?;
10644        let (long_length, remaining) = u32::try_parse(remaining)?;
10645        let _ = remaining;
10646        Ok(GetPropertyRequest {
10647            delete,
10648            window,
10649            property,
10650            type_,
10651            long_offset,
10652            long_length,
10653        })
10654    }
10655}
10656impl Request for GetPropertyRequest {
10657    const EXTENSION_NAME: Option<&'static str> = None;
10658
10659    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
10660        let (bufs, fds) = self.serialize();
10661        // Flatten the buffers into a single vector
10662        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
10663        (buf, fds)
10664    }
10665}
10666impl crate::x11_utils::ReplyRequest for GetPropertyRequest {
10667    type Reply = GetPropertyReply;
10668}
10669impl GetPropertyReply {
10670    /// Iterate over the contained value if its format is 8.
10671    ///
10672    /// This function checks if the `format` member of the reply
10673    /// is 8. If it it is not, `None` is returned. Otherwise
10674    /// and iterator is returned that interprets the value in
10675    /// this reply as type `u8`.
10676    ///
10677    /// # Examples
10678    ///
10679    /// Successfully iterate over the value:
10680    /// ```
10681    /// // First, we have to 'invent' a GetPropertyReply.
10682    /// let reply = x11rb_protocol::protocol::xproto::GetPropertyReply {
10683    ///     format: 8,
10684    ///     sequence: 0,
10685    ///     length: 0, // This value is incorrect
10686    ///     type_: 0, // This value is incorrect
10687    ///     bytes_after: 0,
10688    ///     value_len: 4,
10689    ///     value: vec![1, 2, 3, 4],
10690    /// };
10691    ///
10692    /// // This is the actual example: Iterate over the value.
10693    /// let mut iter = reply.value8().unwrap();
10694    /// assert_eq!(iter.next(), Some(1));
10695    /// assert_eq!(iter.next(), Some(2));
10696    /// assert_eq!(iter.next(), Some(3));
10697    /// assert_eq!(iter.next(), Some(4));
10698    /// assert_eq!(iter.next(), None);
10699    /// ```
10700    ///
10701    /// An iterator is only returned when the `format` is correct.
10702    /// The following example shows this.
10703    /// ```
10704    /// // First, we have to 'invent' a GetPropertyReply.
10705    /// let reply = x11rb_protocol::protocol::xproto::GetPropertyReply {
10706    ///     format: 42, // Not allowed in X11, but used for the example
10707    ///     sequence: 0,
10708    ///     length: 0, // This value is incorrect
10709    ///     type_: 0, // This value is incorrect
10710    ///     bytes_after: 0,
10711    ///     value_len: 4,
10712    ///     value: vec![1, 2, 3, 4],
10713    /// };
10714    /// assert!(reply.value8().is_none());
10715    /// ```
10716    pub fn value8(&self) -> Option<impl Iterator<Item=u8> + '_> {
10717        if self.format == 8 {
10718            Some(crate::wrapper::PropertyIterator::new(&self.value))
10719        } else {
10720            None
10721        }
10722    }
10723    /// Iterate over the contained value if its format is 16.
10724    ///
10725    /// This function checks if the `format` member of the reply
10726    /// is 16. If it it is not, `None` is returned. Otherwise
10727    /// and iterator is returned that interprets the value in
10728    /// this reply as type `u16`.
10729    ///
10730    /// # Examples
10731    ///
10732    /// Successfully iterate over the value:
10733    /// ```
10734    /// // First, we have to 'invent' a GetPropertyReply.
10735    /// let reply = x11rb_protocol::protocol::xproto::GetPropertyReply {
10736    ///     format: 16,
10737    ///     sequence: 0,
10738    ///     length: 0, // This value is incorrect
10739    ///     type_: 0, // This value is incorrect
10740    ///     bytes_after: 0,
10741    ///     value_len: 4,
10742    ///     value: vec![1, 1, 2, 2],
10743    /// };
10744    ///
10745    /// // This is the actual example: Iterate over the value.
10746    /// let mut iter = reply.value16().unwrap();
10747    /// assert_eq!(iter.next(), Some(257));
10748    /// assert_eq!(iter.next(), Some(514));
10749    /// assert_eq!(iter.next(), None);
10750    /// ```
10751    ///
10752    /// An iterator is only returned when the `format` is correct.
10753    /// The following example shows this.
10754    /// ```
10755    /// // First, we have to 'invent' a GetPropertyReply.
10756    /// let reply = x11rb_protocol::protocol::xproto::GetPropertyReply {
10757    ///     format: 42, // Not allowed in X11, but used for the example
10758    ///     sequence: 0,
10759    ///     length: 0, // This value is incorrect
10760    ///     type_: 0, // This value is incorrect
10761    ///     bytes_after: 0,
10762    ///     value_len: 4,
10763    ///     value: vec![1, 2, 3, 4],
10764    /// };
10765    /// assert!(reply.value16().is_none());
10766    /// ```
10767    pub fn value16(&self) -> Option<impl Iterator<Item=u16> + '_> {
10768        if self.format == 16 {
10769            Some(crate::wrapper::PropertyIterator::new(&self.value))
10770        } else {
10771            None
10772        }
10773    }
10774    /// Iterate over the contained value if its format is 32.
10775    ///
10776    /// This function checks if the `format` member of the reply
10777    /// is 32. If it it is not, `None` is returned. Otherwise
10778    /// and iterator is returned that interprets the value in
10779    /// this reply as type `u32`.
10780    ///
10781    /// # Examples
10782    ///
10783    /// Successfully iterate over the value:
10784    /// ```
10785    /// // First, we have to 'invent' a GetPropertyReply.
10786    /// let reply = x11rb_protocol::protocol::xproto::GetPropertyReply {
10787    ///     format: 32,
10788    ///     sequence: 0,
10789    ///     length: 0, // This value is incorrect
10790    ///     type_: 0, // This value is incorrect
10791    ///     bytes_after: 0,
10792    ///     value_len: 4,
10793    ///     value: vec![1, 2, 2, 1],
10794    /// };
10795    ///
10796    /// // This is the actual example: Iterate over the value.
10797    /// let mut iter = reply.value32().unwrap();
10798    /// assert_eq!(iter.next(), Some(16908801));
10799    /// assert_eq!(iter.next(), None);
10800    /// ```
10801    ///
10802    /// An iterator is only returned when the `format` is correct.
10803    /// The following example shows this.
10804    /// ```
10805    /// // First, we have to 'invent' a GetPropertyReply.
10806    /// let reply = x11rb_protocol::protocol::xproto::GetPropertyReply {
10807    ///     format: 42, // Not allowed in X11, but used for the example
10808    ///     sequence: 0,
10809    ///     length: 0, // This value is incorrect
10810    ///     type_: 0, // This value is incorrect
10811    ///     bytes_after: 0,
10812    ///     value_len: 4,
10813    ///     value: vec![1, 2, 3, 4],
10814    /// };
10815    /// assert!(reply.value32().is_none());
10816    /// ```
10817    pub fn value32(&self) -> Option<impl Iterator<Item=u32> + '_> {
10818        if self.format == 32 {
10819            Some(crate::wrapper::PropertyIterator::new(&self.value))
10820        } else {
10821            None
10822        }
10823    }
10824}
10825
10826
10827/// # Fields
10828///
10829/// * `format` - Specifies whether the data should be viewed as a list of 8-bit, 16-bit, or
10830/// 32-bit quantities. Possible values are 8, 16, and 32. This information allows
10831/// the X server to correctly perform byte-swap operations as necessary.
10832/// * `type` - The actual type of the property (an atom).
10833/// * `bytes_after` - The number of bytes remaining to be read in the property if a partial read was
10834/// performed.
10835/// * `value_len` - The length of value. You should use the corresponding accessor instead of this
10836/// field.
10837#[derive(Clone, Default)]
10838#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10839#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10840pub struct GetPropertyReply {
10841    pub format: u8,
10842    pub sequence: u16,
10843    pub length: u32,
10844    pub type_: Atom,
10845    pub bytes_after: u32,
10846    pub value_len: u32,
10847    pub value: Vec<u8>,
10848}
10849impl_debug_if_no_extra_traits!(GetPropertyReply, "GetPropertyReply");
10850impl TryParse for GetPropertyReply {
10851    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
10852        let remaining = initial_value;
10853        let (response_type, remaining) = u8::try_parse(remaining)?;
10854        let (format, remaining) = u8::try_parse(remaining)?;
10855        let (sequence, remaining) = u16::try_parse(remaining)?;
10856        let (length, remaining) = u32::try_parse(remaining)?;
10857        let (type_, remaining) = Atom::try_parse(remaining)?;
10858        let (bytes_after, remaining) = u32::try_parse(remaining)?;
10859        let (value_len, remaining) = u32::try_parse(remaining)?;
10860        let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
10861        let (value, remaining) = crate::x11_utils::parse_u8_list(remaining, u32::from(value_len).checked_mul(u32::from(format).checked_div(8u32).ok_or(ParseError::InvalidExpression)?).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
10862        let value = value.to_vec();
10863        if response_type != 1 {
10864            return Err(ParseError::InvalidValue);
10865        }
10866        let result = GetPropertyReply { format, sequence, length, type_, bytes_after, value_len, value };
10867        let _ = remaining;
10868        let remaining = initial_value.get(32 + length as usize * 4..)
10869            .ok_or(ParseError::InsufficientData)?;
10870        Ok((result, remaining))
10871    }
10872}
10873impl Serialize for GetPropertyReply {
10874    type Bytes = Vec<u8>;
10875    fn serialize(&self) -> Vec<u8> {
10876        let mut result = Vec::new();
10877        self.serialize_into(&mut result);
10878        result
10879    }
10880    fn serialize_into(&self, bytes: &mut Vec<u8>) {
10881        bytes.reserve(32);
10882        let response_type_bytes = &[1];
10883        bytes.push(response_type_bytes[0]);
10884        self.format.serialize_into(bytes);
10885        self.sequence.serialize_into(bytes);
10886        self.length.serialize_into(bytes);
10887        self.type_.serialize_into(bytes);
10888        self.bytes_after.serialize_into(bytes);
10889        self.value_len.serialize_into(bytes);
10890        bytes.extend_from_slice(&[0; 12]);
10891        assert_eq!(self.value.len(), usize::try_from(u32::from(self.value_len).checked_mul(u32::from(self.format).checked_div(8u32).unwrap()).unwrap()).unwrap(), "`value` has an incorrect length");
10892        bytes.extend_from_slice(&self.value);
10893    }
10894}
10895
10896/// Opcode for the ListProperties request
10897pub const LIST_PROPERTIES_REQUEST: u8 = 21;
10898#[derive(Clone, Copy, Default)]
10899#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10900#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10901pub struct ListPropertiesRequest {
10902    pub window: Window,
10903}
10904impl_debug_if_no_extra_traits!(ListPropertiesRequest, "ListPropertiesRequest");
10905impl ListPropertiesRequest {
10906    /// Serialize this request into bytes for the provided connection
10907    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
10908        let length_so_far = 0;
10909        let window_bytes = self.window.serialize();
10910        let mut request0 = vec![
10911            LIST_PROPERTIES_REQUEST,
10912            0,
10913            0,
10914            0,
10915            window_bytes[0],
10916            window_bytes[1],
10917            window_bytes[2],
10918            window_bytes[3],
10919        ];
10920        let length_so_far = length_so_far + request0.len();
10921        assert_eq!(length_so_far % 4, 0);
10922        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
10923        request0[2..4].copy_from_slice(&length.to_ne_bytes());
10924        ([request0.into()], vec![])
10925    }
10926    /// Parse this request given its header, its body, and any fds that go along with it
10927    #[cfg(feature = "request-parsing")]
10928    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
10929        if header.major_opcode != LIST_PROPERTIES_REQUEST {
10930            return Err(ParseError::InvalidValue);
10931        }
10932        let remaining = &[header.minor_opcode];
10933        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
10934        let _ = remaining;
10935        let (window, remaining) = Window::try_parse(value)?;
10936        let _ = remaining;
10937        Ok(ListPropertiesRequest {
10938            window,
10939        })
10940    }
10941}
10942impl Request for ListPropertiesRequest {
10943    const EXTENSION_NAME: Option<&'static str> = None;
10944
10945    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
10946        let (bufs, fds) = self.serialize();
10947        // Flatten the buffers into a single vector
10948        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
10949        (buf, fds)
10950    }
10951}
10952impl crate::x11_utils::ReplyRequest for ListPropertiesRequest {
10953    type Reply = ListPropertiesReply;
10954}
10955
10956#[derive(Clone, Default)]
10957#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10958#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10959pub struct ListPropertiesReply {
10960    pub sequence: u16,
10961    pub length: u32,
10962    pub atoms: Vec<Atom>,
10963}
10964impl_debug_if_no_extra_traits!(ListPropertiesReply, "ListPropertiesReply");
10965impl TryParse for ListPropertiesReply {
10966    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
10967        let remaining = initial_value;
10968        let (response_type, remaining) = u8::try_parse(remaining)?;
10969        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
10970        let (sequence, remaining) = u16::try_parse(remaining)?;
10971        let (length, remaining) = u32::try_parse(remaining)?;
10972        let (atoms_len, remaining) = u16::try_parse(remaining)?;
10973        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
10974        let (atoms, remaining) = crate::x11_utils::parse_list::<Atom>(remaining, atoms_len.try_to_usize()?)?;
10975        if response_type != 1 {
10976            return Err(ParseError::InvalidValue);
10977        }
10978        let result = ListPropertiesReply { sequence, length, atoms };
10979        let _ = remaining;
10980        let remaining = initial_value.get(32 + length as usize * 4..)
10981            .ok_or(ParseError::InsufficientData)?;
10982        Ok((result, remaining))
10983    }
10984}
10985impl Serialize for ListPropertiesReply {
10986    type Bytes = Vec<u8>;
10987    fn serialize(&self) -> Vec<u8> {
10988        let mut result = Vec::new();
10989        self.serialize_into(&mut result);
10990        result
10991    }
10992    fn serialize_into(&self, bytes: &mut Vec<u8>) {
10993        bytes.reserve(32);
10994        let response_type_bytes = &[1];
10995        bytes.push(response_type_bytes[0]);
10996        bytes.extend_from_slice(&[0; 1]);
10997        self.sequence.serialize_into(bytes);
10998        self.length.serialize_into(bytes);
10999        let atoms_len = u16::try_from(self.atoms.len()).expect("`atoms` has too many elements");
11000        atoms_len.serialize_into(bytes);
11001        bytes.extend_from_slice(&[0; 22]);
11002        self.atoms.serialize_into(bytes);
11003    }
11004}
11005impl ListPropertiesReply {
11006    /// Get the value of the `atoms_len` field.
11007    ///
11008    /// The `atoms_len` field is used as the length field of the `atoms` field.
11009    /// This function computes the field's value again based on the length of the list.
11010    ///
11011    /// # Panics
11012    ///
11013    /// Panics if the value cannot be represented in the target type. This
11014    /// cannot happen with values of the struct received from the X11 server.
11015    pub fn atoms_len(&self) -> u16 {
11016        self.atoms.len()
11017            .try_into().unwrap()
11018    }
11019}
11020
11021/// Opcode for the SetSelectionOwner request
11022pub const SET_SELECTION_OWNER_REQUEST: u8 = 22;
11023/// Sets the owner of a selection.
11024///
11025/// Makes `window` the owner of the selection `selection` and updates the
11026/// last-change time of the specified selection.
11027///
11028/// TODO: briefly explain what a selection is.
11029///
11030/// # Fields
11031///
11032/// * `selection` - The selection.
11033/// * `owner` - The new owner of the selection.
11034///
11035/// The special value `XCB_NONE` means that the selection will have no owner.
11036/// * `time` - Timestamp to avoid race conditions when running X over the network.
11037///
11038/// The selection will not be changed if `time` is earlier than the current
11039/// last-change time of the `selection` or is later than the current X server time.
11040/// Otherwise, the last-change time is set to the specified time.
11041///
11042/// The special value `XCB_CURRENT_TIME` will be replaced with the current server
11043/// time.
11044///
11045/// # Errors
11046///
11047/// * `Atom` - `selection` does not refer to a valid atom.
11048///
11049/// # See
11050///
11051/// * `SetSelectionOwner`: request
11052#[derive(Clone, Copy, Default)]
11053#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11054#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11055pub struct SetSelectionOwnerRequest {
11056    pub owner: Window,
11057    pub selection: Atom,
11058    pub time: Timestamp,
11059}
11060impl_debug_if_no_extra_traits!(SetSelectionOwnerRequest, "SetSelectionOwnerRequest");
11061impl SetSelectionOwnerRequest {
11062    /// Serialize this request into bytes for the provided connection
11063    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
11064        let length_so_far = 0;
11065        let owner_bytes = self.owner.serialize();
11066        let selection_bytes = self.selection.serialize();
11067        let time_bytes = self.time.serialize();
11068        let mut request0 = vec![
11069            SET_SELECTION_OWNER_REQUEST,
11070            0,
11071            0,
11072            0,
11073            owner_bytes[0],
11074            owner_bytes[1],
11075            owner_bytes[2],
11076            owner_bytes[3],
11077            selection_bytes[0],
11078            selection_bytes[1],
11079            selection_bytes[2],
11080            selection_bytes[3],
11081            time_bytes[0],
11082            time_bytes[1],
11083            time_bytes[2],
11084            time_bytes[3],
11085        ];
11086        let length_so_far = length_so_far + request0.len();
11087        assert_eq!(length_so_far % 4, 0);
11088        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
11089        request0[2..4].copy_from_slice(&length.to_ne_bytes());
11090        ([request0.into()], vec![])
11091    }
11092    /// Parse this request given its header, its body, and any fds that go along with it
11093    #[cfg(feature = "request-parsing")]
11094    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
11095        if header.major_opcode != SET_SELECTION_OWNER_REQUEST {
11096            return Err(ParseError::InvalidValue);
11097        }
11098        let remaining = &[header.minor_opcode];
11099        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
11100        let _ = remaining;
11101        let (owner, remaining) = Window::try_parse(value)?;
11102        let (selection, remaining) = Atom::try_parse(remaining)?;
11103        let (time, remaining) = Timestamp::try_parse(remaining)?;
11104        let _ = remaining;
11105        Ok(SetSelectionOwnerRequest {
11106            owner,
11107            selection,
11108            time,
11109        })
11110    }
11111}
11112impl Request for SetSelectionOwnerRequest {
11113    const EXTENSION_NAME: Option<&'static str> = None;
11114
11115    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
11116        let (bufs, fds) = self.serialize();
11117        // Flatten the buffers into a single vector
11118        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
11119        (buf, fds)
11120    }
11121}
11122impl crate::x11_utils::VoidRequest for SetSelectionOwnerRequest {
11123}
11124
11125/// Opcode for the GetSelectionOwner request
11126pub const GET_SELECTION_OWNER_REQUEST: u8 = 23;
11127/// Gets the owner of a selection.
11128///
11129/// Gets the owner of the specified selection.
11130///
11131/// TODO: briefly explain what a selection is.
11132///
11133/// # Fields
11134///
11135/// * `selection` - The selection.
11136///
11137/// # Errors
11138///
11139/// * `Atom` - `selection` does not refer to a valid atom.
11140///
11141/// # See
11142///
11143/// * `SetSelectionOwner`: request
11144#[derive(Clone, Copy, Default)]
11145#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11146#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11147pub struct GetSelectionOwnerRequest {
11148    pub selection: Atom,
11149}
11150impl_debug_if_no_extra_traits!(GetSelectionOwnerRequest, "GetSelectionOwnerRequest");
11151impl GetSelectionOwnerRequest {
11152    /// Serialize this request into bytes for the provided connection
11153    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
11154        let length_so_far = 0;
11155        let selection_bytes = self.selection.serialize();
11156        let mut request0 = vec![
11157            GET_SELECTION_OWNER_REQUEST,
11158            0,
11159            0,
11160            0,
11161            selection_bytes[0],
11162            selection_bytes[1],
11163            selection_bytes[2],
11164            selection_bytes[3],
11165        ];
11166        let length_so_far = length_so_far + request0.len();
11167        assert_eq!(length_so_far % 4, 0);
11168        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
11169        request0[2..4].copy_from_slice(&length.to_ne_bytes());
11170        ([request0.into()], vec![])
11171    }
11172    /// Parse this request given its header, its body, and any fds that go along with it
11173    #[cfg(feature = "request-parsing")]
11174    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
11175        if header.major_opcode != GET_SELECTION_OWNER_REQUEST {
11176            return Err(ParseError::InvalidValue);
11177        }
11178        let remaining = &[header.minor_opcode];
11179        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
11180        let _ = remaining;
11181        let (selection, remaining) = Atom::try_parse(value)?;
11182        let _ = remaining;
11183        Ok(GetSelectionOwnerRequest {
11184            selection,
11185        })
11186    }
11187}
11188impl Request for GetSelectionOwnerRequest {
11189    const EXTENSION_NAME: Option<&'static str> = None;
11190
11191    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
11192        let (bufs, fds) = self.serialize();
11193        // Flatten the buffers into a single vector
11194        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
11195        (buf, fds)
11196    }
11197}
11198impl crate::x11_utils::ReplyRequest for GetSelectionOwnerRequest {
11199    type Reply = GetSelectionOwnerReply;
11200}
11201
11202/// # Fields
11203///
11204/// * `owner` - The current selection owner window.
11205#[derive(Clone, Copy, Default)]
11206#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11207#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11208pub struct GetSelectionOwnerReply {
11209    pub sequence: u16,
11210    pub length: u32,
11211    pub owner: Window,
11212}
11213impl_debug_if_no_extra_traits!(GetSelectionOwnerReply, "GetSelectionOwnerReply");
11214impl TryParse for GetSelectionOwnerReply {
11215    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
11216        let remaining = initial_value;
11217        let (response_type, remaining) = u8::try_parse(remaining)?;
11218        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
11219        let (sequence, remaining) = u16::try_parse(remaining)?;
11220        let (length, remaining) = u32::try_parse(remaining)?;
11221        let (owner, remaining) = Window::try_parse(remaining)?;
11222        if response_type != 1 {
11223            return Err(ParseError::InvalidValue);
11224        }
11225        let result = GetSelectionOwnerReply { sequence, length, owner };
11226        let _ = remaining;
11227        let remaining = initial_value.get(32 + length as usize * 4..)
11228            .ok_or(ParseError::InsufficientData)?;
11229        Ok((result, remaining))
11230    }
11231}
11232impl Serialize for GetSelectionOwnerReply {
11233    type Bytes = [u8; 12];
11234    fn serialize(&self) -> [u8; 12] {
11235        let response_type_bytes = &[1];
11236        let sequence_bytes = self.sequence.serialize();
11237        let length_bytes = self.length.serialize();
11238        let owner_bytes = self.owner.serialize();
11239        [
11240            response_type_bytes[0],
11241            0,
11242            sequence_bytes[0],
11243            sequence_bytes[1],
11244            length_bytes[0],
11245            length_bytes[1],
11246            length_bytes[2],
11247            length_bytes[3],
11248            owner_bytes[0],
11249            owner_bytes[1],
11250            owner_bytes[2],
11251            owner_bytes[3],
11252        ]
11253    }
11254    fn serialize_into(&self, bytes: &mut Vec<u8>) {
11255        bytes.reserve(12);
11256        let response_type_bytes = &[1];
11257        bytes.push(response_type_bytes[0]);
11258        bytes.extend_from_slice(&[0; 1]);
11259        self.sequence.serialize_into(bytes);
11260        self.length.serialize_into(bytes);
11261        self.owner.serialize_into(bytes);
11262    }
11263}
11264
11265/// Opcode for the ConvertSelection request
11266pub const CONVERT_SELECTION_REQUEST: u8 = 24;
11267#[derive(Clone, Copy, Default)]
11268#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11269#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11270pub struct ConvertSelectionRequest {
11271    pub requestor: Window,
11272    pub selection: Atom,
11273    pub target: Atom,
11274    pub property: Atom,
11275    pub time: Timestamp,
11276}
11277impl_debug_if_no_extra_traits!(ConvertSelectionRequest, "ConvertSelectionRequest");
11278impl ConvertSelectionRequest {
11279    /// Serialize this request into bytes for the provided connection
11280    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
11281        let length_so_far = 0;
11282        let requestor_bytes = self.requestor.serialize();
11283        let selection_bytes = self.selection.serialize();
11284        let target_bytes = self.target.serialize();
11285        let property_bytes = self.property.serialize();
11286        let time_bytes = self.time.serialize();
11287        let mut request0 = vec![
11288            CONVERT_SELECTION_REQUEST,
11289            0,
11290            0,
11291            0,
11292            requestor_bytes[0],
11293            requestor_bytes[1],
11294            requestor_bytes[2],
11295            requestor_bytes[3],
11296            selection_bytes[0],
11297            selection_bytes[1],
11298            selection_bytes[2],
11299            selection_bytes[3],
11300            target_bytes[0],
11301            target_bytes[1],
11302            target_bytes[2],
11303            target_bytes[3],
11304            property_bytes[0],
11305            property_bytes[1],
11306            property_bytes[2],
11307            property_bytes[3],
11308            time_bytes[0],
11309            time_bytes[1],
11310            time_bytes[2],
11311            time_bytes[3],
11312        ];
11313        let length_so_far = length_so_far + request0.len();
11314        assert_eq!(length_so_far % 4, 0);
11315        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
11316        request0[2..4].copy_from_slice(&length.to_ne_bytes());
11317        ([request0.into()], vec![])
11318    }
11319    /// Parse this request given its header, its body, and any fds that go along with it
11320    #[cfg(feature = "request-parsing")]
11321    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
11322        if header.major_opcode != CONVERT_SELECTION_REQUEST {
11323            return Err(ParseError::InvalidValue);
11324        }
11325        let remaining = &[header.minor_opcode];
11326        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
11327        let _ = remaining;
11328        let (requestor, remaining) = Window::try_parse(value)?;
11329        let (selection, remaining) = Atom::try_parse(remaining)?;
11330        let (target, remaining) = Atom::try_parse(remaining)?;
11331        let (property, remaining) = Atom::try_parse(remaining)?;
11332        let (time, remaining) = Timestamp::try_parse(remaining)?;
11333        let _ = remaining;
11334        Ok(ConvertSelectionRequest {
11335            requestor,
11336            selection,
11337            target,
11338            property,
11339            time,
11340        })
11341    }
11342}
11343impl Request for ConvertSelectionRequest {
11344    const EXTENSION_NAME: Option<&'static str> = None;
11345
11346    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
11347        let (bufs, fds) = self.serialize();
11348        // Flatten the buffers into a single vector
11349        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
11350        (buf, fds)
11351    }
11352}
11353impl crate::x11_utils::VoidRequest for ConvertSelectionRequest {
11354}
11355
11356#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
11357#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11358pub struct SendEventDest(bool);
11359impl SendEventDest {
11360    pub const POINTER_WINDOW: Self = Self(false);
11361    pub const ITEM_FOCUS: Self = Self(true);
11362}
11363impl From<SendEventDest> for bool {
11364    #[inline]
11365    fn from(input: SendEventDest) -> Self {
11366        input.0
11367    }
11368}
11369impl From<SendEventDest> for Option<bool> {
11370    #[inline]
11371    fn from(input: SendEventDest) -> Self {
11372        Some(input.0)
11373    }
11374}
11375impl From<SendEventDest> for u8 {
11376    #[inline]
11377    fn from(input: SendEventDest) -> Self {
11378        u8::from(input.0)
11379    }
11380}
11381impl From<SendEventDest> for Option<u8> {
11382    #[inline]
11383    fn from(input: SendEventDest) -> Self {
11384        Some(u8::from(input.0))
11385    }
11386}
11387impl From<SendEventDest> for u16 {
11388    #[inline]
11389    fn from(input: SendEventDest) -> Self {
11390        u16::from(input.0)
11391    }
11392}
11393impl From<SendEventDest> for Option<u16> {
11394    #[inline]
11395    fn from(input: SendEventDest) -> Self {
11396        Some(u16::from(input.0))
11397    }
11398}
11399impl From<SendEventDest> for u32 {
11400    #[inline]
11401    fn from(input: SendEventDest) -> Self {
11402        u32::from(input.0)
11403    }
11404}
11405impl From<SendEventDest> for Option<u32> {
11406    #[inline]
11407    fn from(input: SendEventDest) -> Self {
11408        Some(u32::from(input.0))
11409    }
11410}
11411impl From<bool> for SendEventDest {
11412    #[inline]
11413    fn from(value: bool) -> Self {
11414        Self(value)
11415    }
11416}
11417impl core::fmt::Debug for SendEventDest  {
11418    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
11419        let variants = [
11420            (Self::POINTER_WINDOW.0.into(), "POINTER_WINDOW", "PointerWindow"),
11421            (Self::ITEM_FOCUS.0.into(), "ITEM_FOCUS", "ItemFocus"),
11422        ];
11423        pretty_print_enum(fmt, self.0.into(), &variants)
11424    }
11425}
11426
11427/// Opcode for the SendEvent request
11428pub const SEND_EVENT_REQUEST: u8 = 25;
11429/// send an event.
11430///
11431/// Identifies the `destination` window, determines which clients should receive
11432/// the specified event and ignores any active grabs.
11433///
11434/// The `event` must be one of the core events or an event defined by an extension,
11435/// so that the X server can correctly byte-swap the contents as necessary. The
11436/// contents of `event` are otherwise unaltered and unchecked except for the
11437/// `send_event` field which is forced to 'true'.
11438///
11439/// # Fields
11440///
11441/// * `destination` - The window to send this event to. Every client which selects any event within
11442/// `event_mask` on `destination` will get the event.
11443///
11444/// The special value `XCB_SEND_EVENT_DEST_POINTER_WINDOW` refers to the window
11445/// that contains the mouse pointer.
11446///
11447/// The special value `XCB_SEND_EVENT_DEST_ITEM_FOCUS` refers to the window which
11448/// has the keyboard focus.
11449/// * `event_mask` - Event_mask for determining which clients should receive the specified event.
11450/// See `destination` and `propagate`.
11451/// * `propagate` - If `propagate` is true and no clients have selected any event on `destination`,
11452/// the destination is replaced with the closest ancestor of `destination` for
11453/// which some client has selected a type in `event_mask` and for which no
11454/// intervening window has that type in its do-not-propagate-mask. If no such
11455/// window exists or if the window is an ancestor of the focus window and
11456/// `InputFocus` was originally specified as the destination, the event is not sent
11457/// to any clients. Otherwise, the event is reported to every client selecting on
11458/// the final destination any of the types specified in `event_mask`.
11459/// * `event` - The event to send to the specified `destination`.
11460///
11461/// # Errors
11462///
11463/// * `Window` - The specified `destination` window does not exist.
11464/// * `Value` - The given `event` is neither a core event nor an event defined by an extension.
11465///
11466/// # See
11467///
11468/// * `ConfigureNotify`: event
11469///
11470/// # Example
11471///
11472/// ```text
11473/// /*
11474///  * Tell the given window that it was configured to a size of 800x600 pixels.
11475///  *
11476///  */
11477/// void my_example(xcb_connection_t *conn, xcb_window_t window) {
11478///     /* Every X11 event is 32 bytes long. Therefore, XCB will copy 32 bytes.
11479///      * In order to properly initialize these bytes, we allocate 32 bytes even
11480///      * though we only need less for an xcb_configure_notify_event_t */
11481///     xcb_configure_notify_event_t *event = calloc(32, 1);
11482///
11483///     event->event = window;
11484///     event->window = window;
11485///     event->response_type = XCB_CONFIGURE_NOTIFY;
11486///
11487///     event->x = 0;
11488///     event->y = 0;
11489///     event->width = 800;
11490///     event->height = 600;
11491///
11492///     event->border_width = 0;
11493///     event->above_sibling = XCB_NONE;
11494///     event->override_redirect = false;
11495///
11496///     xcb_send_event(conn, false, window, XCB_EVENT_MASK_STRUCTURE_NOTIFY,
11497///                    (char*)event);
11498///     xcb_flush(conn);
11499///     free(event);
11500/// }
11501/// ```
11502#[derive(Clone, Default)]
11503#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11504#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11505pub struct SendEventRequest<'input> {
11506    pub propagate: bool,
11507    pub destination: Window,
11508    pub event_mask: EventMask,
11509    pub event: Cow<'input, [u8; 32]>,
11510}
11511impl_debug_if_no_extra_traits!(SendEventRequest<'_>, "SendEventRequest");
11512impl<'input> SendEventRequest<'input> {
11513    /// Serialize this request into bytes for the provided connection
11514    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 2]> {
11515        let length_so_far = 0;
11516        let propagate_bytes = self.propagate.serialize();
11517        let destination_bytes = self.destination.serialize();
11518        let event_mask_bytes = u32::from(self.event_mask).serialize();
11519        let mut request0 = vec![
11520            SEND_EVENT_REQUEST,
11521            propagate_bytes[0],
11522            0,
11523            0,
11524            destination_bytes[0],
11525            destination_bytes[1],
11526            destination_bytes[2],
11527            destination_bytes[3],
11528            event_mask_bytes[0],
11529            event_mask_bytes[1],
11530            event_mask_bytes[2],
11531            event_mask_bytes[3],
11532        ];
11533        let length_so_far = length_so_far + request0.len();
11534        let length_so_far = length_so_far + self.event.len();
11535        assert_eq!(length_so_far % 4, 0);
11536        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
11537        request0[2..4].copy_from_slice(&length.to_ne_bytes());
11538        ([request0.into(), Cow::Owned(self.event.to_vec())], vec![])
11539    }
11540    /// Parse this request given its header, its body, and any fds that go along with it
11541    #[cfg(feature = "request-parsing")]
11542    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
11543        if header.major_opcode != SEND_EVENT_REQUEST {
11544            return Err(ParseError::InvalidValue);
11545        }
11546        let remaining = &[header.minor_opcode];
11547        let (propagate, remaining) = bool::try_parse(remaining)?;
11548        let _ = remaining;
11549        let (destination, remaining) = Window::try_parse(value)?;
11550        let (event_mask, remaining) = u32::try_parse(remaining)?;
11551        let event_mask = event_mask.into();
11552        let (event, remaining) = crate::x11_utils::parse_u8_array_ref::<32>(remaining)?;
11553        let _ = remaining;
11554        Ok(SendEventRequest {
11555            propagate,
11556            destination,
11557            event_mask,
11558            event: Cow::Borrowed(event),
11559        })
11560    }
11561    /// Clone all borrowed data in this SendEventRequest.
11562    pub fn into_owned(self) -> SendEventRequest<'static> {
11563        SendEventRequest {
11564            propagate: self.propagate,
11565            destination: self.destination,
11566            event_mask: self.event_mask,
11567            event: Cow::Owned(self.event.into_owned()),
11568        }
11569    }
11570}
11571impl<'input> Request for SendEventRequest<'input> {
11572    const EXTENSION_NAME: Option<&'static str> = None;
11573
11574    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
11575        let (bufs, fds) = self.serialize();
11576        // Flatten the buffers into a single vector
11577        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
11578        (buf, fds)
11579    }
11580}
11581impl<'input> crate::x11_utils::VoidRequest for SendEventRequest<'input> {
11582}
11583
11584/// # Fields
11585///
11586/// * `Sync` - The state of the keyboard appears to freeze: No further keyboard events are
11587/// generated by the server until the grabbing client issues a releasing
11588/// `AllowEvents` request or until the keyboard grab is released.
11589/// * `Async` - Keyboard event processing continues normally.
11590#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
11591#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11592pub struct GrabMode(u8);
11593impl GrabMode {
11594    pub const SYNC: Self = Self(0);
11595    pub const ASYNC: Self = Self(1);
11596}
11597impl From<GrabMode> for u8 {
11598    #[inline]
11599    fn from(input: GrabMode) -> Self {
11600        input.0
11601    }
11602}
11603impl From<GrabMode> for Option<u8> {
11604    #[inline]
11605    fn from(input: GrabMode) -> Self {
11606        Some(input.0)
11607    }
11608}
11609impl From<GrabMode> for u16 {
11610    #[inline]
11611    fn from(input: GrabMode) -> Self {
11612        u16::from(input.0)
11613    }
11614}
11615impl From<GrabMode> for Option<u16> {
11616    #[inline]
11617    fn from(input: GrabMode) -> Self {
11618        Some(u16::from(input.0))
11619    }
11620}
11621impl From<GrabMode> for u32 {
11622    #[inline]
11623    fn from(input: GrabMode) -> Self {
11624        u32::from(input.0)
11625    }
11626}
11627impl From<GrabMode> for Option<u32> {
11628    #[inline]
11629    fn from(input: GrabMode) -> Self {
11630        Some(u32::from(input.0))
11631    }
11632}
11633impl From<u8> for GrabMode {
11634    #[inline]
11635    fn from(value: u8) -> Self {
11636        Self(value)
11637    }
11638}
11639impl core::fmt::Debug for GrabMode  {
11640    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
11641        let variants = [
11642            (Self::SYNC.0.into(), "SYNC", "Sync"),
11643            (Self::ASYNC.0.into(), "ASYNC", "Async"),
11644        ];
11645        pretty_print_enum(fmt, self.0.into(), &variants)
11646    }
11647}
11648
11649#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
11650#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11651pub struct GrabStatus(u8);
11652impl GrabStatus {
11653    pub const SUCCESS: Self = Self(0);
11654    pub const ALREADY_GRABBED: Self = Self(1);
11655    pub const INVALID_TIME: Self = Self(2);
11656    pub const NOT_VIEWABLE: Self = Self(3);
11657    pub const FROZEN: Self = Self(4);
11658}
11659impl From<GrabStatus> for u8 {
11660    #[inline]
11661    fn from(input: GrabStatus) -> Self {
11662        input.0
11663    }
11664}
11665impl From<GrabStatus> for Option<u8> {
11666    #[inline]
11667    fn from(input: GrabStatus) -> Self {
11668        Some(input.0)
11669    }
11670}
11671impl From<GrabStatus> for u16 {
11672    #[inline]
11673    fn from(input: GrabStatus) -> Self {
11674        u16::from(input.0)
11675    }
11676}
11677impl From<GrabStatus> for Option<u16> {
11678    #[inline]
11679    fn from(input: GrabStatus) -> Self {
11680        Some(u16::from(input.0))
11681    }
11682}
11683impl From<GrabStatus> for u32 {
11684    #[inline]
11685    fn from(input: GrabStatus) -> Self {
11686        u32::from(input.0)
11687    }
11688}
11689impl From<GrabStatus> for Option<u32> {
11690    #[inline]
11691    fn from(input: GrabStatus) -> Self {
11692        Some(u32::from(input.0))
11693    }
11694}
11695impl From<u8> for GrabStatus {
11696    #[inline]
11697    fn from(value: u8) -> Self {
11698        Self(value)
11699    }
11700}
11701impl core::fmt::Debug for GrabStatus  {
11702    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
11703        let variants = [
11704            (Self::SUCCESS.0.into(), "SUCCESS", "Success"),
11705            (Self::ALREADY_GRABBED.0.into(), "ALREADY_GRABBED", "AlreadyGrabbed"),
11706            (Self::INVALID_TIME.0.into(), "INVALID_TIME", "InvalidTime"),
11707            (Self::NOT_VIEWABLE.0.into(), "NOT_VIEWABLE", "NotViewable"),
11708            (Self::FROZEN.0.into(), "FROZEN", "Frozen"),
11709        ];
11710        pretty_print_enum(fmt, self.0.into(), &variants)
11711    }
11712}
11713
11714#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
11715#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11716pub struct CursorEnum(u8);
11717impl CursorEnum {
11718    pub const NONE: Self = Self(0);
11719}
11720impl From<CursorEnum> for u8 {
11721    #[inline]
11722    fn from(input: CursorEnum) -> Self {
11723        input.0
11724    }
11725}
11726impl From<CursorEnum> for Option<u8> {
11727    #[inline]
11728    fn from(input: CursorEnum) -> Self {
11729        Some(input.0)
11730    }
11731}
11732impl From<CursorEnum> for u16 {
11733    #[inline]
11734    fn from(input: CursorEnum) -> Self {
11735        u16::from(input.0)
11736    }
11737}
11738impl From<CursorEnum> for Option<u16> {
11739    #[inline]
11740    fn from(input: CursorEnum) -> Self {
11741        Some(u16::from(input.0))
11742    }
11743}
11744impl From<CursorEnum> for u32 {
11745    #[inline]
11746    fn from(input: CursorEnum) -> Self {
11747        u32::from(input.0)
11748    }
11749}
11750impl From<CursorEnum> for Option<u32> {
11751    #[inline]
11752    fn from(input: CursorEnum) -> Self {
11753        Some(u32::from(input.0))
11754    }
11755}
11756impl From<u8> for CursorEnum {
11757    #[inline]
11758    fn from(value: u8) -> Self {
11759        Self(value)
11760    }
11761}
11762impl core::fmt::Debug for CursorEnum  {
11763    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
11764        let variants = [
11765            (Self::NONE.0.into(), "NONE", "None"),
11766        ];
11767        pretty_print_enum(fmt, self.0.into(), &variants)
11768    }
11769}
11770
11771/// Opcode for the GrabPointer request
11772pub const GRAB_POINTER_REQUEST: u8 = 26;
11773/// Grab the pointer.
11774///
11775/// Actively grabs control of the pointer. Further pointer events are reported only to the grabbing client. Overrides any active pointer grab by this client.
11776///
11777/// # Fields
11778///
11779/// * `event_mask` - Specifies which pointer events are reported to the client.
11780///
11781/// TODO: which values?
11782/// * `confine_to` - Specifies the window to confine the pointer in (the user will not be able to
11783/// move the pointer out of that window).
11784///
11785/// The special value `XCB_NONE` means don't confine the pointer.
11786/// * `cursor` - Specifies the cursor that should be displayed or `XCB_NONE` to not change the
11787/// cursor.
11788/// * `owner_events` - If 1, the `grab_window` will still get the pointer events. If 0, events are not
11789/// reported to the `grab_window`.
11790/// * `grab_window` - Specifies the window on which the pointer should be grabbed.
11791/// * `time` - The time argument allows you to avoid certain circumstances that come up if
11792/// applications take a long time to respond or if there are long network delays.
11793/// Consider a situation where you have two applications, both of which normally
11794/// grab the pointer when clicked on. If both applications specify the timestamp
11795/// from the event, the second application may wake up faster and successfully grab
11796/// the pointer before the first application. The first application then will get
11797/// an indication that the other application grabbed the pointer before its request
11798/// was processed.
11799///
11800/// The special value `XCB_CURRENT_TIME` will be replaced with the current server
11801/// time.
11802/// * `pointer_mode` -
11803/// * `keyboard_mode` -
11804///
11805/// # Errors
11806///
11807/// * `Value` - TODO: reasons?
11808/// * `Window` - The specified `window` does not exist.
11809///
11810/// # See
11811///
11812/// * `GrabKeyboard`: request
11813///
11814/// # Example
11815///
11816/// ```text
11817/// /*
11818///  * Grabs the pointer actively
11819///  *
11820///  */
11821/// void my_example(xcb_connection_t *conn, xcb_screen_t *screen, xcb_cursor_t cursor) {
11822///     xcb_grab_pointer_cookie_t cookie;
11823///     xcb_grab_pointer_reply_t *reply;
11824///
11825///     cookie = xcb_grab_pointer(
11826///         conn,
11827///         false,               /* get all pointer events specified by the following mask */
11828///         screen->root,        /* grab the root window */
11829///         XCB_NONE,            /* which events to let through */
11830///         XCB_GRAB_MODE_ASYNC, /* pointer events should continue as normal */
11831///         XCB_GRAB_MODE_ASYNC, /* keyboard mode */
11832///         XCB_NONE,            /* confine_to = in which window should the cursor stay */
11833///         cursor,              /* we change the cursor to whatever the user wanted */
11834///         XCB_CURRENT_TIME
11835///     );
11836///
11837///     if ((reply = xcb_grab_pointer_reply(conn, cookie, NULL))) {
11838///         if (reply->status == XCB_GRAB_STATUS_SUCCESS)
11839///             printf("successfully grabbed the pointer\\n");
11840///         free(reply);
11841///     }
11842/// }
11843/// ```
11844#[derive(Clone, Copy, Default)]
11845#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11846#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11847pub struct GrabPointerRequest {
11848    pub owner_events: bool,
11849    pub grab_window: Window,
11850    pub event_mask: EventMask,
11851    pub pointer_mode: GrabMode,
11852    pub keyboard_mode: GrabMode,
11853    pub confine_to: Window,
11854    pub cursor: Cursor,
11855    pub time: Timestamp,
11856}
11857impl_debug_if_no_extra_traits!(GrabPointerRequest, "GrabPointerRequest");
11858impl GrabPointerRequest {
11859    /// Serialize this request into bytes for the provided connection
11860    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
11861        let length_so_far = 0;
11862        let owner_events_bytes = self.owner_events.serialize();
11863        let grab_window_bytes = self.grab_window.serialize();
11864        let event_mask_bytes = (u32::from(self.event_mask) as u16).serialize();
11865        let pointer_mode_bytes = u8::from(self.pointer_mode).serialize();
11866        let keyboard_mode_bytes = u8::from(self.keyboard_mode).serialize();
11867        let confine_to_bytes = self.confine_to.serialize();
11868        let cursor_bytes = self.cursor.serialize();
11869        let time_bytes = self.time.serialize();
11870        let mut request0 = vec![
11871            GRAB_POINTER_REQUEST,
11872            owner_events_bytes[0],
11873            0,
11874            0,
11875            grab_window_bytes[0],
11876            grab_window_bytes[1],
11877            grab_window_bytes[2],
11878            grab_window_bytes[3],
11879            event_mask_bytes[0],
11880            event_mask_bytes[1],
11881            pointer_mode_bytes[0],
11882            keyboard_mode_bytes[0],
11883            confine_to_bytes[0],
11884            confine_to_bytes[1],
11885            confine_to_bytes[2],
11886            confine_to_bytes[3],
11887            cursor_bytes[0],
11888            cursor_bytes[1],
11889            cursor_bytes[2],
11890            cursor_bytes[3],
11891            time_bytes[0],
11892            time_bytes[1],
11893            time_bytes[2],
11894            time_bytes[3],
11895        ];
11896        let length_so_far = length_so_far + request0.len();
11897        assert_eq!(length_so_far % 4, 0);
11898        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
11899        request0[2..4].copy_from_slice(&length.to_ne_bytes());
11900        ([request0.into()], vec![])
11901    }
11902    /// Parse this request given its header, its body, and any fds that go along with it
11903    #[cfg(feature = "request-parsing")]
11904    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
11905        if header.major_opcode != GRAB_POINTER_REQUEST {
11906            return Err(ParseError::InvalidValue);
11907        }
11908        let remaining = &[header.minor_opcode];
11909        let (owner_events, remaining) = bool::try_parse(remaining)?;
11910        let _ = remaining;
11911        let (grab_window, remaining) = Window::try_parse(value)?;
11912        let (event_mask, remaining) = u16::try_parse(remaining)?;
11913        let event_mask = event_mask.into();
11914        let (pointer_mode, remaining) = u8::try_parse(remaining)?;
11915        let pointer_mode = pointer_mode.into();
11916        let (keyboard_mode, remaining) = u8::try_parse(remaining)?;
11917        let keyboard_mode = keyboard_mode.into();
11918        let (confine_to, remaining) = Window::try_parse(remaining)?;
11919        let (cursor, remaining) = Cursor::try_parse(remaining)?;
11920        let (time, remaining) = Timestamp::try_parse(remaining)?;
11921        let _ = remaining;
11922        Ok(GrabPointerRequest {
11923            owner_events,
11924            grab_window,
11925            event_mask,
11926            pointer_mode,
11927            keyboard_mode,
11928            confine_to,
11929            cursor,
11930            time,
11931        })
11932    }
11933}
11934impl Request for GrabPointerRequest {
11935    const EXTENSION_NAME: Option<&'static str> = None;
11936
11937    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
11938        let (bufs, fds) = self.serialize();
11939        // Flatten the buffers into a single vector
11940        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
11941        (buf, fds)
11942    }
11943}
11944impl crate::x11_utils::ReplyRequest for GrabPointerRequest {
11945    type Reply = GrabPointerReply;
11946}
11947
11948#[derive(Clone, Copy, Default)]
11949#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11950#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11951pub struct GrabPointerReply {
11952    pub status: GrabStatus,
11953    pub sequence: u16,
11954    pub length: u32,
11955}
11956impl_debug_if_no_extra_traits!(GrabPointerReply, "GrabPointerReply");
11957impl TryParse for GrabPointerReply {
11958    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
11959        let remaining = initial_value;
11960        let (response_type, remaining) = u8::try_parse(remaining)?;
11961        let (status, remaining) = u8::try_parse(remaining)?;
11962        let (sequence, remaining) = u16::try_parse(remaining)?;
11963        let (length, remaining) = u32::try_parse(remaining)?;
11964        if response_type != 1 {
11965            return Err(ParseError::InvalidValue);
11966        }
11967        let status = status.into();
11968        let result = GrabPointerReply { status, sequence, length };
11969        let _ = remaining;
11970        let remaining = initial_value.get(32 + length as usize * 4..)
11971            .ok_or(ParseError::InsufficientData)?;
11972        Ok((result, remaining))
11973    }
11974}
11975impl Serialize for GrabPointerReply {
11976    type Bytes = [u8; 8];
11977    fn serialize(&self) -> [u8; 8] {
11978        let response_type_bytes = &[1];
11979        let status_bytes = u8::from(self.status).serialize();
11980        let sequence_bytes = self.sequence.serialize();
11981        let length_bytes = self.length.serialize();
11982        [
11983            response_type_bytes[0],
11984            status_bytes[0],
11985            sequence_bytes[0],
11986            sequence_bytes[1],
11987            length_bytes[0],
11988            length_bytes[1],
11989            length_bytes[2],
11990            length_bytes[3],
11991        ]
11992    }
11993    fn serialize_into(&self, bytes: &mut Vec<u8>) {
11994        bytes.reserve(8);
11995        let response_type_bytes = &[1];
11996        bytes.push(response_type_bytes[0]);
11997        u8::from(self.status).serialize_into(bytes);
11998        self.sequence.serialize_into(bytes);
11999        self.length.serialize_into(bytes);
12000    }
12001}
12002
12003/// Opcode for the UngrabPointer request
12004pub const UNGRAB_POINTER_REQUEST: u8 = 27;
12005/// release the pointer.
12006///
12007/// Releases the pointer and any queued events if you actively grabbed the pointer
12008/// before using `xcb_grab_pointer`, `xcb_grab_button` or within a normal button
12009/// press.
12010///
12011/// EnterNotify and LeaveNotify events are generated.
12012///
12013/// # Fields
12014///
12015/// * `time` - Timestamp to avoid race conditions when running X over the network.
12016///
12017/// The pointer will not be released if `time` is earlier than the
12018/// last-pointer-grab time or later than the current X server time.
12019/// * `name_len` - Length (in bytes) of `name`.
12020/// * `name` - A pattern describing an X core font.
12021///
12022/// # See
12023///
12024/// * `GrabPointer`: request
12025/// * `GrabButton`: request
12026/// * `EnterNotify`: event
12027/// * `LeaveNotify`: event
12028#[derive(Clone, Copy, Default)]
12029#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12030#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12031pub struct UngrabPointerRequest {
12032    pub time: Timestamp,
12033}
12034impl_debug_if_no_extra_traits!(UngrabPointerRequest, "UngrabPointerRequest");
12035impl UngrabPointerRequest {
12036    /// Serialize this request into bytes for the provided connection
12037    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
12038        let length_so_far = 0;
12039        let time_bytes = self.time.serialize();
12040        let mut request0 = vec![
12041            UNGRAB_POINTER_REQUEST,
12042            0,
12043            0,
12044            0,
12045            time_bytes[0],
12046            time_bytes[1],
12047            time_bytes[2],
12048            time_bytes[3],
12049        ];
12050        let length_so_far = length_so_far + request0.len();
12051        assert_eq!(length_so_far % 4, 0);
12052        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
12053        request0[2..4].copy_from_slice(&length.to_ne_bytes());
12054        ([request0.into()], vec![])
12055    }
12056    /// Parse this request given its header, its body, and any fds that go along with it
12057    #[cfg(feature = "request-parsing")]
12058    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
12059        if header.major_opcode != UNGRAB_POINTER_REQUEST {
12060            return Err(ParseError::InvalidValue);
12061        }
12062        let remaining = &[header.minor_opcode];
12063        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
12064        let _ = remaining;
12065        let (time, remaining) = Timestamp::try_parse(value)?;
12066        let _ = remaining;
12067        Ok(UngrabPointerRequest {
12068            time,
12069        })
12070    }
12071}
12072impl Request for UngrabPointerRequest {
12073    const EXTENSION_NAME: Option<&'static str> = None;
12074
12075    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
12076        let (bufs, fds) = self.serialize();
12077        // Flatten the buffers into a single vector
12078        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
12079        (buf, fds)
12080    }
12081}
12082impl crate::x11_utils::VoidRequest for UngrabPointerRequest {
12083}
12084
12085/// # Fields
12086///
12087/// * `Any` - Any of the following (or none):
12088/// * `1` - The left mouse button.
12089/// * `2` - The right mouse button.
12090/// * `3` - The middle mouse button.
12091/// * `4` - Scroll wheel. TODO: direction?
12092/// * `5` - Scroll wheel. TODO: direction?
12093#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
12094#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12095pub struct ButtonIndex(u8);
12096impl ButtonIndex {
12097    pub const ANY: Self = Self(0);
12098    pub const M1: Self = Self(1);
12099    pub const M2: Self = Self(2);
12100    pub const M3: Self = Self(3);
12101    pub const M4: Self = Self(4);
12102    pub const M5: Self = Self(5);
12103}
12104impl From<ButtonIndex> for u8 {
12105    #[inline]
12106    fn from(input: ButtonIndex) -> Self {
12107        input.0
12108    }
12109}
12110impl From<ButtonIndex> for Option<u8> {
12111    #[inline]
12112    fn from(input: ButtonIndex) -> Self {
12113        Some(input.0)
12114    }
12115}
12116impl From<ButtonIndex> for u16 {
12117    #[inline]
12118    fn from(input: ButtonIndex) -> Self {
12119        u16::from(input.0)
12120    }
12121}
12122impl From<ButtonIndex> for Option<u16> {
12123    #[inline]
12124    fn from(input: ButtonIndex) -> Self {
12125        Some(u16::from(input.0))
12126    }
12127}
12128impl From<ButtonIndex> for u32 {
12129    #[inline]
12130    fn from(input: ButtonIndex) -> Self {
12131        u32::from(input.0)
12132    }
12133}
12134impl From<ButtonIndex> for Option<u32> {
12135    #[inline]
12136    fn from(input: ButtonIndex) -> Self {
12137        Some(u32::from(input.0))
12138    }
12139}
12140impl From<u8> for ButtonIndex {
12141    #[inline]
12142    fn from(value: u8) -> Self {
12143        Self(value)
12144    }
12145}
12146impl core::fmt::Debug for ButtonIndex  {
12147    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
12148        let variants = [
12149            (Self::ANY.0.into(), "ANY", "Any"),
12150            (Self::M1.0.into(), "M1", "M1"),
12151            (Self::M2.0.into(), "M2", "M2"),
12152            (Self::M3.0.into(), "M3", "M3"),
12153            (Self::M4.0.into(), "M4", "M4"),
12154            (Self::M5.0.into(), "M5", "M5"),
12155        ];
12156        pretty_print_enum(fmt, self.0.into(), &variants)
12157    }
12158}
12159
12160/// Opcode for the GrabButton request
12161pub const GRAB_BUTTON_REQUEST: u8 = 28;
12162/// Grab pointer button(s).
12163///
12164/// This request establishes a passive grab. The pointer is actively grabbed as
12165/// described in GrabPointer, the last-pointer-grab time is set to the time at
12166/// which the button was pressed (as transmitted in the ButtonPress event), and the
12167/// ButtonPress event is reported if all of the following conditions are true:
12168///
12169/// The pointer is not grabbed and the specified button is logically pressed when
12170/// the specified modifier keys are logically down, and no other buttons or
12171/// modifier keys are logically down.
12172///
12173/// The grab-window contains the pointer.
12174///
12175/// The confine-to window (if any) is viewable.
12176///
12177/// A passive grab on the same button/key combination does not exist on any
12178/// ancestor of grab-window.
12179///
12180/// The interpretation of the remaining arguments is the same as for GrabPointer.
12181/// The active grab is terminated automatically when the logical state of the
12182/// pointer has all buttons released, independent of the logical state of modifier
12183/// keys. Note that the logical state of a device (as seen by means of the
12184/// protocol) may lag the physical state if device event processing is frozen. This
12185/// request overrides all previous passive grabs by the same client on the same
12186/// button/key combinations on the same window. A modifier of AnyModifier is
12187/// equivalent to issuing the request for all possible modifier combinations
12188/// (including the combination of no modifiers). It is not required that all
12189/// specified modifiers have currently assigned keycodes. A button of AnyButton is
12190/// equivalent to issuing the request for all possible buttons. Otherwise, it is
12191/// not required that the button specified currently be assigned to a physical
12192/// button.
12193///
12194/// An Access error is generated if some other client has already issued a
12195/// GrabButton request with the same button/key combination on the same window.
12196/// When using AnyModifier or AnyButton, the request fails completely (no grabs are
12197/// established), and an Access error is generated if there is a conflicting grab
12198/// for any combination. The request has no effect on an active grab.
12199///
12200/// # Fields
12201///
12202/// * `owner_events` - If 1, the `grab_window` will still get the pointer events. If 0, events are not
12203/// reported to the `grab_window`.
12204/// * `grab_window` - Specifies the window on which the pointer should be grabbed.
12205/// * `event_mask` - Specifies which pointer events are reported to the client.
12206///
12207/// TODO: which values?
12208/// * `confine_to` - Specifies the window to confine the pointer in (the user will not be able to
12209/// move the pointer out of that window).
12210///
12211/// The special value `XCB_NONE` means don't confine the pointer.
12212/// * `cursor` - Specifies the cursor that should be displayed or `XCB_NONE` to not change the
12213/// cursor.
12214/// * `modifiers` - The modifiers to grab.
12215///
12216/// Using the special value `XCB_MOD_MASK_ANY` means grab the pointer with all
12217/// possible modifier combinations.
12218/// * `pointer_mode` -
12219/// * `keyboard_mode` -
12220/// * `button` -
12221///
12222/// # Errors
12223///
12224/// * `Access` - Another client has already issued a GrabButton with the same button/key
12225/// combination on the same window.
12226/// * `Value` - TODO: reasons?
12227/// * `Cursor` - The specified `cursor` does not exist.
12228/// * `Window` - The specified `window` does not exist.
12229#[derive(Clone, Copy, Default)]
12230#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12231#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12232pub struct GrabButtonRequest {
12233    pub owner_events: bool,
12234    pub grab_window: Window,
12235    pub event_mask: EventMask,
12236    pub pointer_mode: GrabMode,
12237    pub keyboard_mode: GrabMode,
12238    pub confine_to: Window,
12239    pub cursor: Cursor,
12240    pub button: ButtonIndex,
12241    pub modifiers: ModMask,
12242}
12243impl_debug_if_no_extra_traits!(GrabButtonRequest, "GrabButtonRequest");
12244impl GrabButtonRequest {
12245    /// Serialize this request into bytes for the provided connection
12246    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
12247        let length_so_far = 0;
12248        let owner_events_bytes = self.owner_events.serialize();
12249        let grab_window_bytes = self.grab_window.serialize();
12250        let event_mask_bytes = (u32::from(self.event_mask) as u16).serialize();
12251        let pointer_mode_bytes = u8::from(self.pointer_mode).serialize();
12252        let keyboard_mode_bytes = u8::from(self.keyboard_mode).serialize();
12253        let confine_to_bytes = self.confine_to.serialize();
12254        let cursor_bytes = self.cursor.serialize();
12255        let button_bytes = u8::from(self.button).serialize();
12256        let modifiers_bytes = u16::from(self.modifiers).serialize();
12257        let mut request0 = vec![
12258            GRAB_BUTTON_REQUEST,
12259            owner_events_bytes[0],
12260            0,
12261            0,
12262            grab_window_bytes[0],
12263            grab_window_bytes[1],
12264            grab_window_bytes[2],
12265            grab_window_bytes[3],
12266            event_mask_bytes[0],
12267            event_mask_bytes[1],
12268            pointer_mode_bytes[0],
12269            keyboard_mode_bytes[0],
12270            confine_to_bytes[0],
12271            confine_to_bytes[1],
12272            confine_to_bytes[2],
12273            confine_to_bytes[3],
12274            cursor_bytes[0],
12275            cursor_bytes[1],
12276            cursor_bytes[2],
12277            cursor_bytes[3],
12278            button_bytes[0],
12279            0,
12280            modifiers_bytes[0],
12281            modifiers_bytes[1],
12282        ];
12283        let length_so_far = length_so_far + request0.len();
12284        assert_eq!(length_so_far % 4, 0);
12285        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
12286        request0[2..4].copy_from_slice(&length.to_ne_bytes());
12287        ([request0.into()], vec![])
12288    }
12289    /// Parse this request given its header, its body, and any fds that go along with it
12290    #[cfg(feature = "request-parsing")]
12291    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
12292        if header.major_opcode != GRAB_BUTTON_REQUEST {
12293            return Err(ParseError::InvalidValue);
12294        }
12295        let remaining = &[header.minor_opcode];
12296        let (owner_events, remaining) = bool::try_parse(remaining)?;
12297        let _ = remaining;
12298        let (grab_window, remaining) = Window::try_parse(value)?;
12299        let (event_mask, remaining) = u16::try_parse(remaining)?;
12300        let event_mask = event_mask.into();
12301        let (pointer_mode, remaining) = u8::try_parse(remaining)?;
12302        let pointer_mode = pointer_mode.into();
12303        let (keyboard_mode, remaining) = u8::try_parse(remaining)?;
12304        let keyboard_mode = keyboard_mode.into();
12305        let (confine_to, remaining) = Window::try_parse(remaining)?;
12306        let (cursor, remaining) = Cursor::try_parse(remaining)?;
12307        let (button, remaining) = u8::try_parse(remaining)?;
12308        let button = button.into();
12309        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
12310        let (modifiers, remaining) = u16::try_parse(remaining)?;
12311        let modifiers = modifiers.into();
12312        let _ = remaining;
12313        Ok(GrabButtonRequest {
12314            owner_events,
12315            grab_window,
12316            event_mask,
12317            pointer_mode,
12318            keyboard_mode,
12319            confine_to,
12320            cursor,
12321            button,
12322            modifiers,
12323        })
12324    }
12325}
12326impl Request for GrabButtonRequest {
12327    const EXTENSION_NAME: Option<&'static str> = None;
12328
12329    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
12330        let (bufs, fds) = self.serialize();
12331        // Flatten the buffers into a single vector
12332        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
12333        (buf, fds)
12334    }
12335}
12336impl crate::x11_utils::VoidRequest for GrabButtonRequest {
12337}
12338
12339/// Opcode for the UngrabButton request
12340pub const UNGRAB_BUTTON_REQUEST: u8 = 29;
12341#[derive(Clone, Copy, Default)]
12342#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12343#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12344pub struct UngrabButtonRequest {
12345    pub button: ButtonIndex,
12346    pub grab_window: Window,
12347    pub modifiers: ModMask,
12348}
12349impl_debug_if_no_extra_traits!(UngrabButtonRequest, "UngrabButtonRequest");
12350impl UngrabButtonRequest {
12351    /// Serialize this request into bytes for the provided connection
12352    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
12353        let length_so_far = 0;
12354        let button_bytes = u8::from(self.button).serialize();
12355        let grab_window_bytes = self.grab_window.serialize();
12356        let modifiers_bytes = u16::from(self.modifiers).serialize();
12357        let mut request0 = vec![
12358            UNGRAB_BUTTON_REQUEST,
12359            button_bytes[0],
12360            0,
12361            0,
12362            grab_window_bytes[0],
12363            grab_window_bytes[1],
12364            grab_window_bytes[2],
12365            grab_window_bytes[3],
12366            modifiers_bytes[0],
12367            modifiers_bytes[1],
12368            0,
12369            0,
12370        ];
12371        let length_so_far = length_so_far + request0.len();
12372        assert_eq!(length_so_far % 4, 0);
12373        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
12374        request0[2..4].copy_from_slice(&length.to_ne_bytes());
12375        ([request0.into()], vec![])
12376    }
12377    /// Parse this request given its header, its body, and any fds that go along with it
12378    #[cfg(feature = "request-parsing")]
12379    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
12380        if header.major_opcode != UNGRAB_BUTTON_REQUEST {
12381            return Err(ParseError::InvalidValue);
12382        }
12383        let remaining = &[header.minor_opcode];
12384        let (button, remaining) = u8::try_parse(remaining)?;
12385        let button = button.into();
12386        let _ = remaining;
12387        let (grab_window, remaining) = Window::try_parse(value)?;
12388        let (modifiers, remaining) = u16::try_parse(remaining)?;
12389        let modifiers = modifiers.into();
12390        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
12391        let _ = remaining;
12392        Ok(UngrabButtonRequest {
12393            button,
12394            grab_window,
12395            modifiers,
12396        })
12397    }
12398}
12399impl Request for UngrabButtonRequest {
12400    const EXTENSION_NAME: Option<&'static str> = None;
12401
12402    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
12403        let (bufs, fds) = self.serialize();
12404        // Flatten the buffers into a single vector
12405        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
12406        (buf, fds)
12407    }
12408}
12409impl crate::x11_utils::VoidRequest for UngrabButtonRequest {
12410}
12411
12412/// Opcode for the ChangeActivePointerGrab request
12413pub const CHANGE_ACTIVE_POINTER_GRAB_REQUEST: u8 = 30;
12414#[derive(Clone, Copy, Default)]
12415#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12416#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12417pub struct ChangeActivePointerGrabRequest {
12418    pub cursor: Cursor,
12419    pub time: Timestamp,
12420    pub event_mask: EventMask,
12421}
12422impl_debug_if_no_extra_traits!(ChangeActivePointerGrabRequest, "ChangeActivePointerGrabRequest");
12423impl ChangeActivePointerGrabRequest {
12424    /// Serialize this request into bytes for the provided connection
12425    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
12426        let length_so_far = 0;
12427        let cursor_bytes = self.cursor.serialize();
12428        let time_bytes = self.time.serialize();
12429        let event_mask_bytes = (u32::from(self.event_mask) as u16).serialize();
12430        let mut request0 = vec![
12431            CHANGE_ACTIVE_POINTER_GRAB_REQUEST,
12432            0,
12433            0,
12434            0,
12435            cursor_bytes[0],
12436            cursor_bytes[1],
12437            cursor_bytes[2],
12438            cursor_bytes[3],
12439            time_bytes[0],
12440            time_bytes[1],
12441            time_bytes[2],
12442            time_bytes[3],
12443            event_mask_bytes[0],
12444            event_mask_bytes[1],
12445            0,
12446            0,
12447        ];
12448        let length_so_far = length_so_far + request0.len();
12449        assert_eq!(length_so_far % 4, 0);
12450        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
12451        request0[2..4].copy_from_slice(&length.to_ne_bytes());
12452        ([request0.into()], vec![])
12453    }
12454    /// Parse this request given its header, its body, and any fds that go along with it
12455    #[cfg(feature = "request-parsing")]
12456    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
12457        if header.major_opcode != CHANGE_ACTIVE_POINTER_GRAB_REQUEST {
12458            return Err(ParseError::InvalidValue);
12459        }
12460        let remaining = &[header.minor_opcode];
12461        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
12462        let _ = remaining;
12463        let (cursor, remaining) = Cursor::try_parse(value)?;
12464        let (time, remaining) = Timestamp::try_parse(remaining)?;
12465        let (event_mask, remaining) = u16::try_parse(remaining)?;
12466        let event_mask = event_mask.into();
12467        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
12468        let _ = remaining;
12469        Ok(ChangeActivePointerGrabRequest {
12470            cursor,
12471            time,
12472            event_mask,
12473        })
12474    }
12475}
12476impl Request for ChangeActivePointerGrabRequest {
12477    const EXTENSION_NAME: Option<&'static str> = None;
12478
12479    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
12480        let (bufs, fds) = self.serialize();
12481        // Flatten the buffers into a single vector
12482        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
12483        (buf, fds)
12484    }
12485}
12486impl crate::x11_utils::VoidRequest for ChangeActivePointerGrabRequest {
12487}
12488
12489/// Opcode for the GrabKeyboard request
12490pub const GRAB_KEYBOARD_REQUEST: u8 = 31;
12491/// Grab the keyboard.
12492///
12493/// Actively grabs control of the keyboard and generates FocusIn and FocusOut
12494/// events. Further key events are reported only to the grabbing client.
12495///
12496/// Any active keyboard grab by this client is overridden. If the keyboard is
12497/// actively grabbed by some other client, `AlreadyGrabbed` is returned. If
12498/// `grab_window` is not viewable, `GrabNotViewable` is returned. If the keyboard
12499/// is frozen by an active grab of another client, `GrabFrozen` is returned. If the
12500/// specified `time` is earlier than the last-keyboard-grab time or later than the
12501/// current X server time, `GrabInvalidTime` is returned. Otherwise, the
12502/// last-keyboard-grab time is set to the specified time.
12503///
12504/// # Fields
12505///
12506/// * `owner_events` - If 1, the `grab_window` will still get the pointer events. If 0, events are not
12507/// reported to the `grab_window`.
12508/// * `grab_window` - Specifies the window on which the pointer should be grabbed.
12509/// * `time` - Timestamp to avoid race conditions when running X over the network.
12510///
12511/// The special value `XCB_CURRENT_TIME` will be replaced with the current server
12512/// time.
12513/// * `pointer_mode` -
12514/// * `keyboard_mode` -
12515///
12516/// # Errors
12517///
12518/// * `Value` - TODO: reasons?
12519/// * `Window` - The specified `window` does not exist.
12520///
12521/// # See
12522///
12523/// * `GrabPointer`: request
12524///
12525/// # Example
12526///
12527/// ```text
12528/// /*
12529///  * Grabs the keyboard actively
12530///  *
12531///  */
12532/// void my_example(xcb_connection_t *conn, xcb_screen_t *screen) {
12533///     xcb_grab_keyboard_cookie_t cookie;
12534///     xcb_grab_keyboard_reply_t *reply;
12535///
12536///     cookie = xcb_grab_keyboard(
12537///         conn,
12538///         true,                /* report events */
12539///         screen->root,        /* grab the root window */
12540///         XCB_CURRENT_TIME,
12541///         XCB_GRAB_MODE_ASYNC, /* process events as normal, do not require sync */
12542///         XCB_GRAB_MODE_ASYNC
12543///     );
12544///
12545///     if ((reply = xcb_grab_keyboard_reply(conn, cookie, NULL))) {
12546///         if (reply->status == XCB_GRAB_STATUS_SUCCESS)
12547///             printf("successfully grabbed the keyboard\\n");
12548///
12549///         free(reply);
12550///     }
12551/// }
12552/// ```
12553#[derive(Clone, Copy, Default)]
12554#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12555#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12556pub struct GrabKeyboardRequest {
12557    pub owner_events: bool,
12558    pub grab_window: Window,
12559    pub time: Timestamp,
12560    pub pointer_mode: GrabMode,
12561    pub keyboard_mode: GrabMode,
12562}
12563impl_debug_if_no_extra_traits!(GrabKeyboardRequest, "GrabKeyboardRequest");
12564impl GrabKeyboardRequest {
12565    /// Serialize this request into bytes for the provided connection
12566    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
12567        let length_so_far = 0;
12568        let owner_events_bytes = self.owner_events.serialize();
12569        let grab_window_bytes = self.grab_window.serialize();
12570        let time_bytes = self.time.serialize();
12571        let pointer_mode_bytes = u8::from(self.pointer_mode).serialize();
12572        let keyboard_mode_bytes = u8::from(self.keyboard_mode).serialize();
12573        let mut request0 = vec![
12574            GRAB_KEYBOARD_REQUEST,
12575            owner_events_bytes[0],
12576            0,
12577            0,
12578            grab_window_bytes[0],
12579            grab_window_bytes[1],
12580            grab_window_bytes[2],
12581            grab_window_bytes[3],
12582            time_bytes[0],
12583            time_bytes[1],
12584            time_bytes[2],
12585            time_bytes[3],
12586            pointer_mode_bytes[0],
12587            keyboard_mode_bytes[0],
12588            0,
12589            0,
12590        ];
12591        let length_so_far = length_so_far + request0.len();
12592        assert_eq!(length_so_far % 4, 0);
12593        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
12594        request0[2..4].copy_from_slice(&length.to_ne_bytes());
12595        ([request0.into()], vec![])
12596    }
12597    /// Parse this request given its header, its body, and any fds that go along with it
12598    #[cfg(feature = "request-parsing")]
12599    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
12600        if header.major_opcode != GRAB_KEYBOARD_REQUEST {
12601            return Err(ParseError::InvalidValue);
12602        }
12603        let remaining = &[header.minor_opcode];
12604        let (owner_events, remaining) = bool::try_parse(remaining)?;
12605        let _ = remaining;
12606        let (grab_window, remaining) = Window::try_parse(value)?;
12607        let (time, remaining) = Timestamp::try_parse(remaining)?;
12608        let (pointer_mode, remaining) = u8::try_parse(remaining)?;
12609        let pointer_mode = pointer_mode.into();
12610        let (keyboard_mode, remaining) = u8::try_parse(remaining)?;
12611        let keyboard_mode = keyboard_mode.into();
12612        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
12613        let _ = remaining;
12614        Ok(GrabKeyboardRequest {
12615            owner_events,
12616            grab_window,
12617            time,
12618            pointer_mode,
12619            keyboard_mode,
12620        })
12621    }
12622}
12623impl Request for GrabKeyboardRequest {
12624    const EXTENSION_NAME: Option<&'static str> = None;
12625
12626    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
12627        let (bufs, fds) = self.serialize();
12628        // Flatten the buffers into a single vector
12629        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
12630        (buf, fds)
12631    }
12632}
12633impl crate::x11_utils::ReplyRequest for GrabKeyboardRequest {
12634    type Reply = GrabKeyboardReply;
12635}
12636
12637#[derive(Clone, Copy, Default)]
12638#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12639#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12640pub struct GrabKeyboardReply {
12641    pub status: GrabStatus,
12642    pub sequence: u16,
12643    pub length: u32,
12644}
12645impl_debug_if_no_extra_traits!(GrabKeyboardReply, "GrabKeyboardReply");
12646impl TryParse for GrabKeyboardReply {
12647    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
12648        let remaining = initial_value;
12649        let (response_type, remaining) = u8::try_parse(remaining)?;
12650        let (status, remaining) = u8::try_parse(remaining)?;
12651        let (sequence, remaining) = u16::try_parse(remaining)?;
12652        let (length, remaining) = u32::try_parse(remaining)?;
12653        if response_type != 1 {
12654            return Err(ParseError::InvalidValue);
12655        }
12656        let status = status.into();
12657        let result = GrabKeyboardReply { status, sequence, length };
12658        let _ = remaining;
12659        let remaining = initial_value.get(32 + length as usize * 4..)
12660            .ok_or(ParseError::InsufficientData)?;
12661        Ok((result, remaining))
12662    }
12663}
12664impl Serialize for GrabKeyboardReply {
12665    type Bytes = [u8; 8];
12666    fn serialize(&self) -> [u8; 8] {
12667        let response_type_bytes = &[1];
12668        let status_bytes = u8::from(self.status).serialize();
12669        let sequence_bytes = self.sequence.serialize();
12670        let length_bytes = self.length.serialize();
12671        [
12672            response_type_bytes[0],
12673            status_bytes[0],
12674            sequence_bytes[0],
12675            sequence_bytes[1],
12676            length_bytes[0],
12677            length_bytes[1],
12678            length_bytes[2],
12679            length_bytes[3],
12680        ]
12681    }
12682    fn serialize_into(&self, bytes: &mut Vec<u8>) {
12683        bytes.reserve(8);
12684        let response_type_bytes = &[1];
12685        bytes.push(response_type_bytes[0]);
12686        u8::from(self.status).serialize_into(bytes);
12687        self.sequence.serialize_into(bytes);
12688        self.length.serialize_into(bytes);
12689    }
12690}
12691
12692/// Opcode for the UngrabKeyboard request
12693pub const UNGRAB_KEYBOARD_REQUEST: u8 = 32;
12694#[derive(Clone, Copy, Default)]
12695#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12696#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12697pub struct UngrabKeyboardRequest {
12698    pub time: Timestamp,
12699}
12700impl_debug_if_no_extra_traits!(UngrabKeyboardRequest, "UngrabKeyboardRequest");
12701impl UngrabKeyboardRequest {
12702    /// Serialize this request into bytes for the provided connection
12703    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
12704        let length_so_far = 0;
12705        let time_bytes = self.time.serialize();
12706        let mut request0 = vec![
12707            UNGRAB_KEYBOARD_REQUEST,
12708            0,
12709            0,
12710            0,
12711            time_bytes[0],
12712            time_bytes[1],
12713            time_bytes[2],
12714            time_bytes[3],
12715        ];
12716        let length_so_far = length_so_far + request0.len();
12717        assert_eq!(length_so_far % 4, 0);
12718        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
12719        request0[2..4].copy_from_slice(&length.to_ne_bytes());
12720        ([request0.into()], vec![])
12721    }
12722    /// Parse this request given its header, its body, and any fds that go along with it
12723    #[cfg(feature = "request-parsing")]
12724    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
12725        if header.major_opcode != UNGRAB_KEYBOARD_REQUEST {
12726            return Err(ParseError::InvalidValue);
12727        }
12728        let remaining = &[header.minor_opcode];
12729        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
12730        let _ = remaining;
12731        let (time, remaining) = Timestamp::try_parse(value)?;
12732        let _ = remaining;
12733        Ok(UngrabKeyboardRequest {
12734            time,
12735        })
12736    }
12737}
12738impl Request for UngrabKeyboardRequest {
12739    const EXTENSION_NAME: Option<&'static str> = None;
12740
12741    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
12742        let (bufs, fds) = self.serialize();
12743        // Flatten the buffers into a single vector
12744        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
12745        (buf, fds)
12746    }
12747}
12748impl crate::x11_utils::VoidRequest for UngrabKeyboardRequest {
12749}
12750
12751#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
12752#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12753pub struct Grab(u8);
12754impl Grab {
12755    pub const ANY: Self = Self(0);
12756}
12757impl From<Grab> for u8 {
12758    #[inline]
12759    fn from(input: Grab) -> Self {
12760        input.0
12761    }
12762}
12763impl From<Grab> for Option<u8> {
12764    #[inline]
12765    fn from(input: Grab) -> Self {
12766        Some(input.0)
12767    }
12768}
12769impl From<Grab> for u16 {
12770    #[inline]
12771    fn from(input: Grab) -> Self {
12772        u16::from(input.0)
12773    }
12774}
12775impl From<Grab> for Option<u16> {
12776    #[inline]
12777    fn from(input: Grab) -> Self {
12778        Some(u16::from(input.0))
12779    }
12780}
12781impl From<Grab> for u32 {
12782    #[inline]
12783    fn from(input: Grab) -> Self {
12784        u32::from(input.0)
12785    }
12786}
12787impl From<Grab> for Option<u32> {
12788    #[inline]
12789    fn from(input: Grab) -> Self {
12790        Some(u32::from(input.0))
12791    }
12792}
12793impl From<u8> for Grab {
12794    #[inline]
12795    fn from(value: u8) -> Self {
12796        Self(value)
12797    }
12798}
12799impl core::fmt::Debug for Grab  {
12800    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
12801        let variants = [
12802            (Self::ANY.0.into(), "ANY", "Any"),
12803        ];
12804        pretty_print_enum(fmt, self.0.into(), &variants)
12805    }
12806}
12807
12808/// Opcode for the GrabKey request
12809pub const GRAB_KEY_REQUEST: u8 = 33;
12810/// Grab keyboard key(s).
12811///
12812/// Establishes a passive grab on the keyboard. In the future, the keyboard is
12813/// actively grabbed (as for `GrabKeyboard`), the last-keyboard-grab time is set to
12814/// the time at which the key was pressed (as transmitted in the KeyPress event),
12815/// and the KeyPress event is reported if all of the following conditions are true:
12816///
12817/// The keyboard is not grabbed and the specified key (which can itself be a
12818/// modifier key) is logically pressed when the specified modifier keys are
12819/// logically down, and no other modifier keys are logically down.
12820///
12821/// Either the grab_window is an ancestor of (or is) the focus window, or the
12822/// grab_window is a descendant of the focus window and contains the pointer.
12823///
12824/// A passive grab on the same key combination does not exist on any ancestor of
12825/// grab_window.
12826///
12827/// The interpretation of the remaining arguments is as for XGrabKeyboard.  The active grab is terminated
12828/// automatically when the logical state of the keyboard has the specified key released (independent of the
12829/// logical state of the modifier keys), at which point a KeyRelease event is reported to the grabbing window.
12830///
12831/// Note that the logical state of a device (as seen by client applications) may lag the physical state if
12832/// device event processing is frozen.
12833///
12834/// A modifiers argument of AnyModifier is equivalent to issuing the request for all possible modifier combinations (including the combination of no modifiers).  It is not required that all modifiers specified
12835/// have currently assigned KeyCodes.  A keycode argument of AnyKey is equivalent to issuing the request for
12836/// all possible KeyCodes.  Otherwise, the specified keycode must be in the range specified by min_keycode
12837/// and max_keycode in the connection setup, or a BadValue error results.
12838///
12839/// If some other client has issued a XGrabKey with the same key combination on the same window, a BadAccess
12840/// error results.  When using AnyModifier or AnyKey, the request fails completely, and a BadAccess error
12841/// results (no grabs are established) if there is a conflicting grab for any combination.
12842///
12843/// # Fields
12844///
12845/// * `owner_events` - If 1, the `grab_window` will still get the key events. If 0, events are not
12846/// reported to the `grab_window`.
12847/// * `grab_window` - Specifies the window on which the key should be grabbed.
12848/// * `key` - The keycode of the key to grab.
12849///
12850/// The special value `XCB_GRAB_ANY` means grab any key.
12851/// * `modifiers` - The modifiers to grab.
12852///
12853/// Using the special value `XCB_MOD_MASK_ANY` means grab the key with all
12854/// possible modifier combinations.
12855/// * `pointer_mode` -
12856/// * `keyboard_mode` -
12857///
12858/// # Errors
12859///
12860/// * `Access` - Another client has already issued a GrabKey with the same button/key
12861/// combination on the same window.
12862/// * `Value` - The key is not `XCB_GRAB_ANY` and not in the range specified by `min_keycode`
12863/// and `max_keycode` in the connection setup.
12864/// * `Window` - The specified `window` does not exist.
12865///
12866/// # See
12867///
12868/// * `GrabKeyboard`: request
12869#[derive(Clone, Copy, Default)]
12870#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12871#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12872pub struct GrabKeyRequest {
12873    pub owner_events: bool,
12874    pub grab_window: Window,
12875    pub modifiers: ModMask,
12876    pub key: Keycode,
12877    pub pointer_mode: GrabMode,
12878    pub keyboard_mode: GrabMode,
12879}
12880impl_debug_if_no_extra_traits!(GrabKeyRequest, "GrabKeyRequest");
12881impl GrabKeyRequest {
12882    /// Serialize this request into bytes for the provided connection
12883    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
12884        let length_so_far = 0;
12885        let owner_events_bytes = self.owner_events.serialize();
12886        let grab_window_bytes = self.grab_window.serialize();
12887        let modifiers_bytes = u16::from(self.modifiers).serialize();
12888        let key_bytes = self.key.serialize();
12889        let pointer_mode_bytes = u8::from(self.pointer_mode).serialize();
12890        let keyboard_mode_bytes = u8::from(self.keyboard_mode).serialize();
12891        let mut request0 = vec![
12892            GRAB_KEY_REQUEST,
12893            owner_events_bytes[0],
12894            0,
12895            0,
12896            grab_window_bytes[0],
12897            grab_window_bytes[1],
12898            grab_window_bytes[2],
12899            grab_window_bytes[3],
12900            modifiers_bytes[0],
12901            modifiers_bytes[1],
12902            key_bytes[0],
12903            pointer_mode_bytes[0],
12904            keyboard_mode_bytes[0],
12905            0,
12906            0,
12907            0,
12908        ];
12909        let length_so_far = length_so_far + request0.len();
12910        assert_eq!(length_so_far % 4, 0);
12911        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
12912        request0[2..4].copy_from_slice(&length.to_ne_bytes());
12913        ([request0.into()], vec![])
12914    }
12915    /// Parse this request given its header, its body, and any fds that go along with it
12916    #[cfg(feature = "request-parsing")]
12917    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
12918        if header.major_opcode != GRAB_KEY_REQUEST {
12919            return Err(ParseError::InvalidValue);
12920        }
12921        let remaining = &[header.minor_opcode];
12922        let (owner_events, remaining) = bool::try_parse(remaining)?;
12923        let _ = remaining;
12924        let (grab_window, remaining) = Window::try_parse(value)?;
12925        let (modifiers, remaining) = u16::try_parse(remaining)?;
12926        let modifiers = modifiers.into();
12927        let (key, remaining) = Keycode::try_parse(remaining)?;
12928        let (pointer_mode, remaining) = u8::try_parse(remaining)?;
12929        let pointer_mode = pointer_mode.into();
12930        let (keyboard_mode, remaining) = u8::try_parse(remaining)?;
12931        let keyboard_mode = keyboard_mode.into();
12932        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
12933        let _ = remaining;
12934        Ok(GrabKeyRequest {
12935            owner_events,
12936            grab_window,
12937            modifiers,
12938            key,
12939            pointer_mode,
12940            keyboard_mode,
12941        })
12942    }
12943}
12944impl Request for GrabKeyRequest {
12945    const EXTENSION_NAME: Option<&'static str> = None;
12946
12947    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
12948        let (bufs, fds) = self.serialize();
12949        // Flatten the buffers into a single vector
12950        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
12951        (buf, fds)
12952    }
12953}
12954impl crate::x11_utils::VoidRequest for GrabKeyRequest {
12955}
12956
12957/// Opcode for the UngrabKey request
12958pub const UNGRAB_KEY_REQUEST: u8 = 34;
12959/// release a key combination.
12960///
12961/// Releases the key combination on `grab_window` if you grabbed it using
12962/// `xcb_grab_key` before.
12963///
12964/// # Fields
12965///
12966/// * `key` - The keycode of the specified key combination.
12967///
12968/// Using the special value `XCB_GRAB_ANY` means releasing all possible key codes.
12969/// * `grab_window` - The window on which the grabbed key combination will be released.
12970/// * `modifiers` - The modifiers of the specified key combination.
12971///
12972/// Using the special value `XCB_MOD_MASK_ANY` means releasing the key combination
12973/// with every possible modifier combination.
12974///
12975/// # Errors
12976///
12977/// * `Window` - The specified `grab_window` does not exist.
12978/// * `Value` - TODO: reasons?
12979///
12980/// # See
12981///
12982/// * `GrabKey`: request
12983/// * `xev`: program
12984#[derive(Clone, Copy, Default)]
12985#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12986#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12987pub struct UngrabKeyRequest {
12988    pub key: Keycode,
12989    pub grab_window: Window,
12990    pub modifiers: ModMask,
12991}
12992impl_debug_if_no_extra_traits!(UngrabKeyRequest, "UngrabKeyRequest");
12993impl UngrabKeyRequest {
12994    /// Serialize this request into bytes for the provided connection
12995    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
12996        let length_so_far = 0;
12997        let key_bytes = self.key.serialize();
12998        let grab_window_bytes = self.grab_window.serialize();
12999        let modifiers_bytes = u16::from(self.modifiers).serialize();
13000        let mut request0 = vec![
13001            UNGRAB_KEY_REQUEST,
13002            key_bytes[0],
13003            0,
13004            0,
13005            grab_window_bytes[0],
13006            grab_window_bytes[1],
13007            grab_window_bytes[2],
13008            grab_window_bytes[3],
13009            modifiers_bytes[0],
13010            modifiers_bytes[1],
13011            0,
13012            0,
13013        ];
13014        let length_so_far = length_so_far + request0.len();
13015        assert_eq!(length_so_far % 4, 0);
13016        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
13017        request0[2..4].copy_from_slice(&length.to_ne_bytes());
13018        ([request0.into()], vec![])
13019    }
13020    /// Parse this request given its header, its body, and any fds that go along with it
13021    #[cfg(feature = "request-parsing")]
13022    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
13023        if header.major_opcode != UNGRAB_KEY_REQUEST {
13024            return Err(ParseError::InvalidValue);
13025        }
13026        let remaining = &[header.minor_opcode];
13027        let (key, remaining) = Keycode::try_parse(remaining)?;
13028        let _ = remaining;
13029        let (grab_window, remaining) = Window::try_parse(value)?;
13030        let (modifiers, remaining) = u16::try_parse(remaining)?;
13031        let modifiers = modifiers.into();
13032        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
13033        let _ = remaining;
13034        Ok(UngrabKeyRequest {
13035            key,
13036            grab_window,
13037            modifiers,
13038        })
13039    }
13040}
13041impl Request for UngrabKeyRequest {
13042    const EXTENSION_NAME: Option<&'static str> = None;
13043
13044    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
13045        let (bufs, fds) = self.serialize();
13046        // Flatten the buffers into a single vector
13047        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
13048        (buf, fds)
13049    }
13050}
13051impl crate::x11_utils::VoidRequest for UngrabKeyRequest {
13052}
13053
13054/// # Fields
13055///
13056/// * `AsyncPointer` - For AsyncPointer, if the pointer is frozen by the client, pointer event
13057/// processing continues normally. If the pointer is frozen twice by the client on
13058/// behalf of two separate grabs, AsyncPointer thaws for both. AsyncPointer has no
13059/// effect if the pointer is not frozen by the client, but the pointer need not be
13060/// grabbed by the client.
13061///
13062/// TODO: rewrite this in more understandable terms.
13063/// * `SyncPointer` - For SyncPointer, if the pointer is frozen and actively grabbed by the client,
13064/// pointer event processing continues normally until the next ButtonPress or
13065/// ButtonRelease event is reported to the client, at which time the pointer again
13066/// appears to freeze. However, if the reported event causes the pointer grab to be
13067/// released, then the pointer does not freeze. SyncPointer has no effect if the
13068/// pointer is not frozen by the client or if the pointer is not grabbed by the
13069/// client.
13070/// * `ReplayPointer` - For ReplayPointer, if the pointer is actively grabbed by the client and is
13071/// frozen as the result of an event having been sent to the client (either from
13072/// the activation of a GrabButton or from a previous AllowEvents with mode
13073/// SyncPointer but not from a GrabPointer), then the pointer grab is released and
13074/// that event is completely reprocessed, this time ignoring any passive grabs at
13075/// or above (towards the root) the grab-window of the grab just released. The
13076/// request has no effect if the pointer is not grabbed by the client or if the
13077/// pointer is not frozen as the result of an event.
13078/// * `AsyncKeyboard` - For AsyncKeyboard, if the keyboard is frozen by the client, keyboard event
13079/// processing continues normally. If the keyboard is frozen twice by the client on
13080/// behalf of two separate grabs, AsyncKeyboard thaws for both. AsyncKeyboard has
13081/// no effect if the keyboard is not frozen by the client, but the keyboard need
13082/// not be grabbed by the client.
13083/// * `SyncKeyboard` - For SyncKeyboard, if the keyboard is frozen and actively grabbed by the client,
13084/// keyboard event processing continues normally until the next KeyPress or
13085/// KeyRelease event is reported to the client, at which time the keyboard again
13086/// appears to freeze. However, if the reported event causes the keyboard grab to
13087/// be released, then the keyboard does not freeze. SyncKeyboard has no effect if
13088/// the keyboard is not frozen by the client or if the keyboard is not grabbed by
13089/// the client.
13090/// * `ReplayKeyboard` - For ReplayKeyboard, if the keyboard is actively grabbed by the client and is
13091/// frozen as the result of an event having been sent to the client (either from
13092/// the activation of a GrabKey or from a previous AllowEvents with mode
13093/// SyncKeyboard but not from a GrabKeyboard), then the keyboard grab is released
13094/// and that event is completely reprocessed, this time ignoring any passive grabs
13095/// at or above (towards the root) the grab-window of the grab just released. The
13096/// request has no effect if the keyboard is not grabbed by the client or if the
13097/// keyboard is not frozen as the result of an event.
13098/// * `SyncBoth` - For SyncBoth, if both pointer and keyboard are frozen by the client, event
13099/// processing (for both devices) continues normally until the next ButtonPress,
13100/// ButtonRelease, KeyPress, or KeyRelease event is reported to the client for a
13101/// grabbed device (button event for the pointer, key event for the keyboard), at
13102/// which time the devices again appear to freeze. However, if the reported event
13103/// causes the grab to be released, then the devices do not freeze (but if the
13104/// other device is still grabbed, then a subsequent event for it will still cause
13105/// both devices to freeze). SyncBoth has no effect unless both pointer and
13106/// keyboard are frozen by the client. If the pointer or keyboard is frozen twice
13107/// by the client on behalf of two separate grabs, SyncBoth thaws for both (but a
13108/// subsequent freeze for SyncBoth will only freeze each device once).
13109/// * `AsyncBoth` - For AsyncBoth, if the pointer and the keyboard are frozen by the client, event
13110/// processing for both devices continues normally. If a device is frozen twice by
13111/// the client on behalf of two separate grabs, AsyncBoth thaws for both. AsyncBoth
13112/// has no effect unless both pointer and keyboard are frozen by the client.
13113#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
13114#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13115pub struct Allow(u8);
13116impl Allow {
13117    pub const ASYNC_POINTER: Self = Self(0);
13118    pub const SYNC_POINTER: Self = Self(1);
13119    pub const REPLAY_POINTER: Self = Self(2);
13120    pub const ASYNC_KEYBOARD: Self = Self(3);
13121    pub const SYNC_KEYBOARD: Self = Self(4);
13122    pub const REPLAY_KEYBOARD: Self = Self(5);
13123    pub const ASYNC_BOTH: Self = Self(6);
13124    pub const SYNC_BOTH: Self = Self(7);
13125}
13126impl From<Allow> for u8 {
13127    #[inline]
13128    fn from(input: Allow) -> Self {
13129        input.0
13130    }
13131}
13132impl From<Allow> for Option<u8> {
13133    #[inline]
13134    fn from(input: Allow) -> Self {
13135        Some(input.0)
13136    }
13137}
13138impl From<Allow> for u16 {
13139    #[inline]
13140    fn from(input: Allow) -> Self {
13141        u16::from(input.0)
13142    }
13143}
13144impl From<Allow> for Option<u16> {
13145    #[inline]
13146    fn from(input: Allow) -> Self {
13147        Some(u16::from(input.0))
13148    }
13149}
13150impl From<Allow> for u32 {
13151    #[inline]
13152    fn from(input: Allow) -> Self {
13153        u32::from(input.0)
13154    }
13155}
13156impl From<Allow> for Option<u32> {
13157    #[inline]
13158    fn from(input: Allow) -> Self {
13159        Some(u32::from(input.0))
13160    }
13161}
13162impl From<u8> for Allow {
13163    #[inline]
13164    fn from(value: u8) -> Self {
13165        Self(value)
13166    }
13167}
13168impl core::fmt::Debug for Allow  {
13169    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
13170        let variants = [
13171            (Self::ASYNC_POINTER.0.into(), "ASYNC_POINTER", "AsyncPointer"),
13172            (Self::SYNC_POINTER.0.into(), "SYNC_POINTER", "SyncPointer"),
13173            (Self::REPLAY_POINTER.0.into(), "REPLAY_POINTER", "ReplayPointer"),
13174            (Self::ASYNC_KEYBOARD.0.into(), "ASYNC_KEYBOARD", "AsyncKeyboard"),
13175            (Self::SYNC_KEYBOARD.0.into(), "SYNC_KEYBOARD", "SyncKeyboard"),
13176            (Self::REPLAY_KEYBOARD.0.into(), "REPLAY_KEYBOARD", "ReplayKeyboard"),
13177            (Self::ASYNC_BOTH.0.into(), "ASYNC_BOTH", "AsyncBoth"),
13178            (Self::SYNC_BOTH.0.into(), "SYNC_BOTH", "SyncBoth"),
13179        ];
13180        pretty_print_enum(fmt, self.0.into(), &variants)
13181    }
13182}
13183
13184/// Opcode for the AllowEvents request
13185pub const ALLOW_EVENTS_REQUEST: u8 = 35;
13186/// release queued events.
13187///
13188/// Releases queued events if the client has caused a device (pointer/keyboard) to
13189/// freeze due to grabbing it actively. This request has no effect if `time` is
13190/// earlier than the last-grab time of the most recent active grab for this client
13191/// or if `time` is later than the current X server time.
13192///
13193/// # Fields
13194///
13195/// * `mode` -
13196/// * `time` - Timestamp to avoid race conditions when running X over the network.
13197///
13198/// The special value `XCB_CURRENT_TIME` will be replaced with the current server
13199/// time.
13200///
13201/// # Errors
13202///
13203/// * `Value` - You specified an invalid `mode`.
13204#[derive(Clone, Copy, Default)]
13205#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13206#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13207pub struct AllowEventsRequest {
13208    pub mode: Allow,
13209    pub time: Timestamp,
13210}
13211impl_debug_if_no_extra_traits!(AllowEventsRequest, "AllowEventsRequest");
13212impl AllowEventsRequest {
13213    /// Serialize this request into bytes for the provided connection
13214    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
13215        let length_so_far = 0;
13216        let mode_bytes = u8::from(self.mode).serialize();
13217        let time_bytes = self.time.serialize();
13218        let mut request0 = vec![
13219            ALLOW_EVENTS_REQUEST,
13220            mode_bytes[0],
13221            0,
13222            0,
13223            time_bytes[0],
13224            time_bytes[1],
13225            time_bytes[2],
13226            time_bytes[3],
13227        ];
13228        let length_so_far = length_so_far + request0.len();
13229        assert_eq!(length_so_far % 4, 0);
13230        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
13231        request0[2..4].copy_from_slice(&length.to_ne_bytes());
13232        ([request0.into()], vec![])
13233    }
13234    /// Parse this request given its header, its body, and any fds that go along with it
13235    #[cfg(feature = "request-parsing")]
13236    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
13237        if header.major_opcode != ALLOW_EVENTS_REQUEST {
13238            return Err(ParseError::InvalidValue);
13239        }
13240        let remaining = &[header.minor_opcode];
13241        let (mode, remaining) = u8::try_parse(remaining)?;
13242        let mode = mode.into();
13243        let _ = remaining;
13244        let (time, remaining) = Timestamp::try_parse(value)?;
13245        let _ = remaining;
13246        Ok(AllowEventsRequest {
13247            mode,
13248            time,
13249        })
13250    }
13251}
13252impl Request for AllowEventsRequest {
13253    const EXTENSION_NAME: Option<&'static str> = None;
13254
13255    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
13256        let (bufs, fds) = self.serialize();
13257        // Flatten the buffers into a single vector
13258        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
13259        (buf, fds)
13260    }
13261}
13262impl crate::x11_utils::VoidRequest for AllowEventsRequest {
13263}
13264
13265/// Opcode for the GrabServer request
13266pub const GRAB_SERVER_REQUEST: u8 = 36;
13267#[derive(Clone, Copy, Default)]
13268#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13269#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13270pub struct GrabServerRequest;
13271impl_debug_if_no_extra_traits!(GrabServerRequest, "GrabServerRequest");
13272impl GrabServerRequest {
13273    /// Serialize this request into bytes for the provided connection
13274    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
13275        let length_so_far = 0;
13276        let mut request0 = vec![
13277            GRAB_SERVER_REQUEST,
13278            0,
13279            0,
13280            0,
13281        ];
13282        let length_so_far = length_so_far + request0.len();
13283        assert_eq!(length_so_far % 4, 0);
13284        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
13285        request0[2..4].copy_from_slice(&length.to_ne_bytes());
13286        ([request0.into()], vec![])
13287    }
13288    /// Parse this request given its header, its body, and any fds that go along with it
13289    #[cfg(feature = "request-parsing")]
13290    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
13291        if header.major_opcode != GRAB_SERVER_REQUEST {
13292            return Err(ParseError::InvalidValue);
13293        }
13294        let remaining = &[header.minor_opcode];
13295        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
13296        let _ = remaining;
13297        let _ = value;
13298        Ok(GrabServerRequest
13299        )
13300    }
13301}
13302impl Request for GrabServerRequest {
13303    const EXTENSION_NAME: Option<&'static str> = None;
13304
13305    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
13306        let (bufs, fds) = self.serialize();
13307        // Flatten the buffers into a single vector
13308        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
13309        (buf, fds)
13310    }
13311}
13312impl crate::x11_utils::VoidRequest for GrabServerRequest {
13313}
13314
13315/// Opcode for the UngrabServer request
13316pub const UNGRAB_SERVER_REQUEST: u8 = 37;
13317#[derive(Clone, Copy, Default)]
13318#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13319#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13320pub struct UngrabServerRequest;
13321impl_debug_if_no_extra_traits!(UngrabServerRequest, "UngrabServerRequest");
13322impl UngrabServerRequest {
13323    /// Serialize this request into bytes for the provided connection
13324    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
13325        let length_so_far = 0;
13326        let mut request0 = vec![
13327            UNGRAB_SERVER_REQUEST,
13328            0,
13329            0,
13330            0,
13331        ];
13332        let length_so_far = length_so_far + request0.len();
13333        assert_eq!(length_so_far % 4, 0);
13334        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
13335        request0[2..4].copy_from_slice(&length.to_ne_bytes());
13336        ([request0.into()], vec![])
13337    }
13338    /// Parse this request given its header, its body, and any fds that go along with it
13339    #[cfg(feature = "request-parsing")]
13340    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
13341        if header.major_opcode != UNGRAB_SERVER_REQUEST {
13342            return Err(ParseError::InvalidValue);
13343        }
13344        let remaining = &[header.minor_opcode];
13345        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
13346        let _ = remaining;
13347        let _ = value;
13348        Ok(UngrabServerRequest
13349        )
13350    }
13351}
13352impl Request for UngrabServerRequest {
13353    const EXTENSION_NAME: Option<&'static str> = None;
13354
13355    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
13356        let (bufs, fds) = self.serialize();
13357        // Flatten the buffers into a single vector
13358        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
13359        (buf, fds)
13360    }
13361}
13362impl crate::x11_utils::VoidRequest for UngrabServerRequest {
13363}
13364
13365/// Opcode for the QueryPointer request
13366pub const QUERY_POINTER_REQUEST: u8 = 38;
13367/// get pointer coordinates.
13368///
13369/// Gets the root window the pointer is logically on and the pointer coordinates
13370/// relative to the root window's origin.
13371///
13372/// # Fields
13373///
13374/// * `window` - A window to check if the pointer is on the same screen as `window` (see the
13375/// `same_screen` field in the reply).
13376///
13377/// # Errors
13378///
13379/// * `Window` - The specified `window` does not exist.
13380#[derive(Clone, Copy, Default)]
13381#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13382#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13383pub struct QueryPointerRequest {
13384    pub window: Window,
13385}
13386impl_debug_if_no_extra_traits!(QueryPointerRequest, "QueryPointerRequest");
13387impl QueryPointerRequest {
13388    /// Serialize this request into bytes for the provided connection
13389    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
13390        let length_so_far = 0;
13391        let window_bytes = self.window.serialize();
13392        let mut request0 = vec![
13393            QUERY_POINTER_REQUEST,
13394            0,
13395            0,
13396            0,
13397            window_bytes[0],
13398            window_bytes[1],
13399            window_bytes[2],
13400            window_bytes[3],
13401        ];
13402        let length_so_far = length_so_far + request0.len();
13403        assert_eq!(length_so_far % 4, 0);
13404        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
13405        request0[2..4].copy_from_slice(&length.to_ne_bytes());
13406        ([request0.into()], vec![])
13407    }
13408    /// Parse this request given its header, its body, and any fds that go along with it
13409    #[cfg(feature = "request-parsing")]
13410    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
13411        if header.major_opcode != QUERY_POINTER_REQUEST {
13412            return Err(ParseError::InvalidValue);
13413        }
13414        let remaining = &[header.minor_opcode];
13415        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
13416        let _ = remaining;
13417        let (window, remaining) = Window::try_parse(value)?;
13418        let _ = remaining;
13419        Ok(QueryPointerRequest {
13420            window,
13421        })
13422    }
13423}
13424impl Request for QueryPointerRequest {
13425    const EXTENSION_NAME: Option<&'static str> = None;
13426
13427    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
13428        let (bufs, fds) = self.serialize();
13429        // Flatten the buffers into a single vector
13430        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
13431        (buf, fds)
13432    }
13433}
13434impl crate::x11_utils::ReplyRequest for QueryPointerRequest {
13435    type Reply = QueryPointerReply;
13436}
13437
13438/// # Fields
13439///
13440/// * `same_screen` - If `same_screen` is False, then the pointer is not on the same screen as the
13441/// argument window, `child` is None, and `win_x` and `win_y` are zero. If
13442/// `same_screen` is True, then `win_x` and `win_y` are the pointer coordinates
13443/// relative to the argument window's origin, and child is the child containing the
13444/// pointer, if any.
13445/// * `root` - The root window the pointer is logically on.
13446/// * `child` - The child window containing the pointer, if any, if `same_screen` is true. If
13447/// `same_screen` is false, `XCB_NONE` is returned.
13448/// * `root_x` - The pointer X position, relative to `root`.
13449/// * `root_y` - The pointer Y position, relative to `root`.
13450/// * `win_x` - The pointer X coordinate, relative to `child`, if `same_screen` is true. Zero
13451/// otherwise.
13452/// * `win_y` - The pointer Y coordinate, relative to `child`, if `same_screen` is true. Zero
13453/// otherwise.
13454/// * `mask` - The current logical state of the modifier keys and the buttons. Note that the
13455/// logical state of a device (as seen by means of the protocol) may lag the
13456/// physical state if device event processing is frozen.
13457#[derive(Clone, Copy, Default)]
13458#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13459#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13460pub struct QueryPointerReply {
13461    pub same_screen: bool,
13462    pub sequence: u16,
13463    pub length: u32,
13464    pub root: Window,
13465    pub child: Window,
13466    pub root_x: i16,
13467    pub root_y: i16,
13468    pub win_x: i16,
13469    pub win_y: i16,
13470    pub mask: KeyButMask,
13471}
13472impl_debug_if_no_extra_traits!(QueryPointerReply, "QueryPointerReply");
13473impl TryParse for QueryPointerReply {
13474    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
13475        let remaining = initial_value;
13476        let (response_type, remaining) = u8::try_parse(remaining)?;
13477        let (same_screen, remaining) = bool::try_parse(remaining)?;
13478        let (sequence, remaining) = u16::try_parse(remaining)?;
13479        let (length, remaining) = u32::try_parse(remaining)?;
13480        let (root, remaining) = Window::try_parse(remaining)?;
13481        let (child, remaining) = Window::try_parse(remaining)?;
13482        let (root_x, remaining) = i16::try_parse(remaining)?;
13483        let (root_y, remaining) = i16::try_parse(remaining)?;
13484        let (win_x, remaining) = i16::try_parse(remaining)?;
13485        let (win_y, remaining) = i16::try_parse(remaining)?;
13486        let (mask, remaining) = u16::try_parse(remaining)?;
13487        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
13488        if response_type != 1 {
13489            return Err(ParseError::InvalidValue);
13490        }
13491        let mask = mask.into();
13492        let result = QueryPointerReply { same_screen, sequence, length, root, child, root_x, root_y, win_x, win_y, mask };
13493        let _ = remaining;
13494        let remaining = initial_value.get(32 + length as usize * 4..)
13495            .ok_or(ParseError::InsufficientData)?;
13496        Ok((result, remaining))
13497    }
13498}
13499impl Serialize for QueryPointerReply {
13500    type Bytes = [u8; 28];
13501    fn serialize(&self) -> [u8; 28] {
13502        let response_type_bytes = &[1];
13503        let same_screen_bytes = self.same_screen.serialize();
13504        let sequence_bytes = self.sequence.serialize();
13505        let length_bytes = self.length.serialize();
13506        let root_bytes = self.root.serialize();
13507        let child_bytes = self.child.serialize();
13508        let root_x_bytes = self.root_x.serialize();
13509        let root_y_bytes = self.root_y.serialize();
13510        let win_x_bytes = self.win_x.serialize();
13511        let win_y_bytes = self.win_y.serialize();
13512        let mask_bytes = u16::from(self.mask).serialize();
13513        [
13514            response_type_bytes[0],
13515            same_screen_bytes[0],
13516            sequence_bytes[0],
13517            sequence_bytes[1],
13518            length_bytes[0],
13519            length_bytes[1],
13520            length_bytes[2],
13521            length_bytes[3],
13522            root_bytes[0],
13523            root_bytes[1],
13524            root_bytes[2],
13525            root_bytes[3],
13526            child_bytes[0],
13527            child_bytes[1],
13528            child_bytes[2],
13529            child_bytes[3],
13530            root_x_bytes[0],
13531            root_x_bytes[1],
13532            root_y_bytes[0],
13533            root_y_bytes[1],
13534            win_x_bytes[0],
13535            win_x_bytes[1],
13536            win_y_bytes[0],
13537            win_y_bytes[1],
13538            mask_bytes[0],
13539            mask_bytes[1],
13540            0,
13541            0,
13542        ]
13543    }
13544    fn serialize_into(&self, bytes: &mut Vec<u8>) {
13545        bytes.reserve(28);
13546        let response_type_bytes = &[1];
13547        bytes.push(response_type_bytes[0]);
13548        self.same_screen.serialize_into(bytes);
13549        self.sequence.serialize_into(bytes);
13550        self.length.serialize_into(bytes);
13551        self.root.serialize_into(bytes);
13552        self.child.serialize_into(bytes);
13553        self.root_x.serialize_into(bytes);
13554        self.root_y.serialize_into(bytes);
13555        self.win_x.serialize_into(bytes);
13556        self.win_y.serialize_into(bytes);
13557        u16::from(self.mask).serialize_into(bytes);
13558        bytes.extend_from_slice(&[0; 2]);
13559    }
13560}
13561
13562#[derive(Clone, Copy, Default)]
13563#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13564#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13565pub struct Timecoord {
13566    pub time: Timestamp,
13567    pub x: i16,
13568    pub y: i16,
13569}
13570impl_debug_if_no_extra_traits!(Timecoord, "Timecoord");
13571impl TryParse for Timecoord {
13572    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
13573        let (time, remaining) = Timestamp::try_parse(remaining)?;
13574        let (x, remaining) = i16::try_parse(remaining)?;
13575        let (y, remaining) = i16::try_parse(remaining)?;
13576        let result = Timecoord { time, x, y };
13577        Ok((result, remaining))
13578    }
13579}
13580impl Serialize for Timecoord {
13581    type Bytes = [u8; 8];
13582    fn serialize(&self) -> [u8; 8] {
13583        let time_bytes = self.time.serialize();
13584        let x_bytes = self.x.serialize();
13585        let y_bytes = self.y.serialize();
13586        [
13587            time_bytes[0],
13588            time_bytes[1],
13589            time_bytes[2],
13590            time_bytes[3],
13591            x_bytes[0],
13592            x_bytes[1],
13593            y_bytes[0],
13594            y_bytes[1],
13595        ]
13596    }
13597    fn serialize_into(&self, bytes: &mut Vec<u8>) {
13598        bytes.reserve(8);
13599        self.time.serialize_into(bytes);
13600        self.x.serialize_into(bytes);
13601        self.y.serialize_into(bytes);
13602    }
13603}
13604
13605/// Opcode for the GetMotionEvents request
13606pub const GET_MOTION_EVENTS_REQUEST: u8 = 39;
13607#[derive(Clone, Copy, Default)]
13608#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13609#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13610pub struct GetMotionEventsRequest {
13611    pub window: Window,
13612    pub start: Timestamp,
13613    pub stop: Timestamp,
13614}
13615impl_debug_if_no_extra_traits!(GetMotionEventsRequest, "GetMotionEventsRequest");
13616impl GetMotionEventsRequest {
13617    /// Serialize this request into bytes for the provided connection
13618    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
13619        let length_so_far = 0;
13620        let window_bytes = self.window.serialize();
13621        let start_bytes = self.start.serialize();
13622        let stop_bytes = self.stop.serialize();
13623        let mut request0 = vec![
13624            GET_MOTION_EVENTS_REQUEST,
13625            0,
13626            0,
13627            0,
13628            window_bytes[0],
13629            window_bytes[1],
13630            window_bytes[2],
13631            window_bytes[3],
13632            start_bytes[0],
13633            start_bytes[1],
13634            start_bytes[2],
13635            start_bytes[3],
13636            stop_bytes[0],
13637            stop_bytes[1],
13638            stop_bytes[2],
13639            stop_bytes[3],
13640        ];
13641        let length_so_far = length_so_far + request0.len();
13642        assert_eq!(length_so_far % 4, 0);
13643        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
13644        request0[2..4].copy_from_slice(&length.to_ne_bytes());
13645        ([request0.into()], vec![])
13646    }
13647    /// Parse this request given its header, its body, and any fds that go along with it
13648    #[cfg(feature = "request-parsing")]
13649    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
13650        if header.major_opcode != GET_MOTION_EVENTS_REQUEST {
13651            return Err(ParseError::InvalidValue);
13652        }
13653        let remaining = &[header.minor_opcode];
13654        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
13655        let _ = remaining;
13656        let (window, remaining) = Window::try_parse(value)?;
13657        let (start, remaining) = Timestamp::try_parse(remaining)?;
13658        let (stop, remaining) = Timestamp::try_parse(remaining)?;
13659        let _ = remaining;
13660        Ok(GetMotionEventsRequest {
13661            window,
13662            start,
13663            stop,
13664        })
13665    }
13666}
13667impl Request for GetMotionEventsRequest {
13668    const EXTENSION_NAME: Option<&'static str> = None;
13669
13670    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
13671        let (bufs, fds) = self.serialize();
13672        // Flatten the buffers into a single vector
13673        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
13674        (buf, fds)
13675    }
13676}
13677impl crate::x11_utils::ReplyRequest for GetMotionEventsRequest {
13678    type Reply = GetMotionEventsReply;
13679}
13680
13681#[derive(Clone, Default)]
13682#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13683#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13684pub struct GetMotionEventsReply {
13685    pub sequence: u16,
13686    pub length: u32,
13687    pub events: Vec<Timecoord>,
13688}
13689impl_debug_if_no_extra_traits!(GetMotionEventsReply, "GetMotionEventsReply");
13690impl TryParse for GetMotionEventsReply {
13691    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
13692        let remaining = initial_value;
13693        let (response_type, remaining) = u8::try_parse(remaining)?;
13694        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
13695        let (sequence, remaining) = u16::try_parse(remaining)?;
13696        let (length, remaining) = u32::try_parse(remaining)?;
13697        let (events_len, remaining) = u32::try_parse(remaining)?;
13698        let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
13699        let (events, remaining) = crate::x11_utils::parse_list::<Timecoord>(remaining, events_len.try_to_usize()?)?;
13700        if response_type != 1 {
13701            return Err(ParseError::InvalidValue);
13702        }
13703        let result = GetMotionEventsReply { sequence, length, events };
13704        let _ = remaining;
13705        let remaining = initial_value.get(32 + length as usize * 4..)
13706            .ok_or(ParseError::InsufficientData)?;
13707        Ok((result, remaining))
13708    }
13709}
13710impl Serialize for GetMotionEventsReply {
13711    type Bytes = Vec<u8>;
13712    fn serialize(&self) -> Vec<u8> {
13713        let mut result = Vec::new();
13714        self.serialize_into(&mut result);
13715        result
13716    }
13717    fn serialize_into(&self, bytes: &mut Vec<u8>) {
13718        bytes.reserve(32);
13719        let response_type_bytes = &[1];
13720        bytes.push(response_type_bytes[0]);
13721        bytes.extend_from_slice(&[0; 1]);
13722        self.sequence.serialize_into(bytes);
13723        self.length.serialize_into(bytes);
13724        let events_len = u32::try_from(self.events.len()).expect("`events` has too many elements");
13725        events_len.serialize_into(bytes);
13726        bytes.extend_from_slice(&[0; 20]);
13727        self.events.serialize_into(bytes);
13728    }
13729}
13730impl GetMotionEventsReply {
13731    /// Get the value of the `events_len` field.
13732    ///
13733    /// The `events_len` field is used as the length field of the `events` field.
13734    /// This function computes the field's value again based on the length of the list.
13735    ///
13736    /// # Panics
13737    ///
13738    /// Panics if the value cannot be represented in the target type. This
13739    /// cannot happen with values of the struct received from the X11 server.
13740    pub fn events_len(&self) -> u32 {
13741        self.events.len()
13742            .try_into().unwrap()
13743    }
13744}
13745
13746/// Opcode for the TranslateCoordinates request
13747pub const TRANSLATE_COORDINATES_REQUEST: u8 = 40;
13748#[derive(Clone, Copy, Default)]
13749#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13750#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13751pub struct TranslateCoordinatesRequest {
13752    pub src_window: Window,
13753    pub dst_window: Window,
13754    pub src_x: i16,
13755    pub src_y: i16,
13756}
13757impl_debug_if_no_extra_traits!(TranslateCoordinatesRequest, "TranslateCoordinatesRequest");
13758impl TranslateCoordinatesRequest {
13759    /// Serialize this request into bytes for the provided connection
13760    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
13761        let length_so_far = 0;
13762        let src_window_bytes = self.src_window.serialize();
13763        let dst_window_bytes = self.dst_window.serialize();
13764        let src_x_bytes = self.src_x.serialize();
13765        let src_y_bytes = self.src_y.serialize();
13766        let mut request0 = vec![
13767            TRANSLATE_COORDINATES_REQUEST,
13768            0,
13769            0,
13770            0,
13771            src_window_bytes[0],
13772            src_window_bytes[1],
13773            src_window_bytes[2],
13774            src_window_bytes[3],
13775            dst_window_bytes[0],
13776            dst_window_bytes[1],
13777            dst_window_bytes[2],
13778            dst_window_bytes[3],
13779            src_x_bytes[0],
13780            src_x_bytes[1],
13781            src_y_bytes[0],
13782            src_y_bytes[1],
13783        ];
13784        let length_so_far = length_so_far + request0.len();
13785        assert_eq!(length_so_far % 4, 0);
13786        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
13787        request0[2..4].copy_from_slice(&length.to_ne_bytes());
13788        ([request0.into()], vec![])
13789    }
13790    /// Parse this request given its header, its body, and any fds that go along with it
13791    #[cfg(feature = "request-parsing")]
13792    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
13793        if header.major_opcode != TRANSLATE_COORDINATES_REQUEST {
13794            return Err(ParseError::InvalidValue);
13795        }
13796        let remaining = &[header.minor_opcode];
13797        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
13798        let _ = remaining;
13799        let (src_window, remaining) = Window::try_parse(value)?;
13800        let (dst_window, remaining) = Window::try_parse(remaining)?;
13801        let (src_x, remaining) = i16::try_parse(remaining)?;
13802        let (src_y, remaining) = i16::try_parse(remaining)?;
13803        let _ = remaining;
13804        Ok(TranslateCoordinatesRequest {
13805            src_window,
13806            dst_window,
13807            src_x,
13808            src_y,
13809        })
13810    }
13811}
13812impl Request for TranslateCoordinatesRequest {
13813    const EXTENSION_NAME: Option<&'static str> = None;
13814
13815    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
13816        let (bufs, fds) = self.serialize();
13817        // Flatten the buffers into a single vector
13818        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
13819        (buf, fds)
13820    }
13821}
13822impl crate::x11_utils::ReplyRequest for TranslateCoordinatesRequest {
13823    type Reply = TranslateCoordinatesReply;
13824}
13825
13826#[derive(Clone, Copy, Default)]
13827#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13828#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13829pub struct TranslateCoordinatesReply {
13830    pub same_screen: bool,
13831    pub sequence: u16,
13832    pub length: u32,
13833    pub child: Window,
13834    pub dst_x: i16,
13835    pub dst_y: i16,
13836}
13837impl_debug_if_no_extra_traits!(TranslateCoordinatesReply, "TranslateCoordinatesReply");
13838impl TryParse for TranslateCoordinatesReply {
13839    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
13840        let remaining = initial_value;
13841        let (response_type, remaining) = u8::try_parse(remaining)?;
13842        let (same_screen, remaining) = bool::try_parse(remaining)?;
13843        let (sequence, remaining) = u16::try_parse(remaining)?;
13844        let (length, remaining) = u32::try_parse(remaining)?;
13845        let (child, remaining) = Window::try_parse(remaining)?;
13846        let (dst_x, remaining) = i16::try_parse(remaining)?;
13847        let (dst_y, remaining) = i16::try_parse(remaining)?;
13848        if response_type != 1 {
13849            return Err(ParseError::InvalidValue);
13850        }
13851        let result = TranslateCoordinatesReply { same_screen, sequence, length, child, dst_x, dst_y };
13852        let _ = remaining;
13853        let remaining = initial_value.get(32 + length as usize * 4..)
13854            .ok_or(ParseError::InsufficientData)?;
13855        Ok((result, remaining))
13856    }
13857}
13858impl Serialize for TranslateCoordinatesReply {
13859    type Bytes = [u8; 16];
13860    fn serialize(&self) -> [u8; 16] {
13861        let response_type_bytes = &[1];
13862        let same_screen_bytes = self.same_screen.serialize();
13863        let sequence_bytes = self.sequence.serialize();
13864        let length_bytes = self.length.serialize();
13865        let child_bytes = self.child.serialize();
13866        let dst_x_bytes = self.dst_x.serialize();
13867        let dst_y_bytes = self.dst_y.serialize();
13868        [
13869            response_type_bytes[0],
13870            same_screen_bytes[0],
13871            sequence_bytes[0],
13872            sequence_bytes[1],
13873            length_bytes[0],
13874            length_bytes[1],
13875            length_bytes[2],
13876            length_bytes[3],
13877            child_bytes[0],
13878            child_bytes[1],
13879            child_bytes[2],
13880            child_bytes[3],
13881            dst_x_bytes[0],
13882            dst_x_bytes[1],
13883            dst_y_bytes[0],
13884            dst_y_bytes[1],
13885        ]
13886    }
13887    fn serialize_into(&self, bytes: &mut Vec<u8>) {
13888        bytes.reserve(16);
13889        let response_type_bytes = &[1];
13890        bytes.push(response_type_bytes[0]);
13891        self.same_screen.serialize_into(bytes);
13892        self.sequence.serialize_into(bytes);
13893        self.length.serialize_into(bytes);
13894        self.child.serialize_into(bytes);
13895        self.dst_x.serialize_into(bytes);
13896        self.dst_y.serialize_into(bytes);
13897    }
13898}
13899
13900/// Opcode for the WarpPointer request
13901pub const WARP_POINTER_REQUEST: u8 = 41;
13902/// move mouse pointer.
13903///
13904/// Moves the mouse pointer to the specified position.
13905///
13906/// If `src_window` is not `XCB_NONE` (TODO), the move will only take place if the
13907/// pointer is inside `src_window` and within the rectangle specified by (`src_x`,
13908/// `src_y`, `src_width`, `src_height`). The rectangle coordinates are relative to
13909/// `src_window`.
13910///
13911/// If `dst_window` is not `XCB_NONE` (TODO), the pointer will be moved to the
13912/// offsets (`dst_x`, `dst_y`) relative to `dst_window`. If `dst_window` is
13913/// `XCB_NONE` (TODO), the pointer will be moved by the offsets (`dst_x`, `dst_y`)
13914/// relative to the current position of the pointer.
13915///
13916/// # Fields
13917///
13918/// * `src_window` - If `src_window` is not `XCB_NONE` (TODO), the move will only take place if the
13919/// pointer is inside `src_window` and within the rectangle specified by (`src_x`,
13920/// `src_y`, `src_width`, `src_height`). The rectangle coordinates are relative to
13921/// `src_window`.
13922/// * `dst_window` - If `dst_window` is not `XCB_NONE` (TODO), the pointer will be moved to the
13923/// offsets (`dst_x`, `dst_y`) relative to `dst_window`. If `dst_window` is
13924/// `XCB_NONE` (TODO), the pointer will be moved by the offsets (`dst_x`, `dst_y`)
13925/// relative to the current position of the pointer.
13926///
13927/// # Errors
13928///
13929/// * `Window` - TODO: reasons?
13930///
13931/// # See
13932///
13933/// * `SetInputFocus`: request
13934#[derive(Clone, Copy, Default)]
13935#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13936#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13937pub struct WarpPointerRequest {
13938    pub src_window: Window,
13939    pub dst_window: Window,
13940    pub src_x: i16,
13941    pub src_y: i16,
13942    pub src_width: u16,
13943    pub src_height: u16,
13944    pub dst_x: i16,
13945    pub dst_y: i16,
13946}
13947impl_debug_if_no_extra_traits!(WarpPointerRequest, "WarpPointerRequest");
13948impl WarpPointerRequest {
13949    /// Serialize this request into bytes for the provided connection
13950    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
13951        let length_so_far = 0;
13952        let src_window_bytes = self.src_window.serialize();
13953        let dst_window_bytes = self.dst_window.serialize();
13954        let src_x_bytes = self.src_x.serialize();
13955        let src_y_bytes = self.src_y.serialize();
13956        let src_width_bytes = self.src_width.serialize();
13957        let src_height_bytes = self.src_height.serialize();
13958        let dst_x_bytes = self.dst_x.serialize();
13959        let dst_y_bytes = self.dst_y.serialize();
13960        let mut request0 = vec![
13961            WARP_POINTER_REQUEST,
13962            0,
13963            0,
13964            0,
13965            src_window_bytes[0],
13966            src_window_bytes[1],
13967            src_window_bytes[2],
13968            src_window_bytes[3],
13969            dst_window_bytes[0],
13970            dst_window_bytes[1],
13971            dst_window_bytes[2],
13972            dst_window_bytes[3],
13973            src_x_bytes[0],
13974            src_x_bytes[1],
13975            src_y_bytes[0],
13976            src_y_bytes[1],
13977            src_width_bytes[0],
13978            src_width_bytes[1],
13979            src_height_bytes[0],
13980            src_height_bytes[1],
13981            dst_x_bytes[0],
13982            dst_x_bytes[1],
13983            dst_y_bytes[0],
13984            dst_y_bytes[1],
13985        ];
13986        let length_so_far = length_so_far + request0.len();
13987        assert_eq!(length_so_far % 4, 0);
13988        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
13989        request0[2..4].copy_from_slice(&length.to_ne_bytes());
13990        ([request0.into()], vec![])
13991    }
13992    /// Parse this request given its header, its body, and any fds that go along with it
13993    #[cfg(feature = "request-parsing")]
13994    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
13995        if header.major_opcode != WARP_POINTER_REQUEST {
13996            return Err(ParseError::InvalidValue);
13997        }
13998        let remaining = &[header.minor_opcode];
13999        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
14000        let _ = remaining;
14001        let (src_window, remaining) = Window::try_parse(value)?;
14002        let (dst_window, remaining) = Window::try_parse(remaining)?;
14003        let (src_x, remaining) = i16::try_parse(remaining)?;
14004        let (src_y, remaining) = i16::try_parse(remaining)?;
14005        let (src_width, remaining) = u16::try_parse(remaining)?;
14006        let (src_height, remaining) = u16::try_parse(remaining)?;
14007        let (dst_x, remaining) = i16::try_parse(remaining)?;
14008        let (dst_y, remaining) = i16::try_parse(remaining)?;
14009        let _ = remaining;
14010        Ok(WarpPointerRequest {
14011            src_window,
14012            dst_window,
14013            src_x,
14014            src_y,
14015            src_width,
14016            src_height,
14017            dst_x,
14018            dst_y,
14019        })
14020    }
14021}
14022impl Request for WarpPointerRequest {
14023    const EXTENSION_NAME: Option<&'static str> = None;
14024
14025    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
14026        let (bufs, fds) = self.serialize();
14027        // Flatten the buffers into a single vector
14028        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
14029        (buf, fds)
14030    }
14031}
14032impl crate::x11_utils::VoidRequest for WarpPointerRequest {
14033}
14034
14035/// # Fields
14036///
14037/// * `None` - The focus reverts to `XCB_NONE`, so no window will have the input focus.
14038/// * `PointerRoot` - The focus reverts to `XCB_POINTER_ROOT` respectively. When the focus reverts,
14039/// FocusIn and FocusOut events are generated, but the last-focus-change time is
14040/// not changed.
14041/// * `Parent` - The focus reverts to the parent (or closest viewable ancestor) and the new
14042/// revert_to value is `XCB_INPUT_FOCUS_NONE`.
14043/// * `FollowKeyboard` - NOT YET DOCUMENTED. Only relevant for the xinput extension.
14044#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
14045#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14046pub struct InputFocus(u8);
14047impl InputFocus {
14048    pub const NONE: Self = Self(0);
14049    pub const POINTER_ROOT: Self = Self(1);
14050    pub const PARENT: Self = Self(2);
14051    pub const FOLLOW_KEYBOARD: Self = Self(3);
14052}
14053impl From<InputFocus> for u8 {
14054    #[inline]
14055    fn from(input: InputFocus) -> Self {
14056        input.0
14057    }
14058}
14059impl From<InputFocus> for Option<u8> {
14060    #[inline]
14061    fn from(input: InputFocus) -> Self {
14062        Some(input.0)
14063    }
14064}
14065impl From<InputFocus> for u16 {
14066    #[inline]
14067    fn from(input: InputFocus) -> Self {
14068        u16::from(input.0)
14069    }
14070}
14071impl From<InputFocus> for Option<u16> {
14072    #[inline]
14073    fn from(input: InputFocus) -> Self {
14074        Some(u16::from(input.0))
14075    }
14076}
14077impl From<InputFocus> for u32 {
14078    #[inline]
14079    fn from(input: InputFocus) -> Self {
14080        u32::from(input.0)
14081    }
14082}
14083impl From<InputFocus> for Option<u32> {
14084    #[inline]
14085    fn from(input: InputFocus) -> Self {
14086        Some(u32::from(input.0))
14087    }
14088}
14089impl From<u8> for InputFocus {
14090    #[inline]
14091    fn from(value: u8) -> Self {
14092        Self(value)
14093    }
14094}
14095impl core::fmt::Debug for InputFocus  {
14096    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
14097        let variants = [
14098            (Self::NONE.0.into(), "NONE", "None"),
14099            (Self::POINTER_ROOT.0.into(), "POINTER_ROOT", "PointerRoot"),
14100            (Self::PARENT.0.into(), "PARENT", "Parent"),
14101            (Self::FOLLOW_KEYBOARD.0.into(), "FOLLOW_KEYBOARD", "FollowKeyboard"),
14102        ];
14103        pretty_print_enum(fmt, self.0.into(), &variants)
14104    }
14105}
14106
14107/// Opcode for the SetInputFocus request
14108pub const SET_INPUT_FOCUS_REQUEST: u8 = 42;
14109/// Sets input focus.
14110///
14111/// Changes the input focus and the last-focus-change time. If the specified `time`
14112/// is earlier than the current last-focus-change time, the request is ignored (to
14113/// avoid race conditions when running X over the network).
14114///
14115/// A FocusIn and FocusOut event is generated when focus is changed.
14116///
14117/// # Fields
14118///
14119/// * `focus` - The window to focus. All keyboard events will be reported to this window. The
14120/// window must be viewable (TODO), or a `xcb_match_error_t` occurs (TODO).
14121///
14122/// If `focus` is `XCB_NONE` (TODO), all keyboard events are
14123/// discarded until a new focus window is set.
14124///
14125/// If `focus` is `XCB_POINTER_ROOT` (TODO), focus is on the root window of the
14126/// screen on which the pointer is on currently.
14127/// * `time` - Timestamp to avoid race conditions when running X over the network.
14128///
14129/// The special value `XCB_CURRENT_TIME` will be replaced with the current server
14130/// time.
14131/// * `revert_to` - Specifies what happens when the `focus` window becomes unviewable (if `focus`
14132/// is neither `XCB_NONE` nor `XCB_POINTER_ROOT`).
14133///
14134/// # Errors
14135///
14136/// * `Window` - The specified `focus` window does not exist.
14137/// * `Match` - The specified `focus` window is not viewable.
14138/// * `Value` - TODO: Reasons?
14139///
14140/// # See
14141///
14142/// * `FocusIn`: event
14143/// * `FocusOut`: event
14144#[derive(Clone, Copy, Default)]
14145#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14146#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14147pub struct SetInputFocusRequest {
14148    pub revert_to: InputFocus,
14149    pub focus: Window,
14150    pub time: Timestamp,
14151}
14152impl_debug_if_no_extra_traits!(SetInputFocusRequest, "SetInputFocusRequest");
14153impl SetInputFocusRequest {
14154    /// Serialize this request into bytes for the provided connection
14155    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
14156        let length_so_far = 0;
14157        let revert_to_bytes = u8::from(self.revert_to).serialize();
14158        let focus_bytes = self.focus.serialize();
14159        let time_bytes = self.time.serialize();
14160        let mut request0 = vec![
14161            SET_INPUT_FOCUS_REQUEST,
14162            revert_to_bytes[0],
14163            0,
14164            0,
14165            focus_bytes[0],
14166            focus_bytes[1],
14167            focus_bytes[2],
14168            focus_bytes[3],
14169            time_bytes[0],
14170            time_bytes[1],
14171            time_bytes[2],
14172            time_bytes[3],
14173        ];
14174        let length_so_far = length_so_far + request0.len();
14175        assert_eq!(length_so_far % 4, 0);
14176        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
14177        request0[2..4].copy_from_slice(&length.to_ne_bytes());
14178        ([request0.into()], vec![])
14179    }
14180    /// Parse this request given its header, its body, and any fds that go along with it
14181    #[cfg(feature = "request-parsing")]
14182    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
14183        if header.major_opcode != SET_INPUT_FOCUS_REQUEST {
14184            return Err(ParseError::InvalidValue);
14185        }
14186        let remaining = &[header.minor_opcode];
14187        let (revert_to, remaining) = u8::try_parse(remaining)?;
14188        let revert_to = revert_to.into();
14189        let _ = remaining;
14190        let (focus, remaining) = Window::try_parse(value)?;
14191        let (time, remaining) = Timestamp::try_parse(remaining)?;
14192        let _ = remaining;
14193        Ok(SetInputFocusRequest {
14194            revert_to,
14195            focus,
14196            time,
14197        })
14198    }
14199}
14200impl Request for SetInputFocusRequest {
14201    const EXTENSION_NAME: Option<&'static str> = None;
14202
14203    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
14204        let (bufs, fds) = self.serialize();
14205        // Flatten the buffers into a single vector
14206        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
14207        (buf, fds)
14208    }
14209}
14210impl crate::x11_utils::VoidRequest for SetInputFocusRequest {
14211}
14212
14213/// Opcode for the GetInputFocus request
14214pub const GET_INPUT_FOCUS_REQUEST: u8 = 43;
14215#[derive(Clone, Copy, Default)]
14216#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14217#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14218pub struct GetInputFocusRequest;
14219impl_debug_if_no_extra_traits!(GetInputFocusRequest, "GetInputFocusRequest");
14220impl GetInputFocusRequest {
14221    /// Serialize this request into bytes for the provided connection
14222    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
14223        let length_so_far = 0;
14224        let mut request0 = vec![
14225            GET_INPUT_FOCUS_REQUEST,
14226            0,
14227            0,
14228            0,
14229        ];
14230        let length_so_far = length_so_far + request0.len();
14231        assert_eq!(length_so_far % 4, 0);
14232        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
14233        request0[2..4].copy_from_slice(&length.to_ne_bytes());
14234        ([request0.into()], vec![])
14235    }
14236    /// Parse this request given its header, its body, and any fds that go along with it
14237    #[cfg(feature = "request-parsing")]
14238    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
14239        if header.major_opcode != GET_INPUT_FOCUS_REQUEST {
14240            return Err(ParseError::InvalidValue);
14241        }
14242        let remaining = &[header.minor_opcode];
14243        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
14244        let _ = remaining;
14245        let _ = value;
14246        Ok(GetInputFocusRequest
14247        )
14248    }
14249}
14250impl Request for GetInputFocusRequest {
14251    const EXTENSION_NAME: Option<&'static str> = None;
14252
14253    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
14254        let (bufs, fds) = self.serialize();
14255        // Flatten the buffers into a single vector
14256        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
14257        (buf, fds)
14258    }
14259}
14260impl crate::x11_utils::ReplyRequest for GetInputFocusRequest {
14261    type Reply = GetInputFocusReply;
14262}
14263
14264#[derive(Clone, Copy, Default)]
14265#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14266#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14267pub struct GetInputFocusReply {
14268    pub revert_to: InputFocus,
14269    pub sequence: u16,
14270    pub length: u32,
14271    pub focus: Window,
14272}
14273impl_debug_if_no_extra_traits!(GetInputFocusReply, "GetInputFocusReply");
14274impl TryParse for GetInputFocusReply {
14275    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
14276        let remaining = initial_value;
14277        let (response_type, remaining) = u8::try_parse(remaining)?;
14278        let (revert_to, remaining) = u8::try_parse(remaining)?;
14279        let (sequence, remaining) = u16::try_parse(remaining)?;
14280        let (length, remaining) = u32::try_parse(remaining)?;
14281        let (focus, remaining) = Window::try_parse(remaining)?;
14282        if response_type != 1 {
14283            return Err(ParseError::InvalidValue);
14284        }
14285        let revert_to = revert_to.into();
14286        let result = GetInputFocusReply { revert_to, sequence, length, focus };
14287        let _ = remaining;
14288        let remaining = initial_value.get(32 + length as usize * 4..)
14289            .ok_or(ParseError::InsufficientData)?;
14290        Ok((result, remaining))
14291    }
14292}
14293impl Serialize for GetInputFocusReply {
14294    type Bytes = [u8; 12];
14295    fn serialize(&self) -> [u8; 12] {
14296        let response_type_bytes = &[1];
14297        let revert_to_bytes = u8::from(self.revert_to).serialize();
14298        let sequence_bytes = self.sequence.serialize();
14299        let length_bytes = self.length.serialize();
14300        let focus_bytes = self.focus.serialize();
14301        [
14302            response_type_bytes[0],
14303            revert_to_bytes[0],
14304            sequence_bytes[0],
14305            sequence_bytes[1],
14306            length_bytes[0],
14307            length_bytes[1],
14308            length_bytes[2],
14309            length_bytes[3],
14310            focus_bytes[0],
14311            focus_bytes[1],
14312            focus_bytes[2],
14313            focus_bytes[3],
14314        ]
14315    }
14316    fn serialize_into(&self, bytes: &mut Vec<u8>) {
14317        bytes.reserve(12);
14318        let response_type_bytes = &[1];
14319        bytes.push(response_type_bytes[0]);
14320        u8::from(self.revert_to).serialize_into(bytes);
14321        self.sequence.serialize_into(bytes);
14322        self.length.serialize_into(bytes);
14323        self.focus.serialize_into(bytes);
14324    }
14325}
14326
14327/// Opcode for the QueryKeymap request
14328pub const QUERY_KEYMAP_REQUEST: u8 = 44;
14329#[derive(Clone, Copy, Default)]
14330#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14331#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14332pub struct QueryKeymapRequest;
14333impl_debug_if_no_extra_traits!(QueryKeymapRequest, "QueryKeymapRequest");
14334impl QueryKeymapRequest {
14335    /// Serialize this request into bytes for the provided connection
14336    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
14337        let length_so_far = 0;
14338        let mut request0 = vec![
14339            QUERY_KEYMAP_REQUEST,
14340            0,
14341            0,
14342            0,
14343        ];
14344        let length_so_far = length_so_far + request0.len();
14345        assert_eq!(length_so_far % 4, 0);
14346        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
14347        request0[2..4].copy_from_slice(&length.to_ne_bytes());
14348        ([request0.into()], vec![])
14349    }
14350    /// Parse this request given its header, its body, and any fds that go along with it
14351    #[cfg(feature = "request-parsing")]
14352    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
14353        if header.major_opcode != QUERY_KEYMAP_REQUEST {
14354            return Err(ParseError::InvalidValue);
14355        }
14356        let remaining = &[header.minor_opcode];
14357        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
14358        let _ = remaining;
14359        let _ = value;
14360        Ok(QueryKeymapRequest
14361        )
14362    }
14363}
14364impl Request for QueryKeymapRequest {
14365    const EXTENSION_NAME: Option<&'static str> = None;
14366
14367    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
14368        let (bufs, fds) = self.serialize();
14369        // Flatten the buffers into a single vector
14370        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
14371        (buf, fds)
14372    }
14373}
14374impl crate::x11_utils::ReplyRequest for QueryKeymapRequest {
14375    type Reply = QueryKeymapReply;
14376}
14377
14378#[derive(Clone, Copy, Default)]
14379#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14380#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14381pub struct QueryKeymapReply {
14382    pub sequence: u16,
14383    pub length: u32,
14384    pub keys: [u8; 32],
14385}
14386impl_debug_if_no_extra_traits!(QueryKeymapReply, "QueryKeymapReply");
14387impl TryParse for QueryKeymapReply {
14388    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
14389        let remaining = initial_value;
14390        let (response_type, remaining) = u8::try_parse(remaining)?;
14391        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
14392        let (sequence, remaining) = u16::try_parse(remaining)?;
14393        let (length, remaining) = u32::try_parse(remaining)?;
14394        let (keys, remaining) = crate::x11_utils::parse_u8_array::<32>(remaining)?;
14395        if response_type != 1 {
14396            return Err(ParseError::InvalidValue);
14397        }
14398        let result = QueryKeymapReply { sequence, length, keys };
14399        let _ = remaining;
14400        let remaining = initial_value.get(32 + length as usize * 4..)
14401            .ok_or(ParseError::InsufficientData)?;
14402        Ok((result, remaining))
14403    }
14404}
14405impl Serialize for QueryKeymapReply {
14406    type Bytes = [u8; 40];
14407    fn serialize(&self) -> [u8; 40] {
14408        let response_type_bytes = &[1];
14409        let sequence_bytes = self.sequence.serialize();
14410        let length_bytes = self.length.serialize();
14411        [
14412            response_type_bytes[0],
14413            0,
14414            sequence_bytes[0],
14415            sequence_bytes[1],
14416            length_bytes[0],
14417            length_bytes[1],
14418            length_bytes[2],
14419            length_bytes[3],
14420            self.keys[0],
14421            self.keys[1],
14422            self.keys[2],
14423            self.keys[3],
14424            self.keys[4],
14425            self.keys[5],
14426            self.keys[6],
14427            self.keys[7],
14428            self.keys[8],
14429            self.keys[9],
14430            self.keys[10],
14431            self.keys[11],
14432            self.keys[12],
14433            self.keys[13],
14434            self.keys[14],
14435            self.keys[15],
14436            self.keys[16],
14437            self.keys[17],
14438            self.keys[18],
14439            self.keys[19],
14440            self.keys[20],
14441            self.keys[21],
14442            self.keys[22],
14443            self.keys[23],
14444            self.keys[24],
14445            self.keys[25],
14446            self.keys[26],
14447            self.keys[27],
14448            self.keys[28],
14449            self.keys[29],
14450            self.keys[30],
14451            self.keys[31],
14452        ]
14453    }
14454    fn serialize_into(&self, bytes: &mut Vec<u8>) {
14455        bytes.reserve(40);
14456        let response_type_bytes = &[1];
14457        bytes.push(response_type_bytes[0]);
14458        bytes.extend_from_slice(&[0; 1]);
14459        self.sequence.serialize_into(bytes);
14460        self.length.serialize_into(bytes);
14461        bytes.extend_from_slice(&self.keys);
14462    }
14463}
14464
14465/// Opcode for the OpenFont request
14466pub const OPEN_FONT_REQUEST: u8 = 45;
14467/// opens a font.
14468///
14469/// Opens any X core font matching the given `name` (for example "-misc-fixed-*").
14470///
14471/// Note that X core fonts are deprecated (but still supported) in favor of
14472/// client-side rendering using Xft.
14473///
14474/// # Fields
14475///
14476/// * `fid` - The ID with which you will refer to the font, created by `xcb_generate_id`.
14477/// * `name` - A pattern describing an X core font.
14478///
14479/// # Errors
14480///
14481/// * `Name` - No font matches the given `name`.
14482///
14483/// # See
14484///
14485/// * `xcb_generate_id`: function
14486#[derive(Clone, Default)]
14487#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14488#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14489pub struct OpenFontRequest<'input> {
14490    pub fid: Font,
14491    pub name: Cow<'input, [u8]>,
14492}
14493impl_debug_if_no_extra_traits!(OpenFontRequest<'_>, "OpenFontRequest");
14494impl<'input> OpenFontRequest<'input> {
14495    /// Serialize this request into bytes for the provided connection
14496    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
14497        let length_so_far = 0;
14498        let fid_bytes = self.fid.serialize();
14499        let name_len = u16::try_from(self.name.len()).expect("`name` has too many elements");
14500        let name_len_bytes = name_len.serialize();
14501        let mut request0 = vec![
14502            OPEN_FONT_REQUEST,
14503            0,
14504            0,
14505            0,
14506            fid_bytes[0],
14507            fid_bytes[1],
14508            fid_bytes[2],
14509            fid_bytes[3],
14510            name_len_bytes[0],
14511            name_len_bytes[1],
14512            0,
14513            0,
14514        ];
14515        let length_so_far = length_so_far + request0.len();
14516        let length_so_far = length_so_far + self.name.len();
14517        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
14518        let length_so_far = length_so_far + padding0.len();
14519        assert_eq!(length_so_far % 4, 0);
14520        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
14521        request0[2..4].copy_from_slice(&length.to_ne_bytes());
14522        ([request0.into(), self.name, padding0.into()], vec![])
14523    }
14524    /// Parse this request given its header, its body, and any fds that go along with it
14525    #[cfg(feature = "request-parsing")]
14526    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
14527        if header.major_opcode != OPEN_FONT_REQUEST {
14528            return Err(ParseError::InvalidValue);
14529        }
14530        let remaining = &[header.minor_opcode];
14531        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
14532        let _ = remaining;
14533        let (fid, remaining) = Font::try_parse(value)?;
14534        let (name_len, remaining) = u16::try_parse(remaining)?;
14535        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
14536        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_len.try_to_usize()?)?;
14537        let _ = remaining;
14538        Ok(OpenFontRequest {
14539            fid,
14540            name: Cow::Borrowed(name),
14541        })
14542    }
14543    /// Clone all borrowed data in this OpenFontRequest.
14544    pub fn into_owned(self) -> OpenFontRequest<'static> {
14545        OpenFontRequest {
14546            fid: self.fid,
14547            name: Cow::Owned(self.name.into_owned()),
14548        }
14549    }
14550}
14551impl<'input> Request for OpenFontRequest<'input> {
14552    const EXTENSION_NAME: Option<&'static str> = None;
14553
14554    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
14555        let (bufs, fds) = self.serialize();
14556        // Flatten the buffers into a single vector
14557        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
14558        (buf, fds)
14559    }
14560}
14561impl<'input> crate::x11_utils::VoidRequest for OpenFontRequest<'input> {
14562}
14563
14564/// Opcode for the CloseFont request
14565pub const CLOSE_FONT_REQUEST: u8 = 46;
14566#[derive(Clone, Copy, Default)]
14567#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14568#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14569pub struct CloseFontRequest {
14570    pub font: Font,
14571}
14572impl_debug_if_no_extra_traits!(CloseFontRequest, "CloseFontRequest");
14573impl CloseFontRequest {
14574    /// Serialize this request into bytes for the provided connection
14575    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
14576        let length_so_far = 0;
14577        let font_bytes = self.font.serialize();
14578        let mut request0 = vec![
14579            CLOSE_FONT_REQUEST,
14580            0,
14581            0,
14582            0,
14583            font_bytes[0],
14584            font_bytes[1],
14585            font_bytes[2],
14586            font_bytes[3],
14587        ];
14588        let length_so_far = length_so_far + request0.len();
14589        assert_eq!(length_so_far % 4, 0);
14590        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
14591        request0[2..4].copy_from_slice(&length.to_ne_bytes());
14592        ([request0.into()], vec![])
14593    }
14594    /// Parse this request given its header, its body, and any fds that go along with it
14595    #[cfg(feature = "request-parsing")]
14596    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
14597        if header.major_opcode != CLOSE_FONT_REQUEST {
14598            return Err(ParseError::InvalidValue);
14599        }
14600        let remaining = &[header.minor_opcode];
14601        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
14602        let _ = remaining;
14603        let (font, remaining) = Font::try_parse(value)?;
14604        let _ = remaining;
14605        Ok(CloseFontRequest {
14606            font,
14607        })
14608    }
14609}
14610impl Request for CloseFontRequest {
14611    const EXTENSION_NAME: Option<&'static str> = None;
14612
14613    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
14614        let (bufs, fds) = self.serialize();
14615        // Flatten the buffers into a single vector
14616        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
14617        (buf, fds)
14618    }
14619}
14620impl crate::x11_utils::VoidRequest for CloseFontRequest {
14621}
14622
14623#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
14624#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14625pub struct FontDraw(u8);
14626impl FontDraw {
14627    pub const LEFT_TO_RIGHT: Self = Self(0);
14628    pub const RIGHT_TO_LEFT: Self = Self(1);
14629}
14630impl From<FontDraw> for u8 {
14631    #[inline]
14632    fn from(input: FontDraw) -> Self {
14633        input.0
14634    }
14635}
14636impl From<FontDraw> for Option<u8> {
14637    #[inline]
14638    fn from(input: FontDraw) -> Self {
14639        Some(input.0)
14640    }
14641}
14642impl From<FontDraw> for u16 {
14643    #[inline]
14644    fn from(input: FontDraw) -> Self {
14645        u16::from(input.0)
14646    }
14647}
14648impl From<FontDraw> for Option<u16> {
14649    #[inline]
14650    fn from(input: FontDraw) -> Self {
14651        Some(u16::from(input.0))
14652    }
14653}
14654impl From<FontDraw> for u32 {
14655    #[inline]
14656    fn from(input: FontDraw) -> Self {
14657        u32::from(input.0)
14658    }
14659}
14660impl From<FontDraw> for Option<u32> {
14661    #[inline]
14662    fn from(input: FontDraw) -> Self {
14663        Some(u32::from(input.0))
14664    }
14665}
14666impl From<u8> for FontDraw {
14667    #[inline]
14668    fn from(value: u8) -> Self {
14669        Self(value)
14670    }
14671}
14672impl core::fmt::Debug for FontDraw  {
14673    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
14674        let variants = [
14675            (Self::LEFT_TO_RIGHT.0.into(), "LEFT_TO_RIGHT", "LeftToRight"),
14676            (Self::RIGHT_TO_LEFT.0.into(), "RIGHT_TO_LEFT", "RightToLeft"),
14677        ];
14678        pretty_print_enum(fmt, self.0.into(), &variants)
14679    }
14680}
14681
14682#[derive(Clone, Copy, Default)]
14683#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14684#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14685pub struct Fontprop {
14686    pub name: Atom,
14687    pub value: u32,
14688}
14689impl_debug_if_no_extra_traits!(Fontprop, "Fontprop");
14690impl TryParse for Fontprop {
14691    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
14692        let (name, remaining) = Atom::try_parse(remaining)?;
14693        let (value, remaining) = u32::try_parse(remaining)?;
14694        let result = Fontprop { name, value };
14695        Ok((result, remaining))
14696    }
14697}
14698impl Serialize for Fontprop {
14699    type Bytes = [u8; 8];
14700    fn serialize(&self) -> [u8; 8] {
14701        let name_bytes = self.name.serialize();
14702        let value_bytes = self.value.serialize();
14703        [
14704            name_bytes[0],
14705            name_bytes[1],
14706            name_bytes[2],
14707            name_bytes[3],
14708            value_bytes[0],
14709            value_bytes[1],
14710            value_bytes[2],
14711            value_bytes[3],
14712        ]
14713    }
14714    fn serialize_into(&self, bytes: &mut Vec<u8>) {
14715        bytes.reserve(8);
14716        self.name.serialize_into(bytes);
14717        self.value.serialize_into(bytes);
14718    }
14719}
14720
14721#[derive(Clone, Copy, Default)]
14722#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14723#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14724pub struct Charinfo {
14725    pub left_side_bearing: i16,
14726    pub right_side_bearing: i16,
14727    pub character_width: i16,
14728    pub ascent: i16,
14729    pub descent: i16,
14730    pub attributes: u16,
14731}
14732impl_debug_if_no_extra_traits!(Charinfo, "Charinfo");
14733impl TryParse for Charinfo {
14734    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
14735        let (left_side_bearing, remaining) = i16::try_parse(remaining)?;
14736        let (right_side_bearing, remaining) = i16::try_parse(remaining)?;
14737        let (character_width, remaining) = i16::try_parse(remaining)?;
14738        let (ascent, remaining) = i16::try_parse(remaining)?;
14739        let (descent, remaining) = i16::try_parse(remaining)?;
14740        let (attributes, remaining) = u16::try_parse(remaining)?;
14741        let result = Charinfo { left_side_bearing, right_side_bearing, character_width, ascent, descent, attributes };
14742        Ok((result, remaining))
14743    }
14744}
14745impl Serialize for Charinfo {
14746    type Bytes = [u8; 12];
14747    fn serialize(&self) -> [u8; 12] {
14748        let left_side_bearing_bytes = self.left_side_bearing.serialize();
14749        let right_side_bearing_bytes = self.right_side_bearing.serialize();
14750        let character_width_bytes = self.character_width.serialize();
14751        let ascent_bytes = self.ascent.serialize();
14752        let descent_bytes = self.descent.serialize();
14753        let attributes_bytes = self.attributes.serialize();
14754        [
14755            left_side_bearing_bytes[0],
14756            left_side_bearing_bytes[1],
14757            right_side_bearing_bytes[0],
14758            right_side_bearing_bytes[1],
14759            character_width_bytes[0],
14760            character_width_bytes[1],
14761            ascent_bytes[0],
14762            ascent_bytes[1],
14763            descent_bytes[0],
14764            descent_bytes[1],
14765            attributes_bytes[0],
14766            attributes_bytes[1],
14767        ]
14768    }
14769    fn serialize_into(&self, bytes: &mut Vec<u8>) {
14770        bytes.reserve(12);
14771        self.left_side_bearing.serialize_into(bytes);
14772        self.right_side_bearing.serialize_into(bytes);
14773        self.character_width.serialize_into(bytes);
14774        self.ascent.serialize_into(bytes);
14775        self.descent.serialize_into(bytes);
14776        self.attributes.serialize_into(bytes);
14777    }
14778}
14779
14780/// Opcode for the QueryFont request
14781pub const QUERY_FONT_REQUEST: u8 = 47;
14782/// query font metrics.
14783///
14784/// Queries information associated with the font.
14785///
14786/// # Fields
14787///
14788/// * `font` - The fontable (Font or Graphics Context) to query.
14789#[derive(Clone, Copy, Default)]
14790#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14791#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14792pub struct QueryFontRequest {
14793    pub font: Fontable,
14794}
14795impl_debug_if_no_extra_traits!(QueryFontRequest, "QueryFontRequest");
14796impl QueryFontRequest {
14797    /// Serialize this request into bytes for the provided connection
14798    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
14799        let length_so_far = 0;
14800        let font_bytes = self.font.serialize();
14801        let mut request0 = vec![
14802            QUERY_FONT_REQUEST,
14803            0,
14804            0,
14805            0,
14806            font_bytes[0],
14807            font_bytes[1],
14808            font_bytes[2],
14809            font_bytes[3],
14810        ];
14811        let length_so_far = length_so_far + request0.len();
14812        assert_eq!(length_so_far % 4, 0);
14813        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
14814        request0[2..4].copy_from_slice(&length.to_ne_bytes());
14815        ([request0.into()], vec![])
14816    }
14817    /// Parse this request given its header, its body, and any fds that go along with it
14818    #[cfg(feature = "request-parsing")]
14819    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
14820        if header.major_opcode != QUERY_FONT_REQUEST {
14821            return Err(ParseError::InvalidValue);
14822        }
14823        let remaining = &[header.minor_opcode];
14824        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
14825        let _ = remaining;
14826        let (font, remaining) = Fontable::try_parse(value)?;
14827        let _ = remaining;
14828        Ok(QueryFontRequest {
14829            font,
14830        })
14831    }
14832}
14833impl Request for QueryFontRequest {
14834    const EXTENSION_NAME: Option<&'static str> = None;
14835
14836    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
14837        let (bufs, fds) = self.serialize();
14838        // Flatten the buffers into a single vector
14839        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
14840        (buf, fds)
14841    }
14842}
14843impl crate::x11_utils::ReplyRequest for QueryFontRequest {
14844    type Reply = QueryFontReply;
14845}
14846
14847/// # Fields
14848///
14849/// * `min_bounds` - minimum bounds over all existing char
14850/// * `max_bounds` - maximum bounds over all existing char
14851/// * `min_char_or_byte2` - first character
14852/// * `max_char_or_byte2` - last character
14853/// * `default_char` - char to print for undefined character
14854/// * `all_chars_exist` - flag if all characters have nonzero size
14855/// * `font_ascent` - baseline to top edge of raster
14856/// * `font_descent` - baseline to bottom edge of raster
14857/// * `draw_direction` -
14858#[derive(Clone, Default)]
14859#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14860#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14861pub struct QueryFontReply {
14862    pub sequence: u16,
14863    pub length: u32,
14864    pub min_bounds: Charinfo,
14865    pub max_bounds: Charinfo,
14866    pub min_char_or_byte2: u16,
14867    pub max_char_or_byte2: u16,
14868    pub default_char: u16,
14869    pub draw_direction: FontDraw,
14870    pub min_byte1: u8,
14871    pub max_byte1: u8,
14872    pub all_chars_exist: bool,
14873    pub font_ascent: i16,
14874    pub font_descent: i16,
14875    pub properties: Vec<Fontprop>,
14876    pub char_infos: Vec<Charinfo>,
14877}
14878impl_debug_if_no_extra_traits!(QueryFontReply, "QueryFontReply");
14879impl TryParse for QueryFontReply {
14880    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
14881        let remaining = initial_value;
14882        let (response_type, remaining) = u8::try_parse(remaining)?;
14883        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
14884        let (sequence, remaining) = u16::try_parse(remaining)?;
14885        let (length, remaining) = u32::try_parse(remaining)?;
14886        let (min_bounds, remaining) = Charinfo::try_parse(remaining)?;
14887        let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
14888        let (max_bounds, remaining) = Charinfo::try_parse(remaining)?;
14889        let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
14890        let (min_char_or_byte2, remaining) = u16::try_parse(remaining)?;
14891        let (max_char_or_byte2, remaining) = u16::try_parse(remaining)?;
14892        let (default_char, remaining) = u16::try_parse(remaining)?;
14893        let (properties_len, remaining) = u16::try_parse(remaining)?;
14894        let (draw_direction, remaining) = u8::try_parse(remaining)?;
14895        let (min_byte1, remaining) = u8::try_parse(remaining)?;
14896        let (max_byte1, remaining) = u8::try_parse(remaining)?;
14897        let (all_chars_exist, remaining) = bool::try_parse(remaining)?;
14898        let (font_ascent, remaining) = i16::try_parse(remaining)?;
14899        let (font_descent, remaining) = i16::try_parse(remaining)?;
14900        let (char_infos_len, remaining) = u32::try_parse(remaining)?;
14901        let (properties, remaining) = crate::x11_utils::parse_list::<Fontprop>(remaining, properties_len.try_to_usize()?)?;
14902        let (char_infos, remaining) = crate::x11_utils::parse_list::<Charinfo>(remaining, char_infos_len.try_to_usize()?)?;
14903        if response_type != 1 {
14904            return Err(ParseError::InvalidValue);
14905        }
14906        let draw_direction = draw_direction.into();
14907        let result = QueryFontReply { sequence, length, min_bounds, max_bounds, min_char_or_byte2, max_char_or_byte2, default_char, draw_direction, min_byte1, max_byte1, all_chars_exist, font_ascent, font_descent, properties, char_infos };
14908        let _ = remaining;
14909        let remaining = initial_value.get(32 + length as usize * 4..)
14910            .ok_or(ParseError::InsufficientData)?;
14911        Ok((result, remaining))
14912    }
14913}
14914impl Serialize for QueryFontReply {
14915    type Bytes = Vec<u8>;
14916    fn serialize(&self) -> Vec<u8> {
14917        let mut result = Vec::new();
14918        self.serialize_into(&mut result);
14919        result
14920    }
14921    fn serialize_into(&self, bytes: &mut Vec<u8>) {
14922        bytes.reserve(60);
14923        let response_type_bytes = &[1];
14924        bytes.push(response_type_bytes[0]);
14925        bytes.extend_from_slice(&[0; 1]);
14926        self.sequence.serialize_into(bytes);
14927        self.length.serialize_into(bytes);
14928        self.min_bounds.serialize_into(bytes);
14929        bytes.extend_from_slice(&[0; 4]);
14930        self.max_bounds.serialize_into(bytes);
14931        bytes.extend_from_slice(&[0; 4]);
14932        self.min_char_or_byte2.serialize_into(bytes);
14933        self.max_char_or_byte2.serialize_into(bytes);
14934        self.default_char.serialize_into(bytes);
14935        let properties_len = u16::try_from(self.properties.len()).expect("`properties` has too many elements");
14936        properties_len.serialize_into(bytes);
14937        u8::from(self.draw_direction).serialize_into(bytes);
14938        self.min_byte1.serialize_into(bytes);
14939        self.max_byte1.serialize_into(bytes);
14940        self.all_chars_exist.serialize_into(bytes);
14941        self.font_ascent.serialize_into(bytes);
14942        self.font_descent.serialize_into(bytes);
14943        let char_infos_len = u32::try_from(self.char_infos.len()).expect("`char_infos` has too many elements");
14944        char_infos_len.serialize_into(bytes);
14945        self.properties.serialize_into(bytes);
14946        self.char_infos.serialize_into(bytes);
14947    }
14948}
14949impl QueryFontReply {
14950    /// Get the value of the `properties_len` field.
14951    ///
14952    /// The `properties_len` field is used as the length field of the `properties` field.
14953    /// This function computes the field's value again based on the length of the list.
14954    ///
14955    /// # Panics
14956    ///
14957    /// Panics if the value cannot be represented in the target type. This
14958    /// cannot happen with values of the struct received from the X11 server.
14959    pub fn properties_len(&self) -> u16 {
14960        self.properties.len()
14961            .try_into().unwrap()
14962    }
14963    /// Get the value of the `char_infos_len` field.
14964    ///
14965    /// The `char_infos_len` field is used as the length field of the `char_infos` field.
14966    /// This function computes the field's value again based on the length of the list.
14967    ///
14968    /// # Panics
14969    ///
14970    /// Panics if the value cannot be represented in the target type. This
14971    /// cannot happen with values of the struct received from the X11 server.
14972    pub fn char_infos_len(&self) -> u32 {
14973        self.char_infos.len()
14974            .try_into().unwrap()
14975    }
14976}
14977
14978/// Opcode for the QueryTextExtents request
14979pub const QUERY_TEXT_EXTENTS_REQUEST: u8 = 48;
14980/// get text extents.
14981///
14982/// Query text extents from the X11 server. This request returns the bounding box
14983/// of the specified 16-bit character string in the specified `font` or the font
14984/// contained in the specified graphics context.
14985///
14986/// `font_ascent` is set to the maximum of the ascent metrics of all characters in
14987/// the string. `font_descent` is set to the maximum of the descent metrics.
14988/// `overall_width` is set to the sum of the character-width metrics of all
14989/// characters in the string. For each character in the string, let W be the sum of
14990/// the character-width metrics of all characters preceding it in the string. Let L
14991/// be the left-side-bearing metric of the character plus W. Let R be the
14992/// right-side-bearing metric of the character plus W. The lbearing member is set
14993/// to the minimum L of all characters in the string. The rbearing member is set to
14994/// the maximum R.
14995///
14996/// For fonts defined with linear indexing rather than 2-byte matrix indexing, each
14997/// `xcb_char2b_t` structure is interpreted as a 16-bit number with byte1 as the
14998/// most significant byte. If the font has no defined default character, undefined
14999/// characters in the string are taken to have all zero metrics.
15000///
15001/// Characters with all zero metrics are ignored. If the font has no defined
15002/// default_char, the undefined characters in the string are also ignored.
15003///
15004/// # Fields
15005///
15006/// * `font` - The `font` to calculate text extents in. You can also pass a graphics context.
15007/// * `string_len` - The number of characters in `string`.
15008/// * `string` - The text to get text extents for.
15009///
15010/// # Errors
15011///
15012/// * `GContext` - The specified graphics context does not exist.
15013/// * `Font` - The specified `font` does not exist.
15014#[derive(Clone, Default)]
15015#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15016#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15017pub struct QueryTextExtentsRequest<'input> {
15018    pub font: Fontable,
15019    pub string: Cow<'input, [Char2b]>,
15020}
15021impl_debug_if_no_extra_traits!(QueryTextExtentsRequest<'_>, "QueryTextExtentsRequest");
15022impl<'input> QueryTextExtentsRequest<'input> {
15023    /// Serialize this request into bytes for the provided connection
15024    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
15025        let string_len = u32::try_from(self.string.len()).unwrap();
15026        let length_so_far = 0;
15027        let odd_length = (u32::from(string_len) & 1u32) != 0;
15028        let odd_length_bytes = odd_length.serialize();
15029        let font_bytes = self.font.serialize();
15030        let mut request0 = vec![
15031            QUERY_TEXT_EXTENTS_REQUEST,
15032            odd_length_bytes[0],
15033            0,
15034            0,
15035            font_bytes[0],
15036            font_bytes[1],
15037            font_bytes[2],
15038            font_bytes[3],
15039        ];
15040        let length_so_far = length_so_far + request0.len();
15041        let string_bytes = self.string.serialize();
15042        let length_so_far = length_so_far + string_bytes.len();
15043        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
15044        let length_so_far = length_so_far + padding0.len();
15045        assert_eq!(length_so_far % 4, 0);
15046        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
15047        request0[2..4].copy_from_slice(&length.to_ne_bytes());
15048        ([request0.into(), string_bytes.into(), padding0.into()], vec![])
15049    }
15050    /// Parse this request given its header, its body, and any fds that go along with it
15051    #[cfg(feature = "request-parsing")]
15052    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
15053        if header.major_opcode != QUERY_TEXT_EXTENTS_REQUEST {
15054            return Err(ParseError::InvalidValue);
15055        }
15056        let remaining = &[header.minor_opcode];
15057        let (odd_length, remaining) = bool::try_parse(remaining)?;
15058        let _ = remaining;
15059        let (font, remaining) = Fontable::try_parse(value)?;
15060        let mut remaining = remaining;
15061        // Length is 'everything left in the input'
15062        let mut string = Vec::new();
15063        while !remaining.is_empty() {
15064            let (v, new_remaining) = Char2b::try_parse(remaining)?;
15065            remaining = new_remaining;
15066            string.push(v);
15067        }
15068        let _ = remaining;
15069        if odd_length {
15070            if string.is_empty() {
15071                return Err(ParseError::InvalidValue);
15072            }
15073            string.truncate(string.len() - 1);
15074        }
15075        Ok(QueryTextExtentsRequest {
15076            font,
15077            string: Cow::Owned(string),
15078        })
15079    }
15080    /// Clone all borrowed data in this QueryTextExtentsRequest.
15081    pub fn into_owned(self) -> QueryTextExtentsRequest<'static> {
15082        QueryTextExtentsRequest {
15083            font: self.font,
15084            string: Cow::Owned(self.string.into_owned()),
15085        }
15086    }
15087}
15088impl<'input> Request for QueryTextExtentsRequest<'input> {
15089    const EXTENSION_NAME: Option<&'static str> = None;
15090
15091    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
15092        let (bufs, fds) = self.serialize();
15093        // Flatten the buffers into a single vector
15094        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
15095        (buf, fds)
15096    }
15097}
15098impl<'input> crate::x11_utils::ReplyRequest for QueryTextExtentsRequest<'input> {
15099    type Reply = QueryTextExtentsReply;
15100}
15101
15102#[derive(Clone, Copy, Default)]
15103#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15104#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15105pub struct QueryTextExtentsReply {
15106    pub draw_direction: FontDraw,
15107    pub sequence: u16,
15108    pub length: u32,
15109    pub font_ascent: i16,
15110    pub font_descent: i16,
15111    pub overall_ascent: i16,
15112    pub overall_descent: i16,
15113    pub overall_width: i32,
15114    pub overall_left: i32,
15115    pub overall_right: i32,
15116}
15117impl_debug_if_no_extra_traits!(QueryTextExtentsReply, "QueryTextExtentsReply");
15118impl TryParse for QueryTextExtentsReply {
15119    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
15120        let remaining = initial_value;
15121        let (response_type, remaining) = u8::try_parse(remaining)?;
15122        let (draw_direction, remaining) = u8::try_parse(remaining)?;
15123        let (sequence, remaining) = u16::try_parse(remaining)?;
15124        let (length, remaining) = u32::try_parse(remaining)?;
15125        let (font_ascent, remaining) = i16::try_parse(remaining)?;
15126        let (font_descent, remaining) = i16::try_parse(remaining)?;
15127        let (overall_ascent, remaining) = i16::try_parse(remaining)?;
15128        let (overall_descent, remaining) = i16::try_parse(remaining)?;
15129        let (overall_width, remaining) = i32::try_parse(remaining)?;
15130        let (overall_left, remaining) = i32::try_parse(remaining)?;
15131        let (overall_right, remaining) = i32::try_parse(remaining)?;
15132        if response_type != 1 {
15133            return Err(ParseError::InvalidValue);
15134        }
15135        let draw_direction = draw_direction.into();
15136        let result = QueryTextExtentsReply { draw_direction, sequence, length, font_ascent, font_descent, overall_ascent, overall_descent, overall_width, overall_left, overall_right };
15137        let _ = remaining;
15138        let remaining = initial_value.get(32 + length as usize * 4..)
15139            .ok_or(ParseError::InsufficientData)?;
15140        Ok((result, remaining))
15141    }
15142}
15143impl Serialize for QueryTextExtentsReply {
15144    type Bytes = [u8; 28];
15145    fn serialize(&self) -> [u8; 28] {
15146        let response_type_bytes = &[1];
15147        let draw_direction_bytes = u8::from(self.draw_direction).serialize();
15148        let sequence_bytes = self.sequence.serialize();
15149        let length_bytes = self.length.serialize();
15150        let font_ascent_bytes = self.font_ascent.serialize();
15151        let font_descent_bytes = self.font_descent.serialize();
15152        let overall_ascent_bytes = self.overall_ascent.serialize();
15153        let overall_descent_bytes = self.overall_descent.serialize();
15154        let overall_width_bytes = self.overall_width.serialize();
15155        let overall_left_bytes = self.overall_left.serialize();
15156        let overall_right_bytes = self.overall_right.serialize();
15157        [
15158            response_type_bytes[0],
15159            draw_direction_bytes[0],
15160            sequence_bytes[0],
15161            sequence_bytes[1],
15162            length_bytes[0],
15163            length_bytes[1],
15164            length_bytes[2],
15165            length_bytes[3],
15166            font_ascent_bytes[0],
15167            font_ascent_bytes[1],
15168            font_descent_bytes[0],
15169            font_descent_bytes[1],
15170            overall_ascent_bytes[0],
15171            overall_ascent_bytes[1],
15172            overall_descent_bytes[0],
15173            overall_descent_bytes[1],
15174            overall_width_bytes[0],
15175            overall_width_bytes[1],
15176            overall_width_bytes[2],
15177            overall_width_bytes[3],
15178            overall_left_bytes[0],
15179            overall_left_bytes[1],
15180            overall_left_bytes[2],
15181            overall_left_bytes[3],
15182            overall_right_bytes[0],
15183            overall_right_bytes[1],
15184            overall_right_bytes[2],
15185            overall_right_bytes[3],
15186        ]
15187    }
15188    fn serialize_into(&self, bytes: &mut Vec<u8>) {
15189        bytes.reserve(28);
15190        let response_type_bytes = &[1];
15191        bytes.push(response_type_bytes[0]);
15192        u8::from(self.draw_direction).serialize_into(bytes);
15193        self.sequence.serialize_into(bytes);
15194        self.length.serialize_into(bytes);
15195        self.font_ascent.serialize_into(bytes);
15196        self.font_descent.serialize_into(bytes);
15197        self.overall_ascent.serialize_into(bytes);
15198        self.overall_descent.serialize_into(bytes);
15199        self.overall_width.serialize_into(bytes);
15200        self.overall_left.serialize_into(bytes);
15201        self.overall_right.serialize_into(bytes);
15202    }
15203}
15204
15205#[derive(Clone, Default)]
15206#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15207#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15208pub struct Str {
15209    pub name: Vec<u8>,
15210}
15211impl_debug_if_no_extra_traits!(Str, "Str");
15212impl TryParse for Str {
15213    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
15214        let (name_len, remaining) = u8::try_parse(remaining)?;
15215        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_len.try_to_usize()?)?;
15216        let name = name.to_vec();
15217        let result = Str { name };
15218        Ok((result, remaining))
15219    }
15220}
15221impl Serialize for Str {
15222    type Bytes = Vec<u8>;
15223    fn serialize(&self) -> Vec<u8> {
15224        let mut result = Vec::new();
15225        self.serialize_into(&mut result);
15226        result
15227    }
15228    fn serialize_into(&self, bytes: &mut Vec<u8>) {
15229        let name_len = u8::try_from(self.name.len()).expect("`name` has too many elements");
15230        name_len.serialize_into(bytes);
15231        bytes.extend_from_slice(&self.name);
15232    }
15233}
15234impl Str {
15235    /// Get the value of the `name_len` field.
15236    ///
15237    /// The `name_len` field is used as the length field of the `name` field.
15238    /// This function computes the field's value again based on the length of the list.
15239    ///
15240    /// # Panics
15241    ///
15242    /// Panics if the value cannot be represented in the target type. This
15243    /// cannot happen with values of the struct received from the X11 server.
15244    pub fn name_len(&self) -> u8 {
15245        self.name.len()
15246            .try_into().unwrap()
15247    }
15248}
15249
15250/// Opcode for the ListFonts request
15251pub const LIST_FONTS_REQUEST: u8 = 49;
15252/// get matching font names.
15253///
15254/// Gets a list of available font names which match the given `pattern`.
15255///
15256/// # Fields
15257///
15258/// * `pattern` - A font pattern, for example "-misc-fixed-*".
15259///
15260/// The asterisk (*) is a wildcard for any number of characters. The question mark
15261/// (?) is a wildcard for a single character. Use of uppercase or lowercase does
15262/// not matter.
15263/// * `max_names` - The maximum number of fonts to be returned.
15264#[derive(Clone, Default)]
15265#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15266#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15267pub struct ListFontsRequest<'input> {
15268    pub max_names: u16,
15269    pub pattern: Cow<'input, [u8]>,
15270}
15271impl_debug_if_no_extra_traits!(ListFontsRequest<'_>, "ListFontsRequest");
15272impl<'input> ListFontsRequest<'input> {
15273    /// Serialize this request into bytes for the provided connection
15274    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
15275        let length_so_far = 0;
15276        let max_names_bytes = self.max_names.serialize();
15277        let pattern_len = u16::try_from(self.pattern.len()).expect("`pattern` has too many elements");
15278        let pattern_len_bytes = pattern_len.serialize();
15279        let mut request0 = vec![
15280            LIST_FONTS_REQUEST,
15281            0,
15282            0,
15283            0,
15284            max_names_bytes[0],
15285            max_names_bytes[1],
15286            pattern_len_bytes[0],
15287            pattern_len_bytes[1],
15288        ];
15289        let length_so_far = length_so_far + request0.len();
15290        let length_so_far = length_so_far + self.pattern.len();
15291        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
15292        let length_so_far = length_so_far + padding0.len();
15293        assert_eq!(length_so_far % 4, 0);
15294        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
15295        request0[2..4].copy_from_slice(&length.to_ne_bytes());
15296        ([request0.into(), self.pattern, padding0.into()], vec![])
15297    }
15298    /// Parse this request given its header, its body, and any fds that go along with it
15299    #[cfg(feature = "request-parsing")]
15300    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
15301        if header.major_opcode != LIST_FONTS_REQUEST {
15302            return Err(ParseError::InvalidValue);
15303        }
15304        let remaining = &[header.minor_opcode];
15305        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
15306        let _ = remaining;
15307        let (max_names, remaining) = u16::try_parse(value)?;
15308        let (pattern_len, remaining) = u16::try_parse(remaining)?;
15309        let (pattern, remaining) = crate::x11_utils::parse_u8_list(remaining, pattern_len.try_to_usize()?)?;
15310        let _ = remaining;
15311        Ok(ListFontsRequest {
15312            max_names,
15313            pattern: Cow::Borrowed(pattern),
15314        })
15315    }
15316    /// Clone all borrowed data in this ListFontsRequest.
15317    pub fn into_owned(self) -> ListFontsRequest<'static> {
15318        ListFontsRequest {
15319            max_names: self.max_names,
15320            pattern: Cow::Owned(self.pattern.into_owned()),
15321        }
15322    }
15323}
15324impl<'input> Request for ListFontsRequest<'input> {
15325    const EXTENSION_NAME: Option<&'static str> = None;
15326
15327    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
15328        let (bufs, fds) = self.serialize();
15329        // Flatten the buffers into a single vector
15330        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
15331        (buf, fds)
15332    }
15333}
15334impl<'input> crate::x11_utils::ReplyRequest for ListFontsRequest<'input> {
15335    type Reply = ListFontsReply;
15336}
15337
15338/// # Fields
15339///
15340#[derive(Clone, Default)]
15341#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15342#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15343pub struct ListFontsReply {
15344    pub sequence: u16,
15345    pub length: u32,
15346    pub names: Vec<Str>,
15347}
15348impl_debug_if_no_extra_traits!(ListFontsReply, "ListFontsReply");
15349impl TryParse for ListFontsReply {
15350    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
15351        let remaining = initial_value;
15352        let (response_type, remaining) = u8::try_parse(remaining)?;
15353        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
15354        let (sequence, remaining) = u16::try_parse(remaining)?;
15355        let (length, remaining) = u32::try_parse(remaining)?;
15356        let (names_len, remaining) = u16::try_parse(remaining)?;
15357        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
15358        let (names, remaining) = crate::x11_utils::parse_list::<Str>(remaining, names_len.try_to_usize()?)?;
15359        if response_type != 1 {
15360            return Err(ParseError::InvalidValue);
15361        }
15362        let result = ListFontsReply { sequence, length, names };
15363        let _ = remaining;
15364        let remaining = initial_value.get(32 + length as usize * 4..)
15365            .ok_or(ParseError::InsufficientData)?;
15366        Ok((result, remaining))
15367    }
15368}
15369impl Serialize for ListFontsReply {
15370    type Bytes = Vec<u8>;
15371    fn serialize(&self) -> Vec<u8> {
15372        let mut result = Vec::new();
15373        self.serialize_into(&mut result);
15374        result
15375    }
15376    fn serialize_into(&self, bytes: &mut Vec<u8>) {
15377        bytes.reserve(32);
15378        let response_type_bytes = &[1];
15379        bytes.push(response_type_bytes[0]);
15380        bytes.extend_from_slice(&[0; 1]);
15381        self.sequence.serialize_into(bytes);
15382        self.length.serialize_into(bytes);
15383        let names_len = u16::try_from(self.names.len()).expect("`names` has too many elements");
15384        names_len.serialize_into(bytes);
15385        bytes.extend_from_slice(&[0; 22]);
15386        self.names.serialize_into(bytes);
15387    }
15388}
15389impl ListFontsReply {
15390    /// Get the value of the `names_len` field.
15391    ///
15392    /// The `names_len` field is used as the length field of the `names` field.
15393    /// This function computes the field's value again based on the length of the list.
15394    ///
15395    /// # Panics
15396    ///
15397    /// Panics if the value cannot be represented in the target type. This
15398    /// cannot happen with values of the struct received from the X11 server.
15399    pub fn names_len(&self) -> u16 {
15400        self.names.len()
15401            .try_into().unwrap()
15402    }
15403}
15404
15405/// Opcode for the ListFontsWithInfo request
15406pub const LIST_FONTS_WITH_INFO_REQUEST: u8 = 50;
15407/// get matching font names and information.
15408///
15409/// Gets a list of available font names which match the given `pattern`.
15410///
15411/// # Fields
15412///
15413/// * `pattern` - A font pattern, for example "-misc-fixed-*".
15414///
15415/// The asterisk (*) is a wildcard for any number of characters. The question mark
15416/// (?) is a wildcard for a single character. Use of uppercase or lowercase does
15417/// not matter.
15418/// * `max_names` - The maximum number of fonts to be returned.
15419#[derive(Clone, Default)]
15420#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15421#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15422pub struct ListFontsWithInfoRequest<'input> {
15423    pub max_names: u16,
15424    pub pattern: Cow<'input, [u8]>,
15425}
15426impl_debug_if_no_extra_traits!(ListFontsWithInfoRequest<'_>, "ListFontsWithInfoRequest");
15427impl<'input> ListFontsWithInfoRequest<'input> {
15428    /// Serialize this request into bytes for the provided connection
15429    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
15430        let length_so_far = 0;
15431        let max_names_bytes = self.max_names.serialize();
15432        let pattern_len = u16::try_from(self.pattern.len()).expect("`pattern` has too many elements");
15433        let pattern_len_bytes = pattern_len.serialize();
15434        let mut request0 = vec![
15435            LIST_FONTS_WITH_INFO_REQUEST,
15436            0,
15437            0,
15438            0,
15439            max_names_bytes[0],
15440            max_names_bytes[1],
15441            pattern_len_bytes[0],
15442            pattern_len_bytes[1],
15443        ];
15444        let length_so_far = length_so_far + request0.len();
15445        let length_so_far = length_so_far + self.pattern.len();
15446        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
15447        let length_so_far = length_so_far + padding0.len();
15448        assert_eq!(length_so_far % 4, 0);
15449        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
15450        request0[2..4].copy_from_slice(&length.to_ne_bytes());
15451        ([request0.into(), self.pattern, padding0.into()], vec![])
15452    }
15453    /// Parse this request given its header, its body, and any fds that go along with it
15454    #[cfg(feature = "request-parsing")]
15455    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
15456        if header.major_opcode != LIST_FONTS_WITH_INFO_REQUEST {
15457            return Err(ParseError::InvalidValue);
15458        }
15459        let remaining = &[header.minor_opcode];
15460        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
15461        let _ = remaining;
15462        let (max_names, remaining) = u16::try_parse(value)?;
15463        let (pattern_len, remaining) = u16::try_parse(remaining)?;
15464        let (pattern, remaining) = crate::x11_utils::parse_u8_list(remaining, pattern_len.try_to_usize()?)?;
15465        let _ = remaining;
15466        Ok(ListFontsWithInfoRequest {
15467            max_names,
15468            pattern: Cow::Borrowed(pattern),
15469        })
15470    }
15471    /// Clone all borrowed data in this ListFontsWithInfoRequest.
15472    pub fn into_owned(self) -> ListFontsWithInfoRequest<'static> {
15473        ListFontsWithInfoRequest {
15474            max_names: self.max_names,
15475            pattern: Cow::Owned(self.pattern.into_owned()),
15476        }
15477    }
15478}
15479impl<'input> Request for ListFontsWithInfoRequest<'input> {
15480    const EXTENSION_NAME: Option<&'static str> = None;
15481
15482    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
15483        let (bufs, fds) = self.serialize();
15484        // Flatten the buffers into a single vector
15485        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
15486        (buf, fds)
15487    }
15488}
15489impl<'input> crate::x11_utils::ReplyRequest for ListFontsWithInfoRequest<'input> {
15490    type Reply = ListFontsWithInfoReply;
15491}
15492
15493/// # Fields
15494///
15495/// * `min_bounds` - minimum bounds over all existing char
15496/// * `max_bounds` - maximum bounds over all existing char
15497/// * `min_char_or_byte2` - first character
15498/// * `max_char_or_byte2` - last character
15499/// * `default_char` - char to print for undefined character
15500/// * `all_chars_exist` - flag if all characters have nonzero size
15501/// * `font_ascent` - baseline to top edge of raster
15502/// * `font_descent` - baseline to bottom edge of raster
15503/// * `replies_hint` - An indication of how many more fonts will be returned. This is only a hint and
15504/// may be larger or smaller than the number of fonts actually returned. A zero
15505/// value does not guarantee that no more fonts will be returned.
15506/// * `draw_direction` -
15507#[derive(Clone, Default)]
15508#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15509#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15510pub struct ListFontsWithInfoReply {
15511    pub sequence: u16,
15512    pub length: u32,
15513    pub min_bounds: Charinfo,
15514    pub max_bounds: Charinfo,
15515    pub min_char_or_byte2: u16,
15516    pub max_char_or_byte2: u16,
15517    pub default_char: u16,
15518    pub draw_direction: FontDraw,
15519    pub min_byte1: u8,
15520    pub max_byte1: u8,
15521    pub all_chars_exist: bool,
15522    pub font_ascent: i16,
15523    pub font_descent: i16,
15524    pub replies_hint: u32,
15525    pub properties: Vec<Fontprop>,
15526    pub name: Vec<u8>,
15527}
15528impl_debug_if_no_extra_traits!(ListFontsWithInfoReply, "ListFontsWithInfoReply");
15529impl TryParse for ListFontsWithInfoReply {
15530    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
15531        let remaining = initial_value;
15532        let (response_type, remaining) = u8::try_parse(remaining)?;
15533        let (name_len, remaining) = u8::try_parse(remaining)?;
15534        let (sequence, remaining) = u16::try_parse(remaining)?;
15535        let (length, remaining) = u32::try_parse(remaining)?;
15536        let (min_bounds, remaining) = Charinfo::try_parse(remaining)?;
15537        let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
15538        let (max_bounds, remaining) = Charinfo::try_parse(remaining)?;
15539        let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
15540        let (min_char_or_byte2, remaining) = u16::try_parse(remaining)?;
15541        let (max_char_or_byte2, remaining) = u16::try_parse(remaining)?;
15542        let (default_char, remaining) = u16::try_parse(remaining)?;
15543        let (properties_len, remaining) = u16::try_parse(remaining)?;
15544        let (draw_direction, remaining) = u8::try_parse(remaining)?;
15545        let (min_byte1, remaining) = u8::try_parse(remaining)?;
15546        let (max_byte1, remaining) = u8::try_parse(remaining)?;
15547        let (all_chars_exist, remaining) = bool::try_parse(remaining)?;
15548        let (font_ascent, remaining) = i16::try_parse(remaining)?;
15549        let (font_descent, remaining) = i16::try_parse(remaining)?;
15550        let (replies_hint, remaining) = u32::try_parse(remaining)?;
15551        let (properties, remaining) = crate::x11_utils::parse_list::<Fontprop>(remaining, properties_len.try_to_usize()?)?;
15552        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_len.try_to_usize()?)?;
15553        let name = name.to_vec();
15554        if response_type != 1 {
15555            return Err(ParseError::InvalidValue);
15556        }
15557        let draw_direction = draw_direction.into();
15558        let result = ListFontsWithInfoReply { sequence, length, min_bounds, max_bounds, min_char_or_byte2, max_char_or_byte2, default_char, draw_direction, min_byte1, max_byte1, all_chars_exist, font_ascent, font_descent, replies_hint, properties, name };
15559        let _ = remaining;
15560        let remaining = initial_value.get(32 + length as usize * 4..)
15561            .ok_or(ParseError::InsufficientData)?;
15562        Ok((result, remaining))
15563    }
15564}
15565impl Serialize for ListFontsWithInfoReply {
15566    type Bytes = Vec<u8>;
15567    fn serialize(&self) -> Vec<u8> {
15568        let mut result = Vec::new();
15569        self.serialize_into(&mut result);
15570        result
15571    }
15572    fn serialize_into(&self, bytes: &mut Vec<u8>) {
15573        bytes.reserve(60);
15574        let response_type_bytes = &[1];
15575        bytes.push(response_type_bytes[0]);
15576        let name_len = u8::try_from(self.name.len()).expect("`name` has too many elements");
15577        name_len.serialize_into(bytes);
15578        self.sequence.serialize_into(bytes);
15579        self.length.serialize_into(bytes);
15580        self.min_bounds.serialize_into(bytes);
15581        bytes.extend_from_slice(&[0; 4]);
15582        self.max_bounds.serialize_into(bytes);
15583        bytes.extend_from_slice(&[0; 4]);
15584        self.min_char_or_byte2.serialize_into(bytes);
15585        self.max_char_or_byte2.serialize_into(bytes);
15586        self.default_char.serialize_into(bytes);
15587        let properties_len = u16::try_from(self.properties.len()).expect("`properties` has too many elements");
15588        properties_len.serialize_into(bytes);
15589        u8::from(self.draw_direction).serialize_into(bytes);
15590        self.min_byte1.serialize_into(bytes);
15591        self.max_byte1.serialize_into(bytes);
15592        self.all_chars_exist.serialize_into(bytes);
15593        self.font_ascent.serialize_into(bytes);
15594        self.font_descent.serialize_into(bytes);
15595        self.replies_hint.serialize_into(bytes);
15596        self.properties.serialize_into(bytes);
15597        bytes.extend_from_slice(&self.name);
15598    }
15599}
15600impl ListFontsWithInfoReply {
15601    /// Get the value of the `name_len` field.
15602    ///
15603    /// The `name_len` field is used as the length field of the `name` field.
15604    /// This function computes the field's value again based on the length of the list.
15605    ///
15606    /// # Panics
15607    ///
15608    /// Panics if the value cannot be represented in the target type. This
15609    /// cannot happen with values of the struct received from the X11 server.
15610    pub fn name_len(&self) -> u8 {
15611        self.name.len()
15612            .try_into().unwrap()
15613    }
15614    /// Get the value of the `properties_len` field.
15615    ///
15616    /// The `properties_len` field is used as the length field of the `properties` field.
15617    /// This function computes the field's value again based on the length of the list.
15618    ///
15619    /// # Panics
15620    ///
15621    /// Panics if the value cannot be represented in the target type. This
15622    /// cannot happen with values of the struct received from the X11 server.
15623    pub fn properties_len(&self) -> u16 {
15624        self.properties.len()
15625            .try_into().unwrap()
15626    }
15627}
15628
15629/// Opcode for the SetFontPath request
15630pub const SET_FONT_PATH_REQUEST: u8 = 51;
15631#[derive(Clone, Default)]
15632#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15633#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15634pub struct SetFontPathRequest<'input> {
15635    pub font: Cow<'input, [Str]>,
15636}
15637impl_debug_if_no_extra_traits!(SetFontPathRequest<'_>, "SetFontPathRequest");
15638impl<'input> SetFontPathRequest<'input> {
15639    /// Serialize this request into bytes for the provided connection
15640    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
15641        let length_so_far = 0;
15642        let font_qty = u16::try_from(self.font.len()).expect("`font` has too many elements");
15643        let font_qty_bytes = font_qty.serialize();
15644        let mut request0 = vec![
15645            SET_FONT_PATH_REQUEST,
15646            0,
15647            0,
15648            0,
15649            font_qty_bytes[0],
15650            font_qty_bytes[1],
15651            0,
15652            0,
15653        ];
15654        let length_so_far = length_so_far + request0.len();
15655        let font_bytes = self.font.serialize();
15656        let length_so_far = length_so_far + font_bytes.len();
15657        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
15658        let length_so_far = length_so_far + padding0.len();
15659        assert_eq!(length_so_far % 4, 0);
15660        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
15661        request0[2..4].copy_from_slice(&length.to_ne_bytes());
15662        ([request0.into(), font_bytes.into(), padding0.into()], vec![])
15663    }
15664    /// Parse this request given its header, its body, and any fds that go along with it
15665    #[cfg(feature = "request-parsing")]
15666    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
15667        if header.major_opcode != SET_FONT_PATH_REQUEST {
15668            return Err(ParseError::InvalidValue);
15669        }
15670        let remaining = &[header.minor_opcode];
15671        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
15672        let _ = remaining;
15673        let (font_qty, remaining) = u16::try_parse(value)?;
15674        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
15675        let (font, remaining) = crate::x11_utils::parse_list::<Str>(remaining, font_qty.try_to_usize()?)?;
15676        let _ = remaining;
15677        Ok(SetFontPathRequest {
15678            font: Cow::Owned(font),
15679        })
15680    }
15681    /// Clone all borrowed data in this SetFontPathRequest.
15682    pub fn into_owned(self) -> SetFontPathRequest<'static> {
15683        SetFontPathRequest {
15684            font: Cow::Owned(self.font.into_owned()),
15685        }
15686    }
15687}
15688impl<'input> Request for SetFontPathRequest<'input> {
15689    const EXTENSION_NAME: Option<&'static str> = None;
15690
15691    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
15692        let (bufs, fds) = self.serialize();
15693        // Flatten the buffers into a single vector
15694        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
15695        (buf, fds)
15696    }
15697}
15698impl<'input> crate::x11_utils::VoidRequest for SetFontPathRequest<'input> {
15699}
15700
15701/// Opcode for the GetFontPath request
15702pub const GET_FONT_PATH_REQUEST: u8 = 52;
15703#[derive(Clone, Copy, Default)]
15704#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15705#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15706pub struct GetFontPathRequest;
15707impl_debug_if_no_extra_traits!(GetFontPathRequest, "GetFontPathRequest");
15708impl GetFontPathRequest {
15709    /// Serialize this request into bytes for the provided connection
15710    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
15711        let length_so_far = 0;
15712        let mut request0 = vec![
15713            GET_FONT_PATH_REQUEST,
15714            0,
15715            0,
15716            0,
15717        ];
15718        let length_so_far = length_so_far + request0.len();
15719        assert_eq!(length_so_far % 4, 0);
15720        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
15721        request0[2..4].copy_from_slice(&length.to_ne_bytes());
15722        ([request0.into()], vec![])
15723    }
15724    /// Parse this request given its header, its body, and any fds that go along with it
15725    #[cfg(feature = "request-parsing")]
15726    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
15727        if header.major_opcode != GET_FONT_PATH_REQUEST {
15728            return Err(ParseError::InvalidValue);
15729        }
15730        let remaining = &[header.minor_opcode];
15731        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
15732        let _ = remaining;
15733        let _ = value;
15734        Ok(GetFontPathRequest
15735        )
15736    }
15737}
15738impl Request for GetFontPathRequest {
15739    const EXTENSION_NAME: Option<&'static str> = None;
15740
15741    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
15742        let (bufs, fds) = self.serialize();
15743        // Flatten the buffers into a single vector
15744        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
15745        (buf, fds)
15746    }
15747}
15748impl crate::x11_utils::ReplyRequest for GetFontPathRequest {
15749    type Reply = GetFontPathReply;
15750}
15751
15752#[derive(Clone, Default)]
15753#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15754#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15755pub struct GetFontPathReply {
15756    pub sequence: u16,
15757    pub length: u32,
15758    pub path: Vec<Str>,
15759}
15760impl_debug_if_no_extra_traits!(GetFontPathReply, "GetFontPathReply");
15761impl TryParse for GetFontPathReply {
15762    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
15763        let remaining = initial_value;
15764        let (response_type, remaining) = u8::try_parse(remaining)?;
15765        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
15766        let (sequence, remaining) = u16::try_parse(remaining)?;
15767        let (length, remaining) = u32::try_parse(remaining)?;
15768        let (path_len, remaining) = u16::try_parse(remaining)?;
15769        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
15770        let (path, remaining) = crate::x11_utils::parse_list::<Str>(remaining, path_len.try_to_usize()?)?;
15771        if response_type != 1 {
15772            return Err(ParseError::InvalidValue);
15773        }
15774        let result = GetFontPathReply { sequence, length, path };
15775        let _ = remaining;
15776        let remaining = initial_value.get(32 + length as usize * 4..)
15777            .ok_or(ParseError::InsufficientData)?;
15778        Ok((result, remaining))
15779    }
15780}
15781impl Serialize for GetFontPathReply {
15782    type Bytes = Vec<u8>;
15783    fn serialize(&self) -> Vec<u8> {
15784        let mut result = Vec::new();
15785        self.serialize_into(&mut result);
15786        result
15787    }
15788    fn serialize_into(&self, bytes: &mut Vec<u8>) {
15789        bytes.reserve(32);
15790        let response_type_bytes = &[1];
15791        bytes.push(response_type_bytes[0]);
15792        bytes.extend_from_slice(&[0; 1]);
15793        self.sequence.serialize_into(bytes);
15794        self.length.serialize_into(bytes);
15795        let path_len = u16::try_from(self.path.len()).expect("`path` has too many elements");
15796        path_len.serialize_into(bytes);
15797        bytes.extend_from_slice(&[0; 22]);
15798        self.path.serialize_into(bytes);
15799    }
15800}
15801impl GetFontPathReply {
15802    /// Get the value of the `path_len` field.
15803    ///
15804    /// The `path_len` field is used as the length field of the `path` field.
15805    /// This function computes the field's value again based on the length of the list.
15806    ///
15807    /// # Panics
15808    ///
15809    /// Panics if the value cannot be represented in the target type. This
15810    /// cannot happen with values of the struct received from the X11 server.
15811    pub fn path_len(&self) -> u16 {
15812        self.path.len()
15813            .try_into().unwrap()
15814    }
15815}
15816
15817/// Opcode for the CreatePixmap request
15818pub const CREATE_PIXMAP_REQUEST: u8 = 53;
15819/// Creates a pixmap.
15820///
15821/// Creates a pixmap. The pixmap can only be used on the same screen as `drawable`
15822/// is on and only with drawables of the same `depth`.
15823///
15824/// # Fields
15825///
15826/// * `depth` - TODO
15827/// * `pid` - The ID with which you will refer to the new pixmap, created by
15828/// `xcb_generate_id`.
15829/// * `drawable` - Drawable to get the screen from.
15830/// * `width` - The width of the new pixmap.
15831/// * `height` - The height of the new pixmap.
15832///
15833/// # Errors
15834///
15835/// * `Value` - TODO: reasons?
15836/// * `Drawable` - The specified `drawable` (Window or Pixmap) does not exist.
15837/// * `Alloc` - The X server could not allocate the requested resources (no memory?).
15838///
15839/// # See
15840///
15841/// * `xcb_generate_id`: function
15842#[derive(Clone, Copy, Default)]
15843#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15844#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15845pub struct CreatePixmapRequest {
15846    pub depth: u8,
15847    pub pid: Pixmap,
15848    pub drawable: Drawable,
15849    pub width: u16,
15850    pub height: u16,
15851}
15852impl_debug_if_no_extra_traits!(CreatePixmapRequest, "CreatePixmapRequest");
15853impl CreatePixmapRequest {
15854    /// Serialize this request into bytes for the provided connection
15855    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
15856        let length_so_far = 0;
15857        let depth_bytes = self.depth.serialize();
15858        let pid_bytes = self.pid.serialize();
15859        let drawable_bytes = self.drawable.serialize();
15860        let width_bytes = self.width.serialize();
15861        let height_bytes = self.height.serialize();
15862        let mut request0 = vec![
15863            CREATE_PIXMAP_REQUEST,
15864            depth_bytes[0],
15865            0,
15866            0,
15867            pid_bytes[0],
15868            pid_bytes[1],
15869            pid_bytes[2],
15870            pid_bytes[3],
15871            drawable_bytes[0],
15872            drawable_bytes[1],
15873            drawable_bytes[2],
15874            drawable_bytes[3],
15875            width_bytes[0],
15876            width_bytes[1],
15877            height_bytes[0],
15878            height_bytes[1],
15879        ];
15880        let length_so_far = length_so_far + request0.len();
15881        assert_eq!(length_so_far % 4, 0);
15882        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
15883        request0[2..4].copy_from_slice(&length.to_ne_bytes());
15884        ([request0.into()], vec![])
15885    }
15886    /// Parse this request given its header, its body, and any fds that go along with it
15887    #[cfg(feature = "request-parsing")]
15888    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
15889        if header.major_opcode != CREATE_PIXMAP_REQUEST {
15890            return Err(ParseError::InvalidValue);
15891        }
15892        let remaining = &[header.minor_opcode];
15893        let (depth, remaining) = u8::try_parse(remaining)?;
15894        let _ = remaining;
15895        let (pid, remaining) = Pixmap::try_parse(value)?;
15896        let (drawable, remaining) = Drawable::try_parse(remaining)?;
15897        let (width, remaining) = u16::try_parse(remaining)?;
15898        let (height, remaining) = u16::try_parse(remaining)?;
15899        let _ = remaining;
15900        Ok(CreatePixmapRequest {
15901            depth,
15902            pid,
15903            drawable,
15904            width,
15905            height,
15906        })
15907    }
15908}
15909impl Request for CreatePixmapRequest {
15910    const EXTENSION_NAME: Option<&'static str> = None;
15911
15912    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
15913        let (bufs, fds) = self.serialize();
15914        // Flatten the buffers into a single vector
15915        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
15916        (buf, fds)
15917    }
15918}
15919impl crate::x11_utils::VoidRequest for CreatePixmapRequest {
15920}
15921
15922/// Opcode for the FreePixmap request
15923pub const FREE_PIXMAP_REQUEST: u8 = 54;
15924/// Destroys a pixmap.
15925///
15926/// Deletes the association between the pixmap ID and the pixmap. The pixmap
15927/// storage will be freed when there are no more references to it.
15928///
15929/// # Fields
15930///
15931/// * `pixmap` - The pixmap to destroy.
15932///
15933/// # Errors
15934///
15935/// * `Pixmap` - The specified pixmap does not exist.
15936#[derive(Clone, Copy, Default)]
15937#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15938#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15939pub struct FreePixmapRequest {
15940    pub pixmap: Pixmap,
15941}
15942impl_debug_if_no_extra_traits!(FreePixmapRequest, "FreePixmapRequest");
15943impl FreePixmapRequest {
15944    /// Serialize this request into bytes for the provided connection
15945    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
15946        let length_so_far = 0;
15947        let pixmap_bytes = self.pixmap.serialize();
15948        let mut request0 = vec![
15949            FREE_PIXMAP_REQUEST,
15950            0,
15951            0,
15952            0,
15953            pixmap_bytes[0],
15954            pixmap_bytes[1],
15955            pixmap_bytes[2],
15956            pixmap_bytes[3],
15957        ];
15958        let length_so_far = length_so_far + request0.len();
15959        assert_eq!(length_so_far % 4, 0);
15960        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
15961        request0[2..4].copy_from_slice(&length.to_ne_bytes());
15962        ([request0.into()], vec![])
15963    }
15964    /// Parse this request given its header, its body, and any fds that go along with it
15965    #[cfg(feature = "request-parsing")]
15966    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
15967        if header.major_opcode != FREE_PIXMAP_REQUEST {
15968            return Err(ParseError::InvalidValue);
15969        }
15970        let remaining = &[header.minor_opcode];
15971        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
15972        let _ = remaining;
15973        let (pixmap, remaining) = Pixmap::try_parse(value)?;
15974        let _ = remaining;
15975        Ok(FreePixmapRequest {
15976            pixmap,
15977        })
15978    }
15979}
15980impl Request for FreePixmapRequest {
15981    const EXTENSION_NAME: Option<&'static str> = None;
15982
15983    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
15984        let (bufs, fds) = self.serialize();
15985        // Flatten the buffers into a single vector
15986        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
15987        (buf, fds)
15988    }
15989}
15990impl crate::x11_utils::VoidRequest for FreePixmapRequest {
15991}
15992
15993/// # Fields
15994///
15995/// * `Function` - TODO: Refer to GX
15996/// * `PlaneMask` - In graphics operations, given a source and destination pixel, the result is
15997/// computed bitwise on corresponding bits of the pixels; that is, a Boolean
15998/// operation is performed in each bit plane. The plane-mask restricts the
15999/// operation to a subset of planes, so the result is:
16000///
16001/// ((src FUNC dst) AND plane-mask) OR (dst AND (NOT plane-mask))
16002/// * `Foreground` - Foreground colorpixel.
16003/// * `Background` - Background colorpixel.
16004/// * `LineWidth` - The line-width is measured in pixels and can be greater than or equal to one, a wide line, or the
16005/// special value zero, a thin line.
16006/// * `LineStyle` - The line-style defines which sections of a line are drawn:
16007/// Solid                The full path of the line is drawn.
16008/// DoubleDash           The full path of the line is drawn, but the even dashes are filled differently
16009/// than the odd dashes (see fill-style), with Butt cap-style used where even and
16010/// odd dashes meet.
16011/// OnOffDash            Only the even dashes are drawn, and cap-style applies to all internal ends of
16012/// the individual dashes (except NotLast is treated as Butt).
16013/// * `CapStyle` - The cap-style defines how the endpoints of a path are drawn:
16014/// NotLast    The result is equivalent to Butt, except that for a line-width of zero the final
16015/// endpoint is not drawn.
16016/// Butt       The result is square at the endpoint (perpendicular to the slope of the line)
16017/// with no projection beyond.
16018/// Round      The result is a circular arc with its diameter equal to the line-width, centered
16019/// on the endpoint; it is equivalent to Butt for line-width zero.
16020/// Projecting The result is square at the end, but the path continues beyond the endpoint for
16021/// a distance equal to half the line-width; it is equivalent to Butt for line-width
16022/// zero.
16023/// * `JoinStyle` - The join-style defines how corners are drawn for wide lines:
16024/// Miter               The outer edges of the two lines extend to meet at an angle. However, if the
16025/// angle is less than 11 degrees, a Bevel join-style is used instead.
16026/// Round               The result is a circular arc with a diameter equal to the line-width, centered
16027/// on the joinpoint.
16028/// Bevel               The result is Butt endpoint styles, and then the triangular notch is filled.
16029/// * `FillStyle` - The fill-style defines the contents of the source for line, text, and fill requests. For all text and fill
16030/// requests (for example, PolyText8, PolyText16, PolyFillRectangle, FillPoly, and PolyFillArc)
16031/// as well as for line requests with line-style Solid, (for example, PolyLine, PolySegment,
16032/// PolyRectangle, PolyArc) and for the even dashes for line requests with line-style OnOffDash
16033/// or DoubleDash:
16034/// Solid                     Foreground
16035/// Tiled                     Tile
16036/// OpaqueStippled            A tile with the same width and height as stipple but with background
16037/// everywhere stipple has a zero and with foreground everywhere stipple
16038/// has a one
16039/// Stippled                  Foreground masked by stipple
16040/// For the odd dashes for line requests with line-style DoubleDash:
16041/// Solid                     Background
16042/// Tiled                     Same as for even dashes
16043/// OpaqueStippled            Same as for even dashes
16044/// Stippled                  Background masked by stipple
16045/// * `FillRule` -
16046/// * `Tile` - The tile/stipple represents an infinite two-dimensional plane with the tile/stipple replicated in all
16047/// dimensions. When that plane is superimposed on the drawable for use in a graphics operation,
16048/// the upper-left corner of some instance of the tile/stipple is at the coordinates within the drawable
16049/// specified by the tile/stipple origin. The tile/stipple and clip origins are interpreted relative to the
16050/// origin of whatever destination drawable is specified in a graphics request.
16051/// The tile pixmap must have the same root and depth as the gcontext (or a Match error results).
16052/// The stipple pixmap must have depth one and must have the same root as the gcontext (or a
16053/// Match error results). For fill-style Stippled (but not fill-style
16054/// OpaqueStippled), the stipple pattern is tiled in a single plane and acts as an
16055/// additional clip mask to be ANDed with the clip-mask.
16056/// Any size pixmap can be used for tiling or stippling, although some sizes may be faster to use than
16057/// others.
16058/// * `Stipple` - The tile/stipple represents an infinite two-dimensional plane with the tile/stipple replicated in all
16059/// dimensions. When that plane is superimposed on the drawable for use in a graphics operation,
16060/// the upper-left corner of some instance of the tile/stipple is at the coordinates within the drawable
16061/// specified by the tile/stipple origin. The tile/stipple and clip origins are interpreted relative to the
16062/// origin of whatever destination drawable is specified in a graphics request.
16063/// The tile pixmap must have the same root and depth as the gcontext (or a Match error results).
16064/// The stipple pixmap must have depth one and must have the same root as the gcontext (or a
16065/// Match error results). For fill-style Stippled (but not fill-style
16066/// OpaqueStippled), the stipple pattern is tiled in a single plane and acts as an
16067/// additional clip mask to be ANDed with the clip-mask.
16068/// Any size pixmap can be used for tiling or stippling, although some sizes may be faster to use than
16069/// others.
16070/// * `TileStippleOriginX` - TODO
16071/// * `TileStippleOriginY` - TODO
16072/// * `Font` - Which font to use for the `ImageText8` and `ImageText16` requests.
16073/// * `SubwindowMode` - For ClipByChildren, both source and destination windows are additionally
16074/// clipped by all viewable InputOutput children. For IncludeInferiors, neither
16075/// source nor destination window is
16076/// clipped by inferiors. This will result in including subwindow contents in the source and drawing
16077/// through subwindow boundaries of the destination. The use of IncludeInferiors with a source or
16078/// destination window of one depth with mapped inferiors of differing depth is not illegal, but the
16079/// semantics is undefined by the core protocol.
16080/// * `GraphicsExposures` - Whether ExposureEvents should be generated (1) or not (0).
16081///
16082/// The default is 1.
16083/// * `ClipOriginX` - TODO
16084/// * `ClipOriginY` - TODO
16085/// * `ClipMask` - The clip-mask restricts writes to the destination drawable. Only pixels where the clip-mask has
16086/// bits set to 1 are drawn. Pixels are not drawn outside the area covered by the clip-mask or where
16087/// the clip-mask has bits set to 0. The clip-mask affects all graphics requests, but it does not clip
16088/// sources. The clip-mask origin is interpreted relative to the origin of whatever destination drawable is specified in a graphics request. If a pixmap is specified as the clip-mask, it must have
16089/// depth 1 and have the same root as the gcontext (or a Match error results). If clip-mask is None,
16090/// then pixels are always drawn, regardless of the clip origin. The clip-mask can also be set with the
16091/// SetClipRectangles request.
16092/// * `DashOffset` - TODO
16093/// * `DashList` - TODO
16094/// * `ArcMode` - TODO
16095#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
16096#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16097pub struct GC(u32);
16098impl GC {
16099    pub const FUNCTION: Self = Self(1 << 0);
16100    pub const PLANE_MASK: Self = Self(1 << 1);
16101    pub const FOREGROUND: Self = Self(1 << 2);
16102    pub const BACKGROUND: Self = Self(1 << 3);
16103    pub const LINE_WIDTH: Self = Self(1 << 4);
16104    pub const LINE_STYLE: Self = Self(1 << 5);
16105    pub const CAP_STYLE: Self = Self(1 << 6);
16106    pub const JOIN_STYLE: Self = Self(1 << 7);
16107    pub const FILL_STYLE: Self = Self(1 << 8);
16108    pub const FILL_RULE: Self = Self(1 << 9);
16109    pub const TILE: Self = Self(1 << 10);
16110    pub const STIPPLE: Self = Self(1 << 11);
16111    pub const TILE_STIPPLE_ORIGIN_X: Self = Self(1 << 12);
16112    pub const TILE_STIPPLE_ORIGIN_Y: Self = Self(1 << 13);
16113    pub const FONT: Self = Self(1 << 14);
16114    pub const SUBWINDOW_MODE: Self = Self(1 << 15);
16115    pub const GRAPHICS_EXPOSURES: Self = Self(1 << 16);
16116    pub const CLIP_ORIGIN_X: Self = Self(1 << 17);
16117    pub const CLIP_ORIGIN_Y: Self = Self(1 << 18);
16118    pub const CLIP_MASK: Self = Self(1 << 19);
16119    pub const DASH_OFFSET: Self = Self(1 << 20);
16120    pub const DASH_LIST: Self = Self(1 << 21);
16121    pub const ARC_MODE: Self = Self(1 << 22);
16122}
16123impl From<GC> for u32 {
16124    #[inline]
16125    fn from(input: GC) -> Self {
16126        input.0
16127    }
16128}
16129impl From<GC> for Option<u32> {
16130    #[inline]
16131    fn from(input: GC) -> Self {
16132        Some(input.0)
16133    }
16134}
16135impl From<u8> for GC {
16136    #[inline]
16137    fn from(value: u8) -> Self {
16138        Self(value.into())
16139    }
16140}
16141impl From<u16> for GC {
16142    #[inline]
16143    fn from(value: u16) -> Self {
16144        Self(value.into())
16145    }
16146}
16147impl From<u32> for GC {
16148    #[inline]
16149    fn from(value: u32) -> Self {
16150        Self(value)
16151    }
16152}
16153impl core::fmt::Debug for GC  {
16154    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
16155        let variants = [
16156            (Self::FUNCTION.0, "FUNCTION", "Function"),
16157            (Self::PLANE_MASK.0, "PLANE_MASK", "PlaneMask"),
16158            (Self::FOREGROUND.0, "FOREGROUND", "Foreground"),
16159            (Self::BACKGROUND.0, "BACKGROUND", "Background"),
16160            (Self::LINE_WIDTH.0, "LINE_WIDTH", "LineWidth"),
16161            (Self::LINE_STYLE.0, "LINE_STYLE", "LineStyle"),
16162            (Self::CAP_STYLE.0, "CAP_STYLE", "CapStyle"),
16163            (Self::JOIN_STYLE.0, "JOIN_STYLE", "JoinStyle"),
16164            (Self::FILL_STYLE.0, "FILL_STYLE", "FillStyle"),
16165            (Self::FILL_RULE.0, "FILL_RULE", "FillRule"),
16166            (Self::TILE.0, "TILE", "Tile"),
16167            (Self::STIPPLE.0, "STIPPLE", "Stipple"),
16168            (Self::TILE_STIPPLE_ORIGIN_X.0, "TILE_STIPPLE_ORIGIN_X", "TileStippleOriginX"),
16169            (Self::TILE_STIPPLE_ORIGIN_Y.0, "TILE_STIPPLE_ORIGIN_Y", "TileStippleOriginY"),
16170            (Self::FONT.0, "FONT", "Font"),
16171            (Self::SUBWINDOW_MODE.0, "SUBWINDOW_MODE", "SubwindowMode"),
16172            (Self::GRAPHICS_EXPOSURES.0, "GRAPHICS_EXPOSURES", "GraphicsExposures"),
16173            (Self::CLIP_ORIGIN_X.0, "CLIP_ORIGIN_X", "ClipOriginX"),
16174            (Self::CLIP_ORIGIN_Y.0, "CLIP_ORIGIN_Y", "ClipOriginY"),
16175            (Self::CLIP_MASK.0, "CLIP_MASK", "ClipMask"),
16176            (Self::DASH_OFFSET.0, "DASH_OFFSET", "DashOffset"),
16177            (Self::DASH_LIST.0, "DASH_LIST", "DashList"),
16178            (Self::ARC_MODE.0, "ARC_MODE", "ArcMode"),
16179        ];
16180        pretty_print_bitmask(fmt, self.0, &variants)
16181    }
16182}
16183bitmask_binop!(GC, u32);
16184
16185#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
16186#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16187pub struct GX(u32);
16188impl GX {
16189    pub const CLEAR: Self = Self(0);
16190    pub const AND: Self = Self(1);
16191    pub const AND_REVERSE: Self = Self(2);
16192    pub const COPY: Self = Self(3);
16193    pub const AND_INVERTED: Self = Self(4);
16194    pub const NOOP: Self = Self(5);
16195    pub const XOR: Self = Self(6);
16196    pub const OR: Self = Self(7);
16197    pub const NOR: Self = Self(8);
16198    pub const EQUIV: Self = Self(9);
16199    pub const INVERT: Self = Self(10);
16200    pub const OR_REVERSE: Self = Self(11);
16201    pub const COPY_INVERTED: Self = Self(12);
16202    pub const OR_INVERTED: Self = Self(13);
16203    pub const NAND: Self = Self(14);
16204    pub const SET: Self = Self(15);
16205}
16206impl From<GX> for u32 {
16207    #[inline]
16208    fn from(input: GX) -> Self {
16209        input.0
16210    }
16211}
16212impl From<GX> for Option<u32> {
16213    #[inline]
16214    fn from(input: GX) -> Self {
16215        Some(input.0)
16216    }
16217}
16218impl From<u8> for GX {
16219    #[inline]
16220    fn from(value: u8) -> Self {
16221        Self(value.into())
16222    }
16223}
16224impl From<u16> for GX {
16225    #[inline]
16226    fn from(value: u16) -> Self {
16227        Self(value.into())
16228    }
16229}
16230impl From<u32> for GX {
16231    #[inline]
16232    fn from(value: u32) -> Self {
16233        Self(value)
16234    }
16235}
16236impl core::fmt::Debug for GX  {
16237    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
16238        let variants = [
16239            (Self::CLEAR.0, "CLEAR", "Clear"),
16240            (Self::AND.0, "AND", "And"),
16241            (Self::AND_REVERSE.0, "AND_REVERSE", "AndReverse"),
16242            (Self::COPY.0, "COPY", "Copy"),
16243            (Self::AND_INVERTED.0, "AND_INVERTED", "AndInverted"),
16244            (Self::NOOP.0, "NOOP", "Noop"),
16245            (Self::XOR.0, "XOR", "Xor"),
16246            (Self::OR.0, "OR", "Or"),
16247            (Self::NOR.0, "NOR", "Nor"),
16248            (Self::EQUIV.0, "EQUIV", "Equiv"),
16249            (Self::INVERT.0, "INVERT", "Invert"),
16250            (Self::OR_REVERSE.0, "OR_REVERSE", "OrReverse"),
16251            (Self::COPY_INVERTED.0, "COPY_INVERTED", "CopyInverted"),
16252            (Self::OR_INVERTED.0, "OR_INVERTED", "OrInverted"),
16253            (Self::NAND.0, "NAND", "Nand"),
16254            (Self::SET.0, "SET", "Set"),
16255        ];
16256        pretty_print_enum(fmt, self.0, &variants)
16257    }
16258}
16259
16260#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
16261#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16262pub struct LineStyle(u32);
16263impl LineStyle {
16264    pub const SOLID: Self = Self(0);
16265    pub const ON_OFF_DASH: Self = Self(1);
16266    pub const DOUBLE_DASH: Self = Self(2);
16267}
16268impl From<LineStyle> for u32 {
16269    #[inline]
16270    fn from(input: LineStyle) -> Self {
16271        input.0
16272    }
16273}
16274impl From<LineStyle> for Option<u32> {
16275    #[inline]
16276    fn from(input: LineStyle) -> Self {
16277        Some(input.0)
16278    }
16279}
16280impl From<u8> for LineStyle {
16281    #[inline]
16282    fn from(value: u8) -> Self {
16283        Self(value.into())
16284    }
16285}
16286impl From<u16> for LineStyle {
16287    #[inline]
16288    fn from(value: u16) -> Self {
16289        Self(value.into())
16290    }
16291}
16292impl From<u32> for LineStyle {
16293    #[inline]
16294    fn from(value: u32) -> Self {
16295        Self(value)
16296    }
16297}
16298impl core::fmt::Debug for LineStyle  {
16299    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
16300        let variants = [
16301            (Self::SOLID.0, "SOLID", "Solid"),
16302            (Self::ON_OFF_DASH.0, "ON_OFF_DASH", "OnOffDash"),
16303            (Self::DOUBLE_DASH.0, "DOUBLE_DASH", "DoubleDash"),
16304        ];
16305        pretty_print_enum(fmt, self.0, &variants)
16306    }
16307}
16308
16309#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
16310#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16311pub struct CapStyle(u32);
16312impl CapStyle {
16313    pub const NOT_LAST: Self = Self(0);
16314    pub const BUTT: Self = Self(1);
16315    pub const ROUND: Self = Self(2);
16316    pub const PROJECTING: Self = Self(3);
16317}
16318impl From<CapStyle> for u32 {
16319    #[inline]
16320    fn from(input: CapStyle) -> Self {
16321        input.0
16322    }
16323}
16324impl From<CapStyle> for Option<u32> {
16325    #[inline]
16326    fn from(input: CapStyle) -> Self {
16327        Some(input.0)
16328    }
16329}
16330impl From<u8> for CapStyle {
16331    #[inline]
16332    fn from(value: u8) -> Self {
16333        Self(value.into())
16334    }
16335}
16336impl From<u16> for CapStyle {
16337    #[inline]
16338    fn from(value: u16) -> Self {
16339        Self(value.into())
16340    }
16341}
16342impl From<u32> for CapStyle {
16343    #[inline]
16344    fn from(value: u32) -> Self {
16345        Self(value)
16346    }
16347}
16348impl core::fmt::Debug for CapStyle  {
16349    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
16350        let variants = [
16351            (Self::NOT_LAST.0, "NOT_LAST", "NotLast"),
16352            (Self::BUTT.0, "BUTT", "Butt"),
16353            (Self::ROUND.0, "ROUND", "Round"),
16354            (Self::PROJECTING.0, "PROJECTING", "Projecting"),
16355        ];
16356        pretty_print_enum(fmt, self.0, &variants)
16357    }
16358}
16359
16360#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
16361#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16362pub struct JoinStyle(u32);
16363impl JoinStyle {
16364    pub const MITER: Self = Self(0);
16365    pub const ROUND: Self = Self(1);
16366    pub const BEVEL: Self = Self(2);
16367}
16368impl From<JoinStyle> for u32 {
16369    #[inline]
16370    fn from(input: JoinStyle) -> Self {
16371        input.0
16372    }
16373}
16374impl From<JoinStyle> for Option<u32> {
16375    #[inline]
16376    fn from(input: JoinStyle) -> Self {
16377        Some(input.0)
16378    }
16379}
16380impl From<u8> for JoinStyle {
16381    #[inline]
16382    fn from(value: u8) -> Self {
16383        Self(value.into())
16384    }
16385}
16386impl From<u16> for JoinStyle {
16387    #[inline]
16388    fn from(value: u16) -> Self {
16389        Self(value.into())
16390    }
16391}
16392impl From<u32> for JoinStyle {
16393    #[inline]
16394    fn from(value: u32) -> Self {
16395        Self(value)
16396    }
16397}
16398impl core::fmt::Debug for JoinStyle  {
16399    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
16400        let variants = [
16401            (Self::MITER.0, "MITER", "Miter"),
16402            (Self::ROUND.0, "ROUND", "Round"),
16403            (Self::BEVEL.0, "BEVEL", "Bevel"),
16404        ];
16405        pretty_print_enum(fmt, self.0, &variants)
16406    }
16407}
16408
16409#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
16410#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16411pub struct FillStyle(u32);
16412impl FillStyle {
16413    pub const SOLID: Self = Self(0);
16414    pub const TILED: Self = Self(1);
16415    pub const STIPPLED: Self = Self(2);
16416    pub const OPAQUE_STIPPLED: Self = Self(3);
16417}
16418impl From<FillStyle> for u32 {
16419    #[inline]
16420    fn from(input: FillStyle) -> Self {
16421        input.0
16422    }
16423}
16424impl From<FillStyle> for Option<u32> {
16425    #[inline]
16426    fn from(input: FillStyle) -> Self {
16427        Some(input.0)
16428    }
16429}
16430impl From<u8> for FillStyle {
16431    #[inline]
16432    fn from(value: u8) -> Self {
16433        Self(value.into())
16434    }
16435}
16436impl From<u16> for FillStyle {
16437    #[inline]
16438    fn from(value: u16) -> Self {
16439        Self(value.into())
16440    }
16441}
16442impl From<u32> for FillStyle {
16443    #[inline]
16444    fn from(value: u32) -> Self {
16445        Self(value)
16446    }
16447}
16448impl core::fmt::Debug for FillStyle  {
16449    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
16450        let variants = [
16451            (Self::SOLID.0, "SOLID", "Solid"),
16452            (Self::TILED.0, "TILED", "Tiled"),
16453            (Self::STIPPLED.0, "STIPPLED", "Stippled"),
16454            (Self::OPAQUE_STIPPLED.0, "OPAQUE_STIPPLED", "OpaqueStippled"),
16455        ];
16456        pretty_print_enum(fmt, self.0, &variants)
16457    }
16458}
16459
16460#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
16461#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16462pub struct FillRule(u32);
16463impl FillRule {
16464    pub const EVEN_ODD: Self = Self(0);
16465    pub const WINDING: Self = Self(1);
16466}
16467impl From<FillRule> for u32 {
16468    #[inline]
16469    fn from(input: FillRule) -> Self {
16470        input.0
16471    }
16472}
16473impl From<FillRule> for Option<u32> {
16474    #[inline]
16475    fn from(input: FillRule) -> Self {
16476        Some(input.0)
16477    }
16478}
16479impl From<u8> for FillRule {
16480    #[inline]
16481    fn from(value: u8) -> Self {
16482        Self(value.into())
16483    }
16484}
16485impl From<u16> for FillRule {
16486    #[inline]
16487    fn from(value: u16) -> Self {
16488        Self(value.into())
16489    }
16490}
16491impl From<u32> for FillRule {
16492    #[inline]
16493    fn from(value: u32) -> Self {
16494        Self(value)
16495    }
16496}
16497impl core::fmt::Debug for FillRule  {
16498    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
16499        let variants = [
16500            (Self::EVEN_ODD.0, "EVEN_ODD", "EvenOdd"),
16501            (Self::WINDING.0, "WINDING", "Winding"),
16502        ];
16503        pretty_print_enum(fmt, self.0, &variants)
16504    }
16505}
16506
16507#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
16508#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16509pub struct SubwindowMode(u32);
16510impl SubwindowMode {
16511    pub const CLIP_BY_CHILDREN: Self = Self(0);
16512    pub const INCLUDE_INFERIORS: Self = Self(1);
16513}
16514impl From<SubwindowMode> for u32 {
16515    #[inline]
16516    fn from(input: SubwindowMode) -> Self {
16517        input.0
16518    }
16519}
16520impl From<SubwindowMode> for Option<u32> {
16521    #[inline]
16522    fn from(input: SubwindowMode) -> Self {
16523        Some(input.0)
16524    }
16525}
16526impl From<u8> for SubwindowMode {
16527    #[inline]
16528    fn from(value: u8) -> Self {
16529        Self(value.into())
16530    }
16531}
16532impl From<u16> for SubwindowMode {
16533    #[inline]
16534    fn from(value: u16) -> Self {
16535        Self(value.into())
16536    }
16537}
16538impl From<u32> for SubwindowMode {
16539    #[inline]
16540    fn from(value: u32) -> Self {
16541        Self(value)
16542    }
16543}
16544impl core::fmt::Debug for SubwindowMode  {
16545    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
16546        let variants = [
16547            (Self::CLIP_BY_CHILDREN.0, "CLIP_BY_CHILDREN", "ClipByChildren"),
16548            (Self::INCLUDE_INFERIORS.0, "INCLUDE_INFERIORS", "IncludeInferiors"),
16549        ];
16550        pretty_print_enum(fmt, self.0, &variants)
16551    }
16552}
16553
16554#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
16555#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16556pub struct ArcMode(u32);
16557impl ArcMode {
16558    pub const CHORD: Self = Self(0);
16559    pub const PIE_SLICE: Self = Self(1);
16560}
16561impl From<ArcMode> for u32 {
16562    #[inline]
16563    fn from(input: ArcMode) -> Self {
16564        input.0
16565    }
16566}
16567impl From<ArcMode> for Option<u32> {
16568    #[inline]
16569    fn from(input: ArcMode) -> Self {
16570        Some(input.0)
16571    }
16572}
16573impl From<u8> for ArcMode {
16574    #[inline]
16575    fn from(value: u8) -> Self {
16576        Self(value.into())
16577    }
16578}
16579impl From<u16> for ArcMode {
16580    #[inline]
16581    fn from(value: u16) -> Self {
16582        Self(value.into())
16583    }
16584}
16585impl From<u32> for ArcMode {
16586    #[inline]
16587    fn from(value: u32) -> Self {
16588        Self(value)
16589    }
16590}
16591impl core::fmt::Debug for ArcMode  {
16592    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
16593        let variants = [
16594            (Self::CHORD.0, "CHORD", "Chord"),
16595            (Self::PIE_SLICE.0, "PIE_SLICE", "PieSlice"),
16596        ];
16597        pretty_print_enum(fmt, self.0, &variants)
16598    }
16599}
16600
16601/// Auxiliary and optional information for the `create_gc` function
16602#[derive(Clone, Copy, Default)]
16603#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
16604#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16605pub struct CreateGCAux {
16606    pub function: Option<GX>,
16607    pub plane_mask: Option<u32>,
16608    pub foreground: Option<u32>,
16609    pub background: Option<u32>,
16610    pub line_width: Option<u32>,
16611    pub line_style: Option<LineStyle>,
16612    pub cap_style: Option<CapStyle>,
16613    pub join_style: Option<JoinStyle>,
16614    pub fill_style: Option<FillStyle>,
16615    pub fill_rule: Option<FillRule>,
16616    pub tile: Option<Pixmap>,
16617    pub stipple: Option<Pixmap>,
16618    pub tile_stipple_x_origin: Option<i32>,
16619    pub tile_stipple_y_origin: Option<i32>,
16620    pub font: Option<Font>,
16621    pub subwindow_mode: Option<SubwindowMode>,
16622    pub graphics_exposures: Option<Bool32>,
16623    pub clip_x_origin: Option<i32>,
16624    pub clip_y_origin: Option<i32>,
16625    pub clip_mask: Option<Pixmap>,
16626    pub dash_offset: Option<u32>,
16627    pub dashes: Option<u32>,
16628    pub arc_mode: Option<ArcMode>,
16629}
16630impl_debug_if_no_extra_traits!(CreateGCAux, "CreateGCAux");
16631impl CreateGCAux {
16632    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
16633    fn try_parse(value: &[u8], value_mask: u32) -> Result<(Self, &[u8]), ParseError> {
16634        let switch_expr = u32::from(value_mask);
16635        let mut outer_remaining = value;
16636        let function = if switch_expr & u32::from(GC::FUNCTION) != 0 {
16637            let remaining = outer_remaining;
16638            let (function, remaining) = u32::try_parse(remaining)?;
16639            let function = function.into();
16640            outer_remaining = remaining;
16641            Some(function)
16642        } else {
16643            None
16644        };
16645        let plane_mask = if switch_expr & u32::from(GC::PLANE_MASK) != 0 {
16646            let remaining = outer_remaining;
16647            let (plane_mask, remaining) = u32::try_parse(remaining)?;
16648            outer_remaining = remaining;
16649            Some(plane_mask)
16650        } else {
16651            None
16652        };
16653        let foreground = if switch_expr & u32::from(GC::FOREGROUND) != 0 {
16654            let remaining = outer_remaining;
16655            let (foreground, remaining) = u32::try_parse(remaining)?;
16656            outer_remaining = remaining;
16657            Some(foreground)
16658        } else {
16659            None
16660        };
16661        let background = if switch_expr & u32::from(GC::BACKGROUND) != 0 {
16662            let remaining = outer_remaining;
16663            let (background, remaining) = u32::try_parse(remaining)?;
16664            outer_remaining = remaining;
16665            Some(background)
16666        } else {
16667            None
16668        };
16669        let line_width = if switch_expr & u32::from(GC::LINE_WIDTH) != 0 {
16670            let remaining = outer_remaining;
16671            let (line_width, remaining) = u32::try_parse(remaining)?;
16672            outer_remaining = remaining;
16673            Some(line_width)
16674        } else {
16675            None
16676        };
16677        let line_style = if switch_expr & u32::from(GC::LINE_STYLE) != 0 {
16678            let remaining = outer_remaining;
16679            let (line_style, remaining) = u32::try_parse(remaining)?;
16680            let line_style = line_style.into();
16681            outer_remaining = remaining;
16682            Some(line_style)
16683        } else {
16684            None
16685        };
16686        let cap_style = if switch_expr & u32::from(GC::CAP_STYLE) != 0 {
16687            let remaining = outer_remaining;
16688            let (cap_style, remaining) = u32::try_parse(remaining)?;
16689            let cap_style = cap_style.into();
16690            outer_remaining = remaining;
16691            Some(cap_style)
16692        } else {
16693            None
16694        };
16695        let join_style = if switch_expr & u32::from(GC::JOIN_STYLE) != 0 {
16696            let remaining = outer_remaining;
16697            let (join_style, remaining) = u32::try_parse(remaining)?;
16698            let join_style = join_style.into();
16699            outer_remaining = remaining;
16700            Some(join_style)
16701        } else {
16702            None
16703        };
16704        let fill_style = if switch_expr & u32::from(GC::FILL_STYLE) != 0 {
16705            let remaining = outer_remaining;
16706            let (fill_style, remaining) = u32::try_parse(remaining)?;
16707            let fill_style = fill_style.into();
16708            outer_remaining = remaining;
16709            Some(fill_style)
16710        } else {
16711            None
16712        };
16713        let fill_rule = if switch_expr & u32::from(GC::FILL_RULE) != 0 {
16714            let remaining = outer_remaining;
16715            let (fill_rule, remaining) = u32::try_parse(remaining)?;
16716            let fill_rule = fill_rule.into();
16717            outer_remaining = remaining;
16718            Some(fill_rule)
16719        } else {
16720            None
16721        };
16722        let tile = if switch_expr & u32::from(GC::TILE) != 0 {
16723            let remaining = outer_remaining;
16724            let (tile, remaining) = Pixmap::try_parse(remaining)?;
16725            outer_remaining = remaining;
16726            Some(tile)
16727        } else {
16728            None
16729        };
16730        let stipple = if switch_expr & u32::from(GC::STIPPLE) != 0 {
16731            let remaining = outer_remaining;
16732            let (stipple, remaining) = Pixmap::try_parse(remaining)?;
16733            outer_remaining = remaining;
16734            Some(stipple)
16735        } else {
16736            None
16737        };
16738        let tile_stipple_x_origin = if switch_expr & u32::from(GC::TILE_STIPPLE_ORIGIN_X) != 0 {
16739            let remaining = outer_remaining;
16740            let (tile_stipple_x_origin, remaining) = i32::try_parse(remaining)?;
16741            outer_remaining = remaining;
16742            Some(tile_stipple_x_origin)
16743        } else {
16744            None
16745        };
16746        let tile_stipple_y_origin = if switch_expr & u32::from(GC::TILE_STIPPLE_ORIGIN_Y) != 0 {
16747            let remaining = outer_remaining;
16748            let (tile_stipple_y_origin, remaining) = i32::try_parse(remaining)?;
16749            outer_remaining = remaining;
16750            Some(tile_stipple_y_origin)
16751        } else {
16752            None
16753        };
16754        let font = if switch_expr & u32::from(GC::FONT) != 0 {
16755            let remaining = outer_remaining;
16756            let (font, remaining) = Font::try_parse(remaining)?;
16757            outer_remaining = remaining;
16758            Some(font)
16759        } else {
16760            None
16761        };
16762        let subwindow_mode = if switch_expr & u32::from(GC::SUBWINDOW_MODE) != 0 {
16763            let remaining = outer_remaining;
16764            let (subwindow_mode, remaining) = u32::try_parse(remaining)?;
16765            let subwindow_mode = subwindow_mode.into();
16766            outer_remaining = remaining;
16767            Some(subwindow_mode)
16768        } else {
16769            None
16770        };
16771        let graphics_exposures = if switch_expr & u32::from(GC::GRAPHICS_EXPOSURES) != 0 {
16772            let remaining = outer_remaining;
16773            let (graphics_exposures, remaining) = Bool32::try_parse(remaining)?;
16774            outer_remaining = remaining;
16775            Some(graphics_exposures)
16776        } else {
16777            None
16778        };
16779        let clip_x_origin = if switch_expr & u32::from(GC::CLIP_ORIGIN_X) != 0 {
16780            let remaining = outer_remaining;
16781            let (clip_x_origin, remaining) = i32::try_parse(remaining)?;
16782            outer_remaining = remaining;
16783            Some(clip_x_origin)
16784        } else {
16785            None
16786        };
16787        let clip_y_origin = if switch_expr & u32::from(GC::CLIP_ORIGIN_Y) != 0 {
16788            let remaining = outer_remaining;
16789            let (clip_y_origin, remaining) = i32::try_parse(remaining)?;
16790            outer_remaining = remaining;
16791            Some(clip_y_origin)
16792        } else {
16793            None
16794        };
16795        let clip_mask = if switch_expr & u32::from(GC::CLIP_MASK) != 0 {
16796            let remaining = outer_remaining;
16797            let (clip_mask, remaining) = Pixmap::try_parse(remaining)?;
16798            outer_remaining = remaining;
16799            Some(clip_mask)
16800        } else {
16801            None
16802        };
16803        let dash_offset = if switch_expr & u32::from(GC::DASH_OFFSET) != 0 {
16804            let remaining = outer_remaining;
16805            let (dash_offset, remaining) = u32::try_parse(remaining)?;
16806            outer_remaining = remaining;
16807            Some(dash_offset)
16808        } else {
16809            None
16810        };
16811        let dashes = if switch_expr & u32::from(GC::DASH_LIST) != 0 {
16812            let remaining = outer_remaining;
16813            let (dashes, remaining) = u32::try_parse(remaining)?;
16814            outer_remaining = remaining;
16815            Some(dashes)
16816        } else {
16817            None
16818        };
16819        let arc_mode = if switch_expr & u32::from(GC::ARC_MODE) != 0 {
16820            let remaining = outer_remaining;
16821            let (arc_mode, remaining) = u32::try_parse(remaining)?;
16822            let arc_mode = arc_mode.into();
16823            outer_remaining = remaining;
16824            Some(arc_mode)
16825        } else {
16826            None
16827        };
16828        let result = CreateGCAux { function, plane_mask, foreground, background, line_width, line_style, cap_style, join_style, fill_style, fill_rule, tile, stipple, tile_stipple_x_origin, tile_stipple_y_origin, font, subwindow_mode, graphics_exposures, clip_x_origin, clip_y_origin, clip_mask, dash_offset, dashes, arc_mode };
16829        Ok((result, outer_remaining))
16830    }
16831}
16832impl CreateGCAux {
16833    #[allow(dead_code)]
16834    fn serialize(&self, value_mask: u32) -> Vec<u8> {
16835        let mut result = Vec::new();
16836        self.serialize_into(&mut result, u32::from(value_mask));
16837        result
16838    }
16839    fn serialize_into(&self, bytes: &mut Vec<u8>, value_mask: u32) {
16840        assert_eq!(self.switch_expr(), u32::from(value_mask), "switch `value_list` has an inconsistent discriminant");
16841        if let Some(function) = self.function {
16842            u32::from(function).serialize_into(bytes);
16843        }
16844        if let Some(plane_mask) = self.plane_mask {
16845            plane_mask.serialize_into(bytes);
16846        }
16847        if let Some(foreground) = self.foreground {
16848            foreground.serialize_into(bytes);
16849        }
16850        if let Some(background) = self.background {
16851            background.serialize_into(bytes);
16852        }
16853        if let Some(line_width) = self.line_width {
16854            line_width.serialize_into(bytes);
16855        }
16856        if let Some(line_style) = self.line_style {
16857            u32::from(line_style).serialize_into(bytes);
16858        }
16859        if let Some(cap_style) = self.cap_style {
16860            u32::from(cap_style).serialize_into(bytes);
16861        }
16862        if let Some(join_style) = self.join_style {
16863            u32::from(join_style).serialize_into(bytes);
16864        }
16865        if let Some(fill_style) = self.fill_style {
16866            u32::from(fill_style).serialize_into(bytes);
16867        }
16868        if let Some(fill_rule) = self.fill_rule {
16869            u32::from(fill_rule).serialize_into(bytes);
16870        }
16871        if let Some(tile) = self.tile {
16872            tile.serialize_into(bytes);
16873        }
16874        if let Some(stipple) = self.stipple {
16875            stipple.serialize_into(bytes);
16876        }
16877        if let Some(tile_stipple_x_origin) = self.tile_stipple_x_origin {
16878            tile_stipple_x_origin.serialize_into(bytes);
16879        }
16880        if let Some(tile_stipple_y_origin) = self.tile_stipple_y_origin {
16881            tile_stipple_y_origin.serialize_into(bytes);
16882        }
16883        if let Some(font) = self.font {
16884            font.serialize_into(bytes);
16885        }
16886        if let Some(subwindow_mode) = self.subwindow_mode {
16887            u32::from(subwindow_mode).serialize_into(bytes);
16888        }
16889        if let Some(graphics_exposures) = self.graphics_exposures {
16890            graphics_exposures.serialize_into(bytes);
16891        }
16892        if let Some(clip_x_origin) = self.clip_x_origin {
16893            clip_x_origin.serialize_into(bytes);
16894        }
16895        if let Some(clip_y_origin) = self.clip_y_origin {
16896            clip_y_origin.serialize_into(bytes);
16897        }
16898        if let Some(clip_mask) = self.clip_mask {
16899            clip_mask.serialize_into(bytes);
16900        }
16901        if let Some(dash_offset) = self.dash_offset {
16902            dash_offset.serialize_into(bytes);
16903        }
16904        if let Some(dashes) = self.dashes {
16905            dashes.serialize_into(bytes);
16906        }
16907        if let Some(arc_mode) = self.arc_mode {
16908            u32::from(arc_mode).serialize_into(bytes);
16909        }
16910    }
16911}
16912impl CreateGCAux {
16913    fn switch_expr(&self) -> u32 {
16914        let mut expr_value = 0;
16915        if self.function.is_some() {
16916            expr_value |= u32::from(GC::FUNCTION);
16917        }
16918        if self.plane_mask.is_some() {
16919            expr_value |= u32::from(GC::PLANE_MASK);
16920        }
16921        if self.foreground.is_some() {
16922            expr_value |= u32::from(GC::FOREGROUND);
16923        }
16924        if self.background.is_some() {
16925            expr_value |= u32::from(GC::BACKGROUND);
16926        }
16927        if self.line_width.is_some() {
16928            expr_value |= u32::from(GC::LINE_WIDTH);
16929        }
16930        if self.line_style.is_some() {
16931            expr_value |= u32::from(GC::LINE_STYLE);
16932        }
16933        if self.cap_style.is_some() {
16934            expr_value |= u32::from(GC::CAP_STYLE);
16935        }
16936        if self.join_style.is_some() {
16937            expr_value |= u32::from(GC::JOIN_STYLE);
16938        }
16939        if self.fill_style.is_some() {
16940            expr_value |= u32::from(GC::FILL_STYLE);
16941        }
16942        if self.fill_rule.is_some() {
16943            expr_value |= u32::from(GC::FILL_RULE);
16944        }
16945        if self.tile.is_some() {
16946            expr_value |= u32::from(GC::TILE);
16947        }
16948        if self.stipple.is_some() {
16949            expr_value |= u32::from(GC::STIPPLE);
16950        }
16951        if self.tile_stipple_x_origin.is_some() {
16952            expr_value |= u32::from(GC::TILE_STIPPLE_ORIGIN_X);
16953        }
16954        if self.tile_stipple_y_origin.is_some() {
16955            expr_value |= u32::from(GC::TILE_STIPPLE_ORIGIN_Y);
16956        }
16957        if self.font.is_some() {
16958            expr_value |= u32::from(GC::FONT);
16959        }
16960        if self.subwindow_mode.is_some() {
16961            expr_value |= u32::from(GC::SUBWINDOW_MODE);
16962        }
16963        if self.graphics_exposures.is_some() {
16964            expr_value |= u32::from(GC::GRAPHICS_EXPOSURES);
16965        }
16966        if self.clip_x_origin.is_some() {
16967            expr_value |= u32::from(GC::CLIP_ORIGIN_X);
16968        }
16969        if self.clip_y_origin.is_some() {
16970            expr_value |= u32::from(GC::CLIP_ORIGIN_Y);
16971        }
16972        if self.clip_mask.is_some() {
16973            expr_value |= u32::from(GC::CLIP_MASK);
16974        }
16975        if self.dash_offset.is_some() {
16976            expr_value |= u32::from(GC::DASH_OFFSET);
16977        }
16978        if self.dashes.is_some() {
16979            expr_value |= u32::from(GC::DASH_LIST);
16980        }
16981        if self.arc_mode.is_some() {
16982            expr_value |= u32::from(GC::ARC_MODE);
16983        }
16984        expr_value
16985    }
16986}
16987impl CreateGCAux {
16988    /// Create a new instance with all fields unset / not present.
16989    pub fn new() -> Self {
16990        Default::default()
16991    }
16992    /// Set the `function` field of this structure.
16993    #[must_use]
16994    pub fn function<I>(mut self, value: I) -> Self where I: Into<Option<GX>> {
16995        self.function = value.into();
16996        self
16997    }
16998    /// Set the `plane_mask` field of this structure.
16999    #[must_use]
17000    pub fn plane_mask<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
17001        self.plane_mask = value.into();
17002        self
17003    }
17004    /// Set the `foreground` field of this structure.
17005    #[must_use]
17006    pub fn foreground<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
17007        self.foreground = value.into();
17008        self
17009    }
17010    /// Set the `background` field of this structure.
17011    #[must_use]
17012    pub fn background<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
17013        self.background = value.into();
17014        self
17015    }
17016    /// Set the `line_width` field of this structure.
17017    #[must_use]
17018    pub fn line_width<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
17019        self.line_width = value.into();
17020        self
17021    }
17022    /// Set the `line_style` field of this structure.
17023    #[must_use]
17024    pub fn line_style<I>(mut self, value: I) -> Self where I: Into<Option<LineStyle>> {
17025        self.line_style = value.into();
17026        self
17027    }
17028    /// Set the `cap_style` field of this structure.
17029    #[must_use]
17030    pub fn cap_style<I>(mut self, value: I) -> Self where I: Into<Option<CapStyle>> {
17031        self.cap_style = value.into();
17032        self
17033    }
17034    /// Set the `join_style` field of this structure.
17035    #[must_use]
17036    pub fn join_style<I>(mut self, value: I) -> Self where I: Into<Option<JoinStyle>> {
17037        self.join_style = value.into();
17038        self
17039    }
17040    /// Set the `fill_style` field of this structure.
17041    #[must_use]
17042    pub fn fill_style<I>(mut self, value: I) -> Self where I: Into<Option<FillStyle>> {
17043        self.fill_style = value.into();
17044        self
17045    }
17046    /// Set the `fill_rule` field of this structure.
17047    #[must_use]
17048    pub fn fill_rule<I>(mut self, value: I) -> Self where I: Into<Option<FillRule>> {
17049        self.fill_rule = value.into();
17050        self
17051    }
17052    /// Set the `tile` field of this structure.
17053    #[must_use]
17054    pub fn tile<I>(mut self, value: I) -> Self where I: Into<Option<Pixmap>> {
17055        self.tile = value.into();
17056        self
17057    }
17058    /// Set the `stipple` field of this structure.
17059    #[must_use]
17060    pub fn stipple<I>(mut self, value: I) -> Self where I: Into<Option<Pixmap>> {
17061        self.stipple = value.into();
17062        self
17063    }
17064    /// Set the `tile_stipple_x_origin` field of this structure.
17065    #[must_use]
17066    pub fn tile_stipple_x_origin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> {
17067        self.tile_stipple_x_origin = value.into();
17068        self
17069    }
17070    /// Set the `tile_stipple_y_origin` field of this structure.
17071    #[must_use]
17072    pub fn tile_stipple_y_origin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> {
17073        self.tile_stipple_y_origin = value.into();
17074        self
17075    }
17076    /// Set the `font` field of this structure.
17077    #[must_use]
17078    pub fn font<I>(mut self, value: I) -> Self where I: Into<Option<Font>> {
17079        self.font = value.into();
17080        self
17081    }
17082    /// Set the `subwindow_mode` field of this structure.
17083    #[must_use]
17084    pub fn subwindow_mode<I>(mut self, value: I) -> Self where I: Into<Option<SubwindowMode>> {
17085        self.subwindow_mode = value.into();
17086        self
17087    }
17088    /// Set the `graphics_exposures` field of this structure.
17089    #[must_use]
17090    pub fn graphics_exposures<I>(mut self, value: I) -> Self where I: Into<Option<Bool32>> {
17091        self.graphics_exposures = value.into();
17092        self
17093    }
17094    /// Set the `clip_x_origin` field of this structure.
17095    #[must_use]
17096    pub fn clip_x_origin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> {
17097        self.clip_x_origin = value.into();
17098        self
17099    }
17100    /// Set the `clip_y_origin` field of this structure.
17101    #[must_use]
17102    pub fn clip_y_origin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> {
17103        self.clip_y_origin = value.into();
17104        self
17105    }
17106    /// Set the `clip_mask` field of this structure.
17107    #[must_use]
17108    pub fn clip_mask<I>(mut self, value: I) -> Self where I: Into<Option<Pixmap>> {
17109        self.clip_mask = value.into();
17110        self
17111    }
17112    /// Set the `dash_offset` field of this structure.
17113    #[must_use]
17114    pub fn dash_offset<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
17115        self.dash_offset = value.into();
17116        self
17117    }
17118    /// Set the `dashes` field of this structure.
17119    #[must_use]
17120    pub fn dashes<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
17121        self.dashes = value.into();
17122        self
17123    }
17124    /// Set the `arc_mode` field of this structure.
17125    #[must_use]
17126    pub fn arc_mode<I>(mut self, value: I) -> Self where I: Into<Option<ArcMode>> {
17127        self.arc_mode = value.into();
17128        self
17129    }
17130}
17131
17132/// Opcode for the CreateGC request
17133pub const CREATE_GC_REQUEST: u8 = 55;
17134/// Creates a graphics context.
17135///
17136/// Creates a graphics context. The graphics context can be used with any drawable
17137/// that has the same root and depth as the specified drawable.
17138///
17139/// # Fields
17140///
17141/// * `cid` - The ID with which you will refer to the graphics context, created by
17142/// `xcb_generate_id`.
17143/// * `drawable` - Drawable to get the root/depth from.
17144///
17145/// # Errors
17146///
17147/// * `Drawable` - The specified `drawable` (Window or Pixmap) does not exist.
17148/// * `Match` - TODO: reasons?
17149/// * `Font` - TODO: reasons?
17150/// * `Pixmap` - TODO: reasons?
17151/// * `Value` - TODO: reasons?
17152/// * `Alloc` - The X server could not allocate the requested resources (no memory?).
17153///
17154/// # See
17155///
17156/// * `xcb_generate_id`: function
17157#[derive(Clone, Default)]
17158#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
17159#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17160pub struct CreateGCRequest<'input> {
17161    pub cid: Gcontext,
17162    pub drawable: Drawable,
17163    pub value_list: Cow<'input, CreateGCAux>,
17164}
17165impl_debug_if_no_extra_traits!(CreateGCRequest<'_>, "CreateGCRequest");
17166impl<'input> CreateGCRequest<'input> {
17167    /// Serialize this request into bytes for the provided connection
17168    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
17169        let length_so_far = 0;
17170        let cid_bytes = self.cid.serialize();
17171        let drawable_bytes = self.drawable.serialize();
17172        let value_mask: u32 = self.value_list.switch_expr();
17173        let value_mask_bytes = value_mask.serialize();
17174        let mut request0 = vec![
17175            CREATE_GC_REQUEST,
17176            0,
17177            0,
17178            0,
17179            cid_bytes[0],
17180            cid_bytes[1],
17181            cid_bytes[2],
17182            cid_bytes[3],
17183            drawable_bytes[0],
17184            drawable_bytes[1],
17185            drawable_bytes[2],
17186            drawable_bytes[3],
17187            value_mask_bytes[0],
17188            value_mask_bytes[1],
17189            value_mask_bytes[2],
17190            value_mask_bytes[3],
17191        ];
17192        let length_so_far = length_so_far + request0.len();
17193        let value_list_bytes = self.value_list.serialize(u32::from(value_mask));
17194        let length_so_far = length_so_far + value_list_bytes.len();
17195        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
17196        let length_so_far = length_so_far + padding0.len();
17197        assert_eq!(length_so_far % 4, 0);
17198        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
17199        request0[2..4].copy_from_slice(&length.to_ne_bytes());
17200        ([request0.into(), value_list_bytes.into(), padding0.into()], vec![])
17201    }
17202    /// Parse this request given its header, its body, and any fds that go along with it
17203    #[cfg(feature = "request-parsing")]
17204    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
17205        if header.major_opcode != CREATE_GC_REQUEST {
17206            return Err(ParseError::InvalidValue);
17207        }
17208        let remaining = &[header.minor_opcode];
17209        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
17210        let _ = remaining;
17211        let (cid, remaining) = Gcontext::try_parse(value)?;
17212        let (drawable, remaining) = Drawable::try_parse(remaining)?;
17213        let (value_mask, remaining) = u32::try_parse(remaining)?;
17214        let (value_list, remaining) = CreateGCAux::try_parse(remaining, u32::from(value_mask))?;
17215        let _ = remaining;
17216        Ok(CreateGCRequest {
17217            cid,
17218            drawable,
17219            value_list: Cow::Owned(value_list),
17220        })
17221    }
17222    /// Clone all borrowed data in this CreateGCRequest.
17223    pub fn into_owned(self) -> CreateGCRequest<'static> {
17224        CreateGCRequest {
17225            cid: self.cid,
17226            drawable: self.drawable,
17227            value_list: Cow::Owned(self.value_list.into_owned()),
17228        }
17229    }
17230}
17231impl<'input> Request for CreateGCRequest<'input> {
17232    const EXTENSION_NAME: Option<&'static str> = None;
17233
17234    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
17235        let (bufs, fds) = self.serialize();
17236        // Flatten the buffers into a single vector
17237        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
17238        (buf, fds)
17239    }
17240}
17241impl<'input> crate::x11_utils::VoidRequest for CreateGCRequest<'input> {
17242}
17243
17244/// Auxiliary and optional information for the `change_gc` function
17245#[derive(Clone, Copy, Default)]
17246#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
17247#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17248pub struct ChangeGCAux {
17249    pub function: Option<GX>,
17250    pub plane_mask: Option<u32>,
17251    pub foreground: Option<u32>,
17252    pub background: Option<u32>,
17253    pub line_width: Option<u32>,
17254    pub line_style: Option<LineStyle>,
17255    pub cap_style: Option<CapStyle>,
17256    pub join_style: Option<JoinStyle>,
17257    pub fill_style: Option<FillStyle>,
17258    pub fill_rule: Option<FillRule>,
17259    pub tile: Option<Pixmap>,
17260    pub stipple: Option<Pixmap>,
17261    pub tile_stipple_x_origin: Option<i32>,
17262    pub tile_stipple_y_origin: Option<i32>,
17263    pub font: Option<Font>,
17264    pub subwindow_mode: Option<SubwindowMode>,
17265    pub graphics_exposures: Option<Bool32>,
17266    pub clip_x_origin: Option<i32>,
17267    pub clip_y_origin: Option<i32>,
17268    pub clip_mask: Option<Pixmap>,
17269    pub dash_offset: Option<u32>,
17270    pub dashes: Option<u32>,
17271    pub arc_mode: Option<ArcMode>,
17272}
17273impl_debug_if_no_extra_traits!(ChangeGCAux, "ChangeGCAux");
17274impl ChangeGCAux {
17275    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
17276    fn try_parse(value: &[u8], value_mask: u32) -> Result<(Self, &[u8]), ParseError> {
17277        let switch_expr = u32::from(value_mask);
17278        let mut outer_remaining = value;
17279        let function = if switch_expr & u32::from(GC::FUNCTION) != 0 {
17280            let remaining = outer_remaining;
17281            let (function, remaining) = u32::try_parse(remaining)?;
17282            let function = function.into();
17283            outer_remaining = remaining;
17284            Some(function)
17285        } else {
17286            None
17287        };
17288        let plane_mask = if switch_expr & u32::from(GC::PLANE_MASK) != 0 {
17289            let remaining = outer_remaining;
17290            let (plane_mask, remaining) = u32::try_parse(remaining)?;
17291            outer_remaining = remaining;
17292            Some(plane_mask)
17293        } else {
17294            None
17295        };
17296        let foreground = if switch_expr & u32::from(GC::FOREGROUND) != 0 {
17297            let remaining = outer_remaining;
17298            let (foreground, remaining) = u32::try_parse(remaining)?;
17299            outer_remaining = remaining;
17300            Some(foreground)
17301        } else {
17302            None
17303        };
17304        let background = if switch_expr & u32::from(GC::BACKGROUND) != 0 {
17305            let remaining = outer_remaining;
17306            let (background, remaining) = u32::try_parse(remaining)?;
17307            outer_remaining = remaining;
17308            Some(background)
17309        } else {
17310            None
17311        };
17312        let line_width = if switch_expr & u32::from(GC::LINE_WIDTH) != 0 {
17313            let remaining = outer_remaining;
17314            let (line_width, remaining) = u32::try_parse(remaining)?;
17315            outer_remaining = remaining;
17316            Some(line_width)
17317        } else {
17318            None
17319        };
17320        let line_style = if switch_expr & u32::from(GC::LINE_STYLE) != 0 {
17321            let remaining = outer_remaining;
17322            let (line_style, remaining) = u32::try_parse(remaining)?;
17323            let line_style = line_style.into();
17324            outer_remaining = remaining;
17325            Some(line_style)
17326        } else {
17327            None
17328        };
17329        let cap_style = if switch_expr & u32::from(GC::CAP_STYLE) != 0 {
17330            let remaining = outer_remaining;
17331            let (cap_style, remaining) = u32::try_parse(remaining)?;
17332            let cap_style = cap_style.into();
17333            outer_remaining = remaining;
17334            Some(cap_style)
17335        } else {
17336            None
17337        };
17338        let join_style = if switch_expr & u32::from(GC::JOIN_STYLE) != 0 {
17339            let remaining = outer_remaining;
17340            let (join_style, remaining) = u32::try_parse(remaining)?;
17341            let join_style = join_style.into();
17342            outer_remaining = remaining;
17343            Some(join_style)
17344        } else {
17345            None
17346        };
17347        let fill_style = if switch_expr & u32::from(GC::FILL_STYLE) != 0 {
17348            let remaining = outer_remaining;
17349            let (fill_style, remaining) = u32::try_parse(remaining)?;
17350            let fill_style = fill_style.into();
17351            outer_remaining = remaining;
17352            Some(fill_style)
17353        } else {
17354            None
17355        };
17356        let fill_rule = if switch_expr & u32::from(GC::FILL_RULE) != 0 {
17357            let remaining = outer_remaining;
17358            let (fill_rule, remaining) = u32::try_parse(remaining)?;
17359            let fill_rule = fill_rule.into();
17360            outer_remaining = remaining;
17361            Some(fill_rule)
17362        } else {
17363            None
17364        };
17365        let tile = if switch_expr & u32::from(GC::TILE) != 0 {
17366            let remaining = outer_remaining;
17367            let (tile, remaining) = Pixmap::try_parse(remaining)?;
17368            outer_remaining = remaining;
17369            Some(tile)
17370        } else {
17371            None
17372        };
17373        let stipple = if switch_expr & u32::from(GC::STIPPLE) != 0 {
17374            let remaining = outer_remaining;
17375            let (stipple, remaining) = Pixmap::try_parse(remaining)?;
17376            outer_remaining = remaining;
17377            Some(stipple)
17378        } else {
17379            None
17380        };
17381        let tile_stipple_x_origin = if switch_expr & u32::from(GC::TILE_STIPPLE_ORIGIN_X) != 0 {
17382            let remaining = outer_remaining;
17383            let (tile_stipple_x_origin, remaining) = i32::try_parse(remaining)?;
17384            outer_remaining = remaining;
17385            Some(tile_stipple_x_origin)
17386        } else {
17387            None
17388        };
17389        let tile_stipple_y_origin = if switch_expr & u32::from(GC::TILE_STIPPLE_ORIGIN_Y) != 0 {
17390            let remaining = outer_remaining;
17391            let (tile_stipple_y_origin, remaining) = i32::try_parse(remaining)?;
17392            outer_remaining = remaining;
17393            Some(tile_stipple_y_origin)
17394        } else {
17395            None
17396        };
17397        let font = if switch_expr & u32::from(GC::FONT) != 0 {
17398            let remaining = outer_remaining;
17399            let (font, remaining) = Font::try_parse(remaining)?;
17400            outer_remaining = remaining;
17401            Some(font)
17402        } else {
17403            None
17404        };
17405        let subwindow_mode = if switch_expr & u32::from(GC::SUBWINDOW_MODE) != 0 {
17406            let remaining = outer_remaining;
17407            let (subwindow_mode, remaining) = u32::try_parse(remaining)?;
17408            let subwindow_mode = subwindow_mode.into();
17409            outer_remaining = remaining;
17410            Some(subwindow_mode)
17411        } else {
17412            None
17413        };
17414        let graphics_exposures = if switch_expr & u32::from(GC::GRAPHICS_EXPOSURES) != 0 {
17415            let remaining = outer_remaining;
17416            let (graphics_exposures, remaining) = Bool32::try_parse(remaining)?;
17417            outer_remaining = remaining;
17418            Some(graphics_exposures)
17419        } else {
17420            None
17421        };
17422        let clip_x_origin = if switch_expr & u32::from(GC::CLIP_ORIGIN_X) != 0 {
17423            let remaining = outer_remaining;
17424            let (clip_x_origin, remaining) = i32::try_parse(remaining)?;
17425            outer_remaining = remaining;
17426            Some(clip_x_origin)
17427        } else {
17428            None
17429        };
17430        let clip_y_origin = if switch_expr & u32::from(GC::CLIP_ORIGIN_Y) != 0 {
17431            let remaining = outer_remaining;
17432            let (clip_y_origin, remaining) = i32::try_parse(remaining)?;
17433            outer_remaining = remaining;
17434            Some(clip_y_origin)
17435        } else {
17436            None
17437        };
17438        let clip_mask = if switch_expr & u32::from(GC::CLIP_MASK) != 0 {
17439            let remaining = outer_remaining;
17440            let (clip_mask, remaining) = Pixmap::try_parse(remaining)?;
17441            outer_remaining = remaining;
17442            Some(clip_mask)
17443        } else {
17444            None
17445        };
17446        let dash_offset = if switch_expr & u32::from(GC::DASH_OFFSET) != 0 {
17447            let remaining = outer_remaining;
17448            let (dash_offset, remaining) = u32::try_parse(remaining)?;
17449            outer_remaining = remaining;
17450            Some(dash_offset)
17451        } else {
17452            None
17453        };
17454        let dashes = if switch_expr & u32::from(GC::DASH_LIST) != 0 {
17455            let remaining = outer_remaining;
17456            let (dashes, remaining) = u32::try_parse(remaining)?;
17457            outer_remaining = remaining;
17458            Some(dashes)
17459        } else {
17460            None
17461        };
17462        let arc_mode = if switch_expr & u32::from(GC::ARC_MODE) != 0 {
17463            let remaining = outer_remaining;
17464            let (arc_mode, remaining) = u32::try_parse(remaining)?;
17465            let arc_mode = arc_mode.into();
17466            outer_remaining = remaining;
17467            Some(arc_mode)
17468        } else {
17469            None
17470        };
17471        let result = ChangeGCAux { function, plane_mask, foreground, background, line_width, line_style, cap_style, join_style, fill_style, fill_rule, tile, stipple, tile_stipple_x_origin, tile_stipple_y_origin, font, subwindow_mode, graphics_exposures, clip_x_origin, clip_y_origin, clip_mask, dash_offset, dashes, arc_mode };
17472        Ok((result, outer_remaining))
17473    }
17474}
17475impl ChangeGCAux {
17476    #[allow(dead_code)]
17477    fn serialize(&self, value_mask: u32) -> Vec<u8> {
17478        let mut result = Vec::new();
17479        self.serialize_into(&mut result, u32::from(value_mask));
17480        result
17481    }
17482    fn serialize_into(&self, bytes: &mut Vec<u8>, value_mask: u32) {
17483        assert_eq!(self.switch_expr(), u32::from(value_mask), "switch `value_list` has an inconsistent discriminant");
17484        if let Some(function) = self.function {
17485            u32::from(function).serialize_into(bytes);
17486        }
17487        if let Some(plane_mask) = self.plane_mask {
17488            plane_mask.serialize_into(bytes);
17489        }
17490        if let Some(foreground) = self.foreground {
17491            foreground.serialize_into(bytes);
17492        }
17493        if let Some(background) = self.background {
17494            background.serialize_into(bytes);
17495        }
17496        if let Some(line_width) = self.line_width {
17497            line_width.serialize_into(bytes);
17498        }
17499        if let Some(line_style) = self.line_style {
17500            u32::from(line_style).serialize_into(bytes);
17501        }
17502        if let Some(cap_style) = self.cap_style {
17503            u32::from(cap_style).serialize_into(bytes);
17504        }
17505        if let Some(join_style) = self.join_style {
17506            u32::from(join_style).serialize_into(bytes);
17507        }
17508        if let Some(fill_style) = self.fill_style {
17509            u32::from(fill_style).serialize_into(bytes);
17510        }
17511        if let Some(fill_rule) = self.fill_rule {
17512            u32::from(fill_rule).serialize_into(bytes);
17513        }
17514        if let Some(tile) = self.tile {
17515            tile.serialize_into(bytes);
17516        }
17517        if let Some(stipple) = self.stipple {
17518            stipple.serialize_into(bytes);
17519        }
17520        if let Some(tile_stipple_x_origin) = self.tile_stipple_x_origin {
17521            tile_stipple_x_origin.serialize_into(bytes);
17522        }
17523        if let Some(tile_stipple_y_origin) = self.tile_stipple_y_origin {
17524            tile_stipple_y_origin.serialize_into(bytes);
17525        }
17526        if let Some(font) = self.font {
17527            font.serialize_into(bytes);
17528        }
17529        if let Some(subwindow_mode) = self.subwindow_mode {
17530            u32::from(subwindow_mode).serialize_into(bytes);
17531        }
17532        if let Some(graphics_exposures) = self.graphics_exposures {
17533            graphics_exposures.serialize_into(bytes);
17534        }
17535        if let Some(clip_x_origin) = self.clip_x_origin {
17536            clip_x_origin.serialize_into(bytes);
17537        }
17538        if let Some(clip_y_origin) = self.clip_y_origin {
17539            clip_y_origin.serialize_into(bytes);
17540        }
17541        if let Some(clip_mask) = self.clip_mask {
17542            clip_mask.serialize_into(bytes);
17543        }
17544        if let Some(dash_offset) = self.dash_offset {
17545            dash_offset.serialize_into(bytes);
17546        }
17547        if let Some(dashes) = self.dashes {
17548            dashes.serialize_into(bytes);
17549        }
17550        if let Some(arc_mode) = self.arc_mode {
17551            u32::from(arc_mode).serialize_into(bytes);
17552        }
17553    }
17554}
17555impl ChangeGCAux {
17556    fn switch_expr(&self) -> u32 {
17557        let mut expr_value = 0;
17558        if self.function.is_some() {
17559            expr_value |= u32::from(GC::FUNCTION);
17560        }
17561        if self.plane_mask.is_some() {
17562            expr_value |= u32::from(GC::PLANE_MASK);
17563        }
17564        if self.foreground.is_some() {
17565            expr_value |= u32::from(GC::FOREGROUND);
17566        }
17567        if self.background.is_some() {
17568            expr_value |= u32::from(GC::BACKGROUND);
17569        }
17570        if self.line_width.is_some() {
17571            expr_value |= u32::from(GC::LINE_WIDTH);
17572        }
17573        if self.line_style.is_some() {
17574            expr_value |= u32::from(GC::LINE_STYLE);
17575        }
17576        if self.cap_style.is_some() {
17577            expr_value |= u32::from(GC::CAP_STYLE);
17578        }
17579        if self.join_style.is_some() {
17580            expr_value |= u32::from(GC::JOIN_STYLE);
17581        }
17582        if self.fill_style.is_some() {
17583            expr_value |= u32::from(GC::FILL_STYLE);
17584        }
17585        if self.fill_rule.is_some() {
17586            expr_value |= u32::from(GC::FILL_RULE);
17587        }
17588        if self.tile.is_some() {
17589            expr_value |= u32::from(GC::TILE);
17590        }
17591        if self.stipple.is_some() {
17592            expr_value |= u32::from(GC::STIPPLE);
17593        }
17594        if self.tile_stipple_x_origin.is_some() {
17595            expr_value |= u32::from(GC::TILE_STIPPLE_ORIGIN_X);
17596        }
17597        if self.tile_stipple_y_origin.is_some() {
17598            expr_value |= u32::from(GC::TILE_STIPPLE_ORIGIN_Y);
17599        }
17600        if self.font.is_some() {
17601            expr_value |= u32::from(GC::FONT);
17602        }
17603        if self.subwindow_mode.is_some() {
17604            expr_value |= u32::from(GC::SUBWINDOW_MODE);
17605        }
17606        if self.graphics_exposures.is_some() {
17607            expr_value |= u32::from(GC::GRAPHICS_EXPOSURES);
17608        }
17609        if self.clip_x_origin.is_some() {
17610            expr_value |= u32::from(GC::CLIP_ORIGIN_X);
17611        }
17612        if self.clip_y_origin.is_some() {
17613            expr_value |= u32::from(GC::CLIP_ORIGIN_Y);
17614        }
17615        if self.clip_mask.is_some() {
17616            expr_value |= u32::from(GC::CLIP_MASK);
17617        }
17618        if self.dash_offset.is_some() {
17619            expr_value |= u32::from(GC::DASH_OFFSET);
17620        }
17621        if self.dashes.is_some() {
17622            expr_value |= u32::from(GC::DASH_LIST);
17623        }
17624        if self.arc_mode.is_some() {
17625            expr_value |= u32::from(GC::ARC_MODE);
17626        }
17627        expr_value
17628    }
17629}
17630impl ChangeGCAux {
17631    /// Create a new instance with all fields unset / not present.
17632    pub fn new() -> Self {
17633        Default::default()
17634    }
17635    /// Set the `function` field of this structure.
17636    #[must_use]
17637    pub fn function<I>(mut self, value: I) -> Self where I: Into<Option<GX>> {
17638        self.function = value.into();
17639        self
17640    }
17641    /// Set the `plane_mask` field of this structure.
17642    #[must_use]
17643    pub fn plane_mask<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
17644        self.plane_mask = value.into();
17645        self
17646    }
17647    /// Set the `foreground` field of this structure.
17648    #[must_use]
17649    pub fn foreground<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
17650        self.foreground = value.into();
17651        self
17652    }
17653    /// Set the `background` field of this structure.
17654    #[must_use]
17655    pub fn background<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
17656        self.background = value.into();
17657        self
17658    }
17659    /// Set the `line_width` field of this structure.
17660    #[must_use]
17661    pub fn line_width<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
17662        self.line_width = value.into();
17663        self
17664    }
17665    /// Set the `line_style` field of this structure.
17666    #[must_use]
17667    pub fn line_style<I>(mut self, value: I) -> Self where I: Into<Option<LineStyle>> {
17668        self.line_style = value.into();
17669        self
17670    }
17671    /// Set the `cap_style` field of this structure.
17672    #[must_use]
17673    pub fn cap_style<I>(mut self, value: I) -> Self where I: Into<Option<CapStyle>> {
17674        self.cap_style = value.into();
17675        self
17676    }
17677    /// Set the `join_style` field of this structure.
17678    #[must_use]
17679    pub fn join_style<I>(mut self, value: I) -> Self where I: Into<Option<JoinStyle>> {
17680        self.join_style = value.into();
17681        self
17682    }
17683    /// Set the `fill_style` field of this structure.
17684    #[must_use]
17685    pub fn fill_style<I>(mut self, value: I) -> Self where I: Into<Option<FillStyle>> {
17686        self.fill_style = value.into();
17687        self
17688    }
17689    /// Set the `fill_rule` field of this structure.
17690    #[must_use]
17691    pub fn fill_rule<I>(mut self, value: I) -> Self where I: Into<Option<FillRule>> {
17692        self.fill_rule = value.into();
17693        self
17694    }
17695    /// Set the `tile` field of this structure.
17696    #[must_use]
17697    pub fn tile<I>(mut self, value: I) -> Self where I: Into<Option<Pixmap>> {
17698        self.tile = value.into();
17699        self
17700    }
17701    /// Set the `stipple` field of this structure.
17702    #[must_use]
17703    pub fn stipple<I>(mut self, value: I) -> Self where I: Into<Option<Pixmap>> {
17704        self.stipple = value.into();
17705        self
17706    }
17707    /// Set the `tile_stipple_x_origin` field of this structure.
17708    #[must_use]
17709    pub fn tile_stipple_x_origin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> {
17710        self.tile_stipple_x_origin = value.into();
17711        self
17712    }
17713    /// Set the `tile_stipple_y_origin` field of this structure.
17714    #[must_use]
17715    pub fn tile_stipple_y_origin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> {
17716        self.tile_stipple_y_origin = value.into();
17717        self
17718    }
17719    /// Set the `font` field of this structure.
17720    #[must_use]
17721    pub fn font<I>(mut self, value: I) -> Self where I: Into<Option<Font>> {
17722        self.font = value.into();
17723        self
17724    }
17725    /// Set the `subwindow_mode` field of this structure.
17726    #[must_use]
17727    pub fn subwindow_mode<I>(mut self, value: I) -> Self where I: Into<Option<SubwindowMode>> {
17728        self.subwindow_mode = value.into();
17729        self
17730    }
17731    /// Set the `graphics_exposures` field of this structure.
17732    #[must_use]
17733    pub fn graphics_exposures<I>(mut self, value: I) -> Self where I: Into<Option<Bool32>> {
17734        self.graphics_exposures = value.into();
17735        self
17736    }
17737    /// Set the `clip_x_origin` field of this structure.
17738    #[must_use]
17739    pub fn clip_x_origin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> {
17740        self.clip_x_origin = value.into();
17741        self
17742    }
17743    /// Set the `clip_y_origin` field of this structure.
17744    #[must_use]
17745    pub fn clip_y_origin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> {
17746        self.clip_y_origin = value.into();
17747        self
17748    }
17749    /// Set the `clip_mask` field of this structure.
17750    #[must_use]
17751    pub fn clip_mask<I>(mut self, value: I) -> Self where I: Into<Option<Pixmap>> {
17752        self.clip_mask = value.into();
17753        self
17754    }
17755    /// Set the `dash_offset` field of this structure.
17756    #[must_use]
17757    pub fn dash_offset<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
17758        self.dash_offset = value.into();
17759        self
17760    }
17761    /// Set the `dashes` field of this structure.
17762    #[must_use]
17763    pub fn dashes<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
17764        self.dashes = value.into();
17765        self
17766    }
17767    /// Set the `arc_mode` field of this structure.
17768    #[must_use]
17769    pub fn arc_mode<I>(mut self, value: I) -> Self where I: Into<Option<ArcMode>> {
17770        self.arc_mode = value.into();
17771        self
17772    }
17773}
17774
17775/// Opcode for the ChangeGC request
17776pub const CHANGE_GC_REQUEST: u8 = 56;
17777/// change graphics context components.
17778///
17779/// Changes the components specified by `value_mask` for the specified graphics context.
17780///
17781/// # Fields
17782///
17783/// * `gc` - The graphics context to change.
17784/// * `value_list` - Values for each of the components specified in the bitmask `value_mask`. The
17785/// order has to correspond to the order of possible `value_mask` bits. See the
17786/// example.
17787///
17788/// # Errors
17789///
17790/// * `Font` - TODO: reasons?
17791/// * `GContext` - TODO: reasons?
17792/// * `Match` - TODO: reasons?
17793/// * `Pixmap` - TODO: reasons?
17794/// * `Value` - TODO: reasons?
17795/// * `Alloc` - The X server could not allocate the requested resources (no memory?).
17796///
17797/// # Example
17798///
17799/// ```text
17800/// /*
17801///  * Changes the foreground color component of the specified graphics context.
17802///  *
17803///  */
17804/// void my_example(xcb_connection_t *conn, xcb_gcontext_t gc, uint32_t fg, uint32_t bg) {
17805///     /* C99 allows us to use a compact way of changing a single component: */
17806///     xcb_change_gc(conn, gc, XCB_GC_FOREGROUND, (uint32_t[]){ fg });
17807///
17808///     /* The more explicit way. Beware that the order of values is important! */
17809///     uint32_t mask = 0;
17810///     mask |= XCB_GC_FOREGROUND;
17811///     mask |= XCB_GC_BACKGROUND;
17812///
17813///     uint32_t values[] = {
17814///         fg,
17815///         bg
17816///     };
17817///     xcb_change_gc(conn, gc, mask, values);
17818///     xcb_flush(conn);
17819/// }
17820/// ```
17821#[derive(Clone, Default)]
17822#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
17823#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17824pub struct ChangeGCRequest<'input> {
17825    pub gc: Gcontext,
17826    pub value_list: Cow<'input, ChangeGCAux>,
17827}
17828impl_debug_if_no_extra_traits!(ChangeGCRequest<'_>, "ChangeGCRequest");
17829impl<'input> ChangeGCRequest<'input> {
17830    /// Serialize this request into bytes for the provided connection
17831    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
17832        let length_so_far = 0;
17833        let gc_bytes = self.gc.serialize();
17834        let value_mask: u32 = self.value_list.switch_expr();
17835        let value_mask_bytes = value_mask.serialize();
17836        let mut request0 = vec![
17837            CHANGE_GC_REQUEST,
17838            0,
17839            0,
17840            0,
17841            gc_bytes[0],
17842            gc_bytes[1],
17843            gc_bytes[2],
17844            gc_bytes[3],
17845            value_mask_bytes[0],
17846            value_mask_bytes[1],
17847            value_mask_bytes[2],
17848            value_mask_bytes[3],
17849        ];
17850        let length_so_far = length_so_far + request0.len();
17851        let value_list_bytes = self.value_list.serialize(u32::from(value_mask));
17852        let length_so_far = length_so_far + value_list_bytes.len();
17853        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
17854        let length_so_far = length_so_far + padding0.len();
17855        assert_eq!(length_so_far % 4, 0);
17856        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
17857        request0[2..4].copy_from_slice(&length.to_ne_bytes());
17858        ([request0.into(), value_list_bytes.into(), padding0.into()], vec![])
17859    }
17860    /// Parse this request given its header, its body, and any fds that go along with it
17861    #[cfg(feature = "request-parsing")]
17862    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
17863        if header.major_opcode != CHANGE_GC_REQUEST {
17864            return Err(ParseError::InvalidValue);
17865        }
17866        let remaining = &[header.minor_opcode];
17867        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
17868        let _ = remaining;
17869        let (gc, remaining) = Gcontext::try_parse(value)?;
17870        let (value_mask, remaining) = u32::try_parse(remaining)?;
17871        let (value_list, remaining) = ChangeGCAux::try_parse(remaining, u32::from(value_mask))?;
17872        let _ = remaining;
17873        Ok(ChangeGCRequest {
17874            gc,
17875            value_list: Cow::Owned(value_list),
17876        })
17877    }
17878    /// Clone all borrowed data in this ChangeGCRequest.
17879    pub fn into_owned(self) -> ChangeGCRequest<'static> {
17880        ChangeGCRequest {
17881            gc: self.gc,
17882            value_list: Cow::Owned(self.value_list.into_owned()),
17883        }
17884    }
17885}
17886impl<'input> Request for ChangeGCRequest<'input> {
17887    const EXTENSION_NAME: Option<&'static str> = None;
17888
17889    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
17890        let (bufs, fds) = self.serialize();
17891        // Flatten the buffers into a single vector
17892        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
17893        (buf, fds)
17894    }
17895}
17896impl<'input> crate::x11_utils::VoidRequest for ChangeGCRequest<'input> {
17897}
17898
17899/// Opcode for the CopyGC request
17900pub const COPY_GC_REQUEST: u8 = 57;
17901#[derive(Clone, Copy, Default)]
17902#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
17903#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17904pub struct CopyGCRequest {
17905    pub src_gc: Gcontext,
17906    pub dst_gc: Gcontext,
17907    pub value_mask: GC,
17908}
17909impl_debug_if_no_extra_traits!(CopyGCRequest, "CopyGCRequest");
17910impl CopyGCRequest {
17911    /// Serialize this request into bytes for the provided connection
17912    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
17913        let length_so_far = 0;
17914        let src_gc_bytes = self.src_gc.serialize();
17915        let dst_gc_bytes = self.dst_gc.serialize();
17916        let value_mask_bytes = u32::from(self.value_mask).serialize();
17917        let mut request0 = vec![
17918            COPY_GC_REQUEST,
17919            0,
17920            0,
17921            0,
17922            src_gc_bytes[0],
17923            src_gc_bytes[1],
17924            src_gc_bytes[2],
17925            src_gc_bytes[3],
17926            dst_gc_bytes[0],
17927            dst_gc_bytes[1],
17928            dst_gc_bytes[2],
17929            dst_gc_bytes[3],
17930            value_mask_bytes[0],
17931            value_mask_bytes[1],
17932            value_mask_bytes[2],
17933            value_mask_bytes[3],
17934        ];
17935        let length_so_far = length_so_far + request0.len();
17936        assert_eq!(length_so_far % 4, 0);
17937        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
17938        request0[2..4].copy_from_slice(&length.to_ne_bytes());
17939        ([request0.into()], vec![])
17940    }
17941    /// Parse this request given its header, its body, and any fds that go along with it
17942    #[cfg(feature = "request-parsing")]
17943    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
17944        if header.major_opcode != COPY_GC_REQUEST {
17945            return Err(ParseError::InvalidValue);
17946        }
17947        let remaining = &[header.minor_opcode];
17948        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
17949        let _ = remaining;
17950        let (src_gc, remaining) = Gcontext::try_parse(value)?;
17951        let (dst_gc, remaining) = Gcontext::try_parse(remaining)?;
17952        let (value_mask, remaining) = u32::try_parse(remaining)?;
17953        let value_mask = value_mask.into();
17954        let _ = remaining;
17955        Ok(CopyGCRequest {
17956            src_gc,
17957            dst_gc,
17958            value_mask,
17959        })
17960    }
17961}
17962impl Request for CopyGCRequest {
17963    const EXTENSION_NAME: Option<&'static str> = None;
17964
17965    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
17966        let (bufs, fds) = self.serialize();
17967        // Flatten the buffers into a single vector
17968        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
17969        (buf, fds)
17970    }
17971}
17972impl crate::x11_utils::VoidRequest for CopyGCRequest {
17973}
17974
17975/// Opcode for the SetDashes request
17976pub const SET_DASHES_REQUEST: u8 = 58;
17977#[derive(Clone, Default)]
17978#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
17979#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17980pub struct SetDashesRequest<'input> {
17981    pub gc: Gcontext,
17982    pub dash_offset: u16,
17983    pub dashes: Cow<'input, [u8]>,
17984}
17985impl_debug_if_no_extra_traits!(SetDashesRequest<'_>, "SetDashesRequest");
17986impl<'input> SetDashesRequest<'input> {
17987    /// Serialize this request into bytes for the provided connection
17988    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
17989        let length_so_far = 0;
17990        let gc_bytes = self.gc.serialize();
17991        let dash_offset_bytes = self.dash_offset.serialize();
17992        let dashes_len = u16::try_from(self.dashes.len()).expect("`dashes` has too many elements");
17993        let dashes_len_bytes = dashes_len.serialize();
17994        let mut request0 = vec![
17995            SET_DASHES_REQUEST,
17996            0,
17997            0,
17998            0,
17999            gc_bytes[0],
18000            gc_bytes[1],
18001            gc_bytes[2],
18002            gc_bytes[3],
18003            dash_offset_bytes[0],
18004            dash_offset_bytes[1],
18005            dashes_len_bytes[0],
18006            dashes_len_bytes[1],
18007        ];
18008        let length_so_far = length_so_far + request0.len();
18009        let length_so_far = length_so_far + self.dashes.len();
18010        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
18011        let length_so_far = length_so_far + padding0.len();
18012        assert_eq!(length_so_far % 4, 0);
18013        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
18014        request0[2..4].copy_from_slice(&length.to_ne_bytes());
18015        ([request0.into(), self.dashes, padding0.into()], vec![])
18016    }
18017    /// Parse this request given its header, its body, and any fds that go along with it
18018    #[cfg(feature = "request-parsing")]
18019    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
18020        if header.major_opcode != SET_DASHES_REQUEST {
18021            return Err(ParseError::InvalidValue);
18022        }
18023        let remaining = &[header.minor_opcode];
18024        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
18025        let _ = remaining;
18026        let (gc, remaining) = Gcontext::try_parse(value)?;
18027        let (dash_offset, remaining) = u16::try_parse(remaining)?;
18028        let (dashes_len, remaining) = u16::try_parse(remaining)?;
18029        let (dashes, remaining) = crate::x11_utils::parse_u8_list(remaining, dashes_len.try_to_usize()?)?;
18030        let _ = remaining;
18031        Ok(SetDashesRequest {
18032            gc,
18033            dash_offset,
18034            dashes: Cow::Borrowed(dashes),
18035        })
18036    }
18037    /// Clone all borrowed data in this SetDashesRequest.
18038    pub fn into_owned(self) -> SetDashesRequest<'static> {
18039        SetDashesRequest {
18040            gc: self.gc,
18041            dash_offset: self.dash_offset,
18042            dashes: Cow::Owned(self.dashes.into_owned()),
18043        }
18044    }
18045}
18046impl<'input> Request for SetDashesRequest<'input> {
18047    const EXTENSION_NAME: Option<&'static str> = None;
18048
18049    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
18050        let (bufs, fds) = self.serialize();
18051        // Flatten the buffers into a single vector
18052        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
18053        (buf, fds)
18054    }
18055}
18056impl<'input> crate::x11_utils::VoidRequest for SetDashesRequest<'input> {
18057}
18058
18059#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
18060#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18061pub struct ClipOrdering(u8);
18062impl ClipOrdering {
18063    pub const UNSORTED: Self = Self(0);
18064    pub const Y_SORTED: Self = Self(1);
18065    pub const YX_SORTED: Self = Self(2);
18066    pub const YX_BANDED: Self = Self(3);
18067}
18068impl From<ClipOrdering> for u8 {
18069    #[inline]
18070    fn from(input: ClipOrdering) -> Self {
18071        input.0
18072    }
18073}
18074impl From<ClipOrdering> for Option<u8> {
18075    #[inline]
18076    fn from(input: ClipOrdering) -> Self {
18077        Some(input.0)
18078    }
18079}
18080impl From<ClipOrdering> for u16 {
18081    #[inline]
18082    fn from(input: ClipOrdering) -> Self {
18083        u16::from(input.0)
18084    }
18085}
18086impl From<ClipOrdering> for Option<u16> {
18087    #[inline]
18088    fn from(input: ClipOrdering) -> Self {
18089        Some(u16::from(input.0))
18090    }
18091}
18092impl From<ClipOrdering> for u32 {
18093    #[inline]
18094    fn from(input: ClipOrdering) -> Self {
18095        u32::from(input.0)
18096    }
18097}
18098impl From<ClipOrdering> for Option<u32> {
18099    #[inline]
18100    fn from(input: ClipOrdering) -> Self {
18101        Some(u32::from(input.0))
18102    }
18103}
18104impl From<u8> for ClipOrdering {
18105    #[inline]
18106    fn from(value: u8) -> Self {
18107        Self(value)
18108    }
18109}
18110impl core::fmt::Debug for ClipOrdering  {
18111    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
18112        let variants = [
18113            (Self::UNSORTED.0.into(), "UNSORTED", "Unsorted"),
18114            (Self::Y_SORTED.0.into(), "Y_SORTED", "YSorted"),
18115            (Self::YX_SORTED.0.into(), "YX_SORTED", "YXSorted"),
18116            (Self::YX_BANDED.0.into(), "YX_BANDED", "YXBanded"),
18117        ];
18118        pretty_print_enum(fmt, self.0.into(), &variants)
18119    }
18120}
18121
18122/// Opcode for the SetClipRectangles request
18123pub const SET_CLIP_RECTANGLES_REQUEST: u8 = 59;
18124#[derive(Clone, Default)]
18125#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18126#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18127pub struct SetClipRectanglesRequest<'input> {
18128    pub ordering: ClipOrdering,
18129    pub gc: Gcontext,
18130    pub clip_x_origin: i16,
18131    pub clip_y_origin: i16,
18132    pub rectangles: Cow<'input, [Rectangle]>,
18133}
18134impl_debug_if_no_extra_traits!(SetClipRectanglesRequest<'_>, "SetClipRectanglesRequest");
18135impl<'input> SetClipRectanglesRequest<'input> {
18136    /// Serialize this request into bytes for the provided connection
18137    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
18138        let length_so_far = 0;
18139        let ordering_bytes = u8::from(self.ordering).serialize();
18140        let gc_bytes = self.gc.serialize();
18141        let clip_x_origin_bytes = self.clip_x_origin.serialize();
18142        let clip_y_origin_bytes = self.clip_y_origin.serialize();
18143        let mut request0 = vec![
18144            SET_CLIP_RECTANGLES_REQUEST,
18145            ordering_bytes[0],
18146            0,
18147            0,
18148            gc_bytes[0],
18149            gc_bytes[1],
18150            gc_bytes[2],
18151            gc_bytes[3],
18152            clip_x_origin_bytes[0],
18153            clip_x_origin_bytes[1],
18154            clip_y_origin_bytes[0],
18155            clip_y_origin_bytes[1],
18156        ];
18157        let length_so_far = length_so_far + request0.len();
18158        let rectangles_bytes = self.rectangles.serialize();
18159        let length_so_far = length_so_far + rectangles_bytes.len();
18160        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
18161        let length_so_far = length_so_far + padding0.len();
18162        assert_eq!(length_so_far % 4, 0);
18163        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
18164        request0[2..4].copy_from_slice(&length.to_ne_bytes());
18165        ([request0.into(), rectangles_bytes.into(), padding0.into()], vec![])
18166    }
18167    /// Parse this request given its header, its body, and any fds that go along with it
18168    #[cfg(feature = "request-parsing")]
18169    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
18170        if header.major_opcode != SET_CLIP_RECTANGLES_REQUEST {
18171            return Err(ParseError::InvalidValue);
18172        }
18173        let remaining = &[header.minor_opcode];
18174        let (ordering, remaining) = u8::try_parse(remaining)?;
18175        let ordering = ordering.into();
18176        let _ = remaining;
18177        let (gc, remaining) = Gcontext::try_parse(value)?;
18178        let (clip_x_origin, remaining) = i16::try_parse(remaining)?;
18179        let (clip_y_origin, remaining) = i16::try_parse(remaining)?;
18180        let mut remaining = remaining;
18181        // Length is 'everything left in the input'
18182        let mut rectangles = Vec::new();
18183        while !remaining.is_empty() {
18184            let (v, new_remaining) = Rectangle::try_parse(remaining)?;
18185            remaining = new_remaining;
18186            rectangles.push(v);
18187        }
18188        let _ = remaining;
18189        Ok(SetClipRectanglesRequest {
18190            ordering,
18191            gc,
18192            clip_x_origin,
18193            clip_y_origin,
18194            rectangles: Cow::Owned(rectangles),
18195        })
18196    }
18197    /// Clone all borrowed data in this SetClipRectanglesRequest.
18198    pub fn into_owned(self) -> SetClipRectanglesRequest<'static> {
18199        SetClipRectanglesRequest {
18200            ordering: self.ordering,
18201            gc: self.gc,
18202            clip_x_origin: self.clip_x_origin,
18203            clip_y_origin: self.clip_y_origin,
18204            rectangles: Cow::Owned(self.rectangles.into_owned()),
18205        }
18206    }
18207}
18208impl<'input> Request for SetClipRectanglesRequest<'input> {
18209    const EXTENSION_NAME: Option<&'static str> = None;
18210
18211    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
18212        let (bufs, fds) = self.serialize();
18213        // Flatten the buffers into a single vector
18214        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
18215        (buf, fds)
18216    }
18217}
18218impl<'input> crate::x11_utils::VoidRequest for SetClipRectanglesRequest<'input> {
18219}
18220
18221/// Opcode for the FreeGC request
18222pub const FREE_GC_REQUEST: u8 = 60;
18223/// Destroys a graphics context.
18224///
18225/// Destroys the specified `gc` and all associated storage.
18226///
18227/// # Fields
18228///
18229/// * `gc` - The graphics context to destroy.
18230///
18231/// # Errors
18232///
18233/// * `GContext` - The specified graphics context does not exist.
18234#[derive(Clone, Copy, Default)]
18235#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18236#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18237pub struct FreeGCRequest {
18238    pub gc: Gcontext,
18239}
18240impl_debug_if_no_extra_traits!(FreeGCRequest, "FreeGCRequest");
18241impl FreeGCRequest {
18242    /// Serialize this request into bytes for the provided connection
18243    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
18244        let length_so_far = 0;
18245        let gc_bytes = self.gc.serialize();
18246        let mut request0 = vec![
18247            FREE_GC_REQUEST,
18248            0,
18249            0,
18250            0,
18251            gc_bytes[0],
18252            gc_bytes[1],
18253            gc_bytes[2],
18254            gc_bytes[3],
18255        ];
18256        let length_so_far = length_so_far + request0.len();
18257        assert_eq!(length_so_far % 4, 0);
18258        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
18259        request0[2..4].copy_from_slice(&length.to_ne_bytes());
18260        ([request0.into()], vec![])
18261    }
18262    /// Parse this request given its header, its body, and any fds that go along with it
18263    #[cfg(feature = "request-parsing")]
18264    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
18265        if header.major_opcode != FREE_GC_REQUEST {
18266            return Err(ParseError::InvalidValue);
18267        }
18268        let remaining = &[header.minor_opcode];
18269        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
18270        let _ = remaining;
18271        let (gc, remaining) = Gcontext::try_parse(value)?;
18272        let _ = remaining;
18273        Ok(FreeGCRequest {
18274            gc,
18275        })
18276    }
18277}
18278impl Request for FreeGCRequest {
18279    const EXTENSION_NAME: Option<&'static str> = None;
18280
18281    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
18282        let (bufs, fds) = self.serialize();
18283        // Flatten the buffers into a single vector
18284        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
18285        (buf, fds)
18286    }
18287}
18288impl crate::x11_utils::VoidRequest for FreeGCRequest {
18289}
18290
18291/// Opcode for the ClearArea request
18292pub const CLEAR_AREA_REQUEST: u8 = 61;
18293#[derive(Clone, Copy, Default)]
18294#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18295#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18296pub struct ClearAreaRequest {
18297    pub exposures: bool,
18298    pub window: Window,
18299    pub x: i16,
18300    pub y: i16,
18301    pub width: u16,
18302    pub height: u16,
18303}
18304impl_debug_if_no_extra_traits!(ClearAreaRequest, "ClearAreaRequest");
18305impl ClearAreaRequest {
18306    /// Serialize this request into bytes for the provided connection
18307    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
18308        let length_so_far = 0;
18309        let exposures_bytes = self.exposures.serialize();
18310        let window_bytes = self.window.serialize();
18311        let x_bytes = self.x.serialize();
18312        let y_bytes = self.y.serialize();
18313        let width_bytes = self.width.serialize();
18314        let height_bytes = self.height.serialize();
18315        let mut request0 = vec![
18316            CLEAR_AREA_REQUEST,
18317            exposures_bytes[0],
18318            0,
18319            0,
18320            window_bytes[0],
18321            window_bytes[1],
18322            window_bytes[2],
18323            window_bytes[3],
18324            x_bytes[0],
18325            x_bytes[1],
18326            y_bytes[0],
18327            y_bytes[1],
18328            width_bytes[0],
18329            width_bytes[1],
18330            height_bytes[0],
18331            height_bytes[1],
18332        ];
18333        let length_so_far = length_so_far + request0.len();
18334        assert_eq!(length_so_far % 4, 0);
18335        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
18336        request0[2..4].copy_from_slice(&length.to_ne_bytes());
18337        ([request0.into()], vec![])
18338    }
18339    /// Parse this request given its header, its body, and any fds that go along with it
18340    #[cfg(feature = "request-parsing")]
18341    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
18342        if header.major_opcode != CLEAR_AREA_REQUEST {
18343            return Err(ParseError::InvalidValue);
18344        }
18345        let remaining = &[header.minor_opcode];
18346        let (exposures, remaining) = bool::try_parse(remaining)?;
18347        let _ = remaining;
18348        let (window, remaining) = Window::try_parse(value)?;
18349        let (x, remaining) = i16::try_parse(remaining)?;
18350        let (y, remaining) = i16::try_parse(remaining)?;
18351        let (width, remaining) = u16::try_parse(remaining)?;
18352        let (height, remaining) = u16::try_parse(remaining)?;
18353        let _ = remaining;
18354        Ok(ClearAreaRequest {
18355            exposures,
18356            window,
18357            x,
18358            y,
18359            width,
18360            height,
18361        })
18362    }
18363}
18364impl Request for ClearAreaRequest {
18365    const EXTENSION_NAME: Option<&'static str> = None;
18366
18367    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
18368        let (bufs, fds) = self.serialize();
18369        // Flatten the buffers into a single vector
18370        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
18371        (buf, fds)
18372    }
18373}
18374impl crate::x11_utils::VoidRequest for ClearAreaRequest {
18375}
18376
18377/// Opcode for the CopyArea request
18378pub const COPY_AREA_REQUEST: u8 = 62;
18379/// copy areas.
18380///
18381/// Copies the specified rectangle from `src_drawable` to `dst_drawable`.
18382///
18383/// # Fields
18384///
18385/// * `dst_drawable` - The destination drawable (Window or Pixmap).
18386/// * `src_drawable` - The source drawable (Window or Pixmap).
18387/// * `gc` - The graphics context to use.
18388/// * `src_x` - The source X coordinate.
18389/// * `src_y` - The source Y coordinate.
18390/// * `dst_x` - The destination X coordinate.
18391/// * `dst_y` - The destination Y coordinate.
18392/// * `width` - The width of the area to copy (in pixels).
18393/// * `height` - The height of the area to copy (in pixels).
18394///
18395/// # Errors
18396///
18397/// * `Drawable` - The specified `drawable` (Window or Pixmap) does not exist.
18398/// * `GContext` - The specified graphics context does not exist.
18399/// * `Match` - `src_drawable` has a different root or depth than `dst_drawable`.
18400#[derive(Clone, Copy, Default)]
18401#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18402#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18403pub struct CopyAreaRequest {
18404    pub src_drawable: Drawable,
18405    pub dst_drawable: Drawable,
18406    pub gc: Gcontext,
18407    pub src_x: i16,
18408    pub src_y: i16,
18409    pub dst_x: i16,
18410    pub dst_y: i16,
18411    pub width: u16,
18412    pub height: u16,
18413}
18414impl_debug_if_no_extra_traits!(CopyAreaRequest, "CopyAreaRequest");
18415impl CopyAreaRequest {
18416    /// Serialize this request into bytes for the provided connection
18417    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
18418        let length_so_far = 0;
18419        let src_drawable_bytes = self.src_drawable.serialize();
18420        let dst_drawable_bytes = self.dst_drawable.serialize();
18421        let gc_bytes = self.gc.serialize();
18422        let src_x_bytes = self.src_x.serialize();
18423        let src_y_bytes = self.src_y.serialize();
18424        let dst_x_bytes = self.dst_x.serialize();
18425        let dst_y_bytes = self.dst_y.serialize();
18426        let width_bytes = self.width.serialize();
18427        let height_bytes = self.height.serialize();
18428        let mut request0 = vec![
18429            COPY_AREA_REQUEST,
18430            0,
18431            0,
18432            0,
18433            src_drawable_bytes[0],
18434            src_drawable_bytes[1],
18435            src_drawable_bytes[2],
18436            src_drawable_bytes[3],
18437            dst_drawable_bytes[0],
18438            dst_drawable_bytes[1],
18439            dst_drawable_bytes[2],
18440            dst_drawable_bytes[3],
18441            gc_bytes[0],
18442            gc_bytes[1],
18443            gc_bytes[2],
18444            gc_bytes[3],
18445            src_x_bytes[0],
18446            src_x_bytes[1],
18447            src_y_bytes[0],
18448            src_y_bytes[1],
18449            dst_x_bytes[0],
18450            dst_x_bytes[1],
18451            dst_y_bytes[0],
18452            dst_y_bytes[1],
18453            width_bytes[0],
18454            width_bytes[1],
18455            height_bytes[0],
18456            height_bytes[1],
18457        ];
18458        let length_so_far = length_so_far + request0.len();
18459        assert_eq!(length_so_far % 4, 0);
18460        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
18461        request0[2..4].copy_from_slice(&length.to_ne_bytes());
18462        ([request0.into()], vec![])
18463    }
18464    /// Parse this request given its header, its body, and any fds that go along with it
18465    #[cfg(feature = "request-parsing")]
18466    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
18467        if header.major_opcode != COPY_AREA_REQUEST {
18468            return Err(ParseError::InvalidValue);
18469        }
18470        let remaining = &[header.minor_opcode];
18471        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
18472        let _ = remaining;
18473        let (src_drawable, remaining) = Drawable::try_parse(value)?;
18474        let (dst_drawable, remaining) = Drawable::try_parse(remaining)?;
18475        let (gc, remaining) = Gcontext::try_parse(remaining)?;
18476        let (src_x, remaining) = i16::try_parse(remaining)?;
18477        let (src_y, remaining) = i16::try_parse(remaining)?;
18478        let (dst_x, remaining) = i16::try_parse(remaining)?;
18479        let (dst_y, remaining) = i16::try_parse(remaining)?;
18480        let (width, remaining) = u16::try_parse(remaining)?;
18481        let (height, remaining) = u16::try_parse(remaining)?;
18482        let _ = remaining;
18483        Ok(CopyAreaRequest {
18484            src_drawable,
18485            dst_drawable,
18486            gc,
18487            src_x,
18488            src_y,
18489            dst_x,
18490            dst_y,
18491            width,
18492            height,
18493        })
18494    }
18495}
18496impl Request for CopyAreaRequest {
18497    const EXTENSION_NAME: Option<&'static str> = None;
18498
18499    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
18500        let (bufs, fds) = self.serialize();
18501        // Flatten the buffers into a single vector
18502        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
18503        (buf, fds)
18504    }
18505}
18506impl crate::x11_utils::VoidRequest for CopyAreaRequest {
18507}
18508
18509/// Opcode for the CopyPlane request
18510pub const COPY_PLANE_REQUEST: u8 = 63;
18511#[derive(Clone, Copy, Default)]
18512#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18513#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18514pub struct CopyPlaneRequest {
18515    pub src_drawable: Drawable,
18516    pub dst_drawable: Drawable,
18517    pub gc: Gcontext,
18518    pub src_x: i16,
18519    pub src_y: i16,
18520    pub dst_x: i16,
18521    pub dst_y: i16,
18522    pub width: u16,
18523    pub height: u16,
18524    pub bit_plane: u32,
18525}
18526impl_debug_if_no_extra_traits!(CopyPlaneRequest, "CopyPlaneRequest");
18527impl CopyPlaneRequest {
18528    /// Serialize this request into bytes for the provided connection
18529    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
18530        let length_so_far = 0;
18531        let src_drawable_bytes = self.src_drawable.serialize();
18532        let dst_drawable_bytes = self.dst_drawable.serialize();
18533        let gc_bytes = self.gc.serialize();
18534        let src_x_bytes = self.src_x.serialize();
18535        let src_y_bytes = self.src_y.serialize();
18536        let dst_x_bytes = self.dst_x.serialize();
18537        let dst_y_bytes = self.dst_y.serialize();
18538        let width_bytes = self.width.serialize();
18539        let height_bytes = self.height.serialize();
18540        let bit_plane_bytes = self.bit_plane.serialize();
18541        let mut request0 = vec![
18542            COPY_PLANE_REQUEST,
18543            0,
18544            0,
18545            0,
18546            src_drawable_bytes[0],
18547            src_drawable_bytes[1],
18548            src_drawable_bytes[2],
18549            src_drawable_bytes[3],
18550            dst_drawable_bytes[0],
18551            dst_drawable_bytes[1],
18552            dst_drawable_bytes[2],
18553            dst_drawable_bytes[3],
18554            gc_bytes[0],
18555            gc_bytes[1],
18556            gc_bytes[2],
18557            gc_bytes[3],
18558            src_x_bytes[0],
18559            src_x_bytes[1],
18560            src_y_bytes[0],
18561            src_y_bytes[1],
18562            dst_x_bytes[0],
18563            dst_x_bytes[1],
18564            dst_y_bytes[0],
18565            dst_y_bytes[1],
18566            width_bytes[0],
18567            width_bytes[1],
18568            height_bytes[0],
18569            height_bytes[1],
18570            bit_plane_bytes[0],
18571            bit_plane_bytes[1],
18572            bit_plane_bytes[2],
18573            bit_plane_bytes[3],
18574        ];
18575        let length_so_far = length_so_far + request0.len();
18576        assert_eq!(length_so_far % 4, 0);
18577        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
18578        request0[2..4].copy_from_slice(&length.to_ne_bytes());
18579        ([request0.into()], vec![])
18580    }
18581    /// Parse this request given its header, its body, and any fds that go along with it
18582    #[cfg(feature = "request-parsing")]
18583    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
18584        if header.major_opcode != COPY_PLANE_REQUEST {
18585            return Err(ParseError::InvalidValue);
18586        }
18587        let remaining = &[header.minor_opcode];
18588        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
18589        let _ = remaining;
18590        let (src_drawable, remaining) = Drawable::try_parse(value)?;
18591        let (dst_drawable, remaining) = Drawable::try_parse(remaining)?;
18592        let (gc, remaining) = Gcontext::try_parse(remaining)?;
18593        let (src_x, remaining) = i16::try_parse(remaining)?;
18594        let (src_y, remaining) = i16::try_parse(remaining)?;
18595        let (dst_x, remaining) = i16::try_parse(remaining)?;
18596        let (dst_y, remaining) = i16::try_parse(remaining)?;
18597        let (width, remaining) = u16::try_parse(remaining)?;
18598        let (height, remaining) = u16::try_parse(remaining)?;
18599        let (bit_plane, remaining) = u32::try_parse(remaining)?;
18600        let _ = remaining;
18601        Ok(CopyPlaneRequest {
18602            src_drawable,
18603            dst_drawable,
18604            gc,
18605            src_x,
18606            src_y,
18607            dst_x,
18608            dst_y,
18609            width,
18610            height,
18611            bit_plane,
18612        })
18613    }
18614}
18615impl Request for CopyPlaneRequest {
18616    const EXTENSION_NAME: Option<&'static str> = None;
18617
18618    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
18619        let (bufs, fds) = self.serialize();
18620        // Flatten the buffers into a single vector
18621        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
18622        (buf, fds)
18623    }
18624}
18625impl crate::x11_utils::VoidRequest for CopyPlaneRequest {
18626}
18627
18628/// # Fields
18629///
18630/// * `Origin` - Treats all coordinates as relative to the origin.
18631/// * `Previous` - Treats all coordinates after the first as relative to the previous coordinate.
18632#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
18633#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18634pub struct CoordMode(u8);
18635impl CoordMode {
18636    pub const ORIGIN: Self = Self(0);
18637    pub const PREVIOUS: Self = Self(1);
18638}
18639impl From<CoordMode> for u8 {
18640    #[inline]
18641    fn from(input: CoordMode) -> Self {
18642        input.0
18643    }
18644}
18645impl From<CoordMode> for Option<u8> {
18646    #[inline]
18647    fn from(input: CoordMode) -> Self {
18648        Some(input.0)
18649    }
18650}
18651impl From<CoordMode> for u16 {
18652    #[inline]
18653    fn from(input: CoordMode) -> Self {
18654        u16::from(input.0)
18655    }
18656}
18657impl From<CoordMode> for Option<u16> {
18658    #[inline]
18659    fn from(input: CoordMode) -> Self {
18660        Some(u16::from(input.0))
18661    }
18662}
18663impl From<CoordMode> for u32 {
18664    #[inline]
18665    fn from(input: CoordMode) -> Self {
18666        u32::from(input.0)
18667    }
18668}
18669impl From<CoordMode> for Option<u32> {
18670    #[inline]
18671    fn from(input: CoordMode) -> Self {
18672        Some(u32::from(input.0))
18673    }
18674}
18675impl From<u8> for CoordMode {
18676    #[inline]
18677    fn from(value: u8) -> Self {
18678        Self(value)
18679    }
18680}
18681impl core::fmt::Debug for CoordMode  {
18682    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
18683        let variants = [
18684            (Self::ORIGIN.0.into(), "ORIGIN", "Origin"),
18685            (Self::PREVIOUS.0.into(), "PREVIOUS", "Previous"),
18686        ];
18687        pretty_print_enum(fmt, self.0.into(), &variants)
18688    }
18689}
18690
18691/// Opcode for the PolyPoint request
18692pub const POLY_POINT_REQUEST: u8 = 64;
18693#[derive(Clone, Default)]
18694#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18695#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18696pub struct PolyPointRequest<'input> {
18697    pub coordinate_mode: CoordMode,
18698    pub drawable: Drawable,
18699    pub gc: Gcontext,
18700    pub points: Cow<'input, [Point]>,
18701}
18702impl_debug_if_no_extra_traits!(PolyPointRequest<'_>, "PolyPointRequest");
18703impl<'input> PolyPointRequest<'input> {
18704    /// Serialize this request into bytes for the provided connection
18705    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
18706        let length_so_far = 0;
18707        let coordinate_mode_bytes = u8::from(self.coordinate_mode).serialize();
18708        let drawable_bytes = self.drawable.serialize();
18709        let gc_bytes = self.gc.serialize();
18710        let mut request0 = vec![
18711            POLY_POINT_REQUEST,
18712            coordinate_mode_bytes[0],
18713            0,
18714            0,
18715            drawable_bytes[0],
18716            drawable_bytes[1],
18717            drawable_bytes[2],
18718            drawable_bytes[3],
18719            gc_bytes[0],
18720            gc_bytes[1],
18721            gc_bytes[2],
18722            gc_bytes[3],
18723        ];
18724        let length_so_far = length_so_far + request0.len();
18725        let points_bytes = self.points.serialize();
18726        let length_so_far = length_so_far + points_bytes.len();
18727        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
18728        let length_so_far = length_so_far + padding0.len();
18729        assert_eq!(length_so_far % 4, 0);
18730        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
18731        request0[2..4].copy_from_slice(&length.to_ne_bytes());
18732        ([request0.into(), points_bytes.into(), padding0.into()], vec![])
18733    }
18734    /// Parse this request given its header, its body, and any fds that go along with it
18735    #[cfg(feature = "request-parsing")]
18736    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
18737        if header.major_opcode != POLY_POINT_REQUEST {
18738            return Err(ParseError::InvalidValue);
18739        }
18740        let remaining = &[header.minor_opcode];
18741        let (coordinate_mode, remaining) = u8::try_parse(remaining)?;
18742        let coordinate_mode = coordinate_mode.into();
18743        let _ = remaining;
18744        let (drawable, remaining) = Drawable::try_parse(value)?;
18745        let (gc, remaining) = Gcontext::try_parse(remaining)?;
18746        let mut remaining = remaining;
18747        // Length is 'everything left in the input'
18748        let mut points = Vec::new();
18749        while !remaining.is_empty() {
18750            let (v, new_remaining) = Point::try_parse(remaining)?;
18751            remaining = new_remaining;
18752            points.push(v);
18753        }
18754        let _ = remaining;
18755        Ok(PolyPointRequest {
18756            coordinate_mode,
18757            drawable,
18758            gc,
18759            points: Cow::Owned(points),
18760        })
18761    }
18762    /// Clone all borrowed data in this PolyPointRequest.
18763    pub fn into_owned(self) -> PolyPointRequest<'static> {
18764        PolyPointRequest {
18765            coordinate_mode: self.coordinate_mode,
18766            drawable: self.drawable,
18767            gc: self.gc,
18768            points: Cow::Owned(self.points.into_owned()),
18769        }
18770    }
18771}
18772impl<'input> Request for PolyPointRequest<'input> {
18773    const EXTENSION_NAME: Option<&'static str> = None;
18774
18775    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
18776        let (bufs, fds) = self.serialize();
18777        // Flatten the buffers into a single vector
18778        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
18779        (buf, fds)
18780    }
18781}
18782impl<'input> crate::x11_utils::VoidRequest for PolyPointRequest<'input> {
18783}
18784
18785/// Opcode for the PolyLine request
18786pub const POLY_LINE_REQUEST: u8 = 65;
18787/// draw lines.
18788///
18789/// Draws `points_len`-1 lines between each pair of points (point[i], point[i+1])
18790/// in the `points` array. The lines are drawn in the order listed in the array.
18791/// They join correctly at all intermediate points, and if the first and last
18792/// points coincide, the first and last lines also join correctly. For any given
18793/// line, a pixel is not drawn more than once. If thin (zero line-width) lines
18794/// intersect, the intersecting pixels are drawn multiple times. If wide lines
18795/// intersect, the intersecting pixels are drawn only once, as though the entire
18796/// request were a single, filled shape.
18797///
18798/// # Fields
18799///
18800/// * `drawable` - The drawable to draw the line(s) on.
18801/// * `gc` - The graphics context to use.
18802/// * `points_len` - The number of `xcb_point_t` structures in `points`.
18803/// * `points` - An array of points.
18804/// * `coordinate_mode` -
18805///
18806/// # Errors
18807///
18808/// * `Drawable` - TODO: reasons?
18809/// * `GContext` - TODO: reasons?
18810/// * `Match` - TODO: reasons?
18811/// * `Value` - TODO: reasons?
18812///
18813/// # Example
18814///
18815/// ```text
18816/// /*
18817///  * Draw a straight line.
18818///  *
18819///  */
18820/// void my_example(xcb_connection_t *conn, xcb_drawable_t drawable, xcb_gcontext_t gc) {
18821///     xcb_poly_line(conn, XCB_COORD_MODE_ORIGIN, drawable, gc, 2,
18822///                   (xcb_point_t[]) { {10, 10}, {100, 10} });
18823///     xcb_flush(conn);
18824/// }
18825/// ```
18826#[derive(Clone, Default)]
18827#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18828#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18829pub struct PolyLineRequest<'input> {
18830    pub coordinate_mode: CoordMode,
18831    pub drawable: Drawable,
18832    pub gc: Gcontext,
18833    pub points: Cow<'input, [Point]>,
18834}
18835impl_debug_if_no_extra_traits!(PolyLineRequest<'_>, "PolyLineRequest");
18836impl<'input> PolyLineRequest<'input> {
18837    /// Serialize this request into bytes for the provided connection
18838    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
18839        let length_so_far = 0;
18840        let coordinate_mode_bytes = u8::from(self.coordinate_mode).serialize();
18841        let drawable_bytes = self.drawable.serialize();
18842        let gc_bytes = self.gc.serialize();
18843        let mut request0 = vec![
18844            POLY_LINE_REQUEST,
18845            coordinate_mode_bytes[0],
18846            0,
18847            0,
18848            drawable_bytes[0],
18849            drawable_bytes[1],
18850            drawable_bytes[2],
18851            drawable_bytes[3],
18852            gc_bytes[0],
18853            gc_bytes[1],
18854            gc_bytes[2],
18855            gc_bytes[3],
18856        ];
18857        let length_so_far = length_so_far + request0.len();
18858        let points_bytes = self.points.serialize();
18859        let length_so_far = length_so_far + points_bytes.len();
18860        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
18861        let length_so_far = length_so_far + padding0.len();
18862        assert_eq!(length_so_far % 4, 0);
18863        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
18864        request0[2..4].copy_from_slice(&length.to_ne_bytes());
18865        ([request0.into(), points_bytes.into(), padding0.into()], vec![])
18866    }
18867    /// Parse this request given its header, its body, and any fds that go along with it
18868    #[cfg(feature = "request-parsing")]
18869    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
18870        if header.major_opcode != POLY_LINE_REQUEST {
18871            return Err(ParseError::InvalidValue);
18872        }
18873        let remaining = &[header.minor_opcode];
18874        let (coordinate_mode, remaining) = u8::try_parse(remaining)?;
18875        let coordinate_mode = coordinate_mode.into();
18876        let _ = remaining;
18877        let (drawable, remaining) = Drawable::try_parse(value)?;
18878        let (gc, remaining) = Gcontext::try_parse(remaining)?;
18879        let mut remaining = remaining;
18880        // Length is 'everything left in the input'
18881        let mut points = Vec::new();
18882        while !remaining.is_empty() {
18883            let (v, new_remaining) = Point::try_parse(remaining)?;
18884            remaining = new_remaining;
18885            points.push(v);
18886        }
18887        let _ = remaining;
18888        Ok(PolyLineRequest {
18889            coordinate_mode,
18890            drawable,
18891            gc,
18892            points: Cow::Owned(points),
18893        })
18894    }
18895    /// Clone all borrowed data in this PolyLineRequest.
18896    pub fn into_owned(self) -> PolyLineRequest<'static> {
18897        PolyLineRequest {
18898            coordinate_mode: self.coordinate_mode,
18899            drawable: self.drawable,
18900            gc: self.gc,
18901            points: Cow::Owned(self.points.into_owned()),
18902        }
18903    }
18904}
18905impl<'input> Request for PolyLineRequest<'input> {
18906    const EXTENSION_NAME: Option<&'static str> = None;
18907
18908    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
18909        let (bufs, fds) = self.serialize();
18910        // Flatten the buffers into a single vector
18911        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
18912        (buf, fds)
18913    }
18914}
18915impl<'input> crate::x11_utils::VoidRequest for PolyLineRequest<'input> {
18916}
18917
18918#[derive(Clone, Copy, Default)]
18919#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18920#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18921pub struct Segment {
18922    pub x1: i16,
18923    pub y1: i16,
18924    pub x2: i16,
18925    pub y2: i16,
18926}
18927impl_debug_if_no_extra_traits!(Segment, "Segment");
18928impl TryParse for Segment {
18929    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
18930        let (x1, remaining) = i16::try_parse(remaining)?;
18931        let (y1, remaining) = i16::try_parse(remaining)?;
18932        let (x2, remaining) = i16::try_parse(remaining)?;
18933        let (y2, remaining) = i16::try_parse(remaining)?;
18934        let result = Segment { x1, y1, x2, y2 };
18935        Ok((result, remaining))
18936    }
18937}
18938impl Serialize for Segment {
18939    type Bytes = [u8; 8];
18940    fn serialize(&self) -> [u8; 8] {
18941        let x1_bytes = self.x1.serialize();
18942        let y1_bytes = self.y1.serialize();
18943        let x2_bytes = self.x2.serialize();
18944        let y2_bytes = self.y2.serialize();
18945        [
18946            x1_bytes[0],
18947            x1_bytes[1],
18948            y1_bytes[0],
18949            y1_bytes[1],
18950            x2_bytes[0],
18951            x2_bytes[1],
18952            y2_bytes[0],
18953            y2_bytes[1],
18954        ]
18955    }
18956    fn serialize_into(&self, bytes: &mut Vec<u8>) {
18957        bytes.reserve(8);
18958        self.x1.serialize_into(bytes);
18959        self.y1.serialize_into(bytes);
18960        self.x2.serialize_into(bytes);
18961        self.y2.serialize_into(bytes);
18962    }
18963}
18964
18965/// Opcode for the PolySegment request
18966pub const POLY_SEGMENT_REQUEST: u8 = 66;
18967/// draw lines.
18968///
18969/// Draws multiple, unconnected lines. For each segment, a line is drawn between
18970/// (x1, y1) and (x2, y2). The lines are drawn in the order listed in the array of
18971/// `xcb_segment_t` structures and does not perform joining at coincident
18972/// endpoints. For any given line, a pixel is not drawn more than once. If lines
18973/// intersect, the intersecting pixels are drawn multiple times.
18974///
18975/// TODO: include the xcb_segment_t data structure
18976///
18977/// TODO: an example
18978///
18979/// # Fields
18980///
18981/// * `drawable` - A drawable (Window or Pixmap) to draw on.
18982/// * `gc` - The graphics context to use.
18983///
18984/// TODO: document which attributes of a gc are used
18985/// * `segments_len` - The number of `xcb_segment_t` structures in `segments`.
18986/// * `segments` - An array of `xcb_segment_t` structures.
18987///
18988/// # Errors
18989///
18990/// * `Drawable` - The specified `drawable` does not exist.
18991/// * `GContext` - The specified `gc` does not exist.
18992/// * `Match` - TODO: reasons?
18993#[derive(Clone, Default)]
18994#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18995#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18996pub struct PolySegmentRequest<'input> {
18997    pub drawable: Drawable,
18998    pub gc: Gcontext,
18999    pub segments: Cow<'input, [Segment]>,
19000}
19001impl_debug_if_no_extra_traits!(PolySegmentRequest<'_>, "PolySegmentRequest");
19002impl<'input> PolySegmentRequest<'input> {
19003    /// Serialize this request into bytes for the provided connection
19004    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
19005        let length_so_far = 0;
19006        let drawable_bytes = self.drawable.serialize();
19007        let gc_bytes = self.gc.serialize();
19008        let mut request0 = vec![
19009            POLY_SEGMENT_REQUEST,
19010            0,
19011            0,
19012            0,
19013            drawable_bytes[0],
19014            drawable_bytes[1],
19015            drawable_bytes[2],
19016            drawable_bytes[3],
19017            gc_bytes[0],
19018            gc_bytes[1],
19019            gc_bytes[2],
19020            gc_bytes[3],
19021        ];
19022        let length_so_far = length_so_far + request0.len();
19023        let segments_bytes = self.segments.serialize();
19024        let length_so_far = length_so_far + segments_bytes.len();
19025        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
19026        let length_so_far = length_so_far + padding0.len();
19027        assert_eq!(length_so_far % 4, 0);
19028        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
19029        request0[2..4].copy_from_slice(&length.to_ne_bytes());
19030        ([request0.into(), segments_bytes.into(), padding0.into()], vec![])
19031    }
19032    /// Parse this request given its header, its body, and any fds that go along with it
19033    #[cfg(feature = "request-parsing")]
19034    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
19035        if header.major_opcode != POLY_SEGMENT_REQUEST {
19036            return Err(ParseError::InvalidValue);
19037        }
19038        let remaining = &[header.minor_opcode];
19039        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
19040        let _ = remaining;
19041        let (drawable, remaining) = Drawable::try_parse(value)?;
19042        let (gc, remaining) = Gcontext::try_parse(remaining)?;
19043        let mut remaining = remaining;
19044        // Length is 'everything left in the input'
19045        let mut segments = Vec::new();
19046        while !remaining.is_empty() {
19047            let (v, new_remaining) = Segment::try_parse(remaining)?;
19048            remaining = new_remaining;
19049            segments.push(v);
19050        }
19051        let _ = remaining;
19052        Ok(PolySegmentRequest {
19053            drawable,
19054            gc,
19055            segments: Cow::Owned(segments),
19056        })
19057    }
19058    /// Clone all borrowed data in this PolySegmentRequest.
19059    pub fn into_owned(self) -> PolySegmentRequest<'static> {
19060        PolySegmentRequest {
19061            drawable: self.drawable,
19062            gc: self.gc,
19063            segments: Cow::Owned(self.segments.into_owned()),
19064        }
19065    }
19066}
19067impl<'input> Request for PolySegmentRequest<'input> {
19068    const EXTENSION_NAME: Option<&'static str> = None;
19069
19070    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
19071        let (bufs, fds) = self.serialize();
19072        // Flatten the buffers into a single vector
19073        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
19074        (buf, fds)
19075    }
19076}
19077impl<'input> crate::x11_utils::VoidRequest for PolySegmentRequest<'input> {
19078}
19079
19080/// Opcode for the PolyRectangle request
19081pub const POLY_RECTANGLE_REQUEST: u8 = 67;
19082#[derive(Clone, Default)]
19083#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
19084#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19085pub struct PolyRectangleRequest<'input> {
19086    pub drawable: Drawable,
19087    pub gc: Gcontext,
19088    pub rectangles: Cow<'input, [Rectangle]>,
19089}
19090impl_debug_if_no_extra_traits!(PolyRectangleRequest<'_>, "PolyRectangleRequest");
19091impl<'input> PolyRectangleRequest<'input> {
19092    /// Serialize this request into bytes for the provided connection
19093    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
19094        let length_so_far = 0;
19095        let drawable_bytes = self.drawable.serialize();
19096        let gc_bytes = self.gc.serialize();
19097        let mut request0 = vec![
19098            POLY_RECTANGLE_REQUEST,
19099            0,
19100            0,
19101            0,
19102            drawable_bytes[0],
19103            drawable_bytes[1],
19104            drawable_bytes[2],
19105            drawable_bytes[3],
19106            gc_bytes[0],
19107            gc_bytes[1],
19108            gc_bytes[2],
19109            gc_bytes[3],
19110        ];
19111        let length_so_far = length_so_far + request0.len();
19112        let rectangles_bytes = self.rectangles.serialize();
19113        let length_so_far = length_so_far + rectangles_bytes.len();
19114        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
19115        let length_so_far = length_so_far + padding0.len();
19116        assert_eq!(length_so_far % 4, 0);
19117        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
19118        request0[2..4].copy_from_slice(&length.to_ne_bytes());
19119        ([request0.into(), rectangles_bytes.into(), padding0.into()], vec![])
19120    }
19121    /// Parse this request given its header, its body, and any fds that go along with it
19122    #[cfg(feature = "request-parsing")]
19123    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
19124        if header.major_opcode != POLY_RECTANGLE_REQUEST {
19125            return Err(ParseError::InvalidValue);
19126        }
19127        let remaining = &[header.minor_opcode];
19128        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
19129        let _ = remaining;
19130        let (drawable, remaining) = Drawable::try_parse(value)?;
19131        let (gc, remaining) = Gcontext::try_parse(remaining)?;
19132        let mut remaining = remaining;
19133        // Length is 'everything left in the input'
19134        let mut rectangles = Vec::new();
19135        while !remaining.is_empty() {
19136            let (v, new_remaining) = Rectangle::try_parse(remaining)?;
19137            remaining = new_remaining;
19138            rectangles.push(v);
19139        }
19140        let _ = remaining;
19141        Ok(PolyRectangleRequest {
19142            drawable,
19143            gc,
19144            rectangles: Cow::Owned(rectangles),
19145        })
19146    }
19147    /// Clone all borrowed data in this PolyRectangleRequest.
19148    pub fn into_owned(self) -> PolyRectangleRequest<'static> {
19149        PolyRectangleRequest {
19150            drawable: self.drawable,
19151            gc: self.gc,
19152            rectangles: Cow::Owned(self.rectangles.into_owned()),
19153        }
19154    }
19155}
19156impl<'input> Request for PolyRectangleRequest<'input> {
19157    const EXTENSION_NAME: Option<&'static str> = None;
19158
19159    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
19160        let (bufs, fds) = self.serialize();
19161        // Flatten the buffers into a single vector
19162        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
19163        (buf, fds)
19164    }
19165}
19166impl<'input> crate::x11_utils::VoidRequest for PolyRectangleRequest<'input> {
19167}
19168
19169/// Opcode for the PolyArc request
19170pub const POLY_ARC_REQUEST: u8 = 68;
19171#[derive(Clone, Default)]
19172#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
19173#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19174pub struct PolyArcRequest<'input> {
19175    pub drawable: Drawable,
19176    pub gc: Gcontext,
19177    pub arcs: Cow<'input, [Arc]>,
19178}
19179impl_debug_if_no_extra_traits!(PolyArcRequest<'_>, "PolyArcRequest");
19180impl<'input> PolyArcRequest<'input> {
19181    /// Serialize this request into bytes for the provided connection
19182    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
19183        let length_so_far = 0;
19184        let drawable_bytes = self.drawable.serialize();
19185        let gc_bytes = self.gc.serialize();
19186        let mut request0 = vec![
19187            POLY_ARC_REQUEST,
19188            0,
19189            0,
19190            0,
19191            drawable_bytes[0],
19192            drawable_bytes[1],
19193            drawable_bytes[2],
19194            drawable_bytes[3],
19195            gc_bytes[0],
19196            gc_bytes[1],
19197            gc_bytes[2],
19198            gc_bytes[3],
19199        ];
19200        let length_so_far = length_so_far + request0.len();
19201        let arcs_bytes = self.arcs.serialize();
19202        let length_so_far = length_so_far + arcs_bytes.len();
19203        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
19204        let length_so_far = length_so_far + padding0.len();
19205        assert_eq!(length_so_far % 4, 0);
19206        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
19207        request0[2..4].copy_from_slice(&length.to_ne_bytes());
19208        ([request0.into(), arcs_bytes.into(), padding0.into()], vec![])
19209    }
19210    /// Parse this request given its header, its body, and any fds that go along with it
19211    #[cfg(feature = "request-parsing")]
19212    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
19213        if header.major_opcode != POLY_ARC_REQUEST {
19214            return Err(ParseError::InvalidValue);
19215        }
19216        let remaining = &[header.minor_opcode];
19217        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
19218        let _ = remaining;
19219        let (drawable, remaining) = Drawable::try_parse(value)?;
19220        let (gc, remaining) = Gcontext::try_parse(remaining)?;
19221        let mut remaining = remaining;
19222        // Length is 'everything left in the input'
19223        let mut arcs = Vec::new();
19224        while !remaining.is_empty() {
19225            let (v, new_remaining) = Arc::try_parse(remaining)?;
19226            remaining = new_remaining;
19227            arcs.push(v);
19228        }
19229        let _ = remaining;
19230        Ok(PolyArcRequest {
19231            drawable,
19232            gc,
19233            arcs: Cow::Owned(arcs),
19234        })
19235    }
19236    /// Clone all borrowed data in this PolyArcRequest.
19237    pub fn into_owned(self) -> PolyArcRequest<'static> {
19238        PolyArcRequest {
19239            drawable: self.drawable,
19240            gc: self.gc,
19241            arcs: Cow::Owned(self.arcs.into_owned()),
19242        }
19243    }
19244}
19245impl<'input> Request for PolyArcRequest<'input> {
19246    const EXTENSION_NAME: Option<&'static str> = None;
19247
19248    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
19249        let (bufs, fds) = self.serialize();
19250        // Flatten the buffers into a single vector
19251        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
19252        (buf, fds)
19253    }
19254}
19255impl<'input> crate::x11_utils::VoidRequest for PolyArcRequest<'input> {
19256}
19257
19258#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
19259#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19260pub struct PolyShape(u8);
19261impl PolyShape {
19262    pub const COMPLEX: Self = Self(0);
19263    pub const NONCONVEX: Self = Self(1);
19264    pub const CONVEX: Self = Self(2);
19265}
19266impl From<PolyShape> for u8 {
19267    #[inline]
19268    fn from(input: PolyShape) -> Self {
19269        input.0
19270    }
19271}
19272impl From<PolyShape> for Option<u8> {
19273    #[inline]
19274    fn from(input: PolyShape) -> Self {
19275        Some(input.0)
19276    }
19277}
19278impl From<PolyShape> for u16 {
19279    #[inline]
19280    fn from(input: PolyShape) -> Self {
19281        u16::from(input.0)
19282    }
19283}
19284impl From<PolyShape> for Option<u16> {
19285    #[inline]
19286    fn from(input: PolyShape) -> Self {
19287        Some(u16::from(input.0))
19288    }
19289}
19290impl From<PolyShape> for u32 {
19291    #[inline]
19292    fn from(input: PolyShape) -> Self {
19293        u32::from(input.0)
19294    }
19295}
19296impl From<PolyShape> for Option<u32> {
19297    #[inline]
19298    fn from(input: PolyShape) -> Self {
19299        Some(u32::from(input.0))
19300    }
19301}
19302impl From<u8> for PolyShape {
19303    #[inline]
19304    fn from(value: u8) -> Self {
19305        Self(value)
19306    }
19307}
19308impl core::fmt::Debug for PolyShape  {
19309    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
19310        let variants = [
19311            (Self::COMPLEX.0.into(), "COMPLEX", "Complex"),
19312            (Self::NONCONVEX.0.into(), "NONCONVEX", "Nonconvex"),
19313            (Self::CONVEX.0.into(), "CONVEX", "Convex"),
19314        ];
19315        pretty_print_enum(fmt, self.0.into(), &variants)
19316    }
19317}
19318
19319/// Opcode for the FillPoly request
19320pub const FILL_POLY_REQUEST: u8 = 69;
19321#[derive(Clone, Default)]
19322#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
19323#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19324pub struct FillPolyRequest<'input> {
19325    pub drawable: Drawable,
19326    pub gc: Gcontext,
19327    pub shape: PolyShape,
19328    pub coordinate_mode: CoordMode,
19329    pub points: Cow<'input, [Point]>,
19330}
19331impl_debug_if_no_extra_traits!(FillPolyRequest<'_>, "FillPolyRequest");
19332impl<'input> FillPolyRequest<'input> {
19333    /// Serialize this request into bytes for the provided connection
19334    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
19335        let length_so_far = 0;
19336        let drawable_bytes = self.drawable.serialize();
19337        let gc_bytes = self.gc.serialize();
19338        let shape_bytes = u8::from(self.shape).serialize();
19339        let coordinate_mode_bytes = u8::from(self.coordinate_mode).serialize();
19340        let mut request0 = vec![
19341            FILL_POLY_REQUEST,
19342            0,
19343            0,
19344            0,
19345            drawable_bytes[0],
19346            drawable_bytes[1],
19347            drawable_bytes[2],
19348            drawable_bytes[3],
19349            gc_bytes[0],
19350            gc_bytes[1],
19351            gc_bytes[2],
19352            gc_bytes[3],
19353            shape_bytes[0],
19354            coordinate_mode_bytes[0],
19355            0,
19356            0,
19357        ];
19358        let length_so_far = length_so_far + request0.len();
19359        let points_bytes = self.points.serialize();
19360        let length_so_far = length_so_far + points_bytes.len();
19361        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
19362        let length_so_far = length_so_far + padding0.len();
19363        assert_eq!(length_so_far % 4, 0);
19364        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
19365        request0[2..4].copy_from_slice(&length.to_ne_bytes());
19366        ([request0.into(), points_bytes.into(), padding0.into()], vec![])
19367    }
19368    /// Parse this request given its header, its body, and any fds that go along with it
19369    #[cfg(feature = "request-parsing")]
19370    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
19371        if header.major_opcode != FILL_POLY_REQUEST {
19372            return Err(ParseError::InvalidValue);
19373        }
19374        let remaining = &[header.minor_opcode];
19375        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
19376        let _ = remaining;
19377        let (drawable, remaining) = Drawable::try_parse(value)?;
19378        let (gc, remaining) = Gcontext::try_parse(remaining)?;
19379        let (shape, remaining) = u8::try_parse(remaining)?;
19380        let shape = shape.into();
19381        let (coordinate_mode, remaining) = u8::try_parse(remaining)?;
19382        let coordinate_mode = coordinate_mode.into();
19383        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
19384        let mut remaining = remaining;
19385        // Length is 'everything left in the input'
19386        let mut points = Vec::new();
19387        while !remaining.is_empty() {
19388            let (v, new_remaining) = Point::try_parse(remaining)?;
19389            remaining = new_remaining;
19390            points.push(v);
19391        }
19392        let _ = remaining;
19393        Ok(FillPolyRequest {
19394            drawable,
19395            gc,
19396            shape,
19397            coordinate_mode,
19398            points: Cow::Owned(points),
19399        })
19400    }
19401    /// Clone all borrowed data in this FillPolyRequest.
19402    pub fn into_owned(self) -> FillPolyRequest<'static> {
19403        FillPolyRequest {
19404            drawable: self.drawable,
19405            gc: self.gc,
19406            shape: self.shape,
19407            coordinate_mode: self.coordinate_mode,
19408            points: Cow::Owned(self.points.into_owned()),
19409        }
19410    }
19411}
19412impl<'input> Request for FillPolyRequest<'input> {
19413    const EXTENSION_NAME: Option<&'static str> = None;
19414
19415    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
19416        let (bufs, fds) = self.serialize();
19417        // Flatten the buffers into a single vector
19418        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
19419        (buf, fds)
19420    }
19421}
19422impl<'input> crate::x11_utils::VoidRequest for FillPolyRequest<'input> {
19423}
19424
19425/// Opcode for the PolyFillRectangle request
19426pub const POLY_FILL_RECTANGLE_REQUEST: u8 = 70;
19427/// Fills rectangles.
19428///
19429/// Fills the specified rectangle(s) in the order listed in the array. For any
19430/// given rectangle, each pixel is not drawn more than once. If rectangles
19431/// intersect, the intersecting pixels are drawn multiple times.
19432///
19433/// # Fields
19434///
19435/// * `drawable` - The drawable (Window or Pixmap) to draw on.
19436/// * `gc` - The graphics context to use.
19437///
19438/// The following graphics context components are used: function, plane-mask,
19439/// fill-style, subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask.
19440///
19441/// The following graphics context mode-dependent components are used:
19442/// foreground, background, tile, stipple, tile-stipple-x-origin, and
19443/// tile-stipple-y-origin.
19444/// * `rectangles_len` - The number of `xcb_rectangle_t` structures in `rectangles`.
19445/// * `rectangles` - The rectangles to fill.
19446///
19447/// # Errors
19448///
19449/// * `Drawable` - The specified `drawable` (Window or Pixmap) does not exist.
19450/// * `GContext` - The specified graphics context does not exist.
19451/// * `Match` - TODO: reasons?
19452#[derive(Clone, Default)]
19453#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
19454#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19455pub struct PolyFillRectangleRequest<'input> {
19456    pub drawable: Drawable,
19457    pub gc: Gcontext,
19458    pub rectangles: Cow<'input, [Rectangle]>,
19459}
19460impl_debug_if_no_extra_traits!(PolyFillRectangleRequest<'_>, "PolyFillRectangleRequest");
19461impl<'input> PolyFillRectangleRequest<'input> {
19462    /// Serialize this request into bytes for the provided connection
19463    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
19464        let length_so_far = 0;
19465        let drawable_bytes = self.drawable.serialize();
19466        let gc_bytes = self.gc.serialize();
19467        let mut request0 = vec![
19468            POLY_FILL_RECTANGLE_REQUEST,
19469            0,
19470            0,
19471            0,
19472            drawable_bytes[0],
19473            drawable_bytes[1],
19474            drawable_bytes[2],
19475            drawable_bytes[3],
19476            gc_bytes[0],
19477            gc_bytes[1],
19478            gc_bytes[2],
19479            gc_bytes[3],
19480        ];
19481        let length_so_far = length_so_far + request0.len();
19482        let rectangles_bytes = self.rectangles.serialize();
19483        let length_so_far = length_so_far + rectangles_bytes.len();
19484        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
19485        let length_so_far = length_so_far + padding0.len();
19486        assert_eq!(length_so_far % 4, 0);
19487        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
19488        request0[2..4].copy_from_slice(&length.to_ne_bytes());
19489        ([request0.into(), rectangles_bytes.into(), padding0.into()], vec![])
19490    }
19491    /// Parse this request given its header, its body, and any fds that go along with it
19492    #[cfg(feature = "request-parsing")]
19493    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
19494        if header.major_opcode != POLY_FILL_RECTANGLE_REQUEST {
19495            return Err(ParseError::InvalidValue);
19496        }
19497        let remaining = &[header.minor_opcode];
19498        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
19499        let _ = remaining;
19500        let (drawable, remaining) = Drawable::try_parse(value)?;
19501        let (gc, remaining) = Gcontext::try_parse(remaining)?;
19502        let mut remaining = remaining;
19503        // Length is 'everything left in the input'
19504        let mut rectangles = Vec::new();
19505        while !remaining.is_empty() {
19506            let (v, new_remaining) = Rectangle::try_parse(remaining)?;
19507            remaining = new_remaining;
19508            rectangles.push(v);
19509        }
19510        let _ = remaining;
19511        Ok(PolyFillRectangleRequest {
19512            drawable,
19513            gc,
19514            rectangles: Cow::Owned(rectangles),
19515        })
19516    }
19517    /// Clone all borrowed data in this PolyFillRectangleRequest.
19518    pub fn into_owned(self) -> PolyFillRectangleRequest<'static> {
19519        PolyFillRectangleRequest {
19520            drawable: self.drawable,
19521            gc: self.gc,
19522            rectangles: Cow::Owned(self.rectangles.into_owned()),
19523        }
19524    }
19525}
19526impl<'input> Request for PolyFillRectangleRequest<'input> {
19527    const EXTENSION_NAME: Option<&'static str> = None;
19528
19529    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
19530        let (bufs, fds) = self.serialize();
19531        // Flatten the buffers into a single vector
19532        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
19533        (buf, fds)
19534    }
19535}
19536impl<'input> crate::x11_utils::VoidRequest for PolyFillRectangleRequest<'input> {
19537}
19538
19539/// Opcode for the PolyFillArc request
19540pub const POLY_FILL_ARC_REQUEST: u8 = 71;
19541#[derive(Clone, Default)]
19542#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
19543#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19544pub struct PolyFillArcRequest<'input> {
19545    pub drawable: Drawable,
19546    pub gc: Gcontext,
19547    pub arcs: Cow<'input, [Arc]>,
19548}
19549impl_debug_if_no_extra_traits!(PolyFillArcRequest<'_>, "PolyFillArcRequest");
19550impl<'input> PolyFillArcRequest<'input> {
19551    /// Serialize this request into bytes for the provided connection
19552    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
19553        let length_so_far = 0;
19554        let drawable_bytes = self.drawable.serialize();
19555        let gc_bytes = self.gc.serialize();
19556        let mut request0 = vec![
19557            POLY_FILL_ARC_REQUEST,
19558            0,
19559            0,
19560            0,
19561            drawable_bytes[0],
19562            drawable_bytes[1],
19563            drawable_bytes[2],
19564            drawable_bytes[3],
19565            gc_bytes[0],
19566            gc_bytes[1],
19567            gc_bytes[2],
19568            gc_bytes[3],
19569        ];
19570        let length_so_far = length_so_far + request0.len();
19571        let arcs_bytes = self.arcs.serialize();
19572        let length_so_far = length_so_far + arcs_bytes.len();
19573        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
19574        let length_so_far = length_so_far + padding0.len();
19575        assert_eq!(length_so_far % 4, 0);
19576        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
19577        request0[2..4].copy_from_slice(&length.to_ne_bytes());
19578        ([request0.into(), arcs_bytes.into(), padding0.into()], vec![])
19579    }
19580    /// Parse this request given its header, its body, and any fds that go along with it
19581    #[cfg(feature = "request-parsing")]
19582    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
19583        if header.major_opcode != POLY_FILL_ARC_REQUEST {
19584            return Err(ParseError::InvalidValue);
19585        }
19586        let remaining = &[header.minor_opcode];
19587        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
19588        let _ = remaining;
19589        let (drawable, remaining) = Drawable::try_parse(value)?;
19590        let (gc, remaining) = Gcontext::try_parse(remaining)?;
19591        let mut remaining = remaining;
19592        // Length is 'everything left in the input'
19593        let mut arcs = Vec::new();
19594        while !remaining.is_empty() {
19595            let (v, new_remaining) = Arc::try_parse(remaining)?;
19596            remaining = new_remaining;
19597            arcs.push(v);
19598        }
19599        let _ = remaining;
19600        Ok(PolyFillArcRequest {
19601            drawable,
19602            gc,
19603            arcs: Cow::Owned(arcs),
19604        })
19605    }
19606    /// Clone all borrowed data in this PolyFillArcRequest.
19607    pub fn into_owned(self) -> PolyFillArcRequest<'static> {
19608        PolyFillArcRequest {
19609            drawable: self.drawable,
19610            gc: self.gc,
19611            arcs: Cow::Owned(self.arcs.into_owned()),
19612        }
19613    }
19614}
19615impl<'input> Request for PolyFillArcRequest<'input> {
19616    const EXTENSION_NAME: Option<&'static str> = None;
19617
19618    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
19619        let (bufs, fds) = self.serialize();
19620        // Flatten the buffers into a single vector
19621        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
19622        (buf, fds)
19623    }
19624}
19625impl<'input> crate::x11_utils::VoidRequest for PolyFillArcRequest<'input> {
19626}
19627
19628#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
19629#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19630pub struct ImageFormat(u8);
19631impl ImageFormat {
19632    pub const XY_BITMAP: Self = Self(0);
19633    pub const XY_PIXMAP: Self = Self(1);
19634    pub const Z_PIXMAP: Self = Self(2);
19635}
19636impl From<ImageFormat> for u8 {
19637    #[inline]
19638    fn from(input: ImageFormat) -> Self {
19639        input.0
19640    }
19641}
19642impl From<ImageFormat> for Option<u8> {
19643    #[inline]
19644    fn from(input: ImageFormat) -> Self {
19645        Some(input.0)
19646    }
19647}
19648impl From<ImageFormat> for u16 {
19649    #[inline]
19650    fn from(input: ImageFormat) -> Self {
19651        u16::from(input.0)
19652    }
19653}
19654impl From<ImageFormat> for Option<u16> {
19655    #[inline]
19656    fn from(input: ImageFormat) -> Self {
19657        Some(u16::from(input.0))
19658    }
19659}
19660impl From<ImageFormat> for u32 {
19661    #[inline]
19662    fn from(input: ImageFormat) -> Self {
19663        u32::from(input.0)
19664    }
19665}
19666impl From<ImageFormat> for Option<u32> {
19667    #[inline]
19668    fn from(input: ImageFormat) -> Self {
19669        Some(u32::from(input.0))
19670    }
19671}
19672impl From<u8> for ImageFormat {
19673    #[inline]
19674    fn from(value: u8) -> Self {
19675        Self(value)
19676    }
19677}
19678impl core::fmt::Debug for ImageFormat  {
19679    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
19680        let variants = [
19681            (Self::XY_BITMAP.0.into(), "XY_BITMAP", "XYBitmap"),
19682            (Self::XY_PIXMAP.0.into(), "XY_PIXMAP", "XYPixmap"),
19683            (Self::Z_PIXMAP.0.into(), "Z_PIXMAP", "ZPixmap"),
19684        ];
19685        pretty_print_enum(fmt, self.0.into(), &variants)
19686    }
19687}
19688
19689/// Opcode for the PutImage request
19690pub const PUT_IMAGE_REQUEST: u8 = 72;
19691#[derive(Clone, Default)]
19692#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
19693#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19694pub struct PutImageRequest<'input> {
19695    pub format: ImageFormat,
19696    pub drawable: Drawable,
19697    pub gc: Gcontext,
19698    pub width: u16,
19699    pub height: u16,
19700    pub dst_x: i16,
19701    pub dst_y: i16,
19702    pub left_pad: u8,
19703    pub depth: u8,
19704    pub data: Cow<'input, [u8]>,
19705}
19706impl_debug_if_no_extra_traits!(PutImageRequest<'_>, "PutImageRequest");
19707impl<'input> PutImageRequest<'input> {
19708    /// Serialize this request into bytes for the provided connection
19709    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
19710        let length_so_far = 0;
19711        let format_bytes = u8::from(self.format).serialize();
19712        let drawable_bytes = self.drawable.serialize();
19713        let gc_bytes = self.gc.serialize();
19714        let width_bytes = self.width.serialize();
19715        let height_bytes = self.height.serialize();
19716        let dst_x_bytes = self.dst_x.serialize();
19717        let dst_y_bytes = self.dst_y.serialize();
19718        let left_pad_bytes = self.left_pad.serialize();
19719        let depth_bytes = self.depth.serialize();
19720        let mut request0 = vec![
19721            PUT_IMAGE_REQUEST,
19722            format_bytes[0],
19723            0,
19724            0,
19725            drawable_bytes[0],
19726            drawable_bytes[1],
19727            drawable_bytes[2],
19728            drawable_bytes[3],
19729            gc_bytes[0],
19730            gc_bytes[1],
19731            gc_bytes[2],
19732            gc_bytes[3],
19733            width_bytes[0],
19734            width_bytes[1],
19735            height_bytes[0],
19736            height_bytes[1],
19737            dst_x_bytes[0],
19738            dst_x_bytes[1],
19739            dst_y_bytes[0],
19740            dst_y_bytes[1],
19741            left_pad_bytes[0],
19742            depth_bytes[0],
19743            0,
19744            0,
19745        ];
19746        let length_so_far = length_so_far + request0.len();
19747        let length_so_far = length_so_far + self.data.len();
19748        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
19749        let length_so_far = length_so_far + padding0.len();
19750        assert_eq!(length_so_far % 4, 0);
19751        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
19752        request0[2..4].copy_from_slice(&length.to_ne_bytes());
19753        ([request0.into(), self.data, padding0.into()], vec![])
19754    }
19755    /// Parse this request given its header, its body, and any fds that go along with it
19756    #[cfg(feature = "request-parsing")]
19757    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
19758        if header.major_opcode != PUT_IMAGE_REQUEST {
19759            return Err(ParseError::InvalidValue);
19760        }
19761        let remaining = &[header.minor_opcode];
19762        let (format, remaining) = u8::try_parse(remaining)?;
19763        let format = format.into();
19764        let _ = remaining;
19765        let (drawable, remaining) = Drawable::try_parse(value)?;
19766        let (gc, remaining) = Gcontext::try_parse(remaining)?;
19767        let (width, remaining) = u16::try_parse(remaining)?;
19768        let (height, remaining) = u16::try_parse(remaining)?;
19769        let (dst_x, remaining) = i16::try_parse(remaining)?;
19770        let (dst_y, remaining) = i16::try_parse(remaining)?;
19771        let (left_pad, remaining) = u8::try_parse(remaining)?;
19772        let (depth, remaining) = u8::try_parse(remaining)?;
19773        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
19774        let (data, remaining) = remaining.split_at(remaining.len());
19775        let _ = remaining;
19776        Ok(PutImageRequest {
19777            format,
19778            drawable,
19779            gc,
19780            width,
19781            height,
19782            dst_x,
19783            dst_y,
19784            left_pad,
19785            depth,
19786            data: Cow::Borrowed(data),
19787        })
19788    }
19789    /// Clone all borrowed data in this PutImageRequest.
19790    pub fn into_owned(self) -> PutImageRequest<'static> {
19791        PutImageRequest {
19792            format: self.format,
19793            drawable: self.drawable,
19794            gc: self.gc,
19795            width: self.width,
19796            height: self.height,
19797            dst_x: self.dst_x,
19798            dst_y: self.dst_y,
19799            left_pad: self.left_pad,
19800            depth: self.depth,
19801            data: Cow::Owned(self.data.into_owned()),
19802        }
19803    }
19804}
19805impl<'input> Request for PutImageRequest<'input> {
19806    const EXTENSION_NAME: Option<&'static str> = None;
19807
19808    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
19809        let (bufs, fds) = self.serialize();
19810        // Flatten the buffers into a single vector
19811        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
19812        (buf, fds)
19813    }
19814}
19815impl<'input> crate::x11_utils::VoidRequest for PutImageRequest<'input> {
19816}
19817
19818/// Opcode for the GetImage request
19819pub const GET_IMAGE_REQUEST: u8 = 73;
19820#[derive(Clone, Copy, Default)]
19821#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
19822#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19823pub struct GetImageRequest {
19824    pub format: ImageFormat,
19825    pub drawable: Drawable,
19826    pub x: i16,
19827    pub y: i16,
19828    pub width: u16,
19829    pub height: u16,
19830    pub plane_mask: u32,
19831}
19832impl_debug_if_no_extra_traits!(GetImageRequest, "GetImageRequest");
19833impl GetImageRequest {
19834    /// Serialize this request into bytes for the provided connection
19835    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
19836        let length_so_far = 0;
19837        let format_bytes = u8::from(self.format).serialize();
19838        let drawable_bytes = self.drawable.serialize();
19839        let x_bytes = self.x.serialize();
19840        let y_bytes = self.y.serialize();
19841        let width_bytes = self.width.serialize();
19842        let height_bytes = self.height.serialize();
19843        let plane_mask_bytes = self.plane_mask.serialize();
19844        let mut request0 = vec![
19845            GET_IMAGE_REQUEST,
19846            format_bytes[0],
19847            0,
19848            0,
19849            drawable_bytes[0],
19850            drawable_bytes[1],
19851            drawable_bytes[2],
19852            drawable_bytes[3],
19853            x_bytes[0],
19854            x_bytes[1],
19855            y_bytes[0],
19856            y_bytes[1],
19857            width_bytes[0],
19858            width_bytes[1],
19859            height_bytes[0],
19860            height_bytes[1],
19861            plane_mask_bytes[0],
19862            plane_mask_bytes[1],
19863            plane_mask_bytes[2],
19864            plane_mask_bytes[3],
19865        ];
19866        let length_so_far = length_so_far + request0.len();
19867        assert_eq!(length_so_far % 4, 0);
19868        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
19869        request0[2..4].copy_from_slice(&length.to_ne_bytes());
19870        ([request0.into()], vec![])
19871    }
19872    /// Parse this request given its header, its body, and any fds that go along with it
19873    #[cfg(feature = "request-parsing")]
19874    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
19875        if header.major_opcode != GET_IMAGE_REQUEST {
19876            return Err(ParseError::InvalidValue);
19877        }
19878        let remaining = &[header.minor_opcode];
19879        let (format, remaining) = u8::try_parse(remaining)?;
19880        let format = format.into();
19881        let _ = remaining;
19882        let (drawable, remaining) = Drawable::try_parse(value)?;
19883        let (x, remaining) = i16::try_parse(remaining)?;
19884        let (y, remaining) = i16::try_parse(remaining)?;
19885        let (width, remaining) = u16::try_parse(remaining)?;
19886        let (height, remaining) = u16::try_parse(remaining)?;
19887        let (plane_mask, remaining) = u32::try_parse(remaining)?;
19888        let _ = remaining;
19889        Ok(GetImageRequest {
19890            format,
19891            drawable,
19892            x,
19893            y,
19894            width,
19895            height,
19896            plane_mask,
19897        })
19898    }
19899}
19900impl Request for GetImageRequest {
19901    const EXTENSION_NAME: Option<&'static str> = None;
19902
19903    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
19904        let (bufs, fds) = self.serialize();
19905        // Flatten the buffers into a single vector
19906        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
19907        (buf, fds)
19908    }
19909}
19910impl crate::x11_utils::ReplyRequest for GetImageRequest {
19911    type Reply = GetImageReply;
19912}
19913
19914#[derive(Clone, Default)]
19915#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
19916#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19917pub struct GetImageReply {
19918    pub depth: u8,
19919    pub sequence: u16,
19920    pub visual: Visualid,
19921    pub data: Vec<u8>,
19922}
19923impl_debug_if_no_extra_traits!(GetImageReply, "GetImageReply");
19924impl TryParse for GetImageReply {
19925    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
19926        let remaining = initial_value;
19927        let (response_type, remaining) = u8::try_parse(remaining)?;
19928        let (depth, remaining) = u8::try_parse(remaining)?;
19929        let (sequence, remaining) = u16::try_parse(remaining)?;
19930        let (length, remaining) = u32::try_parse(remaining)?;
19931        let (visual, remaining) = Visualid::try_parse(remaining)?;
19932        let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
19933        let (data, remaining) = crate::x11_utils::parse_u8_list(remaining, u32::from(length).checked_mul(4u32).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
19934        let data = data.to_vec();
19935        if response_type != 1 {
19936            return Err(ParseError::InvalidValue);
19937        }
19938        let result = GetImageReply { depth, sequence, visual, data };
19939        let _ = remaining;
19940        let remaining = initial_value.get(32 + length as usize * 4..)
19941            .ok_or(ParseError::InsufficientData)?;
19942        Ok((result, remaining))
19943    }
19944}
19945impl Serialize for GetImageReply {
19946    type Bytes = Vec<u8>;
19947    fn serialize(&self) -> Vec<u8> {
19948        let mut result = Vec::new();
19949        self.serialize_into(&mut result);
19950        result
19951    }
19952    fn serialize_into(&self, bytes: &mut Vec<u8>) {
19953        bytes.reserve(32);
19954        let response_type_bytes = &[1];
19955        bytes.push(response_type_bytes[0]);
19956        self.depth.serialize_into(bytes);
19957        self.sequence.serialize_into(bytes);
19958        assert_eq!(self.data.len() % 4, 0, "`data` has an incorrect length, must be a multiple of 4");
19959        let length = u32::try_from(self.data.len() / 4).expect("`data` has too many elements");
19960        length.serialize_into(bytes);
19961        self.visual.serialize_into(bytes);
19962        bytes.extend_from_slice(&[0; 20]);
19963        bytes.extend_from_slice(&self.data);
19964    }
19965}
19966impl GetImageReply {
19967    /// Get the value of the `length` field.
19968    ///
19969    /// The `length` field is used as the length field of the `data` field.
19970    /// This function computes the field's value again based on the length of the list.
19971    ///
19972    /// # Panics
19973    ///
19974    /// Panics if the value cannot be represented in the target type. This
19975    /// cannot happen with values of the struct received from the X11 server.
19976    pub fn length(&self) -> u32 {
19977        self.data.len()
19978            .checked_div(4).unwrap()
19979            .try_into().unwrap()
19980    }
19981}
19982
19983/// Opcode for the PolyText8 request
19984pub const POLY_TEXT8_REQUEST: u8 = 74;
19985#[derive(Clone, Default)]
19986#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
19987#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19988pub struct PolyText8Request<'input> {
19989    pub drawable: Drawable,
19990    pub gc: Gcontext,
19991    pub x: i16,
19992    pub y: i16,
19993    pub items: Cow<'input, [u8]>,
19994}
19995impl_debug_if_no_extra_traits!(PolyText8Request<'_>, "PolyText8Request");
19996impl<'input> PolyText8Request<'input> {
19997    /// Serialize this request into bytes for the provided connection
19998    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
19999        let length_so_far = 0;
20000        let drawable_bytes = self.drawable.serialize();
20001        let gc_bytes = self.gc.serialize();
20002        let x_bytes = self.x.serialize();
20003        let y_bytes = self.y.serialize();
20004        let mut request0 = vec![
20005            POLY_TEXT8_REQUEST,
20006            0,
20007            0,
20008            0,
20009            drawable_bytes[0],
20010            drawable_bytes[1],
20011            drawable_bytes[2],
20012            drawable_bytes[3],
20013            gc_bytes[0],
20014            gc_bytes[1],
20015            gc_bytes[2],
20016            gc_bytes[3],
20017            x_bytes[0],
20018            x_bytes[1],
20019            y_bytes[0],
20020            y_bytes[1],
20021        ];
20022        let length_so_far = length_so_far + request0.len();
20023        let length_so_far = length_so_far + self.items.len();
20024        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
20025        let length_so_far = length_so_far + padding0.len();
20026        assert_eq!(length_so_far % 4, 0);
20027        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
20028        request0[2..4].copy_from_slice(&length.to_ne_bytes());
20029        ([request0.into(), self.items, padding0.into()], vec![])
20030    }
20031    /// Parse this request given its header, its body, and any fds that go along with it
20032    #[cfg(feature = "request-parsing")]
20033    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
20034        if header.major_opcode != POLY_TEXT8_REQUEST {
20035            return Err(ParseError::InvalidValue);
20036        }
20037        let remaining = &[header.minor_opcode];
20038        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
20039        let _ = remaining;
20040        let (drawable, remaining) = Drawable::try_parse(value)?;
20041        let (gc, remaining) = Gcontext::try_parse(remaining)?;
20042        let (x, remaining) = i16::try_parse(remaining)?;
20043        let (y, remaining) = i16::try_parse(remaining)?;
20044        let (items, remaining) = remaining.split_at(remaining.len());
20045        let _ = remaining;
20046        Ok(PolyText8Request {
20047            drawable,
20048            gc,
20049            x,
20050            y,
20051            items: Cow::Borrowed(items),
20052        })
20053    }
20054    /// Clone all borrowed data in this PolyText8Request.
20055    pub fn into_owned(self) -> PolyText8Request<'static> {
20056        PolyText8Request {
20057            drawable: self.drawable,
20058            gc: self.gc,
20059            x: self.x,
20060            y: self.y,
20061            items: Cow::Owned(self.items.into_owned()),
20062        }
20063    }
20064}
20065impl<'input> Request for PolyText8Request<'input> {
20066    const EXTENSION_NAME: Option<&'static str> = None;
20067
20068    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
20069        let (bufs, fds) = self.serialize();
20070        // Flatten the buffers into a single vector
20071        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
20072        (buf, fds)
20073    }
20074}
20075impl<'input> crate::x11_utils::VoidRequest for PolyText8Request<'input> {
20076}
20077
20078/// Opcode for the PolyText16 request
20079pub const POLY_TEXT16_REQUEST: u8 = 75;
20080#[derive(Clone, Default)]
20081#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
20082#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20083pub struct PolyText16Request<'input> {
20084    pub drawable: Drawable,
20085    pub gc: Gcontext,
20086    pub x: i16,
20087    pub y: i16,
20088    pub items: Cow<'input, [u8]>,
20089}
20090impl_debug_if_no_extra_traits!(PolyText16Request<'_>, "PolyText16Request");
20091impl<'input> PolyText16Request<'input> {
20092    /// Serialize this request into bytes for the provided connection
20093    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
20094        let length_so_far = 0;
20095        let drawable_bytes = self.drawable.serialize();
20096        let gc_bytes = self.gc.serialize();
20097        let x_bytes = self.x.serialize();
20098        let y_bytes = self.y.serialize();
20099        let mut request0 = vec![
20100            POLY_TEXT16_REQUEST,
20101            0,
20102            0,
20103            0,
20104            drawable_bytes[0],
20105            drawable_bytes[1],
20106            drawable_bytes[2],
20107            drawable_bytes[3],
20108            gc_bytes[0],
20109            gc_bytes[1],
20110            gc_bytes[2],
20111            gc_bytes[3],
20112            x_bytes[0],
20113            x_bytes[1],
20114            y_bytes[0],
20115            y_bytes[1],
20116        ];
20117        let length_so_far = length_so_far + request0.len();
20118        let length_so_far = length_so_far + self.items.len();
20119        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
20120        let length_so_far = length_so_far + padding0.len();
20121        assert_eq!(length_so_far % 4, 0);
20122        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
20123        request0[2..4].copy_from_slice(&length.to_ne_bytes());
20124        ([request0.into(), self.items, padding0.into()], vec![])
20125    }
20126    /// Parse this request given its header, its body, and any fds that go along with it
20127    #[cfg(feature = "request-parsing")]
20128    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
20129        if header.major_opcode != POLY_TEXT16_REQUEST {
20130            return Err(ParseError::InvalidValue);
20131        }
20132        let remaining = &[header.minor_opcode];
20133        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
20134        let _ = remaining;
20135        let (drawable, remaining) = Drawable::try_parse(value)?;
20136        let (gc, remaining) = Gcontext::try_parse(remaining)?;
20137        let (x, remaining) = i16::try_parse(remaining)?;
20138        let (y, remaining) = i16::try_parse(remaining)?;
20139        let (items, remaining) = remaining.split_at(remaining.len());
20140        let _ = remaining;
20141        Ok(PolyText16Request {
20142            drawable,
20143            gc,
20144            x,
20145            y,
20146            items: Cow::Borrowed(items),
20147        })
20148    }
20149    /// Clone all borrowed data in this PolyText16Request.
20150    pub fn into_owned(self) -> PolyText16Request<'static> {
20151        PolyText16Request {
20152            drawable: self.drawable,
20153            gc: self.gc,
20154            x: self.x,
20155            y: self.y,
20156            items: Cow::Owned(self.items.into_owned()),
20157        }
20158    }
20159}
20160impl<'input> Request for PolyText16Request<'input> {
20161    const EXTENSION_NAME: Option<&'static str> = None;
20162
20163    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
20164        let (bufs, fds) = self.serialize();
20165        // Flatten the buffers into a single vector
20166        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
20167        (buf, fds)
20168    }
20169}
20170impl<'input> crate::x11_utils::VoidRequest for PolyText16Request<'input> {
20171}
20172
20173/// Opcode for the ImageText8 request
20174pub const IMAGE_TEXT8_REQUEST: u8 = 76;
20175/// Draws text.
20176///
20177/// Fills the destination rectangle with the background pixel from `gc`, then
20178/// paints the text with the foreground pixel from `gc`. The upper-left corner of
20179/// the filled rectangle is at [x, y - font-ascent]. The width is overall-width,
20180/// the height is font-ascent + font-descent. The overall-width, font-ascent and
20181/// font-descent are as returned by `xcb_query_text_extents` (TODO).
20182///
20183/// Note that using X core fonts is deprecated (but still supported) in favor of
20184/// client-side rendering using Xft.
20185///
20186/// # Fields
20187///
20188/// * `drawable` - The drawable (Window or Pixmap) to draw text on.
20189/// * `string` - The string to draw. Only the first 255 characters are relevant due to the data
20190/// type of `string_len`.
20191/// * `x` - The x coordinate of the first character, relative to the origin of `drawable`.
20192/// * `y` - The y coordinate of the first character, relative to the origin of `drawable`.
20193/// * `gc` - The graphics context to use.
20194///
20195/// The following graphics context components are used: plane-mask, foreground,
20196/// background, font, subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask.
20197///
20198/// # Errors
20199///
20200/// * `Drawable` - The specified `drawable` (Window or Pixmap) does not exist.
20201/// * `GContext` - The specified graphics context does not exist.
20202/// * `Match` - TODO: reasons?
20203///
20204/// # See
20205///
20206/// * `ImageText16`: request
20207#[derive(Clone, Default)]
20208#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
20209#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20210pub struct ImageText8Request<'input> {
20211    pub drawable: Drawable,
20212    pub gc: Gcontext,
20213    pub x: i16,
20214    pub y: i16,
20215    pub string: Cow<'input, [u8]>,
20216}
20217impl_debug_if_no_extra_traits!(ImageText8Request<'_>, "ImageText8Request");
20218impl<'input> ImageText8Request<'input> {
20219    /// Serialize this request into bytes for the provided connection
20220    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
20221        let length_so_far = 0;
20222        let string_len = u8::try_from(self.string.len()).expect("`string` has too many elements");
20223        let string_len_bytes = string_len.serialize();
20224        let drawable_bytes = self.drawable.serialize();
20225        let gc_bytes = self.gc.serialize();
20226        let x_bytes = self.x.serialize();
20227        let y_bytes = self.y.serialize();
20228        let mut request0 = vec![
20229            IMAGE_TEXT8_REQUEST,
20230            string_len_bytes[0],
20231            0,
20232            0,
20233            drawable_bytes[0],
20234            drawable_bytes[1],
20235            drawable_bytes[2],
20236            drawable_bytes[3],
20237            gc_bytes[0],
20238            gc_bytes[1],
20239            gc_bytes[2],
20240            gc_bytes[3],
20241            x_bytes[0],
20242            x_bytes[1],
20243            y_bytes[0],
20244            y_bytes[1],
20245        ];
20246        let length_so_far = length_so_far + request0.len();
20247        let length_so_far = length_so_far + self.string.len();
20248        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
20249        let length_so_far = length_so_far + padding0.len();
20250        assert_eq!(length_so_far % 4, 0);
20251        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
20252        request0[2..4].copy_from_slice(&length.to_ne_bytes());
20253        ([request0.into(), self.string, padding0.into()], vec![])
20254    }
20255    /// Parse this request given its header, its body, and any fds that go along with it
20256    #[cfg(feature = "request-parsing")]
20257    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
20258        if header.major_opcode != IMAGE_TEXT8_REQUEST {
20259            return Err(ParseError::InvalidValue);
20260        }
20261        let remaining = &[header.minor_opcode];
20262        let (string_len, remaining) = u8::try_parse(remaining)?;
20263        let _ = remaining;
20264        let (drawable, remaining) = Drawable::try_parse(value)?;
20265        let (gc, remaining) = Gcontext::try_parse(remaining)?;
20266        let (x, remaining) = i16::try_parse(remaining)?;
20267        let (y, remaining) = i16::try_parse(remaining)?;
20268        let (string, remaining) = crate::x11_utils::parse_u8_list(remaining, string_len.try_to_usize()?)?;
20269        let _ = remaining;
20270        Ok(ImageText8Request {
20271            drawable,
20272            gc,
20273            x,
20274            y,
20275            string: Cow::Borrowed(string),
20276        })
20277    }
20278    /// Clone all borrowed data in this ImageText8Request.
20279    pub fn into_owned(self) -> ImageText8Request<'static> {
20280        ImageText8Request {
20281            drawable: self.drawable,
20282            gc: self.gc,
20283            x: self.x,
20284            y: self.y,
20285            string: Cow::Owned(self.string.into_owned()),
20286        }
20287    }
20288}
20289impl<'input> Request for ImageText8Request<'input> {
20290    const EXTENSION_NAME: Option<&'static str> = None;
20291
20292    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
20293        let (bufs, fds) = self.serialize();
20294        // Flatten the buffers into a single vector
20295        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
20296        (buf, fds)
20297    }
20298}
20299impl<'input> crate::x11_utils::VoidRequest for ImageText8Request<'input> {
20300}
20301
20302/// Opcode for the ImageText16 request
20303pub const IMAGE_TEXT16_REQUEST: u8 = 77;
20304/// Draws text.
20305///
20306/// Fills the destination rectangle with the background pixel from `gc`, then
20307/// paints the text with the foreground pixel from `gc`. The upper-left corner of
20308/// the filled rectangle is at [x, y - font-ascent]. The width is overall-width,
20309/// the height is font-ascent + font-descent. The overall-width, font-ascent and
20310/// font-descent are as returned by `xcb_query_text_extents` (TODO).
20311///
20312/// Note that using X core fonts is deprecated (but still supported) in favor of
20313/// client-side rendering using Xft.
20314///
20315/// # Fields
20316///
20317/// * `drawable` - The drawable (Window or Pixmap) to draw text on.
20318/// * `string` - The string to draw. Only the first 255 characters are relevant due to the data
20319/// type of `string_len`. Every character uses 2 bytes (hence the 16 in this
20320/// request's name).
20321/// * `x` - The x coordinate of the first character, relative to the origin of `drawable`.
20322/// * `y` - The y coordinate of the first character, relative to the origin of `drawable`.
20323/// * `gc` - The graphics context to use.
20324///
20325/// The following graphics context components are used: plane-mask, foreground,
20326/// background, font, subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask.
20327///
20328/// # Errors
20329///
20330/// * `Drawable` - The specified `drawable` (Window or Pixmap) does not exist.
20331/// * `GContext` - The specified graphics context does not exist.
20332/// * `Match` - TODO: reasons?
20333///
20334/// # See
20335///
20336/// * `ImageText8`: request
20337#[derive(Clone, Default)]
20338#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
20339#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20340pub struct ImageText16Request<'input> {
20341    pub drawable: Drawable,
20342    pub gc: Gcontext,
20343    pub x: i16,
20344    pub y: i16,
20345    pub string: Cow<'input, [Char2b]>,
20346}
20347impl_debug_if_no_extra_traits!(ImageText16Request<'_>, "ImageText16Request");
20348impl<'input> ImageText16Request<'input> {
20349    /// Serialize this request into bytes for the provided connection
20350    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
20351        let length_so_far = 0;
20352        let string_len = u8::try_from(self.string.len()).expect("`string` has too many elements");
20353        let string_len_bytes = string_len.serialize();
20354        let drawable_bytes = self.drawable.serialize();
20355        let gc_bytes = self.gc.serialize();
20356        let x_bytes = self.x.serialize();
20357        let y_bytes = self.y.serialize();
20358        let mut request0 = vec![
20359            IMAGE_TEXT16_REQUEST,
20360            string_len_bytes[0],
20361            0,
20362            0,
20363            drawable_bytes[0],
20364            drawable_bytes[1],
20365            drawable_bytes[2],
20366            drawable_bytes[3],
20367            gc_bytes[0],
20368            gc_bytes[1],
20369            gc_bytes[2],
20370            gc_bytes[3],
20371            x_bytes[0],
20372            x_bytes[1],
20373            y_bytes[0],
20374            y_bytes[1],
20375        ];
20376        let length_so_far = length_so_far + request0.len();
20377        let string_bytes = self.string.serialize();
20378        let length_so_far = length_so_far + string_bytes.len();
20379        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
20380        let length_so_far = length_so_far + padding0.len();
20381        assert_eq!(length_so_far % 4, 0);
20382        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
20383        request0[2..4].copy_from_slice(&length.to_ne_bytes());
20384        ([request0.into(), string_bytes.into(), padding0.into()], vec![])
20385    }
20386    /// Parse this request given its header, its body, and any fds that go along with it
20387    #[cfg(feature = "request-parsing")]
20388    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
20389        if header.major_opcode != IMAGE_TEXT16_REQUEST {
20390            return Err(ParseError::InvalidValue);
20391        }
20392        let remaining = &[header.minor_opcode];
20393        let (string_len, remaining) = u8::try_parse(remaining)?;
20394        let _ = remaining;
20395        let (drawable, remaining) = Drawable::try_parse(value)?;
20396        let (gc, remaining) = Gcontext::try_parse(remaining)?;
20397        let (x, remaining) = i16::try_parse(remaining)?;
20398        let (y, remaining) = i16::try_parse(remaining)?;
20399        let (string, remaining) = crate::x11_utils::parse_list::<Char2b>(remaining, string_len.try_to_usize()?)?;
20400        let _ = remaining;
20401        Ok(ImageText16Request {
20402            drawable,
20403            gc,
20404            x,
20405            y,
20406            string: Cow::Owned(string),
20407        })
20408    }
20409    /// Clone all borrowed data in this ImageText16Request.
20410    pub fn into_owned(self) -> ImageText16Request<'static> {
20411        ImageText16Request {
20412            drawable: self.drawable,
20413            gc: self.gc,
20414            x: self.x,
20415            y: self.y,
20416            string: Cow::Owned(self.string.into_owned()),
20417        }
20418    }
20419}
20420impl<'input> Request for ImageText16Request<'input> {
20421    const EXTENSION_NAME: Option<&'static str> = None;
20422
20423    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
20424        let (bufs, fds) = self.serialize();
20425        // Flatten the buffers into a single vector
20426        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
20427        (buf, fds)
20428    }
20429}
20430impl<'input> crate::x11_utils::VoidRequest for ImageText16Request<'input> {
20431}
20432
20433#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
20434#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20435pub struct ColormapAlloc(u8);
20436impl ColormapAlloc {
20437    pub const NONE: Self = Self(0);
20438    pub const ALL: Self = Self(1);
20439}
20440impl From<ColormapAlloc> for u8 {
20441    #[inline]
20442    fn from(input: ColormapAlloc) -> Self {
20443        input.0
20444    }
20445}
20446impl From<ColormapAlloc> for Option<u8> {
20447    #[inline]
20448    fn from(input: ColormapAlloc) -> Self {
20449        Some(input.0)
20450    }
20451}
20452impl From<ColormapAlloc> for u16 {
20453    #[inline]
20454    fn from(input: ColormapAlloc) -> Self {
20455        u16::from(input.0)
20456    }
20457}
20458impl From<ColormapAlloc> for Option<u16> {
20459    #[inline]
20460    fn from(input: ColormapAlloc) -> Self {
20461        Some(u16::from(input.0))
20462    }
20463}
20464impl From<ColormapAlloc> for u32 {
20465    #[inline]
20466    fn from(input: ColormapAlloc) -> Self {
20467        u32::from(input.0)
20468    }
20469}
20470impl From<ColormapAlloc> for Option<u32> {
20471    #[inline]
20472    fn from(input: ColormapAlloc) -> Self {
20473        Some(u32::from(input.0))
20474    }
20475}
20476impl From<u8> for ColormapAlloc {
20477    #[inline]
20478    fn from(value: u8) -> Self {
20479        Self(value)
20480    }
20481}
20482impl core::fmt::Debug for ColormapAlloc  {
20483    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
20484        let variants = [
20485            (Self::NONE.0.into(), "NONE", "None"),
20486            (Self::ALL.0.into(), "ALL", "All"),
20487        ];
20488        pretty_print_enum(fmt, self.0.into(), &variants)
20489    }
20490}
20491
20492/// Opcode for the CreateColormap request
20493pub const CREATE_COLORMAP_REQUEST: u8 = 78;
20494#[derive(Clone, Copy, Default)]
20495#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
20496#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20497pub struct CreateColormapRequest {
20498    pub alloc: ColormapAlloc,
20499    pub mid: Colormap,
20500    pub window: Window,
20501    pub visual: Visualid,
20502}
20503impl_debug_if_no_extra_traits!(CreateColormapRequest, "CreateColormapRequest");
20504impl CreateColormapRequest {
20505    /// Serialize this request into bytes for the provided connection
20506    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
20507        let length_so_far = 0;
20508        let alloc_bytes = u8::from(self.alloc).serialize();
20509        let mid_bytes = self.mid.serialize();
20510        let window_bytes = self.window.serialize();
20511        let visual_bytes = self.visual.serialize();
20512        let mut request0 = vec![
20513            CREATE_COLORMAP_REQUEST,
20514            alloc_bytes[0],
20515            0,
20516            0,
20517            mid_bytes[0],
20518            mid_bytes[1],
20519            mid_bytes[2],
20520            mid_bytes[3],
20521            window_bytes[0],
20522            window_bytes[1],
20523            window_bytes[2],
20524            window_bytes[3],
20525            visual_bytes[0],
20526            visual_bytes[1],
20527            visual_bytes[2],
20528            visual_bytes[3],
20529        ];
20530        let length_so_far = length_so_far + request0.len();
20531        assert_eq!(length_so_far % 4, 0);
20532        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
20533        request0[2..4].copy_from_slice(&length.to_ne_bytes());
20534        ([request0.into()], vec![])
20535    }
20536    /// Parse this request given its header, its body, and any fds that go along with it
20537    #[cfg(feature = "request-parsing")]
20538    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
20539        if header.major_opcode != CREATE_COLORMAP_REQUEST {
20540            return Err(ParseError::InvalidValue);
20541        }
20542        let remaining = &[header.minor_opcode];
20543        let (alloc, remaining) = u8::try_parse(remaining)?;
20544        let alloc = alloc.into();
20545        let _ = remaining;
20546        let (mid, remaining) = Colormap::try_parse(value)?;
20547        let (window, remaining) = Window::try_parse(remaining)?;
20548        let (visual, remaining) = Visualid::try_parse(remaining)?;
20549        let _ = remaining;
20550        Ok(CreateColormapRequest {
20551            alloc,
20552            mid,
20553            window,
20554            visual,
20555        })
20556    }
20557}
20558impl Request for CreateColormapRequest {
20559    const EXTENSION_NAME: Option<&'static str> = None;
20560
20561    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
20562        let (bufs, fds) = self.serialize();
20563        // Flatten the buffers into a single vector
20564        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
20565        (buf, fds)
20566    }
20567}
20568impl crate::x11_utils::VoidRequest for CreateColormapRequest {
20569}
20570
20571/// Opcode for the FreeColormap request
20572pub const FREE_COLORMAP_REQUEST: u8 = 79;
20573#[derive(Clone, Copy, Default)]
20574#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
20575#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20576pub struct FreeColormapRequest {
20577    pub cmap: Colormap,
20578}
20579impl_debug_if_no_extra_traits!(FreeColormapRequest, "FreeColormapRequest");
20580impl FreeColormapRequest {
20581    /// Serialize this request into bytes for the provided connection
20582    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
20583        let length_so_far = 0;
20584        let cmap_bytes = self.cmap.serialize();
20585        let mut request0 = vec![
20586            FREE_COLORMAP_REQUEST,
20587            0,
20588            0,
20589            0,
20590            cmap_bytes[0],
20591            cmap_bytes[1],
20592            cmap_bytes[2],
20593            cmap_bytes[3],
20594        ];
20595        let length_so_far = length_so_far + request0.len();
20596        assert_eq!(length_so_far % 4, 0);
20597        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
20598        request0[2..4].copy_from_slice(&length.to_ne_bytes());
20599        ([request0.into()], vec![])
20600    }
20601    /// Parse this request given its header, its body, and any fds that go along with it
20602    #[cfg(feature = "request-parsing")]
20603    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
20604        if header.major_opcode != FREE_COLORMAP_REQUEST {
20605            return Err(ParseError::InvalidValue);
20606        }
20607        let remaining = &[header.minor_opcode];
20608        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
20609        let _ = remaining;
20610        let (cmap, remaining) = Colormap::try_parse(value)?;
20611        let _ = remaining;
20612        Ok(FreeColormapRequest {
20613            cmap,
20614        })
20615    }
20616}
20617impl Request for FreeColormapRequest {
20618    const EXTENSION_NAME: Option<&'static str> = None;
20619
20620    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
20621        let (bufs, fds) = self.serialize();
20622        // Flatten the buffers into a single vector
20623        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
20624        (buf, fds)
20625    }
20626}
20627impl crate::x11_utils::VoidRequest for FreeColormapRequest {
20628}
20629
20630/// Opcode for the CopyColormapAndFree request
20631pub const COPY_COLORMAP_AND_FREE_REQUEST: u8 = 80;
20632#[derive(Clone, Copy, Default)]
20633#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
20634#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20635pub struct CopyColormapAndFreeRequest {
20636    pub mid: Colormap,
20637    pub src_cmap: Colormap,
20638}
20639impl_debug_if_no_extra_traits!(CopyColormapAndFreeRequest, "CopyColormapAndFreeRequest");
20640impl CopyColormapAndFreeRequest {
20641    /// Serialize this request into bytes for the provided connection
20642    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
20643        let length_so_far = 0;
20644        let mid_bytes = self.mid.serialize();
20645        let src_cmap_bytes = self.src_cmap.serialize();
20646        let mut request0 = vec![
20647            COPY_COLORMAP_AND_FREE_REQUEST,
20648            0,
20649            0,
20650            0,
20651            mid_bytes[0],
20652            mid_bytes[1],
20653            mid_bytes[2],
20654            mid_bytes[3],
20655            src_cmap_bytes[0],
20656            src_cmap_bytes[1],
20657            src_cmap_bytes[2],
20658            src_cmap_bytes[3],
20659        ];
20660        let length_so_far = length_so_far + request0.len();
20661        assert_eq!(length_so_far % 4, 0);
20662        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
20663        request0[2..4].copy_from_slice(&length.to_ne_bytes());
20664        ([request0.into()], vec![])
20665    }
20666    /// Parse this request given its header, its body, and any fds that go along with it
20667    #[cfg(feature = "request-parsing")]
20668    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
20669        if header.major_opcode != COPY_COLORMAP_AND_FREE_REQUEST {
20670            return Err(ParseError::InvalidValue);
20671        }
20672        let remaining = &[header.minor_opcode];
20673        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
20674        let _ = remaining;
20675        let (mid, remaining) = Colormap::try_parse(value)?;
20676        let (src_cmap, remaining) = Colormap::try_parse(remaining)?;
20677        let _ = remaining;
20678        Ok(CopyColormapAndFreeRequest {
20679            mid,
20680            src_cmap,
20681        })
20682    }
20683}
20684impl Request for CopyColormapAndFreeRequest {
20685    const EXTENSION_NAME: Option<&'static str> = None;
20686
20687    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
20688        let (bufs, fds) = self.serialize();
20689        // Flatten the buffers into a single vector
20690        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
20691        (buf, fds)
20692    }
20693}
20694impl crate::x11_utils::VoidRequest for CopyColormapAndFreeRequest {
20695}
20696
20697/// Opcode for the InstallColormap request
20698pub const INSTALL_COLORMAP_REQUEST: u8 = 81;
20699#[derive(Clone, Copy, Default)]
20700#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
20701#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20702pub struct InstallColormapRequest {
20703    pub cmap: Colormap,
20704}
20705impl_debug_if_no_extra_traits!(InstallColormapRequest, "InstallColormapRequest");
20706impl InstallColormapRequest {
20707    /// Serialize this request into bytes for the provided connection
20708    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
20709        let length_so_far = 0;
20710        let cmap_bytes = self.cmap.serialize();
20711        let mut request0 = vec![
20712            INSTALL_COLORMAP_REQUEST,
20713            0,
20714            0,
20715            0,
20716            cmap_bytes[0],
20717            cmap_bytes[1],
20718            cmap_bytes[2],
20719            cmap_bytes[3],
20720        ];
20721        let length_so_far = length_so_far + request0.len();
20722        assert_eq!(length_so_far % 4, 0);
20723        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
20724        request0[2..4].copy_from_slice(&length.to_ne_bytes());
20725        ([request0.into()], vec![])
20726    }
20727    /// Parse this request given its header, its body, and any fds that go along with it
20728    #[cfg(feature = "request-parsing")]
20729    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
20730        if header.major_opcode != INSTALL_COLORMAP_REQUEST {
20731            return Err(ParseError::InvalidValue);
20732        }
20733        let remaining = &[header.minor_opcode];
20734        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
20735        let _ = remaining;
20736        let (cmap, remaining) = Colormap::try_parse(value)?;
20737        let _ = remaining;
20738        Ok(InstallColormapRequest {
20739            cmap,
20740        })
20741    }
20742}
20743impl Request for InstallColormapRequest {
20744    const EXTENSION_NAME: Option<&'static str> = None;
20745
20746    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
20747        let (bufs, fds) = self.serialize();
20748        // Flatten the buffers into a single vector
20749        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
20750        (buf, fds)
20751    }
20752}
20753impl crate::x11_utils::VoidRequest for InstallColormapRequest {
20754}
20755
20756/// Opcode for the UninstallColormap request
20757pub const UNINSTALL_COLORMAP_REQUEST: u8 = 82;
20758#[derive(Clone, Copy, Default)]
20759#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
20760#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20761pub struct UninstallColormapRequest {
20762    pub cmap: Colormap,
20763}
20764impl_debug_if_no_extra_traits!(UninstallColormapRequest, "UninstallColormapRequest");
20765impl UninstallColormapRequest {
20766    /// Serialize this request into bytes for the provided connection
20767    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
20768        let length_so_far = 0;
20769        let cmap_bytes = self.cmap.serialize();
20770        let mut request0 = vec![
20771            UNINSTALL_COLORMAP_REQUEST,
20772            0,
20773            0,
20774            0,
20775            cmap_bytes[0],
20776            cmap_bytes[1],
20777            cmap_bytes[2],
20778            cmap_bytes[3],
20779        ];
20780        let length_so_far = length_so_far + request0.len();
20781        assert_eq!(length_so_far % 4, 0);
20782        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
20783        request0[2..4].copy_from_slice(&length.to_ne_bytes());
20784        ([request0.into()], vec![])
20785    }
20786    /// Parse this request given its header, its body, and any fds that go along with it
20787    #[cfg(feature = "request-parsing")]
20788    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
20789        if header.major_opcode != UNINSTALL_COLORMAP_REQUEST {
20790            return Err(ParseError::InvalidValue);
20791        }
20792        let remaining = &[header.minor_opcode];
20793        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
20794        let _ = remaining;
20795        let (cmap, remaining) = Colormap::try_parse(value)?;
20796        let _ = remaining;
20797        Ok(UninstallColormapRequest {
20798            cmap,
20799        })
20800    }
20801}
20802impl Request for UninstallColormapRequest {
20803    const EXTENSION_NAME: Option<&'static str> = None;
20804
20805    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
20806        let (bufs, fds) = self.serialize();
20807        // Flatten the buffers into a single vector
20808        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
20809        (buf, fds)
20810    }
20811}
20812impl crate::x11_utils::VoidRequest for UninstallColormapRequest {
20813}
20814
20815/// Opcode for the ListInstalledColormaps request
20816pub const LIST_INSTALLED_COLORMAPS_REQUEST: u8 = 83;
20817#[derive(Clone, Copy, Default)]
20818#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
20819#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20820pub struct ListInstalledColormapsRequest {
20821    pub window: Window,
20822}
20823impl_debug_if_no_extra_traits!(ListInstalledColormapsRequest, "ListInstalledColormapsRequest");
20824impl ListInstalledColormapsRequest {
20825    /// Serialize this request into bytes for the provided connection
20826    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
20827        let length_so_far = 0;
20828        let window_bytes = self.window.serialize();
20829        let mut request0 = vec![
20830            LIST_INSTALLED_COLORMAPS_REQUEST,
20831            0,
20832            0,
20833            0,
20834            window_bytes[0],
20835            window_bytes[1],
20836            window_bytes[2],
20837            window_bytes[3],
20838        ];
20839        let length_so_far = length_so_far + request0.len();
20840        assert_eq!(length_so_far % 4, 0);
20841        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
20842        request0[2..4].copy_from_slice(&length.to_ne_bytes());
20843        ([request0.into()], vec![])
20844    }
20845    /// Parse this request given its header, its body, and any fds that go along with it
20846    #[cfg(feature = "request-parsing")]
20847    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
20848        if header.major_opcode != LIST_INSTALLED_COLORMAPS_REQUEST {
20849            return Err(ParseError::InvalidValue);
20850        }
20851        let remaining = &[header.minor_opcode];
20852        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
20853        let _ = remaining;
20854        let (window, remaining) = Window::try_parse(value)?;
20855        let _ = remaining;
20856        Ok(ListInstalledColormapsRequest {
20857            window,
20858        })
20859    }
20860}
20861impl Request for ListInstalledColormapsRequest {
20862    const EXTENSION_NAME: Option<&'static str> = None;
20863
20864    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
20865        let (bufs, fds) = self.serialize();
20866        // Flatten the buffers into a single vector
20867        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
20868        (buf, fds)
20869    }
20870}
20871impl crate::x11_utils::ReplyRequest for ListInstalledColormapsRequest {
20872    type Reply = ListInstalledColormapsReply;
20873}
20874
20875#[derive(Clone, Default)]
20876#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
20877#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20878pub struct ListInstalledColormapsReply {
20879    pub sequence: u16,
20880    pub length: u32,
20881    pub cmaps: Vec<Colormap>,
20882}
20883impl_debug_if_no_extra_traits!(ListInstalledColormapsReply, "ListInstalledColormapsReply");
20884impl TryParse for ListInstalledColormapsReply {
20885    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
20886        let remaining = initial_value;
20887        let (response_type, remaining) = u8::try_parse(remaining)?;
20888        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
20889        let (sequence, remaining) = u16::try_parse(remaining)?;
20890        let (length, remaining) = u32::try_parse(remaining)?;
20891        let (cmaps_len, remaining) = u16::try_parse(remaining)?;
20892        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
20893        let (cmaps, remaining) = crate::x11_utils::parse_list::<Colormap>(remaining, cmaps_len.try_to_usize()?)?;
20894        if response_type != 1 {
20895            return Err(ParseError::InvalidValue);
20896        }
20897        let result = ListInstalledColormapsReply { sequence, length, cmaps };
20898        let _ = remaining;
20899        let remaining = initial_value.get(32 + length as usize * 4..)
20900            .ok_or(ParseError::InsufficientData)?;
20901        Ok((result, remaining))
20902    }
20903}
20904impl Serialize for ListInstalledColormapsReply {
20905    type Bytes = Vec<u8>;
20906    fn serialize(&self) -> Vec<u8> {
20907        let mut result = Vec::new();
20908        self.serialize_into(&mut result);
20909        result
20910    }
20911    fn serialize_into(&self, bytes: &mut Vec<u8>) {
20912        bytes.reserve(32);
20913        let response_type_bytes = &[1];
20914        bytes.push(response_type_bytes[0]);
20915        bytes.extend_from_slice(&[0; 1]);
20916        self.sequence.serialize_into(bytes);
20917        self.length.serialize_into(bytes);
20918        let cmaps_len = u16::try_from(self.cmaps.len()).expect("`cmaps` has too many elements");
20919        cmaps_len.serialize_into(bytes);
20920        bytes.extend_from_slice(&[0; 22]);
20921        self.cmaps.serialize_into(bytes);
20922    }
20923}
20924impl ListInstalledColormapsReply {
20925    /// Get the value of the `cmaps_len` field.
20926    ///
20927    /// The `cmaps_len` field is used as the length field of the `cmaps` field.
20928    /// This function computes the field's value again based on the length of the list.
20929    ///
20930    /// # Panics
20931    ///
20932    /// Panics if the value cannot be represented in the target type. This
20933    /// cannot happen with values of the struct received from the X11 server.
20934    pub fn cmaps_len(&self) -> u16 {
20935        self.cmaps.len()
20936            .try_into().unwrap()
20937    }
20938}
20939
20940/// Opcode for the AllocColor request
20941pub const ALLOC_COLOR_REQUEST: u8 = 84;
20942/// Allocate a color.
20943///
20944/// Allocates a read-only colormap entry corresponding to the closest RGB value
20945/// supported by the hardware. If you are using TrueColor, you can take a shortcut
20946/// and directly calculate the color pixel value to avoid the round trip. But, for
20947/// example, on 16-bit color setups (VNC), you can easily get the closest supported
20948/// RGB value to the RGB value you are specifying.
20949///
20950/// # Fields
20951///
20952/// * `cmap` - TODO
20953/// * `red` - The red value of your color.
20954/// * `green` - The green value of your color.
20955/// * `blue` - The blue value of your color.
20956///
20957/// # Errors
20958///
20959/// * `Colormap` - The specified colormap `cmap` does not exist.
20960#[derive(Clone, Copy, Default)]
20961#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
20962#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20963pub struct AllocColorRequest {
20964    pub cmap: Colormap,
20965    pub red: u16,
20966    pub green: u16,
20967    pub blue: u16,
20968}
20969impl_debug_if_no_extra_traits!(AllocColorRequest, "AllocColorRequest");
20970impl AllocColorRequest {
20971    /// Serialize this request into bytes for the provided connection
20972    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
20973        let length_so_far = 0;
20974        let cmap_bytes = self.cmap.serialize();
20975        let red_bytes = self.red.serialize();
20976        let green_bytes = self.green.serialize();
20977        let blue_bytes = self.blue.serialize();
20978        let mut request0 = vec![
20979            ALLOC_COLOR_REQUEST,
20980            0,
20981            0,
20982            0,
20983            cmap_bytes[0],
20984            cmap_bytes[1],
20985            cmap_bytes[2],
20986            cmap_bytes[3],
20987            red_bytes[0],
20988            red_bytes[1],
20989            green_bytes[0],
20990            green_bytes[1],
20991            blue_bytes[0],
20992            blue_bytes[1],
20993            0,
20994            0,
20995        ];
20996        let length_so_far = length_so_far + request0.len();
20997        assert_eq!(length_so_far % 4, 0);
20998        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
20999        request0[2..4].copy_from_slice(&length.to_ne_bytes());
21000        ([request0.into()], vec![])
21001    }
21002    /// Parse this request given its header, its body, and any fds that go along with it
21003    #[cfg(feature = "request-parsing")]
21004    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
21005        if header.major_opcode != ALLOC_COLOR_REQUEST {
21006            return Err(ParseError::InvalidValue);
21007        }
21008        let remaining = &[header.minor_opcode];
21009        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
21010        let _ = remaining;
21011        let (cmap, remaining) = Colormap::try_parse(value)?;
21012        let (red, remaining) = u16::try_parse(remaining)?;
21013        let (green, remaining) = u16::try_parse(remaining)?;
21014        let (blue, remaining) = u16::try_parse(remaining)?;
21015        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
21016        let _ = remaining;
21017        Ok(AllocColorRequest {
21018            cmap,
21019            red,
21020            green,
21021            blue,
21022        })
21023    }
21024}
21025impl Request for AllocColorRequest {
21026    const EXTENSION_NAME: Option<&'static str> = None;
21027
21028    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
21029        let (bufs, fds) = self.serialize();
21030        // Flatten the buffers into a single vector
21031        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
21032        (buf, fds)
21033    }
21034}
21035impl crate::x11_utils::ReplyRequest for AllocColorRequest {
21036    type Reply = AllocColorReply;
21037}
21038
21039#[derive(Clone, Copy, Default)]
21040#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
21041#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21042pub struct AllocColorReply {
21043    pub sequence: u16,
21044    pub length: u32,
21045    pub red: u16,
21046    pub green: u16,
21047    pub blue: u16,
21048    pub pixel: u32,
21049}
21050impl_debug_if_no_extra_traits!(AllocColorReply, "AllocColorReply");
21051impl TryParse for AllocColorReply {
21052    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
21053        let remaining = initial_value;
21054        let (response_type, remaining) = u8::try_parse(remaining)?;
21055        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
21056        let (sequence, remaining) = u16::try_parse(remaining)?;
21057        let (length, remaining) = u32::try_parse(remaining)?;
21058        let (red, remaining) = u16::try_parse(remaining)?;
21059        let (green, remaining) = u16::try_parse(remaining)?;
21060        let (blue, remaining) = u16::try_parse(remaining)?;
21061        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
21062        let (pixel, remaining) = u32::try_parse(remaining)?;
21063        if response_type != 1 {
21064            return Err(ParseError::InvalidValue);
21065        }
21066        let result = AllocColorReply { sequence, length, red, green, blue, pixel };
21067        let _ = remaining;
21068        let remaining = initial_value.get(32 + length as usize * 4..)
21069            .ok_or(ParseError::InsufficientData)?;
21070        Ok((result, remaining))
21071    }
21072}
21073impl Serialize for AllocColorReply {
21074    type Bytes = [u8; 20];
21075    fn serialize(&self) -> [u8; 20] {
21076        let response_type_bytes = &[1];
21077        let sequence_bytes = self.sequence.serialize();
21078        let length_bytes = self.length.serialize();
21079        let red_bytes = self.red.serialize();
21080        let green_bytes = self.green.serialize();
21081        let blue_bytes = self.blue.serialize();
21082        let pixel_bytes = self.pixel.serialize();
21083        [
21084            response_type_bytes[0],
21085            0,
21086            sequence_bytes[0],
21087            sequence_bytes[1],
21088            length_bytes[0],
21089            length_bytes[1],
21090            length_bytes[2],
21091            length_bytes[3],
21092            red_bytes[0],
21093            red_bytes[1],
21094            green_bytes[0],
21095            green_bytes[1],
21096            blue_bytes[0],
21097            blue_bytes[1],
21098            0,
21099            0,
21100            pixel_bytes[0],
21101            pixel_bytes[1],
21102            pixel_bytes[2],
21103            pixel_bytes[3],
21104        ]
21105    }
21106    fn serialize_into(&self, bytes: &mut Vec<u8>) {
21107        bytes.reserve(20);
21108        let response_type_bytes = &[1];
21109        bytes.push(response_type_bytes[0]);
21110        bytes.extend_from_slice(&[0; 1]);
21111        self.sequence.serialize_into(bytes);
21112        self.length.serialize_into(bytes);
21113        self.red.serialize_into(bytes);
21114        self.green.serialize_into(bytes);
21115        self.blue.serialize_into(bytes);
21116        bytes.extend_from_slice(&[0; 2]);
21117        self.pixel.serialize_into(bytes);
21118    }
21119}
21120
21121/// Opcode for the AllocNamedColor request
21122pub const ALLOC_NAMED_COLOR_REQUEST: u8 = 85;
21123#[derive(Clone, Default)]
21124#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
21125#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21126pub struct AllocNamedColorRequest<'input> {
21127    pub cmap: Colormap,
21128    pub name: Cow<'input, [u8]>,
21129}
21130impl_debug_if_no_extra_traits!(AllocNamedColorRequest<'_>, "AllocNamedColorRequest");
21131impl<'input> AllocNamedColorRequest<'input> {
21132    /// Serialize this request into bytes for the provided connection
21133    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
21134        let length_so_far = 0;
21135        let cmap_bytes = self.cmap.serialize();
21136        let name_len = u16::try_from(self.name.len()).expect("`name` has too many elements");
21137        let name_len_bytes = name_len.serialize();
21138        let mut request0 = vec![
21139            ALLOC_NAMED_COLOR_REQUEST,
21140            0,
21141            0,
21142            0,
21143            cmap_bytes[0],
21144            cmap_bytes[1],
21145            cmap_bytes[2],
21146            cmap_bytes[3],
21147            name_len_bytes[0],
21148            name_len_bytes[1],
21149            0,
21150            0,
21151        ];
21152        let length_so_far = length_so_far + request0.len();
21153        let length_so_far = length_so_far + self.name.len();
21154        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
21155        let length_so_far = length_so_far + padding0.len();
21156        assert_eq!(length_so_far % 4, 0);
21157        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
21158        request0[2..4].copy_from_slice(&length.to_ne_bytes());
21159        ([request0.into(), self.name, padding0.into()], vec![])
21160    }
21161    /// Parse this request given its header, its body, and any fds that go along with it
21162    #[cfg(feature = "request-parsing")]
21163    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
21164        if header.major_opcode != ALLOC_NAMED_COLOR_REQUEST {
21165            return Err(ParseError::InvalidValue);
21166        }
21167        let remaining = &[header.minor_opcode];
21168        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
21169        let _ = remaining;
21170        let (cmap, remaining) = Colormap::try_parse(value)?;
21171        let (name_len, remaining) = u16::try_parse(remaining)?;
21172        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
21173        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_len.try_to_usize()?)?;
21174        let _ = remaining;
21175        Ok(AllocNamedColorRequest {
21176            cmap,
21177            name: Cow::Borrowed(name),
21178        })
21179    }
21180    /// Clone all borrowed data in this AllocNamedColorRequest.
21181    pub fn into_owned(self) -> AllocNamedColorRequest<'static> {
21182        AllocNamedColorRequest {
21183            cmap: self.cmap,
21184            name: Cow::Owned(self.name.into_owned()),
21185        }
21186    }
21187}
21188impl<'input> Request for AllocNamedColorRequest<'input> {
21189    const EXTENSION_NAME: Option<&'static str> = None;
21190
21191    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
21192        let (bufs, fds) = self.serialize();
21193        // Flatten the buffers into a single vector
21194        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
21195        (buf, fds)
21196    }
21197}
21198impl<'input> crate::x11_utils::ReplyRequest for AllocNamedColorRequest<'input> {
21199    type Reply = AllocNamedColorReply;
21200}
21201
21202#[derive(Clone, Copy, Default)]
21203#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
21204#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21205pub struct AllocNamedColorReply {
21206    pub sequence: u16,
21207    pub length: u32,
21208    pub pixel: u32,
21209    pub exact_red: u16,
21210    pub exact_green: u16,
21211    pub exact_blue: u16,
21212    pub visual_red: u16,
21213    pub visual_green: u16,
21214    pub visual_blue: u16,
21215}
21216impl_debug_if_no_extra_traits!(AllocNamedColorReply, "AllocNamedColorReply");
21217impl TryParse for AllocNamedColorReply {
21218    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
21219        let remaining = initial_value;
21220        let (response_type, remaining) = u8::try_parse(remaining)?;
21221        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
21222        let (sequence, remaining) = u16::try_parse(remaining)?;
21223        let (length, remaining) = u32::try_parse(remaining)?;
21224        let (pixel, remaining) = u32::try_parse(remaining)?;
21225        let (exact_red, remaining) = u16::try_parse(remaining)?;
21226        let (exact_green, remaining) = u16::try_parse(remaining)?;
21227        let (exact_blue, remaining) = u16::try_parse(remaining)?;
21228        let (visual_red, remaining) = u16::try_parse(remaining)?;
21229        let (visual_green, remaining) = u16::try_parse(remaining)?;
21230        let (visual_blue, remaining) = u16::try_parse(remaining)?;
21231        if response_type != 1 {
21232            return Err(ParseError::InvalidValue);
21233        }
21234        let result = AllocNamedColorReply { sequence, length, pixel, exact_red, exact_green, exact_blue, visual_red, visual_green, visual_blue };
21235        let _ = remaining;
21236        let remaining = initial_value.get(32 + length as usize * 4..)
21237            .ok_or(ParseError::InsufficientData)?;
21238        Ok((result, remaining))
21239    }
21240}
21241impl Serialize for AllocNamedColorReply {
21242    type Bytes = [u8; 24];
21243    fn serialize(&self) -> [u8; 24] {
21244        let response_type_bytes = &[1];
21245        let sequence_bytes = self.sequence.serialize();
21246        let length_bytes = self.length.serialize();
21247        let pixel_bytes = self.pixel.serialize();
21248        let exact_red_bytes = self.exact_red.serialize();
21249        let exact_green_bytes = self.exact_green.serialize();
21250        let exact_blue_bytes = self.exact_blue.serialize();
21251        let visual_red_bytes = self.visual_red.serialize();
21252        let visual_green_bytes = self.visual_green.serialize();
21253        let visual_blue_bytes = self.visual_blue.serialize();
21254        [
21255            response_type_bytes[0],
21256            0,
21257            sequence_bytes[0],
21258            sequence_bytes[1],
21259            length_bytes[0],
21260            length_bytes[1],
21261            length_bytes[2],
21262            length_bytes[3],
21263            pixel_bytes[0],
21264            pixel_bytes[1],
21265            pixel_bytes[2],
21266            pixel_bytes[3],
21267            exact_red_bytes[0],
21268            exact_red_bytes[1],
21269            exact_green_bytes[0],
21270            exact_green_bytes[1],
21271            exact_blue_bytes[0],
21272            exact_blue_bytes[1],
21273            visual_red_bytes[0],
21274            visual_red_bytes[1],
21275            visual_green_bytes[0],
21276            visual_green_bytes[1],
21277            visual_blue_bytes[0],
21278            visual_blue_bytes[1],
21279        ]
21280    }
21281    fn serialize_into(&self, bytes: &mut Vec<u8>) {
21282        bytes.reserve(24);
21283        let response_type_bytes = &[1];
21284        bytes.push(response_type_bytes[0]);
21285        bytes.extend_from_slice(&[0; 1]);
21286        self.sequence.serialize_into(bytes);
21287        self.length.serialize_into(bytes);
21288        self.pixel.serialize_into(bytes);
21289        self.exact_red.serialize_into(bytes);
21290        self.exact_green.serialize_into(bytes);
21291        self.exact_blue.serialize_into(bytes);
21292        self.visual_red.serialize_into(bytes);
21293        self.visual_green.serialize_into(bytes);
21294        self.visual_blue.serialize_into(bytes);
21295    }
21296}
21297
21298/// Opcode for the AllocColorCells request
21299pub const ALLOC_COLOR_CELLS_REQUEST: u8 = 86;
21300#[derive(Clone, Copy, Default)]
21301#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
21302#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21303pub struct AllocColorCellsRequest {
21304    pub contiguous: bool,
21305    pub cmap: Colormap,
21306    pub colors: u16,
21307    pub planes: u16,
21308}
21309impl_debug_if_no_extra_traits!(AllocColorCellsRequest, "AllocColorCellsRequest");
21310impl AllocColorCellsRequest {
21311    /// Serialize this request into bytes for the provided connection
21312    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
21313        let length_so_far = 0;
21314        let contiguous_bytes = self.contiguous.serialize();
21315        let cmap_bytes = self.cmap.serialize();
21316        let colors_bytes = self.colors.serialize();
21317        let planes_bytes = self.planes.serialize();
21318        let mut request0 = vec![
21319            ALLOC_COLOR_CELLS_REQUEST,
21320            contiguous_bytes[0],
21321            0,
21322            0,
21323            cmap_bytes[0],
21324            cmap_bytes[1],
21325            cmap_bytes[2],
21326            cmap_bytes[3],
21327            colors_bytes[0],
21328            colors_bytes[1],
21329            planes_bytes[0],
21330            planes_bytes[1],
21331        ];
21332        let length_so_far = length_so_far + request0.len();
21333        assert_eq!(length_so_far % 4, 0);
21334        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
21335        request0[2..4].copy_from_slice(&length.to_ne_bytes());
21336        ([request0.into()], vec![])
21337    }
21338    /// Parse this request given its header, its body, and any fds that go along with it
21339    #[cfg(feature = "request-parsing")]
21340    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
21341        if header.major_opcode != ALLOC_COLOR_CELLS_REQUEST {
21342            return Err(ParseError::InvalidValue);
21343        }
21344        let remaining = &[header.minor_opcode];
21345        let (contiguous, remaining) = bool::try_parse(remaining)?;
21346        let _ = remaining;
21347        let (cmap, remaining) = Colormap::try_parse(value)?;
21348        let (colors, remaining) = u16::try_parse(remaining)?;
21349        let (planes, remaining) = u16::try_parse(remaining)?;
21350        let _ = remaining;
21351        Ok(AllocColorCellsRequest {
21352            contiguous,
21353            cmap,
21354            colors,
21355            planes,
21356        })
21357    }
21358}
21359impl Request for AllocColorCellsRequest {
21360    const EXTENSION_NAME: Option<&'static str> = None;
21361
21362    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
21363        let (bufs, fds) = self.serialize();
21364        // Flatten the buffers into a single vector
21365        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
21366        (buf, fds)
21367    }
21368}
21369impl crate::x11_utils::ReplyRequest for AllocColorCellsRequest {
21370    type Reply = AllocColorCellsReply;
21371}
21372
21373#[derive(Clone, Default)]
21374#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
21375#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21376pub struct AllocColorCellsReply {
21377    pub sequence: u16,
21378    pub length: u32,
21379    pub pixels: Vec<u32>,
21380    pub masks: Vec<u32>,
21381}
21382impl_debug_if_no_extra_traits!(AllocColorCellsReply, "AllocColorCellsReply");
21383impl TryParse for AllocColorCellsReply {
21384    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
21385        let remaining = initial_value;
21386        let (response_type, remaining) = u8::try_parse(remaining)?;
21387        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
21388        let (sequence, remaining) = u16::try_parse(remaining)?;
21389        let (length, remaining) = u32::try_parse(remaining)?;
21390        let (pixels_len, remaining) = u16::try_parse(remaining)?;
21391        let (masks_len, remaining) = u16::try_parse(remaining)?;
21392        let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
21393        let (pixels, remaining) = crate::x11_utils::parse_list::<u32>(remaining, pixels_len.try_to_usize()?)?;
21394        let (masks, remaining) = crate::x11_utils::parse_list::<u32>(remaining, masks_len.try_to_usize()?)?;
21395        if response_type != 1 {
21396            return Err(ParseError::InvalidValue);
21397        }
21398        let result = AllocColorCellsReply { sequence, length, pixels, masks };
21399        let _ = remaining;
21400        let remaining = initial_value.get(32 + length as usize * 4..)
21401            .ok_or(ParseError::InsufficientData)?;
21402        Ok((result, remaining))
21403    }
21404}
21405impl Serialize for AllocColorCellsReply {
21406    type Bytes = Vec<u8>;
21407    fn serialize(&self) -> Vec<u8> {
21408        let mut result = Vec::new();
21409        self.serialize_into(&mut result);
21410        result
21411    }
21412    fn serialize_into(&self, bytes: &mut Vec<u8>) {
21413        bytes.reserve(32);
21414        let response_type_bytes = &[1];
21415        bytes.push(response_type_bytes[0]);
21416        bytes.extend_from_slice(&[0; 1]);
21417        self.sequence.serialize_into(bytes);
21418        self.length.serialize_into(bytes);
21419        let pixels_len = u16::try_from(self.pixels.len()).expect("`pixels` has too many elements");
21420        pixels_len.serialize_into(bytes);
21421        let masks_len = u16::try_from(self.masks.len()).expect("`masks` has too many elements");
21422        masks_len.serialize_into(bytes);
21423        bytes.extend_from_slice(&[0; 20]);
21424        self.pixels.serialize_into(bytes);
21425        self.masks.serialize_into(bytes);
21426    }
21427}
21428impl AllocColorCellsReply {
21429    /// Get the value of the `pixels_len` field.
21430    ///
21431    /// The `pixels_len` field is used as the length field of the `pixels` field.
21432    /// This function computes the field's value again based on the length of the list.
21433    ///
21434    /// # Panics
21435    ///
21436    /// Panics if the value cannot be represented in the target type. This
21437    /// cannot happen with values of the struct received from the X11 server.
21438    pub fn pixels_len(&self) -> u16 {
21439        self.pixels.len()
21440            .try_into().unwrap()
21441    }
21442    /// Get the value of the `masks_len` field.
21443    ///
21444    /// The `masks_len` field is used as the length field of the `masks` field.
21445    /// This function computes the field's value again based on the length of the list.
21446    ///
21447    /// # Panics
21448    ///
21449    /// Panics if the value cannot be represented in the target type. This
21450    /// cannot happen with values of the struct received from the X11 server.
21451    pub fn masks_len(&self) -> u16 {
21452        self.masks.len()
21453            .try_into().unwrap()
21454    }
21455}
21456
21457/// Opcode for the AllocColorPlanes request
21458pub const ALLOC_COLOR_PLANES_REQUEST: u8 = 87;
21459#[derive(Clone, Copy, Default)]
21460#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
21461#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21462pub struct AllocColorPlanesRequest {
21463    pub contiguous: bool,
21464    pub cmap: Colormap,
21465    pub colors: u16,
21466    pub reds: u16,
21467    pub greens: u16,
21468    pub blues: u16,
21469}
21470impl_debug_if_no_extra_traits!(AllocColorPlanesRequest, "AllocColorPlanesRequest");
21471impl AllocColorPlanesRequest {
21472    /// Serialize this request into bytes for the provided connection
21473    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
21474        let length_so_far = 0;
21475        let contiguous_bytes = self.contiguous.serialize();
21476        let cmap_bytes = self.cmap.serialize();
21477        let colors_bytes = self.colors.serialize();
21478        let reds_bytes = self.reds.serialize();
21479        let greens_bytes = self.greens.serialize();
21480        let blues_bytes = self.blues.serialize();
21481        let mut request0 = vec![
21482            ALLOC_COLOR_PLANES_REQUEST,
21483            contiguous_bytes[0],
21484            0,
21485            0,
21486            cmap_bytes[0],
21487            cmap_bytes[1],
21488            cmap_bytes[2],
21489            cmap_bytes[3],
21490            colors_bytes[0],
21491            colors_bytes[1],
21492            reds_bytes[0],
21493            reds_bytes[1],
21494            greens_bytes[0],
21495            greens_bytes[1],
21496            blues_bytes[0],
21497            blues_bytes[1],
21498        ];
21499        let length_so_far = length_so_far + request0.len();
21500        assert_eq!(length_so_far % 4, 0);
21501        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
21502        request0[2..4].copy_from_slice(&length.to_ne_bytes());
21503        ([request0.into()], vec![])
21504    }
21505    /// Parse this request given its header, its body, and any fds that go along with it
21506    #[cfg(feature = "request-parsing")]
21507    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
21508        if header.major_opcode != ALLOC_COLOR_PLANES_REQUEST {
21509            return Err(ParseError::InvalidValue);
21510        }
21511        let remaining = &[header.minor_opcode];
21512        let (contiguous, remaining) = bool::try_parse(remaining)?;
21513        let _ = remaining;
21514        let (cmap, remaining) = Colormap::try_parse(value)?;
21515        let (colors, remaining) = u16::try_parse(remaining)?;
21516        let (reds, remaining) = u16::try_parse(remaining)?;
21517        let (greens, remaining) = u16::try_parse(remaining)?;
21518        let (blues, remaining) = u16::try_parse(remaining)?;
21519        let _ = remaining;
21520        Ok(AllocColorPlanesRequest {
21521            contiguous,
21522            cmap,
21523            colors,
21524            reds,
21525            greens,
21526            blues,
21527        })
21528    }
21529}
21530impl Request for AllocColorPlanesRequest {
21531    const EXTENSION_NAME: Option<&'static str> = None;
21532
21533    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
21534        let (bufs, fds) = self.serialize();
21535        // Flatten the buffers into a single vector
21536        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
21537        (buf, fds)
21538    }
21539}
21540impl crate::x11_utils::ReplyRequest for AllocColorPlanesRequest {
21541    type Reply = AllocColorPlanesReply;
21542}
21543
21544#[derive(Clone, Default)]
21545#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
21546#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21547pub struct AllocColorPlanesReply {
21548    pub sequence: u16,
21549    pub length: u32,
21550    pub red_mask: u32,
21551    pub green_mask: u32,
21552    pub blue_mask: u32,
21553    pub pixels: Vec<u32>,
21554}
21555impl_debug_if_no_extra_traits!(AllocColorPlanesReply, "AllocColorPlanesReply");
21556impl TryParse for AllocColorPlanesReply {
21557    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
21558        let remaining = initial_value;
21559        let (response_type, remaining) = u8::try_parse(remaining)?;
21560        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
21561        let (sequence, remaining) = u16::try_parse(remaining)?;
21562        let (length, remaining) = u32::try_parse(remaining)?;
21563        let (pixels_len, remaining) = u16::try_parse(remaining)?;
21564        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
21565        let (red_mask, remaining) = u32::try_parse(remaining)?;
21566        let (green_mask, remaining) = u32::try_parse(remaining)?;
21567        let (blue_mask, remaining) = u32::try_parse(remaining)?;
21568        let remaining = remaining.get(8..).ok_or(ParseError::InsufficientData)?;
21569        let (pixels, remaining) = crate::x11_utils::parse_list::<u32>(remaining, pixels_len.try_to_usize()?)?;
21570        if response_type != 1 {
21571            return Err(ParseError::InvalidValue);
21572        }
21573        let result = AllocColorPlanesReply { sequence, length, red_mask, green_mask, blue_mask, pixels };
21574        let _ = remaining;
21575        let remaining = initial_value.get(32 + length as usize * 4..)
21576            .ok_or(ParseError::InsufficientData)?;
21577        Ok((result, remaining))
21578    }
21579}
21580impl Serialize for AllocColorPlanesReply {
21581    type Bytes = Vec<u8>;
21582    fn serialize(&self) -> Vec<u8> {
21583        let mut result = Vec::new();
21584        self.serialize_into(&mut result);
21585        result
21586    }
21587    fn serialize_into(&self, bytes: &mut Vec<u8>) {
21588        bytes.reserve(32);
21589        let response_type_bytes = &[1];
21590        bytes.push(response_type_bytes[0]);
21591        bytes.extend_from_slice(&[0; 1]);
21592        self.sequence.serialize_into(bytes);
21593        self.length.serialize_into(bytes);
21594        let pixels_len = u16::try_from(self.pixels.len()).expect("`pixels` has too many elements");
21595        pixels_len.serialize_into(bytes);
21596        bytes.extend_from_slice(&[0; 2]);
21597        self.red_mask.serialize_into(bytes);
21598        self.green_mask.serialize_into(bytes);
21599        self.blue_mask.serialize_into(bytes);
21600        bytes.extend_from_slice(&[0; 8]);
21601        self.pixels.serialize_into(bytes);
21602    }
21603}
21604impl AllocColorPlanesReply {
21605    /// Get the value of the `pixels_len` field.
21606    ///
21607    /// The `pixels_len` field is used as the length field of the `pixels` field.
21608    /// This function computes the field's value again based on the length of the list.
21609    ///
21610    /// # Panics
21611    ///
21612    /// Panics if the value cannot be represented in the target type. This
21613    /// cannot happen with values of the struct received from the X11 server.
21614    pub fn pixels_len(&self) -> u16 {
21615        self.pixels.len()
21616            .try_into().unwrap()
21617    }
21618}
21619
21620/// Opcode for the FreeColors request
21621pub const FREE_COLORS_REQUEST: u8 = 88;
21622#[derive(Clone, Default)]
21623#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
21624#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21625pub struct FreeColorsRequest<'input> {
21626    pub cmap: Colormap,
21627    pub plane_mask: u32,
21628    pub pixels: Cow<'input, [u32]>,
21629}
21630impl_debug_if_no_extra_traits!(FreeColorsRequest<'_>, "FreeColorsRequest");
21631impl<'input> FreeColorsRequest<'input> {
21632    /// Serialize this request into bytes for the provided connection
21633    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
21634        let length_so_far = 0;
21635        let cmap_bytes = self.cmap.serialize();
21636        let plane_mask_bytes = self.plane_mask.serialize();
21637        let mut request0 = vec![
21638            FREE_COLORS_REQUEST,
21639            0,
21640            0,
21641            0,
21642            cmap_bytes[0],
21643            cmap_bytes[1],
21644            cmap_bytes[2],
21645            cmap_bytes[3],
21646            plane_mask_bytes[0],
21647            plane_mask_bytes[1],
21648            plane_mask_bytes[2],
21649            plane_mask_bytes[3],
21650        ];
21651        let length_so_far = length_so_far + request0.len();
21652        let pixels_bytes = self.pixels.serialize();
21653        let length_so_far = length_so_far + pixels_bytes.len();
21654        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
21655        let length_so_far = length_so_far + padding0.len();
21656        assert_eq!(length_so_far % 4, 0);
21657        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
21658        request0[2..4].copy_from_slice(&length.to_ne_bytes());
21659        ([request0.into(), pixels_bytes.into(), padding0.into()], vec![])
21660    }
21661    /// Parse this request given its header, its body, and any fds that go along with it
21662    #[cfg(feature = "request-parsing")]
21663    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
21664        if header.major_opcode != FREE_COLORS_REQUEST {
21665            return Err(ParseError::InvalidValue);
21666        }
21667        let remaining = &[header.minor_opcode];
21668        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
21669        let _ = remaining;
21670        let (cmap, remaining) = Colormap::try_parse(value)?;
21671        let (plane_mask, remaining) = u32::try_parse(remaining)?;
21672        let mut remaining = remaining;
21673        // Length is 'everything left in the input'
21674        let mut pixels = Vec::new();
21675        while !remaining.is_empty() {
21676            let (v, new_remaining) = u32::try_parse(remaining)?;
21677            remaining = new_remaining;
21678            pixels.push(v);
21679        }
21680        let _ = remaining;
21681        Ok(FreeColorsRequest {
21682            cmap,
21683            plane_mask,
21684            pixels: Cow::Owned(pixels),
21685        })
21686    }
21687    /// Clone all borrowed data in this FreeColorsRequest.
21688    pub fn into_owned(self) -> FreeColorsRequest<'static> {
21689        FreeColorsRequest {
21690            cmap: self.cmap,
21691            plane_mask: self.plane_mask,
21692            pixels: Cow::Owned(self.pixels.into_owned()),
21693        }
21694    }
21695}
21696impl<'input> Request for FreeColorsRequest<'input> {
21697    const EXTENSION_NAME: Option<&'static str> = None;
21698
21699    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
21700        let (bufs, fds) = self.serialize();
21701        // Flatten the buffers into a single vector
21702        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
21703        (buf, fds)
21704    }
21705}
21706impl<'input> crate::x11_utils::VoidRequest for FreeColorsRequest<'input> {
21707}
21708
21709#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
21710#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21711pub struct ColorFlag(u8);
21712impl ColorFlag {
21713    pub const RED: Self = Self(1 << 0);
21714    pub const GREEN: Self = Self(1 << 1);
21715    pub const BLUE: Self = Self(1 << 2);
21716}
21717impl From<ColorFlag> for u8 {
21718    #[inline]
21719    fn from(input: ColorFlag) -> Self {
21720        input.0
21721    }
21722}
21723impl From<ColorFlag> for Option<u8> {
21724    #[inline]
21725    fn from(input: ColorFlag) -> Self {
21726        Some(input.0)
21727    }
21728}
21729impl From<ColorFlag> for u16 {
21730    #[inline]
21731    fn from(input: ColorFlag) -> Self {
21732        u16::from(input.0)
21733    }
21734}
21735impl From<ColorFlag> for Option<u16> {
21736    #[inline]
21737    fn from(input: ColorFlag) -> Self {
21738        Some(u16::from(input.0))
21739    }
21740}
21741impl From<ColorFlag> for u32 {
21742    #[inline]
21743    fn from(input: ColorFlag) -> Self {
21744        u32::from(input.0)
21745    }
21746}
21747impl From<ColorFlag> for Option<u32> {
21748    #[inline]
21749    fn from(input: ColorFlag) -> Self {
21750        Some(u32::from(input.0))
21751    }
21752}
21753impl From<u8> for ColorFlag {
21754    #[inline]
21755    fn from(value: u8) -> Self {
21756        Self(value)
21757    }
21758}
21759impl core::fmt::Debug for ColorFlag  {
21760    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
21761        let variants = [
21762            (Self::RED.0.into(), "RED", "Red"),
21763            (Self::GREEN.0.into(), "GREEN", "Green"),
21764            (Self::BLUE.0.into(), "BLUE", "Blue"),
21765        ];
21766        pretty_print_bitmask(fmt, self.0.into(), &variants)
21767    }
21768}
21769bitmask_binop!(ColorFlag, u8);
21770
21771#[derive(Clone, Copy, Default)]
21772#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
21773#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21774pub struct Coloritem {
21775    pub pixel: u32,
21776    pub red: u16,
21777    pub green: u16,
21778    pub blue: u16,
21779    pub flags: ColorFlag,
21780}
21781impl_debug_if_no_extra_traits!(Coloritem, "Coloritem");
21782impl TryParse for Coloritem {
21783    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
21784        let (pixel, remaining) = u32::try_parse(remaining)?;
21785        let (red, remaining) = u16::try_parse(remaining)?;
21786        let (green, remaining) = u16::try_parse(remaining)?;
21787        let (blue, remaining) = u16::try_parse(remaining)?;
21788        let (flags, remaining) = u8::try_parse(remaining)?;
21789        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
21790        let flags = flags.into();
21791        let result = Coloritem { pixel, red, green, blue, flags };
21792        Ok((result, remaining))
21793    }
21794}
21795impl Serialize for Coloritem {
21796    type Bytes = [u8; 12];
21797    fn serialize(&self) -> [u8; 12] {
21798        let pixel_bytes = self.pixel.serialize();
21799        let red_bytes = self.red.serialize();
21800        let green_bytes = self.green.serialize();
21801        let blue_bytes = self.blue.serialize();
21802        let flags_bytes = u8::from(self.flags).serialize();
21803        [
21804            pixel_bytes[0],
21805            pixel_bytes[1],
21806            pixel_bytes[2],
21807            pixel_bytes[3],
21808            red_bytes[0],
21809            red_bytes[1],
21810            green_bytes[0],
21811            green_bytes[1],
21812            blue_bytes[0],
21813            blue_bytes[1],
21814            flags_bytes[0],
21815            0,
21816        ]
21817    }
21818    fn serialize_into(&self, bytes: &mut Vec<u8>) {
21819        bytes.reserve(12);
21820        self.pixel.serialize_into(bytes);
21821        self.red.serialize_into(bytes);
21822        self.green.serialize_into(bytes);
21823        self.blue.serialize_into(bytes);
21824        u8::from(self.flags).serialize_into(bytes);
21825        bytes.extend_from_slice(&[0; 1]);
21826    }
21827}
21828
21829/// Opcode for the StoreColors request
21830pub const STORE_COLORS_REQUEST: u8 = 89;
21831#[derive(Clone, Default)]
21832#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
21833#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21834pub struct StoreColorsRequest<'input> {
21835    pub cmap: Colormap,
21836    pub items: Cow<'input, [Coloritem]>,
21837}
21838impl_debug_if_no_extra_traits!(StoreColorsRequest<'_>, "StoreColorsRequest");
21839impl<'input> StoreColorsRequest<'input> {
21840    /// Serialize this request into bytes for the provided connection
21841    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
21842        let length_so_far = 0;
21843        let cmap_bytes = self.cmap.serialize();
21844        let mut request0 = vec![
21845            STORE_COLORS_REQUEST,
21846            0,
21847            0,
21848            0,
21849            cmap_bytes[0],
21850            cmap_bytes[1],
21851            cmap_bytes[2],
21852            cmap_bytes[3],
21853        ];
21854        let length_so_far = length_so_far + request0.len();
21855        let items_bytes = self.items.serialize();
21856        let length_so_far = length_so_far + items_bytes.len();
21857        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
21858        let length_so_far = length_so_far + padding0.len();
21859        assert_eq!(length_so_far % 4, 0);
21860        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
21861        request0[2..4].copy_from_slice(&length.to_ne_bytes());
21862        ([request0.into(), items_bytes.into(), padding0.into()], vec![])
21863    }
21864    /// Parse this request given its header, its body, and any fds that go along with it
21865    #[cfg(feature = "request-parsing")]
21866    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
21867        if header.major_opcode != STORE_COLORS_REQUEST {
21868            return Err(ParseError::InvalidValue);
21869        }
21870        let remaining = &[header.minor_opcode];
21871        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
21872        let _ = remaining;
21873        let (cmap, remaining) = Colormap::try_parse(value)?;
21874        let mut remaining = remaining;
21875        // Length is 'everything left in the input'
21876        let mut items = Vec::new();
21877        while !remaining.is_empty() {
21878            let (v, new_remaining) = Coloritem::try_parse(remaining)?;
21879            remaining = new_remaining;
21880            items.push(v);
21881        }
21882        let _ = remaining;
21883        Ok(StoreColorsRequest {
21884            cmap,
21885            items: Cow::Owned(items),
21886        })
21887    }
21888    /// Clone all borrowed data in this StoreColorsRequest.
21889    pub fn into_owned(self) -> StoreColorsRequest<'static> {
21890        StoreColorsRequest {
21891            cmap: self.cmap,
21892            items: Cow::Owned(self.items.into_owned()),
21893        }
21894    }
21895}
21896impl<'input> Request for StoreColorsRequest<'input> {
21897    const EXTENSION_NAME: Option<&'static str> = None;
21898
21899    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
21900        let (bufs, fds) = self.serialize();
21901        // Flatten the buffers into a single vector
21902        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
21903        (buf, fds)
21904    }
21905}
21906impl<'input> crate::x11_utils::VoidRequest for StoreColorsRequest<'input> {
21907}
21908
21909/// Opcode for the StoreNamedColor request
21910pub const STORE_NAMED_COLOR_REQUEST: u8 = 90;
21911#[derive(Clone, Default)]
21912#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
21913#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21914pub struct StoreNamedColorRequest<'input> {
21915    pub flags: ColorFlag,
21916    pub cmap: Colormap,
21917    pub pixel: u32,
21918    pub name: Cow<'input, [u8]>,
21919}
21920impl_debug_if_no_extra_traits!(StoreNamedColorRequest<'_>, "StoreNamedColorRequest");
21921impl<'input> StoreNamedColorRequest<'input> {
21922    /// Serialize this request into bytes for the provided connection
21923    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
21924        let length_so_far = 0;
21925        let flags_bytes = u8::from(self.flags).serialize();
21926        let cmap_bytes = self.cmap.serialize();
21927        let pixel_bytes = self.pixel.serialize();
21928        let name_len = u16::try_from(self.name.len()).expect("`name` has too many elements");
21929        let name_len_bytes = name_len.serialize();
21930        let mut request0 = vec![
21931            STORE_NAMED_COLOR_REQUEST,
21932            flags_bytes[0],
21933            0,
21934            0,
21935            cmap_bytes[0],
21936            cmap_bytes[1],
21937            cmap_bytes[2],
21938            cmap_bytes[3],
21939            pixel_bytes[0],
21940            pixel_bytes[1],
21941            pixel_bytes[2],
21942            pixel_bytes[3],
21943            name_len_bytes[0],
21944            name_len_bytes[1],
21945            0,
21946            0,
21947        ];
21948        let length_so_far = length_so_far + request0.len();
21949        let length_so_far = length_so_far + self.name.len();
21950        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
21951        let length_so_far = length_so_far + padding0.len();
21952        assert_eq!(length_so_far % 4, 0);
21953        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
21954        request0[2..4].copy_from_slice(&length.to_ne_bytes());
21955        ([request0.into(), self.name, padding0.into()], vec![])
21956    }
21957    /// Parse this request given its header, its body, and any fds that go along with it
21958    #[cfg(feature = "request-parsing")]
21959    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
21960        if header.major_opcode != STORE_NAMED_COLOR_REQUEST {
21961            return Err(ParseError::InvalidValue);
21962        }
21963        let remaining = &[header.minor_opcode];
21964        let (flags, remaining) = u8::try_parse(remaining)?;
21965        let flags = flags.into();
21966        let _ = remaining;
21967        let (cmap, remaining) = Colormap::try_parse(value)?;
21968        let (pixel, remaining) = u32::try_parse(remaining)?;
21969        let (name_len, remaining) = u16::try_parse(remaining)?;
21970        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
21971        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_len.try_to_usize()?)?;
21972        let _ = remaining;
21973        Ok(StoreNamedColorRequest {
21974            flags,
21975            cmap,
21976            pixel,
21977            name: Cow::Borrowed(name),
21978        })
21979    }
21980    /// Clone all borrowed data in this StoreNamedColorRequest.
21981    pub fn into_owned(self) -> StoreNamedColorRequest<'static> {
21982        StoreNamedColorRequest {
21983            flags: self.flags,
21984            cmap: self.cmap,
21985            pixel: self.pixel,
21986            name: Cow::Owned(self.name.into_owned()),
21987        }
21988    }
21989}
21990impl<'input> Request for StoreNamedColorRequest<'input> {
21991    const EXTENSION_NAME: Option<&'static str> = None;
21992
21993    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
21994        let (bufs, fds) = self.serialize();
21995        // Flatten the buffers into a single vector
21996        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
21997        (buf, fds)
21998    }
21999}
22000impl<'input> crate::x11_utils::VoidRequest for StoreNamedColorRequest<'input> {
22001}
22002
22003#[derive(Clone, Copy, Default)]
22004#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
22005#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22006pub struct Rgb {
22007    pub red: u16,
22008    pub green: u16,
22009    pub blue: u16,
22010}
22011impl_debug_if_no_extra_traits!(Rgb, "Rgb");
22012impl TryParse for Rgb {
22013    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
22014        let (red, remaining) = u16::try_parse(remaining)?;
22015        let (green, remaining) = u16::try_parse(remaining)?;
22016        let (blue, remaining) = u16::try_parse(remaining)?;
22017        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
22018        let result = Rgb { red, green, blue };
22019        Ok((result, remaining))
22020    }
22021}
22022impl Serialize for Rgb {
22023    type Bytes = [u8; 8];
22024    fn serialize(&self) -> [u8; 8] {
22025        let red_bytes = self.red.serialize();
22026        let green_bytes = self.green.serialize();
22027        let blue_bytes = self.blue.serialize();
22028        [
22029            red_bytes[0],
22030            red_bytes[1],
22031            green_bytes[0],
22032            green_bytes[1],
22033            blue_bytes[0],
22034            blue_bytes[1],
22035            0,
22036            0,
22037        ]
22038    }
22039    fn serialize_into(&self, bytes: &mut Vec<u8>) {
22040        bytes.reserve(8);
22041        self.red.serialize_into(bytes);
22042        self.green.serialize_into(bytes);
22043        self.blue.serialize_into(bytes);
22044        bytes.extend_from_slice(&[0; 2]);
22045    }
22046}
22047
22048/// Opcode for the QueryColors request
22049pub const QUERY_COLORS_REQUEST: u8 = 91;
22050#[derive(Clone, Default)]
22051#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
22052#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22053pub struct QueryColorsRequest<'input> {
22054    pub cmap: Colormap,
22055    pub pixels: Cow<'input, [u32]>,
22056}
22057impl_debug_if_no_extra_traits!(QueryColorsRequest<'_>, "QueryColorsRequest");
22058impl<'input> QueryColorsRequest<'input> {
22059    /// Serialize this request into bytes for the provided connection
22060    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
22061        let length_so_far = 0;
22062        let cmap_bytes = self.cmap.serialize();
22063        let mut request0 = vec![
22064            QUERY_COLORS_REQUEST,
22065            0,
22066            0,
22067            0,
22068            cmap_bytes[0],
22069            cmap_bytes[1],
22070            cmap_bytes[2],
22071            cmap_bytes[3],
22072        ];
22073        let length_so_far = length_so_far + request0.len();
22074        let pixels_bytes = self.pixels.serialize();
22075        let length_so_far = length_so_far + pixels_bytes.len();
22076        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
22077        let length_so_far = length_so_far + padding0.len();
22078        assert_eq!(length_so_far % 4, 0);
22079        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
22080        request0[2..4].copy_from_slice(&length.to_ne_bytes());
22081        ([request0.into(), pixels_bytes.into(), padding0.into()], vec![])
22082    }
22083    /// Parse this request given its header, its body, and any fds that go along with it
22084    #[cfg(feature = "request-parsing")]
22085    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
22086        if header.major_opcode != QUERY_COLORS_REQUEST {
22087            return Err(ParseError::InvalidValue);
22088        }
22089        let remaining = &[header.minor_opcode];
22090        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
22091        let _ = remaining;
22092        let (cmap, remaining) = Colormap::try_parse(value)?;
22093        let mut remaining = remaining;
22094        // Length is 'everything left in the input'
22095        let mut pixels = Vec::new();
22096        while !remaining.is_empty() {
22097            let (v, new_remaining) = u32::try_parse(remaining)?;
22098            remaining = new_remaining;
22099            pixels.push(v);
22100        }
22101        let _ = remaining;
22102        Ok(QueryColorsRequest {
22103            cmap,
22104            pixels: Cow::Owned(pixels),
22105        })
22106    }
22107    /// Clone all borrowed data in this QueryColorsRequest.
22108    pub fn into_owned(self) -> QueryColorsRequest<'static> {
22109        QueryColorsRequest {
22110            cmap: self.cmap,
22111            pixels: Cow::Owned(self.pixels.into_owned()),
22112        }
22113    }
22114}
22115impl<'input> Request for QueryColorsRequest<'input> {
22116    const EXTENSION_NAME: Option<&'static str> = None;
22117
22118    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
22119        let (bufs, fds) = self.serialize();
22120        // Flatten the buffers into a single vector
22121        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
22122        (buf, fds)
22123    }
22124}
22125impl<'input> crate::x11_utils::ReplyRequest for QueryColorsRequest<'input> {
22126    type Reply = QueryColorsReply;
22127}
22128
22129#[derive(Clone, Default)]
22130#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
22131#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22132pub struct QueryColorsReply {
22133    pub sequence: u16,
22134    pub length: u32,
22135    pub colors: Vec<Rgb>,
22136}
22137impl_debug_if_no_extra_traits!(QueryColorsReply, "QueryColorsReply");
22138impl TryParse for QueryColorsReply {
22139    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
22140        let remaining = initial_value;
22141        let (response_type, remaining) = u8::try_parse(remaining)?;
22142        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
22143        let (sequence, remaining) = u16::try_parse(remaining)?;
22144        let (length, remaining) = u32::try_parse(remaining)?;
22145        let (colors_len, remaining) = u16::try_parse(remaining)?;
22146        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
22147        let (colors, remaining) = crate::x11_utils::parse_list::<Rgb>(remaining, colors_len.try_to_usize()?)?;
22148        if response_type != 1 {
22149            return Err(ParseError::InvalidValue);
22150        }
22151        let result = QueryColorsReply { sequence, length, colors };
22152        let _ = remaining;
22153        let remaining = initial_value.get(32 + length as usize * 4..)
22154            .ok_or(ParseError::InsufficientData)?;
22155        Ok((result, remaining))
22156    }
22157}
22158impl Serialize for QueryColorsReply {
22159    type Bytes = Vec<u8>;
22160    fn serialize(&self) -> Vec<u8> {
22161        let mut result = Vec::new();
22162        self.serialize_into(&mut result);
22163        result
22164    }
22165    fn serialize_into(&self, bytes: &mut Vec<u8>) {
22166        bytes.reserve(32);
22167        let response_type_bytes = &[1];
22168        bytes.push(response_type_bytes[0]);
22169        bytes.extend_from_slice(&[0; 1]);
22170        self.sequence.serialize_into(bytes);
22171        self.length.serialize_into(bytes);
22172        let colors_len = u16::try_from(self.colors.len()).expect("`colors` has too many elements");
22173        colors_len.serialize_into(bytes);
22174        bytes.extend_from_slice(&[0; 22]);
22175        self.colors.serialize_into(bytes);
22176    }
22177}
22178impl QueryColorsReply {
22179    /// Get the value of the `colors_len` field.
22180    ///
22181    /// The `colors_len` field is used as the length field of the `colors` field.
22182    /// This function computes the field's value again based on the length of the list.
22183    ///
22184    /// # Panics
22185    ///
22186    /// Panics if the value cannot be represented in the target type. This
22187    /// cannot happen with values of the struct received from the X11 server.
22188    pub fn colors_len(&self) -> u16 {
22189        self.colors.len()
22190            .try_into().unwrap()
22191    }
22192}
22193
22194/// Opcode for the LookupColor request
22195pub const LOOKUP_COLOR_REQUEST: u8 = 92;
22196#[derive(Clone, Default)]
22197#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
22198#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22199pub struct LookupColorRequest<'input> {
22200    pub cmap: Colormap,
22201    pub name: Cow<'input, [u8]>,
22202}
22203impl_debug_if_no_extra_traits!(LookupColorRequest<'_>, "LookupColorRequest");
22204impl<'input> LookupColorRequest<'input> {
22205    /// Serialize this request into bytes for the provided connection
22206    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
22207        let length_so_far = 0;
22208        let cmap_bytes = self.cmap.serialize();
22209        let name_len = u16::try_from(self.name.len()).expect("`name` has too many elements");
22210        let name_len_bytes = name_len.serialize();
22211        let mut request0 = vec![
22212            LOOKUP_COLOR_REQUEST,
22213            0,
22214            0,
22215            0,
22216            cmap_bytes[0],
22217            cmap_bytes[1],
22218            cmap_bytes[2],
22219            cmap_bytes[3],
22220            name_len_bytes[0],
22221            name_len_bytes[1],
22222            0,
22223            0,
22224        ];
22225        let length_so_far = length_so_far + request0.len();
22226        let length_so_far = length_so_far + self.name.len();
22227        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
22228        let length_so_far = length_so_far + padding0.len();
22229        assert_eq!(length_so_far % 4, 0);
22230        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
22231        request0[2..4].copy_from_slice(&length.to_ne_bytes());
22232        ([request0.into(), self.name, padding0.into()], vec![])
22233    }
22234    /// Parse this request given its header, its body, and any fds that go along with it
22235    #[cfg(feature = "request-parsing")]
22236    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
22237        if header.major_opcode != LOOKUP_COLOR_REQUEST {
22238            return Err(ParseError::InvalidValue);
22239        }
22240        let remaining = &[header.minor_opcode];
22241        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
22242        let _ = remaining;
22243        let (cmap, remaining) = Colormap::try_parse(value)?;
22244        let (name_len, remaining) = u16::try_parse(remaining)?;
22245        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
22246        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_len.try_to_usize()?)?;
22247        let _ = remaining;
22248        Ok(LookupColorRequest {
22249            cmap,
22250            name: Cow::Borrowed(name),
22251        })
22252    }
22253    /// Clone all borrowed data in this LookupColorRequest.
22254    pub fn into_owned(self) -> LookupColorRequest<'static> {
22255        LookupColorRequest {
22256            cmap: self.cmap,
22257            name: Cow::Owned(self.name.into_owned()),
22258        }
22259    }
22260}
22261impl<'input> Request for LookupColorRequest<'input> {
22262    const EXTENSION_NAME: Option<&'static str> = None;
22263
22264    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
22265        let (bufs, fds) = self.serialize();
22266        // Flatten the buffers into a single vector
22267        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
22268        (buf, fds)
22269    }
22270}
22271impl<'input> crate::x11_utils::ReplyRequest for LookupColorRequest<'input> {
22272    type Reply = LookupColorReply;
22273}
22274
22275#[derive(Clone, Copy, Default)]
22276#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
22277#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22278pub struct LookupColorReply {
22279    pub sequence: u16,
22280    pub length: u32,
22281    pub exact_red: u16,
22282    pub exact_green: u16,
22283    pub exact_blue: u16,
22284    pub visual_red: u16,
22285    pub visual_green: u16,
22286    pub visual_blue: u16,
22287}
22288impl_debug_if_no_extra_traits!(LookupColorReply, "LookupColorReply");
22289impl TryParse for LookupColorReply {
22290    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
22291        let remaining = initial_value;
22292        let (response_type, remaining) = u8::try_parse(remaining)?;
22293        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
22294        let (sequence, remaining) = u16::try_parse(remaining)?;
22295        let (length, remaining) = u32::try_parse(remaining)?;
22296        let (exact_red, remaining) = u16::try_parse(remaining)?;
22297        let (exact_green, remaining) = u16::try_parse(remaining)?;
22298        let (exact_blue, remaining) = u16::try_parse(remaining)?;
22299        let (visual_red, remaining) = u16::try_parse(remaining)?;
22300        let (visual_green, remaining) = u16::try_parse(remaining)?;
22301        let (visual_blue, remaining) = u16::try_parse(remaining)?;
22302        if response_type != 1 {
22303            return Err(ParseError::InvalidValue);
22304        }
22305        let result = LookupColorReply { sequence, length, exact_red, exact_green, exact_blue, visual_red, visual_green, visual_blue };
22306        let _ = remaining;
22307        let remaining = initial_value.get(32 + length as usize * 4..)
22308            .ok_or(ParseError::InsufficientData)?;
22309        Ok((result, remaining))
22310    }
22311}
22312impl Serialize for LookupColorReply {
22313    type Bytes = [u8; 20];
22314    fn serialize(&self) -> [u8; 20] {
22315        let response_type_bytes = &[1];
22316        let sequence_bytes = self.sequence.serialize();
22317        let length_bytes = self.length.serialize();
22318        let exact_red_bytes = self.exact_red.serialize();
22319        let exact_green_bytes = self.exact_green.serialize();
22320        let exact_blue_bytes = self.exact_blue.serialize();
22321        let visual_red_bytes = self.visual_red.serialize();
22322        let visual_green_bytes = self.visual_green.serialize();
22323        let visual_blue_bytes = self.visual_blue.serialize();
22324        [
22325            response_type_bytes[0],
22326            0,
22327            sequence_bytes[0],
22328            sequence_bytes[1],
22329            length_bytes[0],
22330            length_bytes[1],
22331            length_bytes[2],
22332            length_bytes[3],
22333            exact_red_bytes[0],
22334            exact_red_bytes[1],
22335            exact_green_bytes[0],
22336            exact_green_bytes[1],
22337            exact_blue_bytes[0],
22338            exact_blue_bytes[1],
22339            visual_red_bytes[0],
22340            visual_red_bytes[1],
22341            visual_green_bytes[0],
22342            visual_green_bytes[1],
22343            visual_blue_bytes[0],
22344            visual_blue_bytes[1],
22345        ]
22346    }
22347    fn serialize_into(&self, bytes: &mut Vec<u8>) {
22348        bytes.reserve(20);
22349        let response_type_bytes = &[1];
22350        bytes.push(response_type_bytes[0]);
22351        bytes.extend_from_slice(&[0; 1]);
22352        self.sequence.serialize_into(bytes);
22353        self.length.serialize_into(bytes);
22354        self.exact_red.serialize_into(bytes);
22355        self.exact_green.serialize_into(bytes);
22356        self.exact_blue.serialize_into(bytes);
22357        self.visual_red.serialize_into(bytes);
22358        self.visual_green.serialize_into(bytes);
22359        self.visual_blue.serialize_into(bytes);
22360    }
22361}
22362
22363#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
22364#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22365pub struct PixmapEnum(u8);
22366impl PixmapEnum {
22367    pub const NONE: Self = Self(0);
22368}
22369impl From<PixmapEnum> for u8 {
22370    #[inline]
22371    fn from(input: PixmapEnum) -> Self {
22372        input.0
22373    }
22374}
22375impl From<PixmapEnum> for Option<u8> {
22376    #[inline]
22377    fn from(input: PixmapEnum) -> Self {
22378        Some(input.0)
22379    }
22380}
22381impl From<PixmapEnum> for u16 {
22382    #[inline]
22383    fn from(input: PixmapEnum) -> Self {
22384        u16::from(input.0)
22385    }
22386}
22387impl From<PixmapEnum> for Option<u16> {
22388    #[inline]
22389    fn from(input: PixmapEnum) -> Self {
22390        Some(u16::from(input.0))
22391    }
22392}
22393impl From<PixmapEnum> for u32 {
22394    #[inline]
22395    fn from(input: PixmapEnum) -> Self {
22396        u32::from(input.0)
22397    }
22398}
22399impl From<PixmapEnum> for Option<u32> {
22400    #[inline]
22401    fn from(input: PixmapEnum) -> Self {
22402        Some(u32::from(input.0))
22403    }
22404}
22405impl From<u8> for PixmapEnum {
22406    #[inline]
22407    fn from(value: u8) -> Self {
22408        Self(value)
22409    }
22410}
22411impl core::fmt::Debug for PixmapEnum  {
22412    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
22413        let variants = [
22414            (Self::NONE.0.into(), "NONE", "None"),
22415        ];
22416        pretty_print_enum(fmt, self.0.into(), &variants)
22417    }
22418}
22419
22420/// Opcode for the CreateCursor request
22421pub const CREATE_CURSOR_REQUEST: u8 = 93;
22422#[derive(Clone, Copy, Default)]
22423#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
22424#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22425pub struct CreateCursorRequest {
22426    pub cid: Cursor,
22427    pub source: Pixmap,
22428    pub mask: Pixmap,
22429    pub fore_red: u16,
22430    pub fore_green: u16,
22431    pub fore_blue: u16,
22432    pub back_red: u16,
22433    pub back_green: u16,
22434    pub back_blue: u16,
22435    pub x: u16,
22436    pub y: u16,
22437}
22438impl_debug_if_no_extra_traits!(CreateCursorRequest, "CreateCursorRequest");
22439impl CreateCursorRequest {
22440    /// Serialize this request into bytes for the provided connection
22441    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
22442        let length_so_far = 0;
22443        let cid_bytes = self.cid.serialize();
22444        let source_bytes = self.source.serialize();
22445        let mask_bytes = self.mask.serialize();
22446        let fore_red_bytes = self.fore_red.serialize();
22447        let fore_green_bytes = self.fore_green.serialize();
22448        let fore_blue_bytes = self.fore_blue.serialize();
22449        let back_red_bytes = self.back_red.serialize();
22450        let back_green_bytes = self.back_green.serialize();
22451        let back_blue_bytes = self.back_blue.serialize();
22452        let x_bytes = self.x.serialize();
22453        let y_bytes = self.y.serialize();
22454        let mut request0 = vec![
22455            CREATE_CURSOR_REQUEST,
22456            0,
22457            0,
22458            0,
22459            cid_bytes[0],
22460            cid_bytes[1],
22461            cid_bytes[2],
22462            cid_bytes[3],
22463            source_bytes[0],
22464            source_bytes[1],
22465            source_bytes[2],
22466            source_bytes[3],
22467            mask_bytes[0],
22468            mask_bytes[1],
22469            mask_bytes[2],
22470            mask_bytes[3],
22471            fore_red_bytes[0],
22472            fore_red_bytes[1],
22473            fore_green_bytes[0],
22474            fore_green_bytes[1],
22475            fore_blue_bytes[0],
22476            fore_blue_bytes[1],
22477            back_red_bytes[0],
22478            back_red_bytes[1],
22479            back_green_bytes[0],
22480            back_green_bytes[1],
22481            back_blue_bytes[0],
22482            back_blue_bytes[1],
22483            x_bytes[0],
22484            x_bytes[1],
22485            y_bytes[0],
22486            y_bytes[1],
22487        ];
22488        let length_so_far = length_so_far + request0.len();
22489        assert_eq!(length_so_far % 4, 0);
22490        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
22491        request0[2..4].copy_from_slice(&length.to_ne_bytes());
22492        ([request0.into()], vec![])
22493    }
22494    /// Parse this request given its header, its body, and any fds that go along with it
22495    #[cfg(feature = "request-parsing")]
22496    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
22497        if header.major_opcode != CREATE_CURSOR_REQUEST {
22498            return Err(ParseError::InvalidValue);
22499        }
22500        let remaining = &[header.minor_opcode];
22501        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
22502        let _ = remaining;
22503        let (cid, remaining) = Cursor::try_parse(value)?;
22504        let (source, remaining) = Pixmap::try_parse(remaining)?;
22505        let (mask, remaining) = Pixmap::try_parse(remaining)?;
22506        let (fore_red, remaining) = u16::try_parse(remaining)?;
22507        let (fore_green, remaining) = u16::try_parse(remaining)?;
22508        let (fore_blue, remaining) = u16::try_parse(remaining)?;
22509        let (back_red, remaining) = u16::try_parse(remaining)?;
22510        let (back_green, remaining) = u16::try_parse(remaining)?;
22511        let (back_blue, remaining) = u16::try_parse(remaining)?;
22512        let (x, remaining) = u16::try_parse(remaining)?;
22513        let (y, remaining) = u16::try_parse(remaining)?;
22514        let _ = remaining;
22515        Ok(CreateCursorRequest {
22516            cid,
22517            source,
22518            mask,
22519            fore_red,
22520            fore_green,
22521            fore_blue,
22522            back_red,
22523            back_green,
22524            back_blue,
22525            x,
22526            y,
22527        })
22528    }
22529}
22530impl Request for CreateCursorRequest {
22531    const EXTENSION_NAME: Option<&'static str> = None;
22532
22533    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
22534        let (bufs, fds) = self.serialize();
22535        // Flatten the buffers into a single vector
22536        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
22537        (buf, fds)
22538    }
22539}
22540impl crate::x11_utils::VoidRequest for CreateCursorRequest {
22541}
22542
22543#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
22544#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22545pub struct FontEnum(u8);
22546impl FontEnum {
22547    pub const NONE: Self = Self(0);
22548}
22549impl From<FontEnum> for u8 {
22550    #[inline]
22551    fn from(input: FontEnum) -> Self {
22552        input.0
22553    }
22554}
22555impl From<FontEnum> for Option<u8> {
22556    #[inline]
22557    fn from(input: FontEnum) -> Self {
22558        Some(input.0)
22559    }
22560}
22561impl From<FontEnum> for u16 {
22562    #[inline]
22563    fn from(input: FontEnum) -> Self {
22564        u16::from(input.0)
22565    }
22566}
22567impl From<FontEnum> for Option<u16> {
22568    #[inline]
22569    fn from(input: FontEnum) -> Self {
22570        Some(u16::from(input.0))
22571    }
22572}
22573impl From<FontEnum> for u32 {
22574    #[inline]
22575    fn from(input: FontEnum) -> Self {
22576        u32::from(input.0)
22577    }
22578}
22579impl From<FontEnum> for Option<u32> {
22580    #[inline]
22581    fn from(input: FontEnum) -> Self {
22582        Some(u32::from(input.0))
22583    }
22584}
22585impl From<u8> for FontEnum {
22586    #[inline]
22587    fn from(value: u8) -> Self {
22588        Self(value)
22589    }
22590}
22591impl core::fmt::Debug for FontEnum  {
22592    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
22593        let variants = [
22594            (Self::NONE.0.into(), "NONE", "None"),
22595        ];
22596        pretty_print_enum(fmt, self.0.into(), &variants)
22597    }
22598}
22599
22600/// Opcode for the CreateGlyphCursor request
22601pub const CREATE_GLYPH_CURSOR_REQUEST: u8 = 94;
22602/// create cursor.
22603///
22604/// Creates a cursor from a font glyph. X provides a set of standard cursor shapes
22605/// in a special font named cursor. Applications are encouraged to use this
22606/// interface for their cursors because the font can be customized for the
22607/// individual display type.
22608///
22609/// All pixels which are set to 1 in the source will use the foreground color (as
22610/// specified by `fore_red`, `fore_green` and `fore_blue`). All pixels set to 0
22611/// will use the background color (as specified by `back_red`, `back_green` and
22612/// `back_blue`).
22613///
22614/// # Fields
22615///
22616/// * `cid` - The ID with which you will refer to the cursor, created by `xcb_generate_id`.
22617/// * `source_font` - In which font to look for the cursor glyph.
22618/// * `mask_font` - In which font to look for the mask glyph.
22619/// * `source_char` - The glyph of `source_font` to use.
22620/// * `mask_char` - The glyph of `mask_font` to use as a mask: Pixels which are set to 1 define
22621/// which source pixels are displayed. All pixels which are set to 0 are not
22622/// displayed.
22623/// * `fore_red` - The red value of the foreground color.
22624/// * `fore_green` - The green value of the foreground color.
22625/// * `fore_blue` - The blue value of the foreground color.
22626/// * `back_red` - The red value of the background color.
22627/// * `back_green` - The green value of the background color.
22628/// * `back_blue` - The blue value of the background color.
22629///
22630/// # Errors
22631///
22632/// * `Alloc` - The X server could not allocate the requested resources (no memory?).
22633/// * `Font` - The specified `source_font` or `mask_font` does not exist.
22634/// * `Value` - Either `source_char` or `mask_char` are not defined in `source_font` or `mask_font`, respectively.
22635#[derive(Clone, Copy, Default)]
22636#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
22637#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22638pub struct CreateGlyphCursorRequest {
22639    pub cid: Cursor,
22640    pub source_font: Font,
22641    pub mask_font: Font,
22642    pub source_char: u16,
22643    pub mask_char: u16,
22644    pub fore_red: u16,
22645    pub fore_green: u16,
22646    pub fore_blue: u16,
22647    pub back_red: u16,
22648    pub back_green: u16,
22649    pub back_blue: u16,
22650}
22651impl_debug_if_no_extra_traits!(CreateGlyphCursorRequest, "CreateGlyphCursorRequest");
22652impl CreateGlyphCursorRequest {
22653    /// Serialize this request into bytes for the provided connection
22654    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
22655        let length_so_far = 0;
22656        let cid_bytes = self.cid.serialize();
22657        let source_font_bytes = self.source_font.serialize();
22658        let mask_font_bytes = self.mask_font.serialize();
22659        let source_char_bytes = self.source_char.serialize();
22660        let mask_char_bytes = self.mask_char.serialize();
22661        let fore_red_bytes = self.fore_red.serialize();
22662        let fore_green_bytes = self.fore_green.serialize();
22663        let fore_blue_bytes = self.fore_blue.serialize();
22664        let back_red_bytes = self.back_red.serialize();
22665        let back_green_bytes = self.back_green.serialize();
22666        let back_blue_bytes = self.back_blue.serialize();
22667        let mut request0 = vec![
22668            CREATE_GLYPH_CURSOR_REQUEST,
22669            0,
22670            0,
22671            0,
22672            cid_bytes[0],
22673            cid_bytes[1],
22674            cid_bytes[2],
22675            cid_bytes[3],
22676            source_font_bytes[0],
22677            source_font_bytes[1],
22678            source_font_bytes[2],
22679            source_font_bytes[3],
22680            mask_font_bytes[0],
22681            mask_font_bytes[1],
22682            mask_font_bytes[2],
22683            mask_font_bytes[3],
22684            source_char_bytes[0],
22685            source_char_bytes[1],
22686            mask_char_bytes[0],
22687            mask_char_bytes[1],
22688            fore_red_bytes[0],
22689            fore_red_bytes[1],
22690            fore_green_bytes[0],
22691            fore_green_bytes[1],
22692            fore_blue_bytes[0],
22693            fore_blue_bytes[1],
22694            back_red_bytes[0],
22695            back_red_bytes[1],
22696            back_green_bytes[0],
22697            back_green_bytes[1],
22698            back_blue_bytes[0],
22699            back_blue_bytes[1],
22700        ];
22701        let length_so_far = length_so_far + request0.len();
22702        assert_eq!(length_so_far % 4, 0);
22703        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
22704        request0[2..4].copy_from_slice(&length.to_ne_bytes());
22705        ([request0.into()], vec![])
22706    }
22707    /// Parse this request given its header, its body, and any fds that go along with it
22708    #[cfg(feature = "request-parsing")]
22709    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
22710        if header.major_opcode != CREATE_GLYPH_CURSOR_REQUEST {
22711            return Err(ParseError::InvalidValue);
22712        }
22713        let remaining = &[header.minor_opcode];
22714        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
22715        let _ = remaining;
22716        let (cid, remaining) = Cursor::try_parse(value)?;
22717        let (source_font, remaining) = Font::try_parse(remaining)?;
22718        let (mask_font, remaining) = Font::try_parse(remaining)?;
22719        let (source_char, remaining) = u16::try_parse(remaining)?;
22720        let (mask_char, remaining) = u16::try_parse(remaining)?;
22721        let (fore_red, remaining) = u16::try_parse(remaining)?;
22722        let (fore_green, remaining) = u16::try_parse(remaining)?;
22723        let (fore_blue, remaining) = u16::try_parse(remaining)?;
22724        let (back_red, remaining) = u16::try_parse(remaining)?;
22725        let (back_green, remaining) = u16::try_parse(remaining)?;
22726        let (back_blue, remaining) = u16::try_parse(remaining)?;
22727        let _ = remaining;
22728        Ok(CreateGlyphCursorRequest {
22729            cid,
22730            source_font,
22731            mask_font,
22732            source_char,
22733            mask_char,
22734            fore_red,
22735            fore_green,
22736            fore_blue,
22737            back_red,
22738            back_green,
22739            back_blue,
22740        })
22741    }
22742}
22743impl Request for CreateGlyphCursorRequest {
22744    const EXTENSION_NAME: Option<&'static str> = None;
22745
22746    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
22747        let (bufs, fds) = self.serialize();
22748        // Flatten the buffers into a single vector
22749        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
22750        (buf, fds)
22751    }
22752}
22753impl crate::x11_utils::VoidRequest for CreateGlyphCursorRequest {
22754}
22755
22756/// Opcode for the FreeCursor request
22757pub const FREE_CURSOR_REQUEST: u8 = 95;
22758/// Deletes a cursor.
22759///
22760/// Deletes the association between the cursor resource ID and the specified
22761/// cursor. The cursor is freed when no other resource references it.
22762///
22763/// # Fields
22764///
22765/// * `cursor` - The cursor to destroy.
22766///
22767/// # Errors
22768///
22769/// * `Cursor` - The specified cursor does not exist.
22770#[derive(Clone, Copy, Default)]
22771#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
22772#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22773pub struct FreeCursorRequest {
22774    pub cursor: Cursor,
22775}
22776impl_debug_if_no_extra_traits!(FreeCursorRequest, "FreeCursorRequest");
22777impl FreeCursorRequest {
22778    /// Serialize this request into bytes for the provided connection
22779    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
22780        let length_so_far = 0;
22781        let cursor_bytes = self.cursor.serialize();
22782        let mut request0 = vec![
22783            FREE_CURSOR_REQUEST,
22784            0,
22785            0,
22786            0,
22787            cursor_bytes[0],
22788            cursor_bytes[1],
22789            cursor_bytes[2],
22790            cursor_bytes[3],
22791        ];
22792        let length_so_far = length_so_far + request0.len();
22793        assert_eq!(length_so_far % 4, 0);
22794        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
22795        request0[2..4].copy_from_slice(&length.to_ne_bytes());
22796        ([request0.into()], vec![])
22797    }
22798    /// Parse this request given its header, its body, and any fds that go along with it
22799    #[cfg(feature = "request-parsing")]
22800    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
22801        if header.major_opcode != FREE_CURSOR_REQUEST {
22802            return Err(ParseError::InvalidValue);
22803        }
22804        let remaining = &[header.minor_opcode];
22805        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
22806        let _ = remaining;
22807        let (cursor, remaining) = Cursor::try_parse(value)?;
22808        let _ = remaining;
22809        Ok(FreeCursorRequest {
22810            cursor,
22811        })
22812    }
22813}
22814impl Request for FreeCursorRequest {
22815    const EXTENSION_NAME: Option<&'static str> = None;
22816
22817    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
22818        let (bufs, fds) = self.serialize();
22819        // Flatten the buffers into a single vector
22820        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
22821        (buf, fds)
22822    }
22823}
22824impl crate::x11_utils::VoidRequest for FreeCursorRequest {
22825}
22826
22827/// Opcode for the RecolorCursor request
22828pub const RECOLOR_CURSOR_REQUEST: u8 = 96;
22829#[derive(Clone, Copy, Default)]
22830#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
22831#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22832pub struct RecolorCursorRequest {
22833    pub cursor: Cursor,
22834    pub fore_red: u16,
22835    pub fore_green: u16,
22836    pub fore_blue: u16,
22837    pub back_red: u16,
22838    pub back_green: u16,
22839    pub back_blue: u16,
22840}
22841impl_debug_if_no_extra_traits!(RecolorCursorRequest, "RecolorCursorRequest");
22842impl RecolorCursorRequest {
22843    /// Serialize this request into bytes for the provided connection
22844    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
22845        let length_so_far = 0;
22846        let cursor_bytes = self.cursor.serialize();
22847        let fore_red_bytes = self.fore_red.serialize();
22848        let fore_green_bytes = self.fore_green.serialize();
22849        let fore_blue_bytes = self.fore_blue.serialize();
22850        let back_red_bytes = self.back_red.serialize();
22851        let back_green_bytes = self.back_green.serialize();
22852        let back_blue_bytes = self.back_blue.serialize();
22853        let mut request0 = vec![
22854            RECOLOR_CURSOR_REQUEST,
22855            0,
22856            0,
22857            0,
22858            cursor_bytes[0],
22859            cursor_bytes[1],
22860            cursor_bytes[2],
22861            cursor_bytes[3],
22862            fore_red_bytes[0],
22863            fore_red_bytes[1],
22864            fore_green_bytes[0],
22865            fore_green_bytes[1],
22866            fore_blue_bytes[0],
22867            fore_blue_bytes[1],
22868            back_red_bytes[0],
22869            back_red_bytes[1],
22870            back_green_bytes[0],
22871            back_green_bytes[1],
22872            back_blue_bytes[0],
22873            back_blue_bytes[1],
22874        ];
22875        let length_so_far = length_so_far + request0.len();
22876        assert_eq!(length_so_far % 4, 0);
22877        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
22878        request0[2..4].copy_from_slice(&length.to_ne_bytes());
22879        ([request0.into()], vec![])
22880    }
22881    /// Parse this request given its header, its body, and any fds that go along with it
22882    #[cfg(feature = "request-parsing")]
22883    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
22884        if header.major_opcode != RECOLOR_CURSOR_REQUEST {
22885            return Err(ParseError::InvalidValue);
22886        }
22887        let remaining = &[header.minor_opcode];
22888        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
22889        let _ = remaining;
22890        let (cursor, remaining) = Cursor::try_parse(value)?;
22891        let (fore_red, remaining) = u16::try_parse(remaining)?;
22892        let (fore_green, remaining) = u16::try_parse(remaining)?;
22893        let (fore_blue, remaining) = u16::try_parse(remaining)?;
22894        let (back_red, remaining) = u16::try_parse(remaining)?;
22895        let (back_green, remaining) = u16::try_parse(remaining)?;
22896        let (back_blue, remaining) = u16::try_parse(remaining)?;
22897        let _ = remaining;
22898        Ok(RecolorCursorRequest {
22899            cursor,
22900            fore_red,
22901            fore_green,
22902            fore_blue,
22903            back_red,
22904            back_green,
22905            back_blue,
22906        })
22907    }
22908}
22909impl Request for RecolorCursorRequest {
22910    const EXTENSION_NAME: Option<&'static str> = None;
22911
22912    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
22913        let (bufs, fds) = self.serialize();
22914        // Flatten the buffers into a single vector
22915        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
22916        (buf, fds)
22917    }
22918}
22919impl crate::x11_utils::VoidRequest for RecolorCursorRequest {
22920}
22921
22922#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
22923#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22924pub struct QueryShapeOf(u8);
22925impl QueryShapeOf {
22926    pub const LARGEST_CURSOR: Self = Self(0);
22927    pub const FASTEST_TILE: Self = Self(1);
22928    pub const FASTEST_STIPPLE: Self = Self(2);
22929}
22930impl From<QueryShapeOf> for u8 {
22931    #[inline]
22932    fn from(input: QueryShapeOf) -> Self {
22933        input.0
22934    }
22935}
22936impl From<QueryShapeOf> for Option<u8> {
22937    #[inline]
22938    fn from(input: QueryShapeOf) -> Self {
22939        Some(input.0)
22940    }
22941}
22942impl From<QueryShapeOf> for u16 {
22943    #[inline]
22944    fn from(input: QueryShapeOf) -> Self {
22945        u16::from(input.0)
22946    }
22947}
22948impl From<QueryShapeOf> for Option<u16> {
22949    #[inline]
22950    fn from(input: QueryShapeOf) -> Self {
22951        Some(u16::from(input.0))
22952    }
22953}
22954impl From<QueryShapeOf> for u32 {
22955    #[inline]
22956    fn from(input: QueryShapeOf) -> Self {
22957        u32::from(input.0)
22958    }
22959}
22960impl From<QueryShapeOf> for Option<u32> {
22961    #[inline]
22962    fn from(input: QueryShapeOf) -> Self {
22963        Some(u32::from(input.0))
22964    }
22965}
22966impl From<u8> for QueryShapeOf {
22967    #[inline]
22968    fn from(value: u8) -> Self {
22969        Self(value)
22970    }
22971}
22972impl core::fmt::Debug for QueryShapeOf  {
22973    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
22974        let variants = [
22975            (Self::LARGEST_CURSOR.0.into(), "LARGEST_CURSOR", "LargestCursor"),
22976            (Self::FASTEST_TILE.0.into(), "FASTEST_TILE", "FastestTile"),
22977            (Self::FASTEST_STIPPLE.0.into(), "FASTEST_STIPPLE", "FastestStipple"),
22978        ];
22979        pretty_print_enum(fmt, self.0.into(), &variants)
22980    }
22981}
22982
22983/// Opcode for the QueryBestSize request
22984pub const QUERY_BEST_SIZE_REQUEST: u8 = 97;
22985#[derive(Clone, Copy, Default)]
22986#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
22987#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22988pub struct QueryBestSizeRequest {
22989    pub class: QueryShapeOf,
22990    pub drawable: Drawable,
22991    pub width: u16,
22992    pub height: u16,
22993}
22994impl_debug_if_no_extra_traits!(QueryBestSizeRequest, "QueryBestSizeRequest");
22995impl QueryBestSizeRequest {
22996    /// Serialize this request into bytes for the provided connection
22997    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
22998        let length_so_far = 0;
22999        let class_bytes = u8::from(self.class).serialize();
23000        let drawable_bytes = self.drawable.serialize();
23001        let width_bytes = self.width.serialize();
23002        let height_bytes = self.height.serialize();
23003        let mut request0 = vec![
23004            QUERY_BEST_SIZE_REQUEST,
23005            class_bytes[0],
23006            0,
23007            0,
23008            drawable_bytes[0],
23009            drawable_bytes[1],
23010            drawable_bytes[2],
23011            drawable_bytes[3],
23012            width_bytes[0],
23013            width_bytes[1],
23014            height_bytes[0],
23015            height_bytes[1],
23016        ];
23017        let length_so_far = length_so_far + request0.len();
23018        assert_eq!(length_so_far % 4, 0);
23019        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
23020        request0[2..4].copy_from_slice(&length.to_ne_bytes());
23021        ([request0.into()], vec![])
23022    }
23023    /// Parse this request given its header, its body, and any fds that go along with it
23024    #[cfg(feature = "request-parsing")]
23025    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
23026        if header.major_opcode != QUERY_BEST_SIZE_REQUEST {
23027            return Err(ParseError::InvalidValue);
23028        }
23029        let remaining = &[header.minor_opcode];
23030        let (class, remaining) = u8::try_parse(remaining)?;
23031        let class = class.into();
23032        let _ = remaining;
23033        let (drawable, remaining) = Drawable::try_parse(value)?;
23034        let (width, remaining) = u16::try_parse(remaining)?;
23035        let (height, remaining) = u16::try_parse(remaining)?;
23036        let _ = remaining;
23037        Ok(QueryBestSizeRequest {
23038            class,
23039            drawable,
23040            width,
23041            height,
23042        })
23043    }
23044}
23045impl Request for QueryBestSizeRequest {
23046    const EXTENSION_NAME: Option<&'static str> = None;
23047
23048    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
23049        let (bufs, fds) = self.serialize();
23050        // Flatten the buffers into a single vector
23051        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
23052        (buf, fds)
23053    }
23054}
23055impl crate::x11_utils::ReplyRequest for QueryBestSizeRequest {
23056    type Reply = QueryBestSizeReply;
23057}
23058
23059#[derive(Clone, Copy, Default)]
23060#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
23061#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23062pub struct QueryBestSizeReply {
23063    pub sequence: u16,
23064    pub length: u32,
23065    pub width: u16,
23066    pub height: u16,
23067}
23068impl_debug_if_no_extra_traits!(QueryBestSizeReply, "QueryBestSizeReply");
23069impl TryParse for QueryBestSizeReply {
23070    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
23071        let remaining = initial_value;
23072        let (response_type, remaining) = u8::try_parse(remaining)?;
23073        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
23074        let (sequence, remaining) = u16::try_parse(remaining)?;
23075        let (length, remaining) = u32::try_parse(remaining)?;
23076        let (width, remaining) = u16::try_parse(remaining)?;
23077        let (height, remaining) = u16::try_parse(remaining)?;
23078        if response_type != 1 {
23079            return Err(ParseError::InvalidValue);
23080        }
23081        let result = QueryBestSizeReply { sequence, length, width, height };
23082        let _ = remaining;
23083        let remaining = initial_value.get(32 + length as usize * 4..)
23084            .ok_or(ParseError::InsufficientData)?;
23085        Ok((result, remaining))
23086    }
23087}
23088impl Serialize for QueryBestSizeReply {
23089    type Bytes = [u8; 12];
23090    fn serialize(&self) -> [u8; 12] {
23091        let response_type_bytes = &[1];
23092        let sequence_bytes = self.sequence.serialize();
23093        let length_bytes = self.length.serialize();
23094        let width_bytes = self.width.serialize();
23095        let height_bytes = self.height.serialize();
23096        [
23097            response_type_bytes[0],
23098            0,
23099            sequence_bytes[0],
23100            sequence_bytes[1],
23101            length_bytes[0],
23102            length_bytes[1],
23103            length_bytes[2],
23104            length_bytes[3],
23105            width_bytes[0],
23106            width_bytes[1],
23107            height_bytes[0],
23108            height_bytes[1],
23109        ]
23110    }
23111    fn serialize_into(&self, bytes: &mut Vec<u8>) {
23112        bytes.reserve(12);
23113        let response_type_bytes = &[1];
23114        bytes.push(response_type_bytes[0]);
23115        bytes.extend_from_slice(&[0; 1]);
23116        self.sequence.serialize_into(bytes);
23117        self.length.serialize_into(bytes);
23118        self.width.serialize_into(bytes);
23119        self.height.serialize_into(bytes);
23120    }
23121}
23122
23123/// Opcode for the QueryExtension request
23124pub const QUERY_EXTENSION_REQUEST: u8 = 98;
23125/// check if extension is present.
23126///
23127/// Determines if the specified extension is present on this X11 server.
23128///
23129/// Every extension has a unique `major_opcode` to identify requests, the minor
23130/// opcodes and request formats are extension-specific. If the extension provides
23131/// events and errors, the `first_event` and `first_error` fields in the reply are
23132/// set accordingly.
23133///
23134/// There should rarely be a need to use this request directly, XCB provides the
23135/// `xcb_get_extension_data` function instead.
23136///
23137/// # Fields
23138///
23139/// * `name` - The name of the extension to query, for example "RANDR". This is case
23140/// sensitive!
23141///
23142/// # See
23143///
23144/// * `xdpyinfo`: program
23145/// * `xcb_get_extension_data`: function
23146#[derive(Clone, Default)]
23147#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
23148#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23149pub struct QueryExtensionRequest<'input> {
23150    pub name: Cow<'input, [u8]>,
23151}
23152impl_debug_if_no_extra_traits!(QueryExtensionRequest<'_>, "QueryExtensionRequest");
23153impl<'input> QueryExtensionRequest<'input> {
23154    /// Serialize this request into bytes for the provided connection
23155    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
23156        let length_so_far = 0;
23157        let name_len = u16::try_from(self.name.len()).expect("`name` has too many elements");
23158        let name_len_bytes = name_len.serialize();
23159        let mut request0 = vec![
23160            QUERY_EXTENSION_REQUEST,
23161            0,
23162            0,
23163            0,
23164            name_len_bytes[0],
23165            name_len_bytes[1],
23166            0,
23167            0,
23168        ];
23169        let length_so_far = length_so_far + request0.len();
23170        let length_so_far = length_so_far + self.name.len();
23171        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
23172        let length_so_far = length_so_far + padding0.len();
23173        assert_eq!(length_so_far % 4, 0);
23174        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
23175        request0[2..4].copy_from_slice(&length.to_ne_bytes());
23176        ([request0.into(), self.name, padding0.into()], vec![])
23177    }
23178    /// Parse this request given its header, its body, and any fds that go along with it
23179    #[cfg(feature = "request-parsing")]
23180    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
23181        if header.major_opcode != QUERY_EXTENSION_REQUEST {
23182            return Err(ParseError::InvalidValue);
23183        }
23184        let remaining = &[header.minor_opcode];
23185        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
23186        let _ = remaining;
23187        let (name_len, remaining) = u16::try_parse(value)?;
23188        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
23189        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_len.try_to_usize()?)?;
23190        let _ = remaining;
23191        Ok(QueryExtensionRequest {
23192            name: Cow::Borrowed(name),
23193        })
23194    }
23195    /// Clone all borrowed data in this QueryExtensionRequest.
23196    pub fn into_owned(self) -> QueryExtensionRequest<'static> {
23197        QueryExtensionRequest {
23198            name: Cow::Owned(self.name.into_owned()),
23199        }
23200    }
23201}
23202impl<'input> Request for QueryExtensionRequest<'input> {
23203    const EXTENSION_NAME: Option<&'static str> = None;
23204
23205    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
23206        let (bufs, fds) = self.serialize();
23207        // Flatten the buffers into a single vector
23208        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
23209        (buf, fds)
23210    }
23211}
23212impl<'input> crate::x11_utils::ReplyRequest for QueryExtensionRequest<'input> {
23213    type Reply = QueryExtensionReply;
23214}
23215
23216/// # Fields
23217///
23218/// * `present` - Whether the extension is present on this X11 server.
23219/// * `major_opcode` - The major opcode for requests.
23220/// * `first_event` - The first event code, if any.
23221/// * `first_error` - The first error code, if any.
23222#[derive(Clone, Copy, Default)]
23223#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
23224#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23225pub struct QueryExtensionReply {
23226    pub sequence: u16,
23227    pub length: u32,
23228    pub present: bool,
23229    pub major_opcode: u8,
23230    pub first_event: u8,
23231    pub first_error: u8,
23232}
23233impl_debug_if_no_extra_traits!(QueryExtensionReply, "QueryExtensionReply");
23234impl TryParse for QueryExtensionReply {
23235    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
23236        let remaining = initial_value;
23237        let (response_type, remaining) = u8::try_parse(remaining)?;
23238        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
23239        let (sequence, remaining) = u16::try_parse(remaining)?;
23240        let (length, remaining) = u32::try_parse(remaining)?;
23241        let (present, remaining) = bool::try_parse(remaining)?;
23242        let (major_opcode, remaining) = u8::try_parse(remaining)?;
23243        let (first_event, remaining) = u8::try_parse(remaining)?;
23244        let (first_error, remaining) = u8::try_parse(remaining)?;
23245        if response_type != 1 {
23246            return Err(ParseError::InvalidValue);
23247        }
23248        let result = QueryExtensionReply { sequence, length, present, major_opcode, first_event, first_error };
23249        let _ = remaining;
23250        let remaining = initial_value.get(32 + length as usize * 4..)
23251            .ok_or(ParseError::InsufficientData)?;
23252        Ok((result, remaining))
23253    }
23254}
23255impl Serialize for QueryExtensionReply {
23256    type Bytes = [u8; 12];
23257    fn serialize(&self) -> [u8; 12] {
23258        let response_type_bytes = &[1];
23259        let sequence_bytes = self.sequence.serialize();
23260        let length_bytes = self.length.serialize();
23261        let present_bytes = self.present.serialize();
23262        let major_opcode_bytes = self.major_opcode.serialize();
23263        let first_event_bytes = self.first_event.serialize();
23264        let first_error_bytes = self.first_error.serialize();
23265        [
23266            response_type_bytes[0],
23267            0,
23268            sequence_bytes[0],
23269            sequence_bytes[1],
23270            length_bytes[0],
23271            length_bytes[1],
23272            length_bytes[2],
23273            length_bytes[3],
23274            present_bytes[0],
23275            major_opcode_bytes[0],
23276            first_event_bytes[0],
23277            first_error_bytes[0],
23278        ]
23279    }
23280    fn serialize_into(&self, bytes: &mut Vec<u8>) {
23281        bytes.reserve(12);
23282        let response_type_bytes = &[1];
23283        bytes.push(response_type_bytes[0]);
23284        bytes.extend_from_slice(&[0; 1]);
23285        self.sequence.serialize_into(bytes);
23286        self.length.serialize_into(bytes);
23287        self.present.serialize_into(bytes);
23288        self.major_opcode.serialize_into(bytes);
23289        self.first_event.serialize_into(bytes);
23290        self.first_error.serialize_into(bytes);
23291    }
23292}
23293
23294/// Opcode for the ListExtensions request
23295pub const LIST_EXTENSIONS_REQUEST: u8 = 99;
23296#[derive(Clone, Copy, Default)]
23297#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
23298#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23299pub struct ListExtensionsRequest;
23300impl_debug_if_no_extra_traits!(ListExtensionsRequest, "ListExtensionsRequest");
23301impl ListExtensionsRequest {
23302    /// Serialize this request into bytes for the provided connection
23303    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
23304        let length_so_far = 0;
23305        let mut request0 = vec![
23306            LIST_EXTENSIONS_REQUEST,
23307            0,
23308            0,
23309            0,
23310        ];
23311        let length_so_far = length_so_far + request0.len();
23312        assert_eq!(length_so_far % 4, 0);
23313        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
23314        request0[2..4].copy_from_slice(&length.to_ne_bytes());
23315        ([request0.into()], vec![])
23316    }
23317    /// Parse this request given its header, its body, and any fds that go along with it
23318    #[cfg(feature = "request-parsing")]
23319    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
23320        if header.major_opcode != LIST_EXTENSIONS_REQUEST {
23321            return Err(ParseError::InvalidValue);
23322        }
23323        let remaining = &[header.minor_opcode];
23324        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
23325        let _ = remaining;
23326        let _ = value;
23327        Ok(ListExtensionsRequest
23328        )
23329    }
23330}
23331impl Request for ListExtensionsRequest {
23332    const EXTENSION_NAME: Option<&'static str> = None;
23333
23334    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
23335        let (bufs, fds) = self.serialize();
23336        // Flatten the buffers into a single vector
23337        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
23338        (buf, fds)
23339    }
23340}
23341impl crate::x11_utils::ReplyRequest for ListExtensionsRequest {
23342    type Reply = ListExtensionsReply;
23343}
23344
23345#[derive(Clone, Default)]
23346#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
23347#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23348pub struct ListExtensionsReply {
23349    pub sequence: u16,
23350    pub length: u32,
23351    pub names: Vec<Str>,
23352}
23353impl_debug_if_no_extra_traits!(ListExtensionsReply, "ListExtensionsReply");
23354impl TryParse for ListExtensionsReply {
23355    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
23356        let remaining = initial_value;
23357        let (response_type, remaining) = u8::try_parse(remaining)?;
23358        let (names_len, remaining) = u8::try_parse(remaining)?;
23359        let (sequence, remaining) = u16::try_parse(remaining)?;
23360        let (length, remaining) = u32::try_parse(remaining)?;
23361        let remaining = remaining.get(24..).ok_or(ParseError::InsufficientData)?;
23362        let (names, remaining) = crate::x11_utils::parse_list::<Str>(remaining, names_len.try_to_usize()?)?;
23363        if response_type != 1 {
23364            return Err(ParseError::InvalidValue);
23365        }
23366        let result = ListExtensionsReply { sequence, length, names };
23367        let _ = remaining;
23368        let remaining = initial_value.get(32 + length as usize * 4..)
23369            .ok_or(ParseError::InsufficientData)?;
23370        Ok((result, remaining))
23371    }
23372}
23373impl Serialize for ListExtensionsReply {
23374    type Bytes = Vec<u8>;
23375    fn serialize(&self) -> Vec<u8> {
23376        let mut result = Vec::new();
23377        self.serialize_into(&mut result);
23378        result
23379    }
23380    fn serialize_into(&self, bytes: &mut Vec<u8>) {
23381        bytes.reserve(32);
23382        let response_type_bytes = &[1];
23383        bytes.push(response_type_bytes[0]);
23384        let names_len = u8::try_from(self.names.len()).expect("`names` has too many elements");
23385        names_len.serialize_into(bytes);
23386        self.sequence.serialize_into(bytes);
23387        self.length.serialize_into(bytes);
23388        bytes.extend_from_slice(&[0; 24]);
23389        self.names.serialize_into(bytes);
23390    }
23391}
23392impl ListExtensionsReply {
23393    /// Get the value of the `names_len` field.
23394    ///
23395    /// The `names_len` field is used as the length field of the `names` field.
23396    /// This function computes the field's value again based on the length of the list.
23397    ///
23398    /// # Panics
23399    ///
23400    /// Panics if the value cannot be represented in the target type. This
23401    /// cannot happen with values of the struct received from the X11 server.
23402    pub fn names_len(&self) -> u8 {
23403        self.names.len()
23404            .try_into().unwrap()
23405    }
23406}
23407
23408/// Opcode for the ChangeKeyboardMapping request
23409pub const CHANGE_KEYBOARD_MAPPING_REQUEST: u8 = 100;
23410#[derive(Clone, Default)]
23411#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
23412#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23413pub struct ChangeKeyboardMappingRequest<'input> {
23414    pub keycode_count: u8,
23415    pub first_keycode: Keycode,
23416    pub keysyms_per_keycode: u8,
23417    pub keysyms: Cow<'input, [Keysym]>,
23418}
23419impl_debug_if_no_extra_traits!(ChangeKeyboardMappingRequest<'_>, "ChangeKeyboardMappingRequest");
23420impl<'input> ChangeKeyboardMappingRequest<'input> {
23421    /// Serialize this request into bytes for the provided connection
23422    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
23423        let length_so_far = 0;
23424        let keycode_count_bytes = self.keycode_count.serialize();
23425        let first_keycode_bytes = self.first_keycode.serialize();
23426        let keysyms_per_keycode_bytes = self.keysyms_per_keycode.serialize();
23427        let mut request0 = vec![
23428            CHANGE_KEYBOARD_MAPPING_REQUEST,
23429            keycode_count_bytes[0],
23430            0,
23431            0,
23432            first_keycode_bytes[0],
23433            keysyms_per_keycode_bytes[0],
23434            0,
23435            0,
23436        ];
23437        let length_so_far = length_so_far + request0.len();
23438        assert_eq!(self.keysyms.len(), usize::try_from(u32::from(self.keycode_count).checked_mul(u32::from(self.keysyms_per_keycode)).unwrap()).unwrap(), "`keysyms` has an incorrect length");
23439        let keysyms_bytes = self.keysyms.serialize();
23440        let length_so_far = length_so_far + keysyms_bytes.len();
23441        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
23442        let length_so_far = length_so_far + padding0.len();
23443        assert_eq!(length_so_far % 4, 0);
23444        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
23445        request0[2..4].copy_from_slice(&length.to_ne_bytes());
23446        ([request0.into(), keysyms_bytes.into(), padding0.into()], vec![])
23447    }
23448    /// Parse this request given its header, its body, and any fds that go along with it
23449    #[cfg(feature = "request-parsing")]
23450    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
23451        if header.major_opcode != CHANGE_KEYBOARD_MAPPING_REQUEST {
23452            return Err(ParseError::InvalidValue);
23453        }
23454        let remaining = &[header.minor_opcode];
23455        let (keycode_count, remaining) = u8::try_parse(remaining)?;
23456        let _ = remaining;
23457        let (first_keycode, remaining) = Keycode::try_parse(value)?;
23458        let (keysyms_per_keycode, remaining) = u8::try_parse(remaining)?;
23459        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
23460        let (keysyms, remaining) = crate::x11_utils::parse_list::<Keysym>(remaining, u32::from(keycode_count).checked_mul(u32::from(keysyms_per_keycode)).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
23461        let _ = remaining;
23462        Ok(ChangeKeyboardMappingRequest {
23463            keycode_count,
23464            first_keycode,
23465            keysyms_per_keycode,
23466            keysyms: Cow::Owned(keysyms),
23467        })
23468    }
23469    /// Clone all borrowed data in this ChangeKeyboardMappingRequest.
23470    pub fn into_owned(self) -> ChangeKeyboardMappingRequest<'static> {
23471        ChangeKeyboardMappingRequest {
23472            keycode_count: self.keycode_count,
23473            first_keycode: self.first_keycode,
23474            keysyms_per_keycode: self.keysyms_per_keycode,
23475            keysyms: Cow::Owned(self.keysyms.into_owned()),
23476        }
23477    }
23478}
23479impl<'input> Request for ChangeKeyboardMappingRequest<'input> {
23480    const EXTENSION_NAME: Option<&'static str> = None;
23481
23482    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
23483        let (bufs, fds) = self.serialize();
23484        // Flatten the buffers into a single vector
23485        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
23486        (buf, fds)
23487    }
23488}
23489impl<'input> crate::x11_utils::VoidRequest for ChangeKeyboardMappingRequest<'input> {
23490}
23491
23492/// Opcode for the GetKeyboardMapping request
23493pub const GET_KEYBOARD_MAPPING_REQUEST: u8 = 101;
23494#[derive(Clone, Copy, Default)]
23495#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
23496#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23497pub struct GetKeyboardMappingRequest {
23498    pub first_keycode: Keycode,
23499    pub count: u8,
23500}
23501impl_debug_if_no_extra_traits!(GetKeyboardMappingRequest, "GetKeyboardMappingRequest");
23502impl GetKeyboardMappingRequest {
23503    /// Serialize this request into bytes for the provided connection
23504    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
23505        let length_so_far = 0;
23506        let first_keycode_bytes = self.first_keycode.serialize();
23507        let count_bytes = self.count.serialize();
23508        let mut request0 = vec![
23509            GET_KEYBOARD_MAPPING_REQUEST,
23510            0,
23511            0,
23512            0,
23513            first_keycode_bytes[0],
23514            count_bytes[0],
23515            0,
23516            0,
23517        ];
23518        let length_so_far = length_so_far + request0.len();
23519        assert_eq!(length_so_far % 4, 0);
23520        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
23521        request0[2..4].copy_from_slice(&length.to_ne_bytes());
23522        ([request0.into()], vec![])
23523    }
23524    /// Parse this request given its header, its body, and any fds that go along with it
23525    #[cfg(feature = "request-parsing")]
23526    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
23527        if header.major_opcode != GET_KEYBOARD_MAPPING_REQUEST {
23528            return Err(ParseError::InvalidValue);
23529        }
23530        let remaining = &[header.minor_opcode];
23531        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
23532        let _ = remaining;
23533        let (first_keycode, remaining) = Keycode::try_parse(value)?;
23534        let (count, remaining) = u8::try_parse(remaining)?;
23535        let _ = remaining;
23536        Ok(GetKeyboardMappingRequest {
23537            first_keycode,
23538            count,
23539        })
23540    }
23541}
23542impl Request for GetKeyboardMappingRequest {
23543    const EXTENSION_NAME: Option<&'static str> = None;
23544
23545    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
23546        let (bufs, fds) = self.serialize();
23547        // Flatten the buffers into a single vector
23548        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
23549        (buf, fds)
23550    }
23551}
23552impl crate::x11_utils::ReplyRequest for GetKeyboardMappingRequest {
23553    type Reply = GetKeyboardMappingReply;
23554}
23555
23556#[derive(Clone, Default)]
23557#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
23558#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23559pub struct GetKeyboardMappingReply {
23560    pub keysyms_per_keycode: u8,
23561    pub sequence: u16,
23562    pub keysyms: Vec<Keysym>,
23563}
23564impl_debug_if_no_extra_traits!(GetKeyboardMappingReply, "GetKeyboardMappingReply");
23565impl TryParse for GetKeyboardMappingReply {
23566    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
23567        let remaining = initial_value;
23568        let (response_type, remaining) = u8::try_parse(remaining)?;
23569        let (keysyms_per_keycode, remaining) = u8::try_parse(remaining)?;
23570        let (sequence, remaining) = u16::try_parse(remaining)?;
23571        let (length, remaining) = u32::try_parse(remaining)?;
23572        let remaining = remaining.get(24..).ok_or(ParseError::InsufficientData)?;
23573        let (keysyms, remaining) = crate::x11_utils::parse_list::<Keysym>(remaining, length.try_to_usize()?)?;
23574        if response_type != 1 {
23575            return Err(ParseError::InvalidValue);
23576        }
23577        let result = GetKeyboardMappingReply { keysyms_per_keycode, sequence, keysyms };
23578        let _ = remaining;
23579        let remaining = initial_value.get(32 + length as usize * 4..)
23580            .ok_or(ParseError::InsufficientData)?;
23581        Ok((result, remaining))
23582    }
23583}
23584impl Serialize for GetKeyboardMappingReply {
23585    type Bytes = Vec<u8>;
23586    fn serialize(&self) -> Vec<u8> {
23587        let mut result = Vec::new();
23588        self.serialize_into(&mut result);
23589        result
23590    }
23591    fn serialize_into(&self, bytes: &mut Vec<u8>) {
23592        bytes.reserve(32);
23593        let response_type_bytes = &[1];
23594        bytes.push(response_type_bytes[0]);
23595        self.keysyms_per_keycode.serialize_into(bytes);
23596        self.sequence.serialize_into(bytes);
23597        let length = u32::try_from(self.keysyms.len()).expect("`keysyms` has too many elements");
23598        length.serialize_into(bytes);
23599        bytes.extend_from_slice(&[0; 24]);
23600        self.keysyms.serialize_into(bytes);
23601    }
23602}
23603impl GetKeyboardMappingReply {
23604    /// Get the value of the `length` field.
23605    ///
23606    /// The `length` field is used as the length field of the `keysyms` field.
23607    /// This function computes the field's value again based on the length of the list.
23608    ///
23609    /// # Panics
23610    ///
23611    /// Panics if the value cannot be represented in the target type. This
23612    /// cannot happen with values of the struct received from the X11 server.
23613    pub fn length(&self) -> u32 {
23614        self.keysyms.len()
23615            .try_into().unwrap()
23616    }
23617}
23618
23619#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
23620#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23621pub struct KB(u32);
23622impl KB {
23623    pub const KEY_CLICK_PERCENT: Self = Self(1 << 0);
23624    pub const BELL_PERCENT: Self = Self(1 << 1);
23625    pub const BELL_PITCH: Self = Self(1 << 2);
23626    pub const BELL_DURATION: Self = Self(1 << 3);
23627    pub const LED: Self = Self(1 << 4);
23628    pub const LED_MODE: Self = Self(1 << 5);
23629    pub const KEY: Self = Self(1 << 6);
23630    pub const AUTO_REPEAT_MODE: Self = Self(1 << 7);
23631}
23632impl From<KB> for u32 {
23633    #[inline]
23634    fn from(input: KB) -> Self {
23635        input.0
23636    }
23637}
23638impl From<KB> for Option<u32> {
23639    #[inline]
23640    fn from(input: KB) -> Self {
23641        Some(input.0)
23642    }
23643}
23644impl From<u8> for KB {
23645    #[inline]
23646    fn from(value: u8) -> Self {
23647        Self(value.into())
23648    }
23649}
23650impl From<u16> for KB {
23651    #[inline]
23652    fn from(value: u16) -> Self {
23653        Self(value.into())
23654    }
23655}
23656impl From<u32> for KB {
23657    #[inline]
23658    fn from(value: u32) -> Self {
23659        Self(value)
23660    }
23661}
23662impl core::fmt::Debug for KB  {
23663    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
23664        let variants = [
23665            (Self::KEY_CLICK_PERCENT.0, "KEY_CLICK_PERCENT", "KeyClickPercent"),
23666            (Self::BELL_PERCENT.0, "BELL_PERCENT", "BellPercent"),
23667            (Self::BELL_PITCH.0, "BELL_PITCH", "BellPitch"),
23668            (Self::BELL_DURATION.0, "BELL_DURATION", "BellDuration"),
23669            (Self::LED.0, "LED", "Led"),
23670            (Self::LED_MODE.0, "LED_MODE", "LedMode"),
23671            (Self::KEY.0, "KEY", "Key"),
23672            (Self::AUTO_REPEAT_MODE.0, "AUTO_REPEAT_MODE", "AutoRepeatMode"),
23673        ];
23674        pretty_print_bitmask(fmt, self.0, &variants)
23675    }
23676}
23677bitmask_binop!(KB, u32);
23678
23679#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
23680#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23681pub struct LedMode(u32);
23682impl LedMode {
23683    pub const OFF: Self = Self(0);
23684    pub const ON: Self = Self(1);
23685}
23686impl From<LedMode> for u32 {
23687    #[inline]
23688    fn from(input: LedMode) -> Self {
23689        input.0
23690    }
23691}
23692impl From<LedMode> for Option<u32> {
23693    #[inline]
23694    fn from(input: LedMode) -> Self {
23695        Some(input.0)
23696    }
23697}
23698impl From<u8> for LedMode {
23699    #[inline]
23700    fn from(value: u8) -> Self {
23701        Self(value.into())
23702    }
23703}
23704impl From<u16> for LedMode {
23705    #[inline]
23706    fn from(value: u16) -> Self {
23707        Self(value.into())
23708    }
23709}
23710impl From<u32> for LedMode {
23711    #[inline]
23712    fn from(value: u32) -> Self {
23713        Self(value)
23714    }
23715}
23716impl core::fmt::Debug for LedMode  {
23717    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
23718        let variants = [
23719            (Self::OFF.0, "OFF", "Off"),
23720            (Self::ON.0, "ON", "On"),
23721        ];
23722        pretty_print_enum(fmt, self.0, &variants)
23723    }
23724}
23725
23726#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
23727#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23728pub struct AutoRepeatMode(u32);
23729impl AutoRepeatMode {
23730    pub const OFF: Self = Self(0);
23731    pub const ON: Self = Self(1);
23732    pub const DEFAULT: Self = Self(2);
23733}
23734impl From<AutoRepeatMode> for u32 {
23735    #[inline]
23736    fn from(input: AutoRepeatMode) -> Self {
23737        input.0
23738    }
23739}
23740impl From<AutoRepeatMode> for Option<u32> {
23741    #[inline]
23742    fn from(input: AutoRepeatMode) -> Self {
23743        Some(input.0)
23744    }
23745}
23746impl From<u8> for AutoRepeatMode {
23747    #[inline]
23748    fn from(value: u8) -> Self {
23749        Self(value.into())
23750    }
23751}
23752impl From<u16> for AutoRepeatMode {
23753    #[inline]
23754    fn from(value: u16) -> Self {
23755        Self(value.into())
23756    }
23757}
23758impl From<u32> for AutoRepeatMode {
23759    #[inline]
23760    fn from(value: u32) -> Self {
23761        Self(value)
23762    }
23763}
23764impl core::fmt::Debug for AutoRepeatMode  {
23765    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
23766        let variants = [
23767            (Self::OFF.0, "OFF", "Off"),
23768            (Self::ON.0, "ON", "On"),
23769            (Self::DEFAULT.0, "DEFAULT", "Default"),
23770        ];
23771        pretty_print_enum(fmt, self.0, &variants)
23772    }
23773}
23774
23775/// Auxiliary and optional information for the `change_keyboard_control` function
23776#[derive(Clone, Copy, Default)]
23777#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
23778#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23779pub struct ChangeKeyboardControlAux {
23780    pub key_click_percent: Option<i32>,
23781    pub bell_percent: Option<i32>,
23782    pub bell_pitch: Option<i32>,
23783    pub bell_duration: Option<i32>,
23784    pub led: Option<u32>,
23785    pub led_mode: Option<LedMode>,
23786    pub key: Option<Keycode32>,
23787    pub auto_repeat_mode: Option<AutoRepeatMode>,
23788}
23789impl_debug_if_no_extra_traits!(ChangeKeyboardControlAux, "ChangeKeyboardControlAux");
23790impl ChangeKeyboardControlAux {
23791    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
23792    fn try_parse(value: &[u8], value_mask: u32) -> Result<(Self, &[u8]), ParseError> {
23793        let switch_expr = u32::from(value_mask);
23794        let mut outer_remaining = value;
23795        let key_click_percent = if switch_expr & u32::from(KB::KEY_CLICK_PERCENT) != 0 {
23796            let remaining = outer_remaining;
23797            let (key_click_percent, remaining) = i32::try_parse(remaining)?;
23798            outer_remaining = remaining;
23799            Some(key_click_percent)
23800        } else {
23801            None
23802        };
23803        let bell_percent = if switch_expr & u32::from(KB::BELL_PERCENT) != 0 {
23804            let remaining = outer_remaining;
23805            let (bell_percent, remaining) = i32::try_parse(remaining)?;
23806            outer_remaining = remaining;
23807            Some(bell_percent)
23808        } else {
23809            None
23810        };
23811        let bell_pitch = if switch_expr & u32::from(KB::BELL_PITCH) != 0 {
23812            let remaining = outer_remaining;
23813            let (bell_pitch, remaining) = i32::try_parse(remaining)?;
23814            outer_remaining = remaining;
23815            Some(bell_pitch)
23816        } else {
23817            None
23818        };
23819        let bell_duration = if switch_expr & u32::from(KB::BELL_DURATION) != 0 {
23820            let remaining = outer_remaining;
23821            let (bell_duration, remaining) = i32::try_parse(remaining)?;
23822            outer_remaining = remaining;
23823            Some(bell_duration)
23824        } else {
23825            None
23826        };
23827        let led = if switch_expr & u32::from(KB::LED) != 0 {
23828            let remaining = outer_remaining;
23829            let (led, remaining) = u32::try_parse(remaining)?;
23830            outer_remaining = remaining;
23831            Some(led)
23832        } else {
23833            None
23834        };
23835        let led_mode = if switch_expr & u32::from(KB::LED_MODE) != 0 {
23836            let remaining = outer_remaining;
23837            let (led_mode, remaining) = u32::try_parse(remaining)?;
23838            let led_mode = led_mode.into();
23839            outer_remaining = remaining;
23840            Some(led_mode)
23841        } else {
23842            None
23843        };
23844        let key = if switch_expr & u32::from(KB::KEY) != 0 {
23845            let remaining = outer_remaining;
23846            let (key, remaining) = Keycode32::try_parse(remaining)?;
23847            outer_remaining = remaining;
23848            Some(key)
23849        } else {
23850            None
23851        };
23852        let auto_repeat_mode = if switch_expr & u32::from(KB::AUTO_REPEAT_MODE) != 0 {
23853            let remaining = outer_remaining;
23854            let (auto_repeat_mode, remaining) = u32::try_parse(remaining)?;
23855            let auto_repeat_mode = auto_repeat_mode.into();
23856            outer_remaining = remaining;
23857            Some(auto_repeat_mode)
23858        } else {
23859            None
23860        };
23861        let result = ChangeKeyboardControlAux { key_click_percent, bell_percent, bell_pitch, bell_duration, led, led_mode, key, auto_repeat_mode };
23862        Ok((result, outer_remaining))
23863    }
23864}
23865impl ChangeKeyboardControlAux {
23866    #[allow(dead_code)]
23867    fn serialize(&self, value_mask: u32) -> Vec<u8> {
23868        let mut result = Vec::new();
23869        self.serialize_into(&mut result, u32::from(value_mask));
23870        result
23871    }
23872    fn serialize_into(&self, bytes: &mut Vec<u8>, value_mask: u32) {
23873        assert_eq!(self.switch_expr(), u32::from(value_mask), "switch `value_list` has an inconsistent discriminant");
23874        if let Some(key_click_percent) = self.key_click_percent {
23875            key_click_percent.serialize_into(bytes);
23876        }
23877        if let Some(bell_percent) = self.bell_percent {
23878            bell_percent.serialize_into(bytes);
23879        }
23880        if let Some(bell_pitch) = self.bell_pitch {
23881            bell_pitch.serialize_into(bytes);
23882        }
23883        if let Some(bell_duration) = self.bell_duration {
23884            bell_duration.serialize_into(bytes);
23885        }
23886        if let Some(led) = self.led {
23887            led.serialize_into(bytes);
23888        }
23889        if let Some(led_mode) = self.led_mode {
23890            u32::from(led_mode).serialize_into(bytes);
23891        }
23892        if let Some(key) = self.key {
23893            key.serialize_into(bytes);
23894        }
23895        if let Some(auto_repeat_mode) = self.auto_repeat_mode {
23896            u32::from(auto_repeat_mode).serialize_into(bytes);
23897        }
23898    }
23899}
23900impl ChangeKeyboardControlAux {
23901    fn switch_expr(&self) -> u32 {
23902        let mut expr_value = 0;
23903        if self.key_click_percent.is_some() {
23904            expr_value |= u32::from(KB::KEY_CLICK_PERCENT);
23905        }
23906        if self.bell_percent.is_some() {
23907            expr_value |= u32::from(KB::BELL_PERCENT);
23908        }
23909        if self.bell_pitch.is_some() {
23910            expr_value |= u32::from(KB::BELL_PITCH);
23911        }
23912        if self.bell_duration.is_some() {
23913            expr_value |= u32::from(KB::BELL_DURATION);
23914        }
23915        if self.led.is_some() {
23916            expr_value |= u32::from(KB::LED);
23917        }
23918        if self.led_mode.is_some() {
23919            expr_value |= u32::from(KB::LED_MODE);
23920        }
23921        if self.key.is_some() {
23922            expr_value |= u32::from(KB::KEY);
23923        }
23924        if self.auto_repeat_mode.is_some() {
23925            expr_value |= u32::from(KB::AUTO_REPEAT_MODE);
23926        }
23927        expr_value
23928    }
23929}
23930impl ChangeKeyboardControlAux {
23931    /// Create a new instance with all fields unset / not present.
23932    pub fn new() -> Self {
23933        Default::default()
23934    }
23935    /// Set the `key_click_percent` field of this structure.
23936    #[must_use]
23937    pub fn key_click_percent<I>(mut self, value: I) -> Self where I: Into<Option<i32>> {
23938        self.key_click_percent = value.into();
23939        self
23940    }
23941    /// Set the `bell_percent` field of this structure.
23942    #[must_use]
23943    pub fn bell_percent<I>(mut self, value: I) -> Self where I: Into<Option<i32>> {
23944        self.bell_percent = value.into();
23945        self
23946    }
23947    /// Set the `bell_pitch` field of this structure.
23948    #[must_use]
23949    pub fn bell_pitch<I>(mut self, value: I) -> Self where I: Into<Option<i32>> {
23950        self.bell_pitch = value.into();
23951        self
23952    }
23953    /// Set the `bell_duration` field of this structure.
23954    #[must_use]
23955    pub fn bell_duration<I>(mut self, value: I) -> Self where I: Into<Option<i32>> {
23956        self.bell_duration = value.into();
23957        self
23958    }
23959    /// Set the `led` field of this structure.
23960    #[must_use]
23961    pub fn led<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
23962        self.led = value.into();
23963        self
23964    }
23965    /// Set the `led_mode` field of this structure.
23966    #[must_use]
23967    pub fn led_mode<I>(mut self, value: I) -> Self where I: Into<Option<LedMode>> {
23968        self.led_mode = value.into();
23969        self
23970    }
23971    /// Set the `key` field of this structure.
23972    #[must_use]
23973    pub fn key<I>(mut self, value: I) -> Self where I: Into<Option<Keycode32>> {
23974        self.key = value.into();
23975        self
23976    }
23977    /// Set the `auto_repeat_mode` field of this structure.
23978    #[must_use]
23979    pub fn auto_repeat_mode<I>(mut self, value: I) -> Self where I: Into<Option<AutoRepeatMode>> {
23980        self.auto_repeat_mode = value.into();
23981        self
23982    }
23983}
23984
23985/// Opcode for the ChangeKeyboardControl request
23986pub const CHANGE_KEYBOARD_CONTROL_REQUEST: u8 = 102;
23987#[derive(Clone, Default)]
23988#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
23989#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23990pub struct ChangeKeyboardControlRequest<'input> {
23991    pub value_list: Cow<'input, ChangeKeyboardControlAux>,
23992}
23993impl_debug_if_no_extra_traits!(ChangeKeyboardControlRequest<'_>, "ChangeKeyboardControlRequest");
23994impl<'input> ChangeKeyboardControlRequest<'input> {
23995    /// Serialize this request into bytes for the provided connection
23996    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
23997        let length_so_far = 0;
23998        let value_mask: u32 = self.value_list.switch_expr();
23999        let value_mask_bytes = value_mask.serialize();
24000        let mut request0 = vec![
24001            CHANGE_KEYBOARD_CONTROL_REQUEST,
24002            0,
24003            0,
24004            0,
24005            value_mask_bytes[0],
24006            value_mask_bytes[1],
24007            value_mask_bytes[2],
24008            value_mask_bytes[3],
24009        ];
24010        let length_so_far = length_so_far + request0.len();
24011        let value_list_bytes = self.value_list.serialize(u32::from(value_mask));
24012        let length_so_far = length_so_far + value_list_bytes.len();
24013        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
24014        let length_so_far = length_so_far + padding0.len();
24015        assert_eq!(length_so_far % 4, 0);
24016        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
24017        request0[2..4].copy_from_slice(&length.to_ne_bytes());
24018        ([request0.into(), value_list_bytes.into(), padding0.into()], vec![])
24019    }
24020    /// Parse this request given its header, its body, and any fds that go along with it
24021    #[cfg(feature = "request-parsing")]
24022    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
24023        if header.major_opcode != CHANGE_KEYBOARD_CONTROL_REQUEST {
24024            return Err(ParseError::InvalidValue);
24025        }
24026        let remaining = &[header.minor_opcode];
24027        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
24028        let _ = remaining;
24029        let (value_mask, remaining) = u32::try_parse(value)?;
24030        let (value_list, remaining) = ChangeKeyboardControlAux::try_parse(remaining, u32::from(value_mask))?;
24031        let _ = remaining;
24032        Ok(ChangeKeyboardControlRequest {
24033            value_list: Cow::Owned(value_list),
24034        })
24035    }
24036    /// Clone all borrowed data in this ChangeKeyboardControlRequest.
24037    pub fn into_owned(self) -> ChangeKeyboardControlRequest<'static> {
24038        ChangeKeyboardControlRequest {
24039            value_list: Cow::Owned(self.value_list.into_owned()),
24040        }
24041    }
24042}
24043impl<'input> Request for ChangeKeyboardControlRequest<'input> {
24044    const EXTENSION_NAME: Option<&'static str> = None;
24045
24046    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
24047        let (bufs, fds) = self.serialize();
24048        // Flatten the buffers into a single vector
24049        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
24050        (buf, fds)
24051    }
24052}
24053impl<'input> crate::x11_utils::VoidRequest for ChangeKeyboardControlRequest<'input> {
24054}
24055
24056/// Opcode for the GetKeyboardControl request
24057pub const GET_KEYBOARD_CONTROL_REQUEST: u8 = 103;
24058#[derive(Clone, Copy, Default)]
24059#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
24060#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24061pub struct GetKeyboardControlRequest;
24062impl_debug_if_no_extra_traits!(GetKeyboardControlRequest, "GetKeyboardControlRequest");
24063impl GetKeyboardControlRequest {
24064    /// Serialize this request into bytes for the provided connection
24065    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
24066        let length_so_far = 0;
24067        let mut request0 = vec![
24068            GET_KEYBOARD_CONTROL_REQUEST,
24069            0,
24070            0,
24071            0,
24072        ];
24073        let length_so_far = length_so_far + request0.len();
24074        assert_eq!(length_so_far % 4, 0);
24075        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
24076        request0[2..4].copy_from_slice(&length.to_ne_bytes());
24077        ([request0.into()], vec![])
24078    }
24079    /// Parse this request given its header, its body, and any fds that go along with it
24080    #[cfg(feature = "request-parsing")]
24081    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
24082        if header.major_opcode != GET_KEYBOARD_CONTROL_REQUEST {
24083            return Err(ParseError::InvalidValue);
24084        }
24085        let remaining = &[header.minor_opcode];
24086        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
24087        let _ = remaining;
24088        let _ = value;
24089        Ok(GetKeyboardControlRequest
24090        )
24091    }
24092}
24093impl Request for GetKeyboardControlRequest {
24094    const EXTENSION_NAME: Option<&'static str> = None;
24095
24096    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
24097        let (bufs, fds) = self.serialize();
24098        // Flatten the buffers into a single vector
24099        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
24100        (buf, fds)
24101    }
24102}
24103impl crate::x11_utils::ReplyRequest for GetKeyboardControlRequest {
24104    type Reply = GetKeyboardControlReply;
24105}
24106
24107#[derive(Clone, Copy, Default)]
24108#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
24109#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24110pub struct GetKeyboardControlReply {
24111    pub global_auto_repeat: AutoRepeatMode,
24112    pub sequence: u16,
24113    pub length: u32,
24114    pub led_mask: u32,
24115    pub key_click_percent: u8,
24116    pub bell_percent: u8,
24117    pub bell_pitch: u16,
24118    pub bell_duration: u16,
24119    pub auto_repeats: [u8; 32],
24120}
24121impl_debug_if_no_extra_traits!(GetKeyboardControlReply, "GetKeyboardControlReply");
24122impl TryParse for GetKeyboardControlReply {
24123    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
24124        let remaining = initial_value;
24125        let (response_type, remaining) = u8::try_parse(remaining)?;
24126        let (global_auto_repeat, remaining) = u8::try_parse(remaining)?;
24127        let (sequence, remaining) = u16::try_parse(remaining)?;
24128        let (length, remaining) = u32::try_parse(remaining)?;
24129        let (led_mask, remaining) = u32::try_parse(remaining)?;
24130        let (key_click_percent, remaining) = u8::try_parse(remaining)?;
24131        let (bell_percent, remaining) = u8::try_parse(remaining)?;
24132        let (bell_pitch, remaining) = u16::try_parse(remaining)?;
24133        let (bell_duration, remaining) = u16::try_parse(remaining)?;
24134        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
24135        let (auto_repeats, remaining) = crate::x11_utils::parse_u8_array::<32>(remaining)?;
24136        if response_type != 1 {
24137            return Err(ParseError::InvalidValue);
24138        }
24139        let global_auto_repeat = global_auto_repeat.into();
24140        let result = GetKeyboardControlReply { global_auto_repeat, sequence, length, led_mask, key_click_percent, bell_percent, bell_pitch, bell_duration, auto_repeats };
24141        let _ = remaining;
24142        let remaining = initial_value.get(32 + length as usize * 4..)
24143            .ok_or(ParseError::InsufficientData)?;
24144        Ok((result, remaining))
24145    }
24146}
24147impl Serialize for GetKeyboardControlReply {
24148    type Bytes = [u8; 52];
24149    fn serialize(&self) -> [u8; 52] {
24150        let response_type_bytes = &[1];
24151        let global_auto_repeat_bytes = (u32::from(self.global_auto_repeat) as u8).serialize();
24152        let sequence_bytes = self.sequence.serialize();
24153        let length_bytes = self.length.serialize();
24154        let led_mask_bytes = self.led_mask.serialize();
24155        let key_click_percent_bytes = self.key_click_percent.serialize();
24156        let bell_percent_bytes = self.bell_percent.serialize();
24157        let bell_pitch_bytes = self.bell_pitch.serialize();
24158        let bell_duration_bytes = self.bell_duration.serialize();
24159        [
24160            response_type_bytes[0],
24161            global_auto_repeat_bytes[0],
24162            sequence_bytes[0],
24163            sequence_bytes[1],
24164            length_bytes[0],
24165            length_bytes[1],
24166            length_bytes[2],
24167            length_bytes[3],
24168            led_mask_bytes[0],
24169            led_mask_bytes[1],
24170            led_mask_bytes[2],
24171            led_mask_bytes[3],
24172            key_click_percent_bytes[0],
24173            bell_percent_bytes[0],
24174            bell_pitch_bytes[0],
24175            bell_pitch_bytes[1],
24176            bell_duration_bytes[0],
24177            bell_duration_bytes[1],
24178            0,
24179            0,
24180            self.auto_repeats[0],
24181            self.auto_repeats[1],
24182            self.auto_repeats[2],
24183            self.auto_repeats[3],
24184            self.auto_repeats[4],
24185            self.auto_repeats[5],
24186            self.auto_repeats[6],
24187            self.auto_repeats[7],
24188            self.auto_repeats[8],
24189            self.auto_repeats[9],
24190            self.auto_repeats[10],
24191            self.auto_repeats[11],
24192            self.auto_repeats[12],
24193            self.auto_repeats[13],
24194            self.auto_repeats[14],
24195            self.auto_repeats[15],
24196            self.auto_repeats[16],
24197            self.auto_repeats[17],
24198            self.auto_repeats[18],
24199            self.auto_repeats[19],
24200            self.auto_repeats[20],
24201            self.auto_repeats[21],
24202            self.auto_repeats[22],
24203            self.auto_repeats[23],
24204            self.auto_repeats[24],
24205            self.auto_repeats[25],
24206            self.auto_repeats[26],
24207            self.auto_repeats[27],
24208            self.auto_repeats[28],
24209            self.auto_repeats[29],
24210            self.auto_repeats[30],
24211            self.auto_repeats[31],
24212        ]
24213    }
24214    fn serialize_into(&self, bytes: &mut Vec<u8>) {
24215        bytes.reserve(52);
24216        let response_type_bytes = &[1];
24217        bytes.push(response_type_bytes[0]);
24218        (u32::from(self.global_auto_repeat) as u8).serialize_into(bytes);
24219        self.sequence.serialize_into(bytes);
24220        self.length.serialize_into(bytes);
24221        self.led_mask.serialize_into(bytes);
24222        self.key_click_percent.serialize_into(bytes);
24223        self.bell_percent.serialize_into(bytes);
24224        self.bell_pitch.serialize_into(bytes);
24225        self.bell_duration.serialize_into(bytes);
24226        bytes.extend_from_slice(&[0; 2]);
24227        bytes.extend_from_slice(&self.auto_repeats);
24228    }
24229}
24230
24231/// Opcode for the Bell request
24232pub const BELL_REQUEST: u8 = 104;
24233#[derive(Clone, Copy, Default)]
24234#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
24235#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24236pub struct BellRequest {
24237    pub percent: i8,
24238}
24239impl_debug_if_no_extra_traits!(BellRequest, "BellRequest");
24240impl BellRequest {
24241    /// Serialize this request into bytes for the provided connection
24242    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
24243        let length_so_far = 0;
24244        let percent_bytes = self.percent.serialize();
24245        let mut request0 = vec![
24246            BELL_REQUEST,
24247            percent_bytes[0],
24248            0,
24249            0,
24250        ];
24251        let length_so_far = length_so_far + request0.len();
24252        assert_eq!(length_so_far % 4, 0);
24253        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
24254        request0[2..4].copy_from_slice(&length.to_ne_bytes());
24255        ([request0.into()], vec![])
24256    }
24257    /// Parse this request given its header, its body, and any fds that go along with it
24258    #[cfg(feature = "request-parsing")]
24259    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
24260        if header.major_opcode != BELL_REQUEST {
24261            return Err(ParseError::InvalidValue);
24262        }
24263        let remaining = &[header.minor_opcode];
24264        let (percent, remaining) = i8::try_parse(remaining)?;
24265        let _ = remaining;
24266        let _ = value;
24267        Ok(BellRequest {
24268            percent,
24269        })
24270    }
24271}
24272impl Request for BellRequest {
24273    const EXTENSION_NAME: Option<&'static str> = None;
24274
24275    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
24276        let (bufs, fds) = self.serialize();
24277        // Flatten the buffers into a single vector
24278        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
24279        (buf, fds)
24280    }
24281}
24282impl crate::x11_utils::VoidRequest for BellRequest {
24283}
24284
24285/// Opcode for the ChangePointerControl request
24286pub const CHANGE_POINTER_CONTROL_REQUEST: u8 = 105;
24287#[derive(Clone, Copy, Default)]
24288#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
24289#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24290pub struct ChangePointerControlRequest {
24291    pub acceleration_numerator: i16,
24292    pub acceleration_denominator: i16,
24293    pub threshold: i16,
24294    pub do_acceleration: bool,
24295    pub do_threshold: bool,
24296}
24297impl_debug_if_no_extra_traits!(ChangePointerControlRequest, "ChangePointerControlRequest");
24298impl ChangePointerControlRequest {
24299    /// Serialize this request into bytes for the provided connection
24300    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
24301        let length_so_far = 0;
24302        let acceleration_numerator_bytes = self.acceleration_numerator.serialize();
24303        let acceleration_denominator_bytes = self.acceleration_denominator.serialize();
24304        let threshold_bytes = self.threshold.serialize();
24305        let do_acceleration_bytes = self.do_acceleration.serialize();
24306        let do_threshold_bytes = self.do_threshold.serialize();
24307        let mut request0 = vec![
24308            CHANGE_POINTER_CONTROL_REQUEST,
24309            0,
24310            0,
24311            0,
24312            acceleration_numerator_bytes[0],
24313            acceleration_numerator_bytes[1],
24314            acceleration_denominator_bytes[0],
24315            acceleration_denominator_bytes[1],
24316            threshold_bytes[0],
24317            threshold_bytes[1],
24318            do_acceleration_bytes[0],
24319            do_threshold_bytes[0],
24320        ];
24321        let length_so_far = length_so_far + request0.len();
24322        assert_eq!(length_so_far % 4, 0);
24323        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
24324        request0[2..4].copy_from_slice(&length.to_ne_bytes());
24325        ([request0.into()], vec![])
24326    }
24327    /// Parse this request given its header, its body, and any fds that go along with it
24328    #[cfg(feature = "request-parsing")]
24329    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
24330        if header.major_opcode != CHANGE_POINTER_CONTROL_REQUEST {
24331            return Err(ParseError::InvalidValue);
24332        }
24333        let remaining = &[header.minor_opcode];
24334        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
24335        let _ = remaining;
24336        let (acceleration_numerator, remaining) = i16::try_parse(value)?;
24337        let (acceleration_denominator, remaining) = i16::try_parse(remaining)?;
24338        let (threshold, remaining) = i16::try_parse(remaining)?;
24339        let (do_acceleration, remaining) = bool::try_parse(remaining)?;
24340        let (do_threshold, remaining) = bool::try_parse(remaining)?;
24341        let _ = remaining;
24342        Ok(ChangePointerControlRequest {
24343            acceleration_numerator,
24344            acceleration_denominator,
24345            threshold,
24346            do_acceleration,
24347            do_threshold,
24348        })
24349    }
24350}
24351impl Request for ChangePointerControlRequest {
24352    const EXTENSION_NAME: Option<&'static str> = None;
24353
24354    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
24355        let (bufs, fds) = self.serialize();
24356        // Flatten the buffers into a single vector
24357        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
24358        (buf, fds)
24359    }
24360}
24361impl crate::x11_utils::VoidRequest for ChangePointerControlRequest {
24362}
24363
24364/// Opcode for the GetPointerControl request
24365pub const GET_POINTER_CONTROL_REQUEST: u8 = 106;
24366#[derive(Clone, Copy, Default)]
24367#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
24368#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24369pub struct GetPointerControlRequest;
24370impl_debug_if_no_extra_traits!(GetPointerControlRequest, "GetPointerControlRequest");
24371impl GetPointerControlRequest {
24372    /// Serialize this request into bytes for the provided connection
24373    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
24374        let length_so_far = 0;
24375        let mut request0 = vec![
24376            GET_POINTER_CONTROL_REQUEST,
24377            0,
24378            0,
24379            0,
24380        ];
24381        let length_so_far = length_so_far + request0.len();
24382        assert_eq!(length_so_far % 4, 0);
24383        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
24384        request0[2..4].copy_from_slice(&length.to_ne_bytes());
24385        ([request0.into()], vec![])
24386    }
24387    /// Parse this request given its header, its body, and any fds that go along with it
24388    #[cfg(feature = "request-parsing")]
24389    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
24390        if header.major_opcode != GET_POINTER_CONTROL_REQUEST {
24391            return Err(ParseError::InvalidValue);
24392        }
24393        let remaining = &[header.minor_opcode];
24394        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
24395        let _ = remaining;
24396        let _ = value;
24397        Ok(GetPointerControlRequest
24398        )
24399    }
24400}
24401impl Request for GetPointerControlRequest {
24402    const EXTENSION_NAME: Option<&'static str> = None;
24403
24404    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
24405        let (bufs, fds) = self.serialize();
24406        // Flatten the buffers into a single vector
24407        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
24408        (buf, fds)
24409    }
24410}
24411impl crate::x11_utils::ReplyRequest for GetPointerControlRequest {
24412    type Reply = GetPointerControlReply;
24413}
24414
24415#[derive(Clone, Copy, Default)]
24416#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
24417#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24418pub struct GetPointerControlReply {
24419    pub sequence: u16,
24420    pub length: u32,
24421    pub acceleration_numerator: u16,
24422    pub acceleration_denominator: u16,
24423    pub threshold: u16,
24424}
24425impl_debug_if_no_extra_traits!(GetPointerControlReply, "GetPointerControlReply");
24426impl TryParse for GetPointerControlReply {
24427    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
24428        let remaining = initial_value;
24429        let (response_type, remaining) = u8::try_parse(remaining)?;
24430        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
24431        let (sequence, remaining) = u16::try_parse(remaining)?;
24432        let (length, remaining) = u32::try_parse(remaining)?;
24433        let (acceleration_numerator, remaining) = u16::try_parse(remaining)?;
24434        let (acceleration_denominator, remaining) = u16::try_parse(remaining)?;
24435        let (threshold, remaining) = u16::try_parse(remaining)?;
24436        let remaining = remaining.get(18..).ok_or(ParseError::InsufficientData)?;
24437        if response_type != 1 {
24438            return Err(ParseError::InvalidValue);
24439        }
24440        let result = GetPointerControlReply { sequence, length, acceleration_numerator, acceleration_denominator, threshold };
24441        let _ = remaining;
24442        let remaining = initial_value.get(32 + length as usize * 4..)
24443            .ok_or(ParseError::InsufficientData)?;
24444        Ok((result, remaining))
24445    }
24446}
24447impl Serialize for GetPointerControlReply {
24448    type Bytes = [u8; 32];
24449    fn serialize(&self) -> [u8; 32] {
24450        let response_type_bytes = &[1];
24451        let sequence_bytes = self.sequence.serialize();
24452        let length_bytes = self.length.serialize();
24453        let acceleration_numerator_bytes = self.acceleration_numerator.serialize();
24454        let acceleration_denominator_bytes = self.acceleration_denominator.serialize();
24455        let threshold_bytes = self.threshold.serialize();
24456        [
24457            response_type_bytes[0],
24458            0,
24459            sequence_bytes[0],
24460            sequence_bytes[1],
24461            length_bytes[0],
24462            length_bytes[1],
24463            length_bytes[2],
24464            length_bytes[3],
24465            acceleration_numerator_bytes[0],
24466            acceleration_numerator_bytes[1],
24467            acceleration_denominator_bytes[0],
24468            acceleration_denominator_bytes[1],
24469            threshold_bytes[0],
24470            threshold_bytes[1],
24471            0,
24472            0,
24473            0,
24474            0,
24475            0,
24476            0,
24477            0,
24478            0,
24479            0,
24480            0,
24481            0,
24482            0,
24483            0,
24484            0,
24485            0,
24486            0,
24487            0,
24488            0,
24489        ]
24490    }
24491    fn serialize_into(&self, bytes: &mut Vec<u8>) {
24492        bytes.reserve(32);
24493        let response_type_bytes = &[1];
24494        bytes.push(response_type_bytes[0]);
24495        bytes.extend_from_slice(&[0; 1]);
24496        self.sequence.serialize_into(bytes);
24497        self.length.serialize_into(bytes);
24498        self.acceleration_numerator.serialize_into(bytes);
24499        self.acceleration_denominator.serialize_into(bytes);
24500        self.threshold.serialize_into(bytes);
24501        bytes.extend_from_slice(&[0; 18]);
24502    }
24503}
24504
24505#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
24506#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24507pub struct Blanking(u8);
24508impl Blanking {
24509    pub const NOT_PREFERRED: Self = Self(0);
24510    pub const PREFERRED: Self = Self(1);
24511    pub const DEFAULT: Self = Self(2);
24512}
24513impl From<Blanking> for u8 {
24514    #[inline]
24515    fn from(input: Blanking) -> Self {
24516        input.0
24517    }
24518}
24519impl From<Blanking> for Option<u8> {
24520    #[inline]
24521    fn from(input: Blanking) -> Self {
24522        Some(input.0)
24523    }
24524}
24525impl From<Blanking> for u16 {
24526    #[inline]
24527    fn from(input: Blanking) -> Self {
24528        u16::from(input.0)
24529    }
24530}
24531impl From<Blanking> for Option<u16> {
24532    #[inline]
24533    fn from(input: Blanking) -> Self {
24534        Some(u16::from(input.0))
24535    }
24536}
24537impl From<Blanking> for u32 {
24538    #[inline]
24539    fn from(input: Blanking) -> Self {
24540        u32::from(input.0)
24541    }
24542}
24543impl From<Blanking> for Option<u32> {
24544    #[inline]
24545    fn from(input: Blanking) -> Self {
24546        Some(u32::from(input.0))
24547    }
24548}
24549impl From<u8> for Blanking {
24550    #[inline]
24551    fn from(value: u8) -> Self {
24552        Self(value)
24553    }
24554}
24555impl core::fmt::Debug for Blanking  {
24556    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
24557        let variants = [
24558            (Self::NOT_PREFERRED.0.into(), "NOT_PREFERRED", "NotPreferred"),
24559            (Self::PREFERRED.0.into(), "PREFERRED", "Preferred"),
24560            (Self::DEFAULT.0.into(), "DEFAULT", "Default"),
24561        ];
24562        pretty_print_enum(fmt, self.0.into(), &variants)
24563    }
24564}
24565
24566#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
24567#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24568pub struct Exposures(u8);
24569impl Exposures {
24570    pub const NOT_ALLOWED: Self = Self(0);
24571    pub const ALLOWED: Self = Self(1);
24572    pub const DEFAULT: Self = Self(2);
24573}
24574impl From<Exposures> for u8 {
24575    #[inline]
24576    fn from(input: Exposures) -> Self {
24577        input.0
24578    }
24579}
24580impl From<Exposures> for Option<u8> {
24581    #[inline]
24582    fn from(input: Exposures) -> Self {
24583        Some(input.0)
24584    }
24585}
24586impl From<Exposures> for u16 {
24587    #[inline]
24588    fn from(input: Exposures) -> Self {
24589        u16::from(input.0)
24590    }
24591}
24592impl From<Exposures> for Option<u16> {
24593    #[inline]
24594    fn from(input: Exposures) -> Self {
24595        Some(u16::from(input.0))
24596    }
24597}
24598impl From<Exposures> for u32 {
24599    #[inline]
24600    fn from(input: Exposures) -> Self {
24601        u32::from(input.0)
24602    }
24603}
24604impl From<Exposures> for Option<u32> {
24605    #[inline]
24606    fn from(input: Exposures) -> Self {
24607        Some(u32::from(input.0))
24608    }
24609}
24610impl From<u8> for Exposures {
24611    #[inline]
24612    fn from(value: u8) -> Self {
24613        Self(value)
24614    }
24615}
24616impl core::fmt::Debug for Exposures  {
24617    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
24618        let variants = [
24619            (Self::NOT_ALLOWED.0.into(), "NOT_ALLOWED", "NotAllowed"),
24620            (Self::ALLOWED.0.into(), "ALLOWED", "Allowed"),
24621            (Self::DEFAULT.0.into(), "DEFAULT", "Default"),
24622        ];
24623        pretty_print_enum(fmt, self.0.into(), &variants)
24624    }
24625}
24626
24627/// Opcode for the SetScreenSaver request
24628pub const SET_SCREEN_SAVER_REQUEST: u8 = 107;
24629#[derive(Clone, Copy, Default)]
24630#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
24631#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24632pub struct SetScreenSaverRequest {
24633    pub timeout: i16,
24634    pub interval: i16,
24635    pub prefer_blanking: Blanking,
24636    pub allow_exposures: Exposures,
24637}
24638impl_debug_if_no_extra_traits!(SetScreenSaverRequest, "SetScreenSaverRequest");
24639impl SetScreenSaverRequest {
24640    /// Serialize this request into bytes for the provided connection
24641    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
24642        let length_so_far = 0;
24643        let timeout_bytes = self.timeout.serialize();
24644        let interval_bytes = self.interval.serialize();
24645        let prefer_blanking_bytes = u8::from(self.prefer_blanking).serialize();
24646        let allow_exposures_bytes = u8::from(self.allow_exposures).serialize();
24647        let mut request0 = vec![
24648            SET_SCREEN_SAVER_REQUEST,
24649            0,
24650            0,
24651            0,
24652            timeout_bytes[0],
24653            timeout_bytes[1],
24654            interval_bytes[0],
24655            interval_bytes[1],
24656            prefer_blanking_bytes[0],
24657            allow_exposures_bytes[0],
24658            0,
24659            0,
24660        ];
24661        let length_so_far = length_so_far + request0.len();
24662        assert_eq!(length_so_far % 4, 0);
24663        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
24664        request0[2..4].copy_from_slice(&length.to_ne_bytes());
24665        ([request0.into()], vec![])
24666    }
24667    /// Parse this request given its header, its body, and any fds that go along with it
24668    #[cfg(feature = "request-parsing")]
24669    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
24670        if header.major_opcode != SET_SCREEN_SAVER_REQUEST {
24671            return Err(ParseError::InvalidValue);
24672        }
24673        let remaining = &[header.minor_opcode];
24674        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
24675        let _ = remaining;
24676        let (timeout, remaining) = i16::try_parse(value)?;
24677        let (interval, remaining) = i16::try_parse(remaining)?;
24678        let (prefer_blanking, remaining) = u8::try_parse(remaining)?;
24679        let prefer_blanking = prefer_blanking.into();
24680        let (allow_exposures, remaining) = u8::try_parse(remaining)?;
24681        let allow_exposures = allow_exposures.into();
24682        let _ = remaining;
24683        Ok(SetScreenSaverRequest {
24684            timeout,
24685            interval,
24686            prefer_blanking,
24687            allow_exposures,
24688        })
24689    }
24690}
24691impl Request for SetScreenSaverRequest {
24692    const EXTENSION_NAME: Option<&'static str> = None;
24693
24694    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
24695        let (bufs, fds) = self.serialize();
24696        // Flatten the buffers into a single vector
24697        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
24698        (buf, fds)
24699    }
24700}
24701impl crate::x11_utils::VoidRequest for SetScreenSaverRequest {
24702}
24703
24704/// Opcode for the GetScreenSaver request
24705pub const GET_SCREEN_SAVER_REQUEST: u8 = 108;
24706#[derive(Clone, Copy, Default)]
24707#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
24708#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24709pub struct GetScreenSaverRequest;
24710impl_debug_if_no_extra_traits!(GetScreenSaverRequest, "GetScreenSaverRequest");
24711impl GetScreenSaverRequest {
24712    /// Serialize this request into bytes for the provided connection
24713    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
24714        let length_so_far = 0;
24715        let mut request0 = vec![
24716            GET_SCREEN_SAVER_REQUEST,
24717            0,
24718            0,
24719            0,
24720        ];
24721        let length_so_far = length_so_far + request0.len();
24722        assert_eq!(length_so_far % 4, 0);
24723        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
24724        request0[2..4].copy_from_slice(&length.to_ne_bytes());
24725        ([request0.into()], vec![])
24726    }
24727    /// Parse this request given its header, its body, and any fds that go along with it
24728    #[cfg(feature = "request-parsing")]
24729    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
24730        if header.major_opcode != GET_SCREEN_SAVER_REQUEST {
24731            return Err(ParseError::InvalidValue);
24732        }
24733        let remaining = &[header.minor_opcode];
24734        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
24735        let _ = remaining;
24736        let _ = value;
24737        Ok(GetScreenSaverRequest
24738        )
24739    }
24740}
24741impl Request for GetScreenSaverRequest {
24742    const EXTENSION_NAME: Option<&'static str> = None;
24743
24744    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
24745        let (bufs, fds) = self.serialize();
24746        // Flatten the buffers into a single vector
24747        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
24748        (buf, fds)
24749    }
24750}
24751impl crate::x11_utils::ReplyRequest for GetScreenSaverRequest {
24752    type Reply = GetScreenSaverReply;
24753}
24754
24755#[derive(Clone, Copy, Default)]
24756#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
24757#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24758pub struct GetScreenSaverReply {
24759    pub sequence: u16,
24760    pub length: u32,
24761    pub timeout: u16,
24762    pub interval: u16,
24763    pub prefer_blanking: Blanking,
24764    pub allow_exposures: Exposures,
24765}
24766impl_debug_if_no_extra_traits!(GetScreenSaverReply, "GetScreenSaverReply");
24767impl TryParse for GetScreenSaverReply {
24768    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
24769        let remaining = initial_value;
24770        let (response_type, remaining) = u8::try_parse(remaining)?;
24771        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
24772        let (sequence, remaining) = u16::try_parse(remaining)?;
24773        let (length, remaining) = u32::try_parse(remaining)?;
24774        let (timeout, remaining) = u16::try_parse(remaining)?;
24775        let (interval, remaining) = u16::try_parse(remaining)?;
24776        let (prefer_blanking, remaining) = u8::try_parse(remaining)?;
24777        let (allow_exposures, remaining) = u8::try_parse(remaining)?;
24778        let remaining = remaining.get(18..).ok_or(ParseError::InsufficientData)?;
24779        if response_type != 1 {
24780            return Err(ParseError::InvalidValue);
24781        }
24782        let prefer_blanking = prefer_blanking.into();
24783        let allow_exposures = allow_exposures.into();
24784        let result = GetScreenSaverReply { sequence, length, timeout, interval, prefer_blanking, allow_exposures };
24785        let _ = remaining;
24786        let remaining = initial_value.get(32 + length as usize * 4..)
24787            .ok_or(ParseError::InsufficientData)?;
24788        Ok((result, remaining))
24789    }
24790}
24791impl Serialize for GetScreenSaverReply {
24792    type Bytes = [u8; 32];
24793    fn serialize(&self) -> [u8; 32] {
24794        let response_type_bytes = &[1];
24795        let sequence_bytes = self.sequence.serialize();
24796        let length_bytes = self.length.serialize();
24797        let timeout_bytes = self.timeout.serialize();
24798        let interval_bytes = self.interval.serialize();
24799        let prefer_blanking_bytes = u8::from(self.prefer_blanking).serialize();
24800        let allow_exposures_bytes = u8::from(self.allow_exposures).serialize();
24801        [
24802            response_type_bytes[0],
24803            0,
24804            sequence_bytes[0],
24805            sequence_bytes[1],
24806            length_bytes[0],
24807            length_bytes[1],
24808            length_bytes[2],
24809            length_bytes[3],
24810            timeout_bytes[0],
24811            timeout_bytes[1],
24812            interval_bytes[0],
24813            interval_bytes[1],
24814            prefer_blanking_bytes[0],
24815            allow_exposures_bytes[0],
24816            0,
24817            0,
24818            0,
24819            0,
24820            0,
24821            0,
24822            0,
24823            0,
24824            0,
24825            0,
24826            0,
24827            0,
24828            0,
24829            0,
24830            0,
24831            0,
24832            0,
24833            0,
24834        ]
24835    }
24836    fn serialize_into(&self, bytes: &mut Vec<u8>) {
24837        bytes.reserve(32);
24838        let response_type_bytes = &[1];
24839        bytes.push(response_type_bytes[0]);
24840        bytes.extend_from_slice(&[0; 1]);
24841        self.sequence.serialize_into(bytes);
24842        self.length.serialize_into(bytes);
24843        self.timeout.serialize_into(bytes);
24844        self.interval.serialize_into(bytes);
24845        u8::from(self.prefer_blanking).serialize_into(bytes);
24846        u8::from(self.allow_exposures).serialize_into(bytes);
24847        bytes.extend_from_slice(&[0; 18]);
24848    }
24849}
24850
24851#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
24852#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24853pub struct HostMode(u8);
24854impl HostMode {
24855    pub const INSERT: Self = Self(0);
24856    pub const DELETE: Self = Self(1);
24857}
24858impl From<HostMode> for u8 {
24859    #[inline]
24860    fn from(input: HostMode) -> Self {
24861        input.0
24862    }
24863}
24864impl From<HostMode> for Option<u8> {
24865    #[inline]
24866    fn from(input: HostMode) -> Self {
24867        Some(input.0)
24868    }
24869}
24870impl From<HostMode> for u16 {
24871    #[inline]
24872    fn from(input: HostMode) -> Self {
24873        u16::from(input.0)
24874    }
24875}
24876impl From<HostMode> for Option<u16> {
24877    #[inline]
24878    fn from(input: HostMode) -> Self {
24879        Some(u16::from(input.0))
24880    }
24881}
24882impl From<HostMode> for u32 {
24883    #[inline]
24884    fn from(input: HostMode) -> Self {
24885        u32::from(input.0)
24886    }
24887}
24888impl From<HostMode> for Option<u32> {
24889    #[inline]
24890    fn from(input: HostMode) -> Self {
24891        Some(u32::from(input.0))
24892    }
24893}
24894impl From<u8> for HostMode {
24895    #[inline]
24896    fn from(value: u8) -> Self {
24897        Self(value)
24898    }
24899}
24900impl core::fmt::Debug for HostMode  {
24901    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
24902        let variants = [
24903            (Self::INSERT.0.into(), "INSERT", "Insert"),
24904            (Self::DELETE.0.into(), "DELETE", "Delete"),
24905        ];
24906        pretty_print_enum(fmt, self.0.into(), &variants)
24907    }
24908}
24909
24910#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
24911#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24912pub struct Family(u8);
24913impl Family {
24914    pub const INTERNET: Self = Self(0);
24915    pub const DEC_NET: Self = Self(1);
24916    pub const CHAOS: Self = Self(2);
24917    pub const SERVER_INTERPRETED: Self = Self(5);
24918    pub const INTERNET6: Self = Self(6);
24919}
24920impl From<Family> for u8 {
24921    #[inline]
24922    fn from(input: Family) -> Self {
24923        input.0
24924    }
24925}
24926impl From<Family> for Option<u8> {
24927    #[inline]
24928    fn from(input: Family) -> Self {
24929        Some(input.0)
24930    }
24931}
24932impl From<Family> for u16 {
24933    #[inline]
24934    fn from(input: Family) -> Self {
24935        u16::from(input.0)
24936    }
24937}
24938impl From<Family> for Option<u16> {
24939    #[inline]
24940    fn from(input: Family) -> Self {
24941        Some(u16::from(input.0))
24942    }
24943}
24944impl From<Family> for u32 {
24945    #[inline]
24946    fn from(input: Family) -> Self {
24947        u32::from(input.0)
24948    }
24949}
24950impl From<Family> for Option<u32> {
24951    #[inline]
24952    fn from(input: Family) -> Self {
24953        Some(u32::from(input.0))
24954    }
24955}
24956impl From<u8> for Family {
24957    #[inline]
24958    fn from(value: u8) -> Self {
24959        Self(value)
24960    }
24961}
24962impl core::fmt::Debug for Family  {
24963    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
24964        let variants = [
24965            (Self::INTERNET.0.into(), "INTERNET", "Internet"),
24966            (Self::DEC_NET.0.into(), "DEC_NET", "DECnet"),
24967            (Self::CHAOS.0.into(), "CHAOS", "Chaos"),
24968            (Self::SERVER_INTERPRETED.0.into(), "SERVER_INTERPRETED", "ServerInterpreted"),
24969            (Self::INTERNET6.0.into(), "INTERNET6", "Internet6"),
24970        ];
24971        pretty_print_enum(fmt, self.0.into(), &variants)
24972    }
24973}
24974
24975/// Opcode for the ChangeHosts request
24976pub const CHANGE_HOSTS_REQUEST: u8 = 109;
24977#[derive(Clone, Default)]
24978#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
24979#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24980pub struct ChangeHostsRequest<'input> {
24981    pub mode: HostMode,
24982    pub family: Family,
24983    pub address: Cow<'input, [u8]>,
24984}
24985impl_debug_if_no_extra_traits!(ChangeHostsRequest<'_>, "ChangeHostsRequest");
24986impl<'input> ChangeHostsRequest<'input> {
24987    /// Serialize this request into bytes for the provided connection
24988    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
24989        let length_so_far = 0;
24990        let mode_bytes = u8::from(self.mode).serialize();
24991        let family_bytes = u8::from(self.family).serialize();
24992        let address_len = u16::try_from(self.address.len()).expect("`address` has too many elements");
24993        let address_len_bytes = address_len.serialize();
24994        let mut request0 = vec![
24995            CHANGE_HOSTS_REQUEST,
24996            mode_bytes[0],
24997            0,
24998            0,
24999            family_bytes[0],
25000            0,
25001            address_len_bytes[0],
25002            address_len_bytes[1],
25003        ];
25004        let length_so_far = length_so_far + request0.len();
25005        let length_so_far = length_so_far + self.address.len();
25006        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
25007        let length_so_far = length_so_far + padding0.len();
25008        assert_eq!(length_so_far % 4, 0);
25009        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
25010        request0[2..4].copy_from_slice(&length.to_ne_bytes());
25011        ([request0.into(), self.address, padding0.into()], vec![])
25012    }
25013    /// Parse this request given its header, its body, and any fds that go along with it
25014    #[cfg(feature = "request-parsing")]
25015    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
25016        if header.major_opcode != CHANGE_HOSTS_REQUEST {
25017            return Err(ParseError::InvalidValue);
25018        }
25019        let remaining = &[header.minor_opcode];
25020        let (mode, remaining) = u8::try_parse(remaining)?;
25021        let mode = mode.into();
25022        let _ = remaining;
25023        let (family, remaining) = u8::try_parse(value)?;
25024        let family = family.into();
25025        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
25026        let (address_len, remaining) = u16::try_parse(remaining)?;
25027        let (address, remaining) = crate::x11_utils::parse_u8_list(remaining, address_len.try_to_usize()?)?;
25028        let _ = remaining;
25029        Ok(ChangeHostsRequest {
25030            mode,
25031            family,
25032            address: Cow::Borrowed(address),
25033        })
25034    }
25035    /// Clone all borrowed data in this ChangeHostsRequest.
25036    pub fn into_owned(self) -> ChangeHostsRequest<'static> {
25037        ChangeHostsRequest {
25038            mode: self.mode,
25039            family: self.family,
25040            address: Cow::Owned(self.address.into_owned()),
25041        }
25042    }
25043}
25044impl<'input> Request for ChangeHostsRequest<'input> {
25045    const EXTENSION_NAME: Option<&'static str> = None;
25046
25047    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
25048        let (bufs, fds) = self.serialize();
25049        // Flatten the buffers into a single vector
25050        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
25051        (buf, fds)
25052    }
25053}
25054impl<'input> crate::x11_utils::VoidRequest for ChangeHostsRequest<'input> {
25055}
25056
25057#[derive(Clone, Default)]
25058#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
25059#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25060pub struct Host {
25061    pub family: Family,
25062    pub address: Vec<u8>,
25063}
25064impl_debug_if_no_extra_traits!(Host, "Host");
25065impl TryParse for Host {
25066    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
25067        let value = remaining;
25068        let (family, remaining) = u8::try_parse(remaining)?;
25069        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
25070        let (address_len, remaining) = u16::try_parse(remaining)?;
25071        let (address, remaining) = crate::x11_utils::parse_u8_list(remaining, address_len.try_to_usize()?)?;
25072        let address = address.to_vec();
25073        // Align offset to multiple of 4
25074        let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
25075        let misalignment = (4 - (offset % 4)) % 4;
25076        let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
25077        let family = family.into();
25078        let result = Host { family, address };
25079        Ok((result, remaining))
25080    }
25081}
25082impl Serialize for Host {
25083    type Bytes = Vec<u8>;
25084    fn serialize(&self) -> Vec<u8> {
25085        let mut result = Vec::new();
25086        self.serialize_into(&mut result);
25087        result
25088    }
25089    fn serialize_into(&self, bytes: &mut Vec<u8>) {
25090        bytes.reserve(4);
25091        u8::from(self.family).serialize_into(bytes);
25092        bytes.extend_from_slice(&[0; 1]);
25093        let address_len = u16::try_from(self.address.len()).expect("`address` has too many elements");
25094        address_len.serialize_into(bytes);
25095        bytes.extend_from_slice(&self.address);
25096        bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
25097    }
25098}
25099impl Host {
25100    /// Get the value of the `address_len` field.
25101    ///
25102    /// The `address_len` field is used as the length field of the `address` field.
25103    /// This function computes the field's value again based on the length of the list.
25104    ///
25105    /// # Panics
25106    ///
25107    /// Panics if the value cannot be represented in the target type. This
25108    /// cannot happen with values of the struct received from the X11 server.
25109    pub fn address_len(&self) -> u16 {
25110        self.address.len()
25111            .try_into().unwrap()
25112    }
25113}
25114
25115/// Opcode for the ListHosts request
25116pub const LIST_HOSTS_REQUEST: u8 = 110;
25117#[derive(Clone, Copy, Default)]
25118#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
25119#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25120pub struct ListHostsRequest;
25121impl_debug_if_no_extra_traits!(ListHostsRequest, "ListHostsRequest");
25122impl ListHostsRequest {
25123    /// Serialize this request into bytes for the provided connection
25124    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
25125        let length_so_far = 0;
25126        let mut request0 = vec![
25127            LIST_HOSTS_REQUEST,
25128            0,
25129            0,
25130            0,
25131        ];
25132        let length_so_far = length_so_far + request0.len();
25133        assert_eq!(length_so_far % 4, 0);
25134        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
25135        request0[2..4].copy_from_slice(&length.to_ne_bytes());
25136        ([request0.into()], vec![])
25137    }
25138    /// Parse this request given its header, its body, and any fds that go along with it
25139    #[cfg(feature = "request-parsing")]
25140    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
25141        if header.major_opcode != LIST_HOSTS_REQUEST {
25142            return Err(ParseError::InvalidValue);
25143        }
25144        let remaining = &[header.minor_opcode];
25145        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
25146        let _ = remaining;
25147        let _ = value;
25148        Ok(ListHostsRequest
25149        )
25150    }
25151}
25152impl Request for ListHostsRequest {
25153    const EXTENSION_NAME: Option<&'static str> = None;
25154
25155    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
25156        let (bufs, fds) = self.serialize();
25157        // Flatten the buffers into a single vector
25158        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
25159        (buf, fds)
25160    }
25161}
25162impl crate::x11_utils::ReplyRequest for ListHostsRequest {
25163    type Reply = ListHostsReply;
25164}
25165
25166#[derive(Clone, Default)]
25167#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
25168#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25169pub struct ListHostsReply {
25170    pub mode: AccessControl,
25171    pub sequence: u16,
25172    pub length: u32,
25173    pub hosts: Vec<Host>,
25174}
25175impl_debug_if_no_extra_traits!(ListHostsReply, "ListHostsReply");
25176impl TryParse for ListHostsReply {
25177    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
25178        let remaining = initial_value;
25179        let (response_type, remaining) = u8::try_parse(remaining)?;
25180        let (mode, remaining) = u8::try_parse(remaining)?;
25181        let (sequence, remaining) = u16::try_parse(remaining)?;
25182        let (length, remaining) = u32::try_parse(remaining)?;
25183        let (hosts_len, remaining) = u16::try_parse(remaining)?;
25184        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
25185        let (hosts, remaining) = crate::x11_utils::parse_list::<Host>(remaining, hosts_len.try_to_usize()?)?;
25186        if response_type != 1 {
25187            return Err(ParseError::InvalidValue);
25188        }
25189        let mode = mode.into();
25190        let result = ListHostsReply { mode, sequence, length, hosts };
25191        let _ = remaining;
25192        let remaining = initial_value.get(32 + length as usize * 4..)
25193            .ok_or(ParseError::InsufficientData)?;
25194        Ok((result, remaining))
25195    }
25196}
25197impl Serialize for ListHostsReply {
25198    type Bytes = Vec<u8>;
25199    fn serialize(&self) -> Vec<u8> {
25200        let mut result = Vec::new();
25201        self.serialize_into(&mut result);
25202        result
25203    }
25204    fn serialize_into(&self, bytes: &mut Vec<u8>) {
25205        bytes.reserve(32);
25206        let response_type_bytes = &[1];
25207        bytes.push(response_type_bytes[0]);
25208        u8::from(self.mode).serialize_into(bytes);
25209        self.sequence.serialize_into(bytes);
25210        self.length.serialize_into(bytes);
25211        let hosts_len = u16::try_from(self.hosts.len()).expect("`hosts` has too many elements");
25212        hosts_len.serialize_into(bytes);
25213        bytes.extend_from_slice(&[0; 22]);
25214        self.hosts.serialize_into(bytes);
25215    }
25216}
25217impl ListHostsReply {
25218    /// Get the value of the `hosts_len` field.
25219    ///
25220    /// The `hosts_len` field is used as the length field of the `hosts` field.
25221    /// This function computes the field's value again based on the length of the list.
25222    ///
25223    /// # Panics
25224    ///
25225    /// Panics if the value cannot be represented in the target type. This
25226    /// cannot happen with values of the struct received from the X11 server.
25227    pub fn hosts_len(&self) -> u16 {
25228        self.hosts.len()
25229            .try_into().unwrap()
25230    }
25231}
25232
25233#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
25234#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25235pub struct AccessControl(u8);
25236impl AccessControl {
25237    pub const DISABLE: Self = Self(0);
25238    pub const ENABLE: Self = Self(1);
25239}
25240impl From<AccessControl> for u8 {
25241    #[inline]
25242    fn from(input: AccessControl) -> Self {
25243        input.0
25244    }
25245}
25246impl From<AccessControl> for Option<u8> {
25247    #[inline]
25248    fn from(input: AccessControl) -> Self {
25249        Some(input.0)
25250    }
25251}
25252impl From<AccessControl> for u16 {
25253    #[inline]
25254    fn from(input: AccessControl) -> Self {
25255        u16::from(input.0)
25256    }
25257}
25258impl From<AccessControl> for Option<u16> {
25259    #[inline]
25260    fn from(input: AccessControl) -> Self {
25261        Some(u16::from(input.0))
25262    }
25263}
25264impl From<AccessControl> for u32 {
25265    #[inline]
25266    fn from(input: AccessControl) -> Self {
25267        u32::from(input.0)
25268    }
25269}
25270impl From<AccessControl> for Option<u32> {
25271    #[inline]
25272    fn from(input: AccessControl) -> Self {
25273        Some(u32::from(input.0))
25274    }
25275}
25276impl From<u8> for AccessControl {
25277    #[inline]
25278    fn from(value: u8) -> Self {
25279        Self(value)
25280    }
25281}
25282impl core::fmt::Debug for AccessControl  {
25283    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
25284        let variants = [
25285            (Self::DISABLE.0.into(), "DISABLE", "Disable"),
25286            (Self::ENABLE.0.into(), "ENABLE", "Enable"),
25287        ];
25288        pretty_print_enum(fmt, self.0.into(), &variants)
25289    }
25290}
25291
25292/// Opcode for the SetAccessControl request
25293pub const SET_ACCESS_CONTROL_REQUEST: u8 = 111;
25294#[derive(Clone, Copy, Default)]
25295#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
25296#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25297pub struct SetAccessControlRequest {
25298    pub mode: AccessControl,
25299}
25300impl_debug_if_no_extra_traits!(SetAccessControlRequest, "SetAccessControlRequest");
25301impl SetAccessControlRequest {
25302    /// Serialize this request into bytes for the provided connection
25303    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
25304        let length_so_far = 0;
25305        let mode_bytes = u8::from(self.mode).serialize();
25306        let mut request0 = vec![
25307            SET_ACCESS_CONTROL_REQUEST,
25308            mode_bytes[0],
25309            0,
25310            0,
25311        ];
25312        let length_so_far = length_so_far + request0.len();
25313        assert_eq!(length_so_far % 4, 0);
25314        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
25315        request0[2..4].copy_from_slice(&length.to_ne_bytes());
25316        ([request0.into()], vec![])
25317    }
25318    /// Parse this request given its header, its body, and any fds that go along with it
25319    #[cfg(feature = "request-parsing")]
25320    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
25321        if header.major_opcode != SET_ACCESS_CONTROL_REQUEST {
25322            return Err(ParseError::InvalidValue);
25323        }
25324        let remaining = &[header.minor_opcode];
25325        let (mode, remaining) = u8::try_parse(remaining)?;
25326        let mode = mode.into();
25327        let _ = remaining;
25328        let _ = value;
25329        Ok(SetAccessControlRequest {
25330            mode,
25331        })
25332    }
25333}
25334impl Request for SetAccessControlRequest {
25335    const EXTENSION_NAME: Option<&'static str> = None;
25336
25337    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
25338        let (bufs, fds) = self.serialize();
25339        // Flatten the buffers into a single vector
25340        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
25341        (buf, fds)
25342    }
25343}
25344impl crate::x11_utils::VoidRequest for SetAccessControlRequest {
25345}
25346
25347#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
25348#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25349pub struct CloseDown(u8);
25350impl CloseDown {
25351    pub const DESTROY_ALL: Self = Self(0);
25352    pub const RETAIN_PERMANENT: Self = Self(1);
25353    pub const RETAIN_TEMPORARY: Self = Self(2);
25354}
25355impl From<CloseDown> for u8 {
25356    #[inline]
25357    fn from(input: CloseDown) -> Self {
25358        input.0
25359    }
25360}
25361impl From<CloseDown> for Option<u8> {
25362    #[inline]
25363    fn from(input: CloseDown) -> Self {
25364        Some(input.0)
25365    }
25366}
25367impl From<CloseDown> for u16 {
25368    #[inline]
25369    fn from(input: CloseDown) -> Self {
25370        u16::from(input.0)
25371    }
25372}
25373impl From<CloseDown> for Option<u16> {
25374    #[inline]
25375    fn from(input: CloseDown) -> Self {
25376        Some(u16::from(input.0))
25377    }
25378}
25379impl From<CloseDown> for u32 {
25380    #[inline]
25381    fn from(input: CloseDown) -> Self {
25382        u32::from(input.0)
25383    }
25384}
25385impl From<CloseDown> for Option<u32> {
25386    #[inline]
25387    fn from(input: CloseDown) -> Self {
25388        Some(u32::from(input.0))
25389    }
25390}
25391impl From<u8> for CloseDown {
25392    #[inline]
25393    fn from(value: u8) -> Self {
25394        Self(value)
25395    }
25396}
25397impl core::fmt::Debug for CloseDown  {
25398    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
25399        let variants = [
25400            (Self::DESTROY_ALL.0.into(), "DESTROY_ALL", "DestroyAll"),
25401            (Self::RETAIN_PERMANENT.0.into(), "RETAIN_PERMANENT", "RetainPermanent"),
25402            (Self::RETAIN_TEMPORARY.0.into(), "RETAIN_TEMPORARY", "RetainTemporary"),
25403        ];
25404        pretty_print_enum(fmt, self.0.into(), &variants)
25405    }
25406}
25407
25408/// Opcode for the SetCloseDownMode request
25409pub const SET_CLOSE_DOWN_MODE_REQUEST: u8 = 112;
25410#[derive(Clone, Copy, Default)]
25411#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
25412#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25413pub struct SetCloseDownModeRequest {
25414    pub mode: CloseDown,
25415}
25416impl_debug_if_no_extra_traits!(SetCloseDownModeRequest, "SetCloseDownModeRequest");
25417impl SetCloseDownModeRequest {
25418    /// Serialize this request into bytes for the provided connection
25419    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
25420        let length_so_far = 0;
25421        let mode_bytes = u8::from(self.mode).serialize();
25422        let mut request0 = vec![
25423            SET_CLOSE_DOWN_MODE_REQUEST,
25424            mode_bytes[0],
25425            0,
25426            0,
25427        ];
25428        let length_so_far = length_so_far + request0.len();
25429        assert_eq!(length_so_far % 4, 0);
25430        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
25431        request0[2..4].copy_from_slice(&length.to_ne_bytes());
25432        ([request0.into()], vec![])
25433    }
25434    /// Parse this request given its header, its body, and any fds that go along with it
25435    #[cfg(feature = "request-parsing")]
25436    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
25437        if header.major_opcode != SET_CLOSE_DOWN_MODE_REQUEST {
25438            return Err(ParseError::InvalidValue);
25439        }
25440        let remaining = &[header.minor_opcode];
25441        let (mode, remaining) = u8::try_parse(remaining)?;
25442        let mode = mode.into();
25443        let _ = remaining;
25444        let _ = value;
25445        Ok(SetCloseDownModeRequest {
25446            mode,
25447        })
25448    }
25449}
25450impl Request for SetCloseDownModeRequest {
25451    const EXTENSION_NAME: Option<&'static str> = None;
25452
25453    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
25454        let (bufs, fds) = self.serialize();
25455        // Flatten the buffers into a single vector
25456        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
25457        (buf, fds)
25458    }
25459}
25460impl crate::x11_utils::VoidRequest for SetCloseDownModeRequest {
25461}
25462
25463#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
25464#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25465pub struct Kill(u8);
25466impl Kill {
25467    pub const ALL_TEMPORARY: Self = Self(0);
25468}
25469impl From<Kill> for u8 {
25470    #[inline]
25471    fn from(input: Kill) -> Self {
25472        input.0
25473    }
25474}
25475impl From<Kill> for Option<u8> {
25476    #[inline]
25477    fn from(input: Kill) -> Self {
25478        Some(input.0)
25479    }
25480}
25481impl From<Kill> for u16 {
25482    #[inline]
25483    fn from(input: Kill) -> Self {
25484        u16::from(input.0)
25485    }
25486}
25487impl From<Kill> for Option<u16> {
25488    #[inline]
25489    fn from(input: Kill) -> Self {
25490        Some(u16::from(input.0))
25491    }
25492}
25493impl From<Kill> for u32 {
25494    #[inline]
25495    fn from(input: Kill) -> Self {
25496        u32::from(input.0)
25497    }
25498}
25499impl From<Kill> for Option<u32> {
25500    #[inline]
25501    fn from(input: Kill) -> Self {
25502        Some(u32::from(input.0))
25503    }
25504}
25505impl From<u8> for Kill {
25506    #[inline]
25507    fn from(value: u8) -> Self {
25508        Self(value)
25509    }
25510}
25511impl core::fmt::Debug for Kill  {
25512    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
25513        let variants = [
25514            (Self::ALL_TEMPORARY.0.into(), "ALL_TEMPORARY", "AllTemporary"),
25515        ];
25516        pretty_print_enum(fmt, self.0.into(), &variants)
25517    }
25518}
25519
25520/// Opcode for the KillClient request
25521pub const KILL_CLIENT_REQUEST: u8 = 113;
25522/// kills a client.
25523///
25524/// Forces a close down of the client that created the specified `resource`.
25525///
25526/// # Fields
25527///
25528/// * `resource` - Any resource belonging to the client (for example a Window), used to identify
25529/// the client connection.
25530///
25531/// The special value of `XCB_KILL_ALL_TEMPORARY`, the resources of all clients
25532/// that have terminated in `RetainTemporary` (TODO) are destroyed.
25533///
25534/// # Errors
25535///
25536/// * `Value` - The specified `resource` does not exist.
25537///
25538/// # See
25539///
25540/// * `xkill`: program
25541#[derive(Clone, Copy, Default)]
25542#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
25543#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25544pub struct KillClientRequest {
25545    pub resource: u32,
25546}
25547impl_debug_if_no_extra_traits!(KillClientRequest, "KillClientRequest");
25548impl KillClientRequest {
25549    /// Serialize this request into bytes for the provided connection
25550    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
25551        let length_so_far = 0;
25552        let resource_bytes = self.resource.serialize();
25553        let mut request0 = vec![
25554            KILL_CLIENT_REQUEST,
25555            0,
25556            0,
25557            0,
25558            resource_bytes[0],
25559            resource_bytes[1],
25560            resource_bytes[2],
25561            resource_bytes[3],
25562        ];
25563        let length_so_far = length_so_far + request0.len();
25564        assert_eq!(length_so_far % 4, 0);
25565        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
25566        request0[2..4].copy_from_slice(&length.to_ne_bytes());
25567        ([request0.into()], vec![])
25568    }
25569    /// Parse this request given its header, its body, and any fds that go along with it
25570    #[cfg(feature = "request-parsing")]
25571    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
25572        if header.major_opcode != KILL_CLIENT_REQUEST {
25573            return Err(ParseError::InvalidValue);
25574        }
25575        let remaining = &[header.minor_opcode];
25576        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
25577        let _ = remaining;
25578        let (resource, remaining) = u32::try_parse(value)?;
25579        let _ = remaining;
25580        Ok(KillClientRequest {
25581            resource,
25582        })
25583    }
25584}
25585impl Request for KillClientRequest {
25586    const EXTENSION_NAME: Option<&'static str> = None;
25587
25588    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
25589        let (bufs, fds) = self.serialize();
25590        // Flatten the buffers into a single vector
25591        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
25592        (buf, fds)
25593    }
25594}
25595impl crate::x11_utils::VoidRequest for KillClientRequest {
25596}
25597
25598/// Opcode for the RotateProperties request
25599pub const ROTATE_PROPERTIES_REQUEST: u8 = 114;
25600#[derive(Clone, Default)]
25601#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
25602#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25603pub struct RotatePropertiesRequest<'input> {
25604    pub window: Window,
25605    pub delta: i16,
25606    pub atoms: Cow<'input, [Atom]>,
25607}
25608impl_debug_if_no_extra_traits!(RotatePropertiesRequest<'_>, "RotatePropertiesRequest");
25609impl<'input> RotatePropertiesRequest<'input> {
25610    /// Serialize this request into bytes for the provided connection
25611    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
25612        let length_so_far = 0;
25613        let window_bytes = self.window.serialize();
25614        let atoms_len = u16::try_from(self.atoms.len()).expect("`atoms` has too many elements");
25615        let atoms_len_bytes = atoms_len.serialize();
25616        let delta_bytes = self.delta.serialize();
25617        let mut request0 = vec![
25618            ROTATE_PROPERTIES_REQUEST,
25619            0,
25620            0,
25621            0,
25622            window_bytes[0],
25623            window_bytes[1],
25624            window_bytes[2],
25625            window_bytes[3],
25626            atoms_len_bytes[0],
25627            atoms_len_bytes[1],
25628            delta_bytes[0],
25629            delta_bytes[1],
25630        ];
25631        let length_so_far = length_so_far + request0.len();
25632        let atoms_bytes = self.atoms.serialize();
25633        let length_so_far = length_so_far + atoms_bytes.len();
25634        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
25635        let length_so_far = length_so_far + padding0.len();
25636        assert_eq!(length_so_far % 4, 0);
25637        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
25638        request0[2..4].copy_from_slice(&length.to_ne_bytes());
25639        ([request0.into(), atoms_bytes.into(), padding0.into()], vec![])
25640    }
25641    /// Parse this request given its header, its body, and any fds that go along with it
25642    #[cfg(feature = "request-parsing")]
25643    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
25644        if header.major_opcode != ROTATE_PROPERTIES_REQUEST {
25645            return Err(ParseError::InvalidValue);
25646        }
25647        let remaining = &[header.minor_opcode];
25648        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
25649        let _ = remaining;
25650        let (window, remaining) = Window::try_parse(value)?;
25651        let (atoms_len, remaining) = u16::try_parse(remaining)?;
25652        let (delta, remaining) = i16::try_parse(remaining)?;
25653        let (atoms, remaining) = crate::x11_utils::parse_list::<Atom>(remaining, atoms_len.try_to_usize()?)?;
25654        let _ = remaining;
25655        Ok(RotatePropertiesRequest {
25656            window,
25657            delta,
25658            atoms: Cow::Owned(atoms),
25659        })
25660    }
25661    /// Clone all borrowed data in this RotatePropertiesRequest.
25662    pub fn into_owned(self) -> RotatePropertiesRequest<'static> {
25663        RotatePropertiesRequest {
25664            window: self.window,
25665            delta: self.delta,
25666            atoms: Cow::Owned(self.atoms.into_owned()),
25667        }
25668    }
25669}
25670impl<'input> Request for RotatePropertiesRequest<'input> {
25671    const EXTENSION_NAME: Option<&'static str> = None;
25672
25673    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
25674        let (bufs, fds) = self.serialize();
25675        // Flatten the buffers into a single vector
25676        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
25677        (buf, fds)
25678    }
25679}
25680impl<'input> crate::x11_utils::VoidRequest for RotatePropertiesRequest<'input> {
25681}
25682
25683#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
25684#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25685pub struct ScreenSaver(u8);
25686impl ScreenSaver {
25687    pub const RESET: Self = Self(0);
25688    pub const ACTIVE: Self = Self(1);
25689}
25690impl From<ScreenSaver> for u8 {
25691    #[inline]
25692    fn from(input: ScreenSaver) -> Self {
25693        input.0
25694    }
25695}
25696impl From<ScreenSaver> for Option<u8> {
25697    #[inline]
25698    fn from(input: ScreenSaver) -> Self {
25699        Some(input.0)
25700    }
25701}
25702impl From<ScreenSaver> for u16 {
25703    #[inline]
25704    fn from(input: ScreenSaver) -> Self {
25705        u16::from(input.0)
25706    }
25707}
25708impl From<ScreenSaver> for Option<u16> {
25709    #[inline]
25710    fn from(input: ScreenSaver) -> Self {
25711        Some(u16::from(input.0))
25712    }
25713}
25714impl From<ScreenSaver> for u32 {
25715    #[inline]
25716    fn from(input: ScreenSaver) -> Self {
25717        u32::from(input.0)
25718    }
25719}
25720impl From<ScreenSaver> for Option<u32> {
25721    #[inline]
25722    fn from(input: ScreenSaver) -> Self {
25723        Some(u32::from(input.0))
25724    }
25725}
25726impl From<u8> for ScreenSaver {
25727    #[inline]
25728    fn from(value: u8) -> Self {
25729        Self(value)
25730    }
25731}
25732impl core::fmt::Debug for ScreenSaver  {
25733    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
25734        let variants = [
25735            (Self::RESET.0.into(), "RESET", "Reset"),
25736            (Self::ACTIVE.0.into(), "ACTIVE", "Active"),
25737        ];
25738        pretty_print_enum(fmt, self.0.into(), &variants)
25739    }
25740}
25741
25742/// Opcode for the ForceScreenSaver request
25743pub const FORCE_SCREEN_SAVER_REQUEST: u8 = 115;
25744#[derive(Clone, Copy, Default)]
25745#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
25746#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25747pub struct ForceScreenSaverRequest {
25748    pub mode: ScreenSaver,
25749}
25750impl_debug_if_no_extra_traits!(ForceScreenSaverRequest, "ForceScreenSaverRequest");
25751impl ForceScreenSaverRequest {
25752    /// Serialize this request into bytes for the provided connection
25753    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
25754        let length_so_far = 0;
25755        let mode_bytes = u8::from(self.mode).serialize();
25756        let mut request0 = vec![
25757            FORCE_SCREEN_SAVER_REQUEST,
25758            mode_bytes[0],
25759            0,
25760            0,
25761        ];
25762        let length_so_far = length_so_far + request0.len();
25763        assert_eq!(length_so_far % 4, 0);
25764        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
25765        request0[2..4].copy_from_slice(&length.to_ne_bytes());
25766        ([request0.into()], vec![])
25767    }
25768    /// Parse this request given its header, its body, and any fds that go along with it
25769    #[cfg(feature = "request-parsing")]
25770    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
25771        if header.major_opcode != FORCE_SCREEN_SAVER_REQUEST {
25772            return Err(ParseError::InvalidValue);
25773        }
25774        let remaining = &[header.minor_opcode];
25775        let (mode, remaining) = u8::try_parse(remaining)?;
25776        let mode = mode.into();
25777        let _ = remaining;
25778        let _ = value;
25779        Ok(ForceScreenSaverRequest {
25780            mode,
25781        })
25782    }
25783}
25784impl Request for ForceScreenSaverRequest {
25785    const EXTENSION_NAME: Option<&'static str> = None;
25786
25787    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
25788        let (bufs, fds) = self.serialize();
25789        // Flatten the buffers into a single vector
25790        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
25791        (buf, fds)
25792    }
25793}
25794impl crate::x11_utils::VoidRequest for ForceScreenSaverRequest {
25795}
25796
25797#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
25798#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25799pub struct MappingStatus(u8);
25800impl MappingStatus {
25801    pub const SUCCESS: Self = Self(0);
25802    pub const BUSY: Self = Self(1);
25803    pub const FAILURE: Self = Self(2);
25804}
25805impl From<MappingStatus> for u8 {
25806    #[inline]
25807    fn from(input: MappingStatus) -> Self {
25808        input.0
25809    }
25810}
25811impl From<MappingStatus> for Option<u8> {
25812    #[inline]
25813    fn from(input: MappingStatus) -> Self {
25814        Some(input.0)
25815    }
25816}
25817impl From<MappingStatus> for u16 {
25818    #[inline]
25819    fn from(input: MappingStatus) -> Self {
25820        u16::from(input.0)
25821    }
25822}
25823impl From<MappingStatus> for Option<u16> {
25824    #[inline]
25825    fn from(input: MappingStatus) -> Self {
25826        Some(u16::from(input.0))
25827    }
25828}
25829impl From<MappingStatus> for u32 {
25830    #[inline]
25831    fn from(input: MappingStatus) -> Self {
25832        u32::from(input.0)
25833    }
25834}
25835impl From<MappingStatus> for Option<u32> {
25836    #[inline]
25837    fn from(input: MappingStatus) -> Self {
25838        Some(u32::from(input.0))
25839    }
25840}
25841impl From<u8> for MappingStatus {
25842    #[inline]
25843    fn from(value: u8) -> Self {
25844        Self(value)
25845    }
25846}
25847impl core::fmt::Debug for MappingStatus  {
25848    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
25849        let variants = [
25850            (Self::SUCCESS.0.into(), "SUCCESS", "Success"),
25851            (Self::BUSY.0.into(), "BUSY", "Busy"),
25852            (Self::FAILURE.0.into(), "FAILURE", "Failure"),
25853        ];
25854        pretty_print_enum(fmt, self.0.into(), &variants)
25855    }
25856}
25857
25858/// Opcode for the SetPointerMapping request
25859pub const SET_POINTER_MAPPING_REQUEST: u8 = 116;
25860#[derive(Clone, Default)]
25861#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
25862#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25863pub struct SetPointerMappingRequest<'input> {
25864    pub map: Cow<'input, [u8]>,
25865}
25866impl_debug_if_no_extra_traits!(SetPointerMappingRequest<'_>, "SetPointerMappingRequest");
25867impl<'input> SetPointerMappingRequest<'input> {
25868    /// Serialize this request into bytes for the provided connection
25869    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
25870        let length_so_far = 0;
25871        let map_len = u8::try_from(self.map.len()).expect("`map` has too many elements");
25872        let map_len_bytes = map_len.serialize();
25873        let mut request0 = vec![
25874            SET_POINTER_MAPPING_REQUEST,
25875            map_len_bytes[0],
25876            0,
25877            0,
25878        ];
25879        let length_so_far = length_so_far + request0.len();
25880        let length_so_far = length_so_far + self.map.len();
25881        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
25882        let length_so_far = length_so_far + padding0.len();
25883        assert_eq!(length_so_far % 4, 0);
25884        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
25885        request0[2..4].copy_from_slice(&length.to_ne_bytes());
25886        ([request0.into(), self.map, padding0.into()], vec![])
25887    }
25888    /// Parse this request given its header, its body, and any fds that go along with it
25889    #[cfg(feature = "request-parsing")]
25890    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
25891        if header.major_opcode != SET_POINTER_MAPPING_REQUEST {
25892            return Err(ParseError::InvalidValue);
25893        }
25894        let remaining = &[header.minor_opcode];
25895        let (map_len, remaining) = u8::try_parse(remaining)?;
25896        let _ = remaining;
25897        let (map, remaining) = crate::x11_utils::parse_u8_list(value, map_len.try_to_usize()?)?;
25898        let _ = remaining;
25899        Ok(SetPointerMappingRequest {
25900            map: Cow::Borrowed(map),
25901        })
25902    }
25903    /// Clone all borrowed data in this SetPointerMappingRequest.
25904    pub fn into_owned(self) -> SetPointerMappingRequest<'static> {
25905        SetPointerMappingRequest {
25906            map: Cow::Owned(self.map.into_owned()),
25907        }
25908    }
25909}
25910impl<'input> Request for SetPointerMappingRequest<'input> {
25911    const EXTENSION_NAME: Option<&'static str> = None;
25912
25913    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
25914        let (bufs, fds) = self.serialize();
25915        // Flatten the buffers into a single vector
25916        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
25917        (buf, fds)
25918    }
25919}
25920impl<'input> crate::x11_utils::ReplyRequest for SetPointerMappingRequest<'input> {
25921    type Reply = SetPointerMappingReply;
25922}
25923
25924#[derive(Clone, Copy, Default)]
25925#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
25926#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25927pub struct SetPointerMappingReply {
25928    pub status: MappingStatus,
25929    pub sequence: u16,
25930    pub length: u32,
25931}
25932impl_debug_if_no_extra_traits!(SetPointerMappingReply, "SetPointerMappingReply");
25933impl TryParse for SetPointerMappingReply {
25934    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
25935        let remaining = initial_value;
25936        let (response_type, remaining) = u8::try_parse(remaining)?;
25937        let (status, remaining) = u8::try_parse(remaining)?;
25938        let (sequence, remaining) = u16::try_parse(remaining)?;
25939        let (length, remaining) = u32::try_parse(remaining)?;
25940        if response_type != 1 {
25941            return Err(ParseError::InvalidValue);
25942        }
25943        let status = status.into();
25944        let result = SetPointerMappingReply { status, sequence, length };
25945        let _ = remaining;
25946        let remaining = initial_value.get(32 + length as usize * 4..)
25947            .ok_or(ParseError::InsufficientData)?;
25948        Ok((result, remaining))
25949    }
25950}
25951impl Serialize for SetPointerMappingReply {
25952    type Bytes = [u8; 8];
25953    fn serialize(&self) -> [u8; 8] {
25954        let response_type_bytes = &[1];
25955        let status_bytes = u8::from(self.status).serialize();
25956        let sequence_bytes = self.sequence.serialize();
25957        let length_bytes = self.length.serialize();
25958        [
25959            response_type_bytes[0],
25960            status_bytes[0],
25961            sequence_bytes[0],
25962            sequence_bytes[1],
25963            length_bytes[0],
25964            length_bytes[1],
25965            length_bytes[2],
25966            length_bytes[3],
25967        ]
25968    }
25969    fn serialize_into(&self, bytes: &mut Vec<u8>) {
25970        bytes.reserve(8);
25971        let response_type_bytes = &[1];
25972        bytes.push(response_type_bytes[0]);
25973        u8::from(self.status).serialize_into(bytes);
25974        self.sequence.serialize_into(bytes);
25975        self.length.serialize_into(bytes);
25976    }
25977}
25978
25979/// Opcode for the GetPointerMapping request
25980pub const GET_POINTER_MAPPING_REQUEST: u8 = 117;
25981#[derive(Clone, Copy, Default)]
25982#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
25983#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25984pub struct GetPointerMappingRequest;
25985impl_debug_if_no_extra_traits!(GetPointerMappingRequest, "GetPointerMappingRequest");
25986impl GetPointerMappingRequest {
25987    /// Serialize this request into bytes for the provided connection
25988    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
25989        let length_so_far = 0;
25990        let mut request0 = vec![
25991            GET_POINTER_MAPPING_REQUEST,
25992            0,
25993            0,
25994            0,
25995        ];
25996        let length_so_far = length_so_far + request0.len();
25997        assert_eq!(length_so_far % 4, 0);
25998        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
25999        request0[2..4].copy_from_slice(&length.to_ne_bytes());
26000        ([request0.into()], vec![])
26001    }
26002    /// Parse this request given its header, its body, and any fds that go along with it
26003    #[cfg(feature = "request-parsing")]
26004    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
26005        if header.major_opcode != GET_POINTER_MAPPING_REQUEST {
26006            return Err(ParseError::InvalidValue);
26007        }
26008        let remaining = &[header.minor_opcode];
26009        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
26010        let _ = remaining;
26011        let _ = value;
26012        Ok(GetPointerMappingRequest
26013        )
26014    }
26015}
26016impl Request for GetPointerMappingRequest {
26017    const EXTENSION_NAME: Option<&'static str> = None;
26018
26019    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
26020        let (bufs, fds) = self.serialize();
26021        // Flatten the buffers into a single vector
26022        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
26023        (buf, fds)
26024    }
26025}
26026impl crate::x11_utils::ReplyRequest for GetPointerMappingRequest {
26027    type Reply = GetPointerMappingReply;
26028}
26029
26030#[derive(Clone, Default)]
26031#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
26032#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
26033pub struct GetPointerMappingReply {
26034    pub sequence: u16,
26035    pub length: u32,
26036    pub map: Vec<u8>,
26037}
26038impl_debug_if_no_extra_traits!(GetPointerMappingReply, "GetPointerMappingReply");
26039impl TryParse for GetPointerMappingReply {
26040    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
26041        let remaining = initial_value;
26042        let (response_type, remaining) = u8::try_parse(remaining)?;
26043        let (map_len, remaining) = u8::try_parse(remaining)?;
26044        let (sequence, remaining) = u16::try_parse(remaining)?;
26045        let (length, remaining) = u32::try_parse(remaining)?;
26046        let remaining = remaining.get(24..).ok_or(ParseError::InsufficientData)?;
26047        let (map, remaining) = crate::x11_utils::parse_u8_list(remaining, map_len.try_to_usize()?)?;
26048        let map = map.to_vec();
26049        if response_type != 1 {
26050            return Err(ParseError::InvalidValue);
26051        }
26052        let result = GetPointerMappingReply { sequence, length, map };
26053        let _ = remaining;
26054        let remaining = initial_value.get(32 + length as usize * 4..)
26055            .ok_or(ParseError::InsufficientData)?;
26056        Ok((result, remaining))
26057    }
26058}
26059impl Serialize for GetPointerMappingReply {
26060    type Bytes = Vec<u8>;
26061    fn serialize(&self) -> Vec<u8> {
26062        let mut result = Vec::new();
26063        self.serialize_into(&mut result);
26064        result
26065    }
26066    fn serialize_into(&self, bytes: &mut Vec<u8>) {
26067        bytes.reserve(32);
26068        let response_type_bytes = &[1];
26069        bytes.push(response_type_bytes[0]);
26070        let map_len = u8::try_from(self.map.len()).expect("`map` has too many elements");
26071        map_len.serialize_into(bytes);
26072        self.sequence.serialize_into(bytes);
26073        self.length.serialize_into(bytes);
26074        bytes.extend_from_slice(&[0; 24]);
26075        bytes.extend_from_slice(&self.map);
26076    }
26077}
26078impl GetPointerMappingReply {
26079    /// Get the value of the `map_len` field.
26080    ///
26081    /// The `map_len` field is used as the length field of the `map` field.
26082    /// This function computes the field's value again based on the length of the list.
26083    ///
26084    /// # Panics
26085    ///
26086    /// Panics if the value cannot be represented in the target type. This
26087    /// cannot happen with values of the struct received from the X11 server.
26088    pub fn map_len(&self) -> u8 {
26089        self.map.len()
26090            .try_into().unwrap()
26091    }
26092}
26093
26094#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
26095#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
26096pub struct MapIndex(u8);
26097impl MapIndex {
26098    pub const SHIFT: Self = Self(0);
26099    pub const LOCK: Self = Self(1);
26100    pub const CONTROL: Self = Self(2);
26101    pub const M1: Self = Self(3);
26102    pub const M2: Self = Self(4);
26103    pub const M3: Self = Self(5);
26104    pub const M4: Self = Self(6);
26105    pub const M5: Self = Self(7);
26106}
26107impl From<MapIndex> for u8 {
26108    #[inline]
26109    fn from(input: MapIndex) -> Self {
26110        input.0
26111    }
26112}
26113impl From<MapIndex> for Option<u8> {
26114    #[inline]
26115    fn from(input: MapIndex) -> Self {
26116        Some(input.0)
26117    }
26118}
26119impl From<MapIndex> for u16 {
26120    #[inline]
26121    fn from(input: MapIndex) -> Self {
26122        u16::from(input.0)
26123    }
26124}
26125impl From<MapIndex> for Option<u16> {
26126    #[inline]
26127    fn from(input: MapIndex) -> Self {
26128        Some(u16::from(input.0))
26129    }
26130}
26131impl From<MapIndex> for u32 {
26132    #[inline]
26133    fn from(input: MapIndex) -> Self {
26134        u32::from(input.0)
26135    }
26136}
26137impl From<MapIndex> for Option<u32> {
26138    #[inline]
26139    fn from(input: MapIndex) -> Self {
26140        Some(u32::from(input.0))
26141    }
26142}
26143impl From<u8> for MapIndex {
26144    #[inline]
26145    fn from(value: u8) -> Self {
26146        Self(value)
26147    }
26148}
26149impl core::fmt::Debug for MapIndex  {
26150    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
26151        let variants = [
26152            (Self::SHIFT.0.into(), "SHIFT", "Shift"),
26153            (Self::LOCK.0.into(), "LOCK", "Lock"),
26154            (Self::CONTROL.0.into(), "CONTROL", "Control"),
26155            (Self::M1.0.into(), "M1", "M1"),
26156            (Self::M2.0.into(), "M2", "M2"),
26157            (Self::M3.0.into(), "M3", "M3"),
26158            (Self::M4.0.into(), "M4", "M4"),
26159            (Self::M5.0.into(), "M5", "M5"),
26160        ];
26161        pretty_print_enum(fmt, self.0.into(), &variants)
26162    }
26163}
26164
26165/// Opcode for the SetModifierMapping request
26166pub const SET_MODIFIER_MAPPING_REQUEST: u8 = 118;
26167#[derive(Clone, Default)]
26168#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
26169#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
26170pub struct SetModifierMappingRequest<'input> {
26171    pub keycodes: Cow<'input, [Keycode]>,
26172}
26173impl_debug_if_no_extra_traits!(SetModifierMappingRequest<'_>, "SetModifierMappingRequest");
26174impl<'input> SetModifierMappingRequest<'input> {
26175    /// Serialize this request into bytes for the provided connection
26176    pub fn serialize(self) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
26177        let length_so_far = 0;
26178        assert_eq!(self.keycodes.len() % 8, 0, "`keycodes` has an incorrect length, must be a multiple of 8");
26179        let keycodes_per_modifier = u8::try_from(self.keycodes.len() / 8).expect("`keycodes` has too many elements");
26180        let keycodes_per_modifier_bytes = keycodes_per_modifier.serialize();
26181        let mut request0 = vec![
26182            SET_MODIFIER_MAPPING_REQUEST,
26183            keycodes_per_modifier_bytes[0],
26184            0,
26185            0,
26186        ];
26187        let length_so_far = length_so_far + request0.len();
26188        let length_so_far = length_so_far + self.keycodes.len();
26189        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
26190        let length_so_far = length_so_far + padding0.len();
26191        assert_eq!(length_so_far % 4, 0);
26192        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
26193        request0[2..4].copy_from_slice(&length.to_ne_bytes());
26194        ([request0.into(), self.keycodes, padding0.into()], vec![])
26195    }
26196    /// Parse this request given its header, its body, and any fds that go along with it
26197    #[cfg(feature = "request-parsing")]
26198    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
26199        if header.major_opcode != SET_MODIFIER_MAPPING_REQUEST {
26200            return Err(ParseError::InvalidValue);
26201        }
26202        let remaining = &[header.minor_opcode];
26203        let (keycodes_per_modifier, remaining) = u8::try_parse(remaining)?;
26204        let _ = remaining;
26205        let (keycodes, remaining) = crate::x11_utils::parse_u8_list(value, u32::from(keycodes_per_modifier).checked_mul(8u32).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
26206        let _ = remaining;
26207        Ok(SetModifierMappingRequest {
26208            keycodes: Cow::Borrowed(keycodes),
26209        })
26210    }
26211    /// Clone all borrowed data in this SetModifierMappingRequest.
26212    pub fn into_owned(self) -> SetModifierMappingRequest<'static> {
26213        SetModifierMappingRequest {
26214            keycodes: Cow::Owned(self.keycodes.into_owned()),
26215        }
26216    }
26217}
26218impl<'input> Request for SetModifierMappingRequest<'input> {
26219    const EXTENSION_NAME: Option<&'static str> = None;
26220
26221    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
26222        let (bufs, fds) = self.serialize();
26223        // Flatten the buffers into a single vector
26224        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
26225        (buf, fds)
26226    }
26227}
26228impl<'input> crate::x11_utils::ReplyRequest for SetModifierMappingRequest<'input> {
26229    type Reply = SetModifierMappingReply;
26230}
26231
26232#[derive(Clone, Copy, Default)]
26233#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
26234#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
26235pub struct SetModifierMappingReply {
26236    pub status: MappingStatus,
26237    pub sequence: u16,
26238    pub length: u32,
26239}
26240impl_debug_if_no_extra_traits!(SetModifierMappingReply, "SetModifierMappingReply");
26241impl TryParse for SetModifierMappingReply {
26242    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
26243        let remaining = initial_value;
26244        let (response_type, remaining) = u8::try_parse(remaining)?;
26245        let (status, remaining) = u8::try_parse(remaining)?;
26246        let (sequence, remaining) = u16::try_parse(remaining)?;
26247        let (length, remaining) = u32::try_parse(remaining)?;
26248        if response_type != 1 {
26249            return Err(ParseError::InvalidValue);
26250        }
26251        let status = status.into();
26252        let result = SetModifierMappingReply { status, sequence, length };
26253        let _ = remaining;
26254        let remaining = initial_value.get(32 + length as usize * 4..)
26255            .ok_or(ParseError::InsufficientData)?;
26256        Ok((result, remaining))
26257    }
26258}
26259impl Serialize for SetModifierMappingReply {
26260    type Bytes = [u8; 8];
26261    fn serialize(&self) -> [u8; 8] {
26262        let response_type_bytes = &[1];
26263        let status_bytes = u8::from(self.status).serialize();
26264        let sequence_bytes = self.sequence.serialize();
26265        let length_bytes = self.length.serialize();
26266        [
26267            response_type_bytes[0],
26268            status_bytes[0],
26269            sequence_bytes[0],
26270            sequence_bytes[1],
26271            length_bytes[0],
26272            length_bytes[1],
26273            length_bytes[2],
26274            length_bytes[3],
26275        ]
26276    }
26277    fn serialize_into(&self, bytes: &mut Vec<u8>) {
26278        bytes.reserve(8);
26279        let response_type_bytes = &[1];
26280        bytes.push(response_type_bytes[0]);
26281        u8::from(self.status).serialize_into(bytes);
26282        self.sequence.serialize_into(bytes);
26283        self.length.serialize_into(bytes);
26284    }
26285}
26286
26287/// Opcode for the GetModifierMapping request
26288pub const GET_MODIFIER_MAPPING_REQUEST: u8 = 119;
26289#[derive(Clone, Copy, Default)]
26290#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
26291#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
26292pub struct GetModifierMappingRequest;
26293impl_debug_if_no_extra_traits!(GetModifierMappingRequest, "GetModifierMappingRequest");
26294impl GetModifierMappingRequest {
26295    /// Serialize this request into bytes for the provided connection
26296    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
26297        let length_so_far = 0;
26298        let mut request0 = vec![
26299            GET_MODIFIER_MAPPING_REQUEST,
26300            0,
26301            0,
26302            0,
26303        ];
26304        let length_so_far = length_so_far + request0.len();
26305        assert_eq!(length_so_far % 4, 0);
26306        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
26307        request0[2..4].copy_from_slice(&length.to_ne_bytes());
26308        ([request0.into()], vec![])
26309    }
26310    /// Parse this request given its header, its body, and any fds that go along with it
26311    #[cfg(feature = "request-parsing")]
26312    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
26313        if header.major_opcode != GET_MODIFIER_MAPPING_REQUEST {
26314            return Err(ParseError::InvalidValue);
26315        }
26316        let remaining = &[header.minor_opcode];
26317        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
26318        let _ = remaining;
26319        let _ = value;
26320        Ok(GetModifierMappingRequest
26321        )
26322    }
26323}
26324impl Request for GetModifierMappingRequest {
26325    const EXTENSION_NAME: Option<&'static str> = None;
26326
26327    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
26328        let (bufs, fds) = self.serialize();
26329        // Flatten the buffers into a single vector
26330        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
26331        (buf, fds)
26332    }
26333}
26334impl crate::x11_utils::ReplyRequest for GetModifierMappingRequest {
26335    type Reply = GetModifierMappingReply;
26336}
26337
26338#[derive(Clone, Default)]
26339#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
26340#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
26341pub struct GetModifierMappingReply {
26342    pub sequence: u16,
26343    pub length: u32,
26344    pub keycodes: Vec<Keycode>,
26345}
26346impl_debug_if_no_extra_traits!(GetModifierMappingReply, "GetModifierMappingReply");
26347impl TryParse for GetModifierMappingReply {
26348    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
26349        let remaining = initial_value;
26350        let (response_type, remaining) = u8::try_parse(remaining)?;
26351        let (keycodes_per_modifier, remaining) = u8::try_parse(remaining)?;
26352        let (sequence, remaining) = u16::try_parse(remaining)?;
26353        let (length, remaining) = u32::try_parse(remaining)?;
26354        let remaining = remaining.get(24..).ok_or(ParseError::InsufficientData)?;
26355        let (keycodes, remaining) = crate::x11_utils::parse_u8_list(remaining, u32::from(keycodes_per_modifier).checked_mul(8u32).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
26356        let keycodes = keycodes.to_vec();
26357        if response_type != 1 {
26358            return Err(ParseError::InvalidValue);
26359        }
26360        let result = GetModifierMappingReply { sequence, length, keycodes };
26361        let _ = remaining;
26362        let remaining = initial_value.get(32 + length as usize * 4..)
26363            .ok_or(ParseError::InsufficientData)?;
26364        Ok((result, remaining))
26365    }
26366}
26367impl Serialize for GetModifierMappingReply {
26368    type Bytes = Vec<u8>;
26369    fn serialize(&self) -> Vec<u8> {
26370        let mut result = Vec::new();
26371        self.serialize_into(&mut result);
26372        result
26373    }
26374    fn serialize_into(&self, bytes: &mut Vec<u8>) {
26375        bytes.reserve(32);
26376        let response_type_bytes = &[1];
26377        bytes.push(response_type_bytes[0]);
26378        assert_eq!(self.keycodes.len() % 8, 0, "`keycodes` has an incorrect length, must be a multiple of 8");
26379        let keycodes_per_modifier = u8::try_from(self.keycodes.len() / 8).expect("`keycodes` has too many elements");
26380        keycodes_per_modifier.serialize_into(bytes);
26381        self.sequence.serialize_into(bytes);
26382        self.length.serialize_into(bytes);
26383        bytes.extend_from_slice(&[0; 24]);
26384        bytes.extend_from_slice(&self.keycodes);
26385    }
26386}
26387impl GetModifierMappingReply {
26388    /// Get the value of the `keycodes_per_modifier` field.
26389    ///
26390    /// The `keycodes_per_modifier` field is used as the length field of the `keycodes` field.
26391    /// This function computes the field's value again based on the length of the list.
26392    ///
26393    /// # Panics
26394    ///
26395    /// Panics if the value cannot be represented in the target type. This
26396    /// cannot happen with values of the struct received from the X11 server.
26397    pub fn keycodes_per_modifier(&self) -> u8 {
26398        self.keycodes.len()
26399            .checked_div(8).unwrap()
26400            .try_into().unwrap()
26401    }
26402}
26403
26404/// Opcode for the NoOperation request
26405pub const NO_OPERATION_REQUEST: u8 = 127;
26406#[derive(Clone, Copy, Default)]
26407#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
26408#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
26409pub struct NoOperationRequest;
26410impl_debug_if_no_extra_traits!(NoOperationRequest, "NoOperationRequest");
26411impl NoOperationRequest {
26412    /// Serialize this request into bytes for the provided connection
26413    pub fn serialize(self) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
26414        let length_so_far = 0;
26415        let mut request0 = vec![
26416            NO_OPERATION_REQUEST,
26417            0,
26418            0,
26419            0,
26420        ];
26421        let length_so_far = length_so_far + request0.len();
26422        assert_eq!(length_so_far % 4, 0);
26423        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
26424        request0[2..4].copy_from_slice(&length.to_ne_bytes());
26425        ([request0.into()], vec![])
26426    }
26427    /// Parse this request given its header, its body, and any fds that go along with it
26428    #[cfg(feature = "request-parsing")]
26429    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
26430        if header.major_opcode != NO_OPERATION_REQUEST {
26431            return Err(ParseError::InvalidValue);
26432        }
26433        let remaining = &[header.minor_opcode];
26434        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
26435        let _ = remaining;
26436        let _ = value;
26437        Ok(NoOperationRequest
26438        )
26439    }
26440}
26441impl Request for NoOperationRequest {
26442    const EXTENSION_NAME: Option<&'static str> = None;
26443
26444    fn serialize(self, _major_opcode: u8) -> BufWithFds<Vec<u8>> {
26445        let (bufs, fds) = self.serialize();
26446        // Flatten the buffers into a single vector
26447        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
26448        (buf, fds)
26449    }
26450}
26451impl crate::x11_utils::VoidRequest for NoOperationRequest {
26452}
26453