x11rb_protocol/protocol/
xinput.rs

1// This file contains generated code. Do not edit directly.
2// To regenerate this, run 'make'.
3
4//! Bindings to the `Input` X11 extension.
5
6#![allow(clippy::too_many_arguments)]
7// The code generator is simpler if it can always use conversions
8#![allow(clippy::useless_conversion)]
9
10#[allow(unused_imports)]
11use alloc::borrow::Cow;
12#[allow(unused_imports)]
13use core::convert::TryInto;
14use alloc::vec;
15use alloc::vec::Vec;
16use core::convert::TryFrom;
17use crate::errors::ParseError;
18#[allow(unused_imports)]
19use crate::x11_utils::TryIntoUSize;
20use crate::BufWithFds;
21#[allow(unused_imports)]
22use crate::utils::{RawFdContainer, pretty_print_bitmask, pretty_print_enum};
23#[allow(unused_imports)]
24use crate::x11_utils::{Request, RequestHeader, Serialize, TryParse, TryParseFd};
25#[allow(unused_imports)]
26use super::xfixes;
27#[allow(unused_imports)]
28use super::xproto;
29
30/// The X11 name of the extension for QueryExtension
31pub const X11_EXTENSION_NAME: &str = "XInputExtension";
32
33/// The version number of this extension that this client library supports.
34///
35/// This constant contains the version number of this extension that is supported
36/// by this build of x11rb. For most things, it does not make sense to use this
37/// information. If you need to send a `QueryVersion`, it is recommended to instead
38/// send the maximum version of the extension that you need.
39pub const X11_XML_VERSION: (u32, u32) = (2, 4);
40
41pub type EventClass = u32;
42
43pub type KeyCode = u8;
44
45pub type DeviceId = u16;
46
47pub type Fp1616 = i32;
48
49#[derive(Clone, Copy, Default)]
50#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
51#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
52pub struct Fp3232 {
53    pub integral: i32,
54    pub frac: u32,
55}
56impl_debug_if_no_extra_traits!(Fp3232, "Fp3232");
57impl TryParse for Fp3232 {
58    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
59        let (integral, remaining) = i32::try_parse(remaining)?;
60        let (frac, remaining) = u32::try_parse(remaining)?;
61        let result = Fp3232 { integral, frac };
62        Ok((result, remaining))
63    }
64}
65impl Serialize for Fp3232 {
66    type Bytes = [u8; 8];
67    fn serialize(&self) -> [u8; 8] {
68        let integral_bytes = self.integral.serialize();
69        let frac_bytes = self.frac.serialize();
70        [
71            integral_bytes[0],
72            integral_bytes[1],
73            integral_bytes[2],
74            integral_bytes[3],
75            frac_bytes[0],
76            frac_bytes[1],
77            frac_bytes[2],
78            frac_bytes[3],
79        ]
80    }
81    fn serialize_into(&self, bytes: &mut Vec<u8>) {
82        bytes.reserve(8);
83        self.integral.serialize_into(bytes);
84        self.frac.serialize_into(bytes);
85    }
86}
87
88/// Opcode for the GetExtensionVersion request
89pub const GET_EXTENSION_VERSION_REQUEST: u8 = 1;
90#[derive(Clone, Default)]
91#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
92#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
93pub struct GetExtensionVersionRequest<'input> {
94    pub name: Cow<'input, [u8]>,
95}
96impl_debug_if_no_extra_traits!(GetExtensionVersionRequest<'_>, "GetExtensionVersionRequest");
97impl<'input> GetExtensionVersionRequest<'input> {
98    /// Serialize this request into bytes for the provided connection
99    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
100        let length_so_far = 0;
101        let name_len = u16::try_from(self.name.len()).expect("`name` has too many elements");
102        let name_len_bytes = name_len.serialize();
103        let mut request0 = vec![
104            major_opcode,
105            GET_EXTENSION_VERSION_REQUEST,
106            0,
107            0,
108            name_len_bytes[0],
109            name_len_bytes[1],
110            0,
111            0,
112        ];
113        let length_so_far = length_so_far + request0.len();
114        let length_so_far = length_so_far + self.name.len();
115        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
116        let length_so_far = length_so_far + padding0.len();
117        assert_eq!(length_so_far % 4, 0);
118        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
119        request0[2..4].copy_from_slice(&length.to_ne_bytes());
120        ([request0.into(), self.name, padding0.into()], vec![])
121    }
122    /// Parse this request given its header, its body, and any fds that go along with it
123    #[cfg(feature = "request-parsing")]
124    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
125        if header.minor_opcode != GET_EXTENSION_VERSION_REQUEST {
126            return Err(ParseError::InvalidValue);
127        }
128        let (name_len, remaining) = u16::try_parse(value)?;
129        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
130        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_len.try_to_usize()?)?;
131        let _ = remaining;
132        Ok(GetExtensionVersionRequest {
133            name: Cow::Borrowed(name),
134        })
135    }
136    /// Clone all borrowed data in this GetExtensionVersionRequest.
137    pub fn into_owned(self) -> GetExtensionVersionRequest<'static> {
138        GetExtensionVersionRequest {
139            name: Cow::Owned(self.name.into_owned()),
140        }
141    }
142}
143impl<'input> Request for GetExtensionVersionRequest<'input> {
144    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
145
146    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
147        let (bufs, fds) = self.serialize(major_opcode);
148        // Flatten the buffers into a single vector
149        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
150        (buf, fds)
151    }
152}
153impl<'input> crate::x11_utils::ReplyRequest for GetExtensionVersionRequest<'input> {
154    type Reply = GetExtensionVersionReply;
155}
156
157#[derive(Clone, Copy, Default)]
158#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
159#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
160pub struct GetExtensionVersionReply {
161    pub xi_reply_type: u8,
162    pub sequence: u16,
163    pub length: u32,
164    pub server_major: u16,
165    pub server_minor: u16,
166    pub present: bool,
167}
168impl_debug_if_no_extra_traits!(GetExtensionVersionReply, "GetExtensionVersionReply");
169impl TryParse for GetExtensionVersionReply {
170    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
171        let remaining = initial_value;
172        let (response_type, remaining) = u8::try_parse(remaining)?;
173        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
174        let (sequence, remaining) = u16::try_parse(remaining)?;
175        let (length, remaining) = u32::try_parse(remaining)?;
176        let (server_major, remaining) = u16::try_parse(remaining)?;
177        let (server_minor, remaining) = u16::try_parse(remaining)?;
178        let (present, remaining) = bool::try_parse(remaining)?;
179        let remaining = remaining.get(19..).ok_or(ParseError::InsufficientData)?;
180        if response_type != 1 {
181            return Err(ParseError::InvalidValue);
182        }
183        let result = GetExtensionVersionReply { xi_reply_type, sequence, length, server_major, server_minor, present };
184        let _ = remaining;
185        let remaining = initial_value.get(32 + length as usize * 4..)
186            .ok_or(ParseError::InsufficientData)?;
187        Ok((result, remaining))
188    }
189}
190impl Serialize for GetExtensionVersionReply {
191    type Bytes = [u8; 32];
192    fn serialize(&self) -> [u8; 32] {
193        let response_type_bytes = &[1];
194        let xi_reply_type_bytes = self.xi_reply_type.serialize();
195        let sequence_bytes = self.sequence.serialize();
196        let length_bytes = self.length.serialize();
197        let server_major_bytes = self.server_major.serialize();
198        let server_minor_bytes = self.server_minor.serialize();
199        let present_bytes = self.present.serialize();
200        [
201            response_type_bytes[0],
202            xi_reply_type_bytes[0],
203            sequence_bytes[0],
204            sequence_bytes[1],
205            length_bytes[0],
206            length_bytes[1],
207            length_bytes[2],
208            length_bytes[3],
209            server_major_bytes[0],
210            server_major_bytes[1],
211            server_minor_bytes[0],
212            server_minor_bytes[1],
213            present_bytes[0],
214            0,
215            0,
216            0,
217            0,
218            0,
219            0,
220            0,
221            0,
222            0,
223            0,
224            0,
225            0,
226            0,
227            0,
228            0,
229            0,
230            0,
231            0,
232            0,
233        ]
234    }
235    fn serialize_into(&self, bytes: &mut Vec<u8>) {
236        bytes.reserve(32);
237        let response_type_bytes = &[1];
238        bytes.push(response_type_bytes[0]);
239        self.xi_reply_type.serialize_into(bytes);
240        self.sequence.serialize_into(bytes);
241        self.length.serialize_into(bytes);
242        self.server_major.serialize_into(bytes);
243        self.server_minor.serialize_into(bytes);
244        self.present.serialize_into(bytes);
245        bytes.extend_from_slice(&[0; 19]);
246    }
247}
248
249#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
250#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
251pub struct DeviceUse(u8);
252impl DeviceUse {
253    pub const IS_X_POINTER: Self = Self(0);
254    pub const IS_X_KEYBOARD: Self = Self(1);
255    pub const IS_X_EXTENSION_DEVICE: Self = Self(2);
256    pub const IS_X_EXTENSION_KEYBOARD: Self = Self(3);
257    pub const IS_X_EXTENSION_POINTER: Self = Self(4);
258}
259impl From<DeviceUse> for u8 {
260    #[inline]
261    fn from(input: DeviceUse) -> Self {
262        input.0
263    }
264}
265impl From<DeviceUse> for Option<u8> {
266    #[inline]
267    fn from(input: DeviceUse) -> Self {
268        Some(input.0)
269    }
270}
271impl From<DeviceUse> for u16 {
272    #[inline]
273    fn from(input: DeviceUse) -> Self {
274        u16::from(input.0)
275    }
276}
277impl From<DeviceUse> for Option<u16> {
278    #[inline]
279    fn from(input: DeviceUse) -> Self {
280        Some(u16::from(input.0))
281    }
282}
283impl From<DeviceUse> for u32 {
284    #[inline]
285    fn from(input: DeviceUse) -> Self {
286        u32::from(input.0)
287    }
288}
289impl From<DeviceUse> for Option<u32> {
290    #[inline]
291    fn from(input: DeviceUse) -> Self {
292        Some(u32::from(input.0))
293    }
294}
295impl From<u8> for DeviceUse {
296    #[inline]
297    fn from(value: u8) -> Self {
298        Self(value)
299    }
300}
301impl core::fmt::Debug for DeviceUse  {
302    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
303        let variants = [
304            (Self::IS_X_POINTER.0.into(), "IS_X_POINTER", "IsXPointer"),
305            (Self::IS_X_KEYBOARD.0.into(), "IS_X_KEYBOARD", "IsXKeyboard"),
306            (Self::IS_X_EXTENSION_DEVICE.0.into(), "IS_X_EXTENSION_DEVICE", "IsXExtensionDevice"),
307            (Self::IS_X_EXTENSION_KEYBOARD.0.into(), "IS_X_EXTENSION_KEYBOARD", "IsXExtensionKeyboard"),
308            (Self::IS_X_EXTENSION_POINTER.0.into(), "IS_X_EXTENSION_POINTER", "IsXExtensionPointer"),
309        ];
310        pretty_print_enum(fmt, self.0.into(), &variants)
311    }
312}
313
314#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
315#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
316pub struct InputClass(u8);
317impl InputClass {
318    pub const KEY: Self = Self(0);
319    pub const BUTTON: Self = Self(1);
320    pub const VALUATOR: Self = Self(2);
321    pub const FEEDBACK: Self = Self(3);
322    pub const PROXIMITY: Self = Self(4);
323    pub const FOCUS: Self = Self(5);
324    pub const OTHER: Self = Self(6);
325}
326impl From<InputClass> for u8 {
327    #[inline]
328    fn from(input: InputClass) -> Self {
329        input.0
330    }
331}
332impl From<InputClass> for Option<u8> {
333    #[inline]
334    fn from(input: InputClass) -> Self {
335        Some(input.0)
336    }
337}
338impl From<InputClass> for u16 {
339    #[inline]
340    fn from(input: InputClass) -> Self {
341        u16::from(input.0)
342    }
343}
344impl From<InputClass> for Option<u16> {
345    #[inline]
346    fn from(input: InputClass) -> Self {
347        Some(u16::from(input.0))
348    }
349}
350impl From<InputClass> for u32 {
351    #[inline]
352    fn from(input: InputClass) -> Self {
353        u32::from(input.0)
354    }
355}
356impl From<InputClass> for Option<u32> {
357    #[inline]
358    fn from(input: InputClass) -> Self {
359        Some(u32::from(input.0))
360    }
361}
362impl From<u8> for InputClass {
363    #[inline]
364    fn from(value: u8) -> Self {
365        Self(value)
366    }
367}
368impl core::fmt::Debug for InputClass  {
369    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
370        let variants = [
371            (Self::KEY.0.into(), "KEY", "Key"),
372            (Self::BUTTON.0.into(), "BUTTON", "Button"),
373            (Self::VALUATOR.0.into(), "VALUATOR", "Valuator"),
374            (Self::FEEDBACK.0.into(), "FEEDBACK", "Feedback"),
375            (Self::PROXIMITY.0.into(), "PROXIMITY", "Proximity"),
376            (Self::FOCUS.0.into(), "FOCUS", "Focus"),
377            (Self::OTHER.0.into(), "OTHER", "Other"),
378        ];
379        pretty_print_enum(fmt, self.0.into(), &variants)
380    }
381}
382
383#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
384#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
385pub struct ValuatorMode(u8);
386impl ValuatorMode {
387    pub const RELATIVE: Self = Self(0);
388    pub const ABSOLUTE: Self = Self(1);
389}
390impl From<ValuatorMode> for u8 {
391    #[inline]
392    fn from(input: ValuatorMode) -> Self {
393        input.0
394    }
395}
396impl From<ValuatorMode> for Option<u8> {
397    #[inline]
398    fn from(input: ValuatorMode) -> Self {
399        Some(input.0)
400    }
401}
402impl From<ValuatorMode> for u16 {
403    #[inline]
404    fn from(input: ValuatorMode) -> Self {
405        u16::from(input.0)
406    }
407}
408impl From<ValuatorMode> for Option<u16> {
409    #[inline]
410    fn from(input: ValuatorMode) -> Self {
411        Some(u16::from(input.0))
412    }
413}
414impl From<ValuatorMode> for u32 {
415    #[inline]
416    fn from(input: ValuatorMode) -> Self {
417        u32::from(input.0)
418    }
419}
420impl From<ValuatorMode> for Option<u32> {
421    #[inline]
422    fn from(input: ValuatorMode) -> Self {
423        Some(u32::from(input.0))
424    }
425}
426impl From<u8> for ValuatorMode {
427    #[inline]
428    fn from(value: u8) -> Self {
429        Self(value)
430    }
431}
432impl core::fmt::Debug for ValuatorMode  {
433    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
434        let variants = [
435            (Self::RELATIVE.0.into(), "RELATIVE", "Relative"),
436            (Self::ABSOLUTE.0.into(), "ABSOLUTE", "Absolute"),
437        ];
438        pretty_print_enum(fmt, self.0.into(), &variants)
439    }
440}
441
442#[derive(Clone, Copy, Default)]
443#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
444#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
445pub struct DeviceInfo {
446    pub device_type: xproto::Atom,
447    pub device_id: u8,
448    pub num_class_info: u8,
449    pub device_use: DeviceUse,
450}
451impl_debug_if_no_extra_traits!(DeviceInfo, "DeviceInfo");
452impl TryParse for DeviceInfo {
453    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
454        let (device_type, remaining) = xproto::Atom::try_parse(remaining)?;
455        let (device_id, remaining) = u8::try_parse(remaining)?;
456        let (num_class_info, remaining) = u8::try_parse(remaining)?;
457        let (device_use, remaining) = u8::try_parse(remaining)?;
458        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
459        let device_use = device_use.into();
460        let result = DeviceInfo { device_type, device_id, num_class_info, device_use };
461        Ok((result, remaining))
462    }
463}
464impl Serialize for DeviceInfo {
465    type Bytes = [u8; 8];
466    fn serialize(&self) -> [u8; 8] {
467        let device_type_bytes = self.device_type.serialize();
468        let device_id_bytes = self.device_id.serialize();
469        let num_class_info_bytes = self.num_class_info.serialize();
470        let device_use_bytes = u8::from(self.device_use).serialize();
471        [
472            device_type_bytes[0],
473            device_type_bytes[1],
474            device_type_bytes[2],
475            device_type_bytes[3],
476            device_id_bytes[0],
477            num_class_info_bytes[0],
478            device_use_bytes[0],
479            0,
480        ]
481    }
482    fn serialize_into(&self, bytes: &mut Vec<u8>) {
483        bytes.reserve(8);
484        self.device_type.serialize_into(bytes);
485        self.device_id.serialize_into(bytes);
486        self.num_class_info.serialize_into(bytes);
487        u8::from(self.device_use).serialize_into(bytes);
488        bytes.extend_from_slice(&[0; 1]);
489    }
490}
491
492#[derive(Clone, Copy, Default)]
493#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
494#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
495pub struct KeyInfo {
496    pub class_id: InputClass,
497    pub len: u8,
498    pub min_keycode: KeyCode,
499    pub max_keycode: KeyCode,
500    pub num_keys: u16,
501}
502impl_debug_if_no_extra_traits!(KeyInfo, "KeyInfo");
503impl TryParse for KeyInfo {
504    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
505        let (class_id, remaining) = u8::try_parse(remaining)?;
506        let (len, remaining) = u8::try_parse(remaining)?;
507        let (min_keycode, remaining) = KeyCode::try_parse(remaining)?;
508        let (max_keycode, remaining) = KeyCode::try_parse(remaining)?;
509        let (num_keys, remaining) = u16::try_parse(remaining)?;
510        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
511        let class_id = class_id.into();
512        let result = KeyInfo { class_id, len, min_keycode, max_keycode, num_keys };
513        Ok((result, remaining))
514    }
515}
516impl Serialize for KeyInfo {
517    type Bytes = [u8; 8];
518    fn serialize(&self) -> [u8; 8] {
519        let class_id_bytes = u8::from(self.class_id).serialize();
520        let len_bytes = self.len.serialize();
521        let min_keycode_bytes = self.min_keycode.serialize();
522        let max_keycode_bytes = self.max_keycode.serialize();
523        let num_keys_bytes = self.num_keys.serialize();
524        [
525            class_id_bytes[0],
526            len_bytes[0],
527            min_keycode_bytes[0],
528            max_keycode_bytes[0],
529            num_keys_bytes[0],
530            num_keys_bytes[1],
531            0,
532            0,
533        ]
534    }
535    fn serialize_into(&self, bytes: &mut Vec<u8>) {
536        bytes.reserve(8);
537        u8::from(self.class_id).serialize_into(bytes);
538        self.len.serialize_into(bytes);
539        self.min_keycode.serialize_into(bytes);
540        self.max_keycode.serialize_into(bytes);
541        self.num_keys.serialize_into(bytes);
542        bytes.extend_from_slice(&[0; 2]);
543    }
544}
545
546#[derive(Clone, Copy, Default)]
547#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
548#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
549pub struct ButtonInfo {
550    pub class_id: InputClass,
551    pub len: u8,
552    pub num_buttons: u16,
553}
554impl_debug_if_no_extra_traits!(ButtonInfo, "ButtonInfo");
555impl TryParse for ButtonInfo {
556    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
557        let (class_id, remaining) = u8::try_parse(remaining)?;
558        let (len, remaining) = u8::try_parse(remaining)?;
559        let (num_buttons, remaining) = u16::try_parse(remaining)?;
560        let class_id = class_id.into();
561        let result = ButtonInfo { class_id, len, num_buttons };
562        Ok((result, remaining))
563    }
564}
565impl Serialize for ButtonInfo {
566    type Bytes = [u8; 4];
567    fn serialize(&self) -> [u8; 4] {
568        let class_id_bytes = u8::from(self.class_id).serialize();
569        let len_bytes = self.len.serialize();
570        let num_buttons_bytes = self.num_buttons.serialize();
571        [
572            class_id_bytes[0],
573            len_bytes[0],
574            num_buttons_bytes[0],
575            num_buttons_bytes[1],
576        ]
577    }
578    fn serialize_into(&self, bytes: &mut Vec<u8>) {
579        bytes.reserve(4);
580        u8::from(self.class_id).serialize_into(bytes);
581        self.len.serialize_into(bytes);
582        self.num_buttons.serialize_into(bytes);
583    }
584}
585
586#[derive(Clone, Copy, Default)]
587#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
588#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
589pub struct AxisInfo {
590    pub resolution: u32,
591    pub minimum: i32,
592    pub maximum: i32,
593}
594impl_debug_if_no_extra_traits!(AxisInfo, "AxisInfo");
595impl TryParse for AxisInfo {
596    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
597        let (resolution, remaining) = u32::try_parse(remaining)?;
598        let (minimum, remaining) = i32::try_parse(remaining)?;
599        let (maximum, remaining) = i32::try_parse(remaining)?;
600        let result = AxisInfo { resolution, minimum, maximum };
601        Ok((result, remaining))
602    }
603}
604impl Serialize for AxisInfo {
605    type Bytes = [u8; 12];
606    fn serialize(&self) -> [u8; 12] {
607        let resolution_bytes = self.resolution.serialize();
608        let minimum_bytes = self.minimum.serialize();
609        let maximum_bytes = self.maximum.serialize();
610        [
611            resolution_bytes[0],
612            resolution_bytes[1],
613            resolution_bytes[2],
614            resolution_bytes[3],
615            minimum_bytes[0],
616            minimum_bytes[1],
617            minimum_bytes[2],
618            minimum_bytes[3],
619            maximum_bytes[0],
620            maximum_bytes[1],
621            maximum_bytes[2],
622            maximum_bytes[3],
623        ]
624    }
625    fn serialize_into(&self, bytes: &mut Vec<u8>) {
626        bytes.reserve(12);
627        self.resolution.serialize_into(bytes);
628        self.minimum.serialize_into(bytes);
629        self.maximum.serialize_into(bytes);
630    }
631}
632
633#[derive(Clone, Default)]
634#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
635#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
636pub struct ValuatorInfo {
637    pub class_id: InputClass,
638    pub len: u8,
639    pub mode: ValuatorMode,
640    pub motion_size: u32,
641    pub axes: Vec<AxisInfo>,
642}
643impl_debug_if_no_extra_traits!(ValuatorInfo, "ValuatorInfo");
644impl TryParse for ValuatorInfo {
645    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
646        let (class_id, remaining) = u8::try_parse(remaining)?;
647        let (len, remaining) = u8::try_parse(remaining)?;
648        let (axes_len, remaining) = u8::try_parse(remaining)?;
649        let (mode, remaining) = u8::try_parse(remaining)?;
650        let (motion_size, remaining) = u32::try_parse(remaining)?;
651        let (axes, remaining) = crate::x11_utils::parse_list::<AxisInfo>(remaining, axes_len.try_to_usize()?)?;
652        let class_id = class_id.into();
653        let mode = mode.into();
654        let result = ValuatorInfo { class_id, len, mode, motion_size, axes };
655        Ok((result, remaining))
656    }
657}
658impl Serialize for ValuatorInfo {
659    type Bytes = Vec<u8>;
660    fn serialize(&self) -> Vec<u8> {
661        let mut result = Vec::new();
662        self.serialize_into(&mut result);
663        result
664    }
665    fn serialize_into(&self, bytes: &mut Vec<u8>) {
666        bytes.reserve(8);
667        u8::from(self.class_id).serialize_into(bytes);
668        self.len.serialize_into(bytes);
669        let axes_len = u8::try_from(self.axes.len()).expect("`axes` has too many elements");
670        axes_len.serialize_into(bytes);
671        u8::from(self.mode).serialize_into(bytes);
672        self.motion_size.serialize_into(bytes);
673        self.axes.serialize_into(bytes);
674    }
675}
676impl ValuatorInfo {
677    /// Get the value of the `axes_len` field.
678    ///
679    /// The `axes_len` field is used as the length field of the `axes` field.
680    /// This function computes the field's value again based on the length of the list.
681    ///
682    /// # Panics
683    ///
684    /// Panics if the value cannot be represented in the target type. This
685    /// cannot happen with values of the struct received from the X11 server.
686    pub fn axes_len(&self) -> u8 {
687        self.axes.len()
688            .try_into().unwrap()
689    }
690}
691
692#[derive(Clone, Copy)]
693#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
694#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
695pub struct InputInfoInfoKey {
696    pub min_keycode: KeyCode,
697    pub max_keycode: KeyCode,
698    pub num_keys: u16,
699}
700impl_debug_if_no_extra_traits!(InputInfoInfoKey, "InputInfoInfoKey");
701impl TryParse for InputInfoInfoKey {
702    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
703        let (min_keycode, remaining) = KeyCode::try_parse(remaining)?;
704        let (max_keycode, remaining) = KeyCode::try_parse(remaining)?;
705        let (num_keys, remaining) = u16::try_parse(remaining)?;
706        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
707        let result = InputInfoInfoKey { min_keycode, max_keycode, num_keys };
708        Ok((result, remaining))
709    }
710}
711impl Serialize for InputInfoInfoKey {
712    type Bytes = [u8; 6];
713    fn serialize(&self) -> [u8; 6] {
714        let min_keycode_bytes = self.min_keycode.serialize();
715        let max_keycode_bytes = self.max_keycode.serialize();
716        let num_keys_bytes = self.num_keys.serialize();
717        [
718            min_keycode_bytes[0],
719            max_keycode_bytes[0],
720            num_keys_bytes[0],
721            num_keys_bytes[1],
722            0,
723            0,
724        ]
725    }
726    fn serialize_into(&self, bytes: &mut Vec<u8>) {
727        bytes.reserve(6);
728        self.min_keycode.serialize_into(bytes);
729        self.max_keycode.serialize_into(bytes);
730        self.num_keys.serialize_into(bytes);
731        bytes.extend_from_slice(&[0; 2]);
732    }
733}
734#[derive(Clone, Copy)]
735#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
736#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
737pub struct InputInfoInfoButton {
738    pub num_buttons: u16,
739}
740impl_debug_if_no_extra_traits!(InputInfoInfoButton, "InputInfoInfoButton");
741impl TryParse for InputInfoInfoButton {
742    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
743        let (num_buttons, remaining) = u16::try_parse(remaining)?;
744        let result = InputInfoInfoButton { num_buttons };
745        Ok((result, remaining))
746    }
747}
748impl Serialize for InputInfoInfoButton {
749    type Bytes = [u8; 2];
750    fn serialize(&self) -> [u8; 2] {
751        let num_buttons_bytes = self.num_buttons.serialize();
752        [
753            num_buttons_bytes[0],
754            num_buttons_bytes[1],
755        ]
756    }
757    fn serialize_into(&self, bytes: &mut Vec<u8>) {
758        bytes.reserve(2);
759        self.num_buttons.serialize_into(bytes);
760    }
761}
762#[derive(Clone)]
763#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
764#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
765pub struct InputInfoInfoValuator {
766    pub mode: ValuatorMode,
767    pub motion_size: u32,
768    pub axes: Vec<AxisInfo>,
769}
770impl_debug_if_no_extra_traits!(InputInfoInfoValuator, "InputInfoInfoValuator");
771impl TryParse for InputInfoInfoValuator {
772    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
773        let (axes_len, remaining) = u8::try_parse(remaining)?;
774        let (mode, remaining) = u8::try_parse(remaining)?;
775        let (motion_size, remaining) = u32::try_parse(remaining)?;
776        let (axes, remaining) = crate::x11_utils::parse_list::<AxisInfo>(remaining, axes_len.try_to_usize()?)?;
777        let mode = mode.into();
778        let result = InputInfoInfoValuator { mode, motion_size, axes };
779        Ok((result, remaining))
780    }
781}
782impl Serialize for InputInfoInfoValuator {
783    type Bytes = Vec<u8>;
784    fn serialize(&self) -> Vec<u8> {
785        let mut result = Vec::new();
786        self.serialize_into(&mut result);
787        result
788    }
789    fn serialize_into(&self, bytes: &mut Vec<u8>) {
790        bytes.reserve(6);
791        let axes_len = u8::try_from(self.axes.len()).expect("`axes` has too many elements");
792        axes_len.serialize_into(bytes);
793        u8::from(self.mode).serialize_into(bytes);
794        self.motion_size.serialize_into(bytes);
795        self.axes.serialize_into(bytes);
796    }
797}
798impl InputInfoInfoValuator {
799    /// Get the value of the `axes_len` field.
800    ///
801    /// The `axes_len` field is used as the length field of the `axes` field.
802    /// This function computes the field's value again based on the length of the list.
803    ///
804    /// # Panics
805    ///
806    /// Panics if the value cannot be represented in the target type. This
807    /// cannot happen with values of the struct received from the X11 server.
808    pub fn axes_len(&self) -> u8 {
809        self.axes.len()
810            .try_into().unwrap()
811    }
812}
813#[derive(Clone)]
814#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
815#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
816pub enum InputInfoInfo {
817    Key(InputInfoInfoKey),
818    Button(InputInfoInfoButton),
819    Valuator(InputInfoInfoValuator),
820    /// This variant is returned when the server sends a discriminant
821    /// value that does not match any of the defined by the protocol.
822    ///
823    /// Usually, this should be considered a parsing error, but there
824    /// are some cases where the server violates the protocol.
825    ///
826    /// Trying to use `serialize` or `serialize_into` with this variant
827    /// will raise a panic.
828    InvalidValue(u8),
829}
830impl_debug_if_no_extra_traits!(InputInfoInfo, "InputInfoInfo");
831impl InputInfoInfo {
832    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
833    fn try_parse(value: &[u8], class_id: u8) -> Result<(Self, &[u8]), ParseError> {
834        let switch_expr = u8::from(class_id);
835        let mut outer_remaining = value;
836        let mut parse_result = None;
837        if switch_expr == u8::from(InputClass::KEY) {
838            let (key, new_remaining) = InputInfoInfoKey::try_parse(outer_remaining)?;
839            outer_remaining = new_remaining;
840            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
841            parse_result = Some(InputInfoInfo::Key(key));
842        }
843        if switch_expr == u8::from(InputClass::BUTTON) {
844            let (button, new_remaining) = InputInfoInfoButton::try_parse(outer_remaining)?;
845            outer_remaining = new_remaining;
846            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
847            parse_result = Some(InputInfoInfo::Button(button));
848        }
849        if switch_expr == u8::from(InputClass::VALUATOR) {
850            let (valuator, new_remaining) = InputInfoInfoValuator::try_parse(outer_remaining)?;
851            outer_remaining = new_remaining;
852            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
853            parse_result = Some(InputInfoInfo::Valuator(valuator));
854        }
855        match parse_result {
856            None => Ok((InputInfoInfo::InvalidValue(switch_expr), &[])),
857            Some(result) => Ok((result, outer_remaining)),
858        }
859    }
860}
861impl InputInfoInfo {
862    pub fn as_key(&self) -> Option<&InputInfoInfoKey> {
863        match self {
864            InputInfoInfo::Key(value) => Some(value),
865            _ => None,
866        }
867    }
868    pub fn as_button(&self) -> Option<&InputInfoInfoButton> {
869        match self {
870            InputInfoInfo::Button(value) => Some(value),
871            _ => None,
872        }
873    }
874    pub fn as_valuator(&self) -> Option<&InputInfoInfoValuator> {
875        match self {
876            InputInfoInfo::Valuator(value) => Some(value),
877            _ => None,
878        }
879    }
880}
881impl InputInfoInfo {
882    #[allow(dead_code)]
883    fn serialize(&self, class_id: u8) -> Vec<u8> {
884        let mut result = Vec::new();
885        self.serialize_into(&mut result, u8::from(class_id));
886        result
887    }
888    fn serialize_into(&self, bytes: &mut Vec<u8>, class_id: u8) {
889        assert_eq!(self.switch_expr(), u8::from(class_id), "switch `info` has an inconsistent discriminant");
890        match self {
891            InputInfoInfo::Key(key) => key.serialize_into(bytes),
892            InputInfoInfo::Button(button) => button.serialize_into(bytes),
893            InputInfoInfo::Valuator(valuator) => valuator.serialize_into(bytes),
894            InputInfoInfo::InvalidValue(_) => panic!("attempted to serialize invalid switch case"),
895        }
896    }
897}
898impl InputInfoInfo {
899    fn switch_expr(&self) -> u8 {
900        match self {
901            InputInfoInfo::Key(_) => u8::from(InputClass::KEY),
902            InputInfoInfo::Button(_) => u8::from(InputClass::BUTTON),
903            InputInfoInfo::Valuator(_) => u8::from(InputClass::VALUATOR),
904            InputInfoInfo::InvalidValue(switch_expr) => *switch_expr,
905        }
906    }
907}
908
909#[derive(Clone)]
910#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
911#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
912pub struct InputInfo {
913    pub len: u8,
914    pub info: InputInfoInfo,
915}
916impl_debug_if_no_extra_traits!(InputInfo, "InputInfo");
917impl TryParse for InputInfo {
918    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
919        let (class_id, remaining) = u8::try_parse(remaining)?;
920        let (len, remaining) = u8::try_parse(remaining)?;
921        let (info, remaining) = InputInfoInfo::try_parse(remaining, u8::from(class_id))?;
922        let result = InputInfo { len, info };
923        Ok((result, remaining))
924    }
925}
926impl Serialize for InputInfo {
927    type Bytes = Vec<u8>;
928    fn serialize(&self) -> Vec<u8> {
929        let mut result = Vec::new();
930        self.serialize_into(&mut result);
931        result
932    }
933    fn serialize_into(&self, bytes: &mut Vec<u8>) {
934        bytes.reserve(2);
935        let class_id: u8 = self.info.switch_expr();
936        class_id.serialize_into(bytes);
937        self.len.serialize_into(bytes);
938        self.info.serialize_into(bytes, u8::from(class_id));
939    }
940}
941
942#[derive(Clone, Default)]
943#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
944#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
945pub struct DeviceName {
946    pub string: Vec<u8>,
947}
948impl_debug_if_no_extra_traits!(DeviceName, "DeviceName");
949impl TryParse for DeviceName {
950    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
951        let (len, remaining) = u8::try_parse(remaining)?;
952        let (string, remaining) = crate::x11_utils::parse_u8_list(remaining, len.try_to_usize()?)?;
953        let string = string.to_vec();
954        let result = DeviceName { string };
955        Ok((result, remaining))
956    }
957}
958impl Serialize for DeviceName {
959    type Bytes = Vec<u8>;
960    fn serialize(&self) -> Vec<u8> {
961        let mut result = Vec::new();
962        self.serialize_into(&mut result);
963        result
964    }
965    fn serialize_into(&self, bytes: &mut Vec<u8>) {
966        let len = u8::try_from(self.string.len()).expect("`string` has too many elements");
967        len.serialize_into(bytes);
968        bytes.extend_from_slice(&self.string);
969    }
970}
971#[allow(clippy::len_without_is_empty)] // This is not a container and is_empty() makes no sense
972impl DeviceName {
973    /// Get the value of the `len` field.
974    ///
975    /// The `len` field is used as the length field of the `string` field.
976    /// This function computes the field's value again based on the length of the list.
977    ///
978    /// # Panics
979    ///
980    /// Panics if the value cannot be represented in the target type. This
981    /// cannot happen with values of the struct received from the X11 server.
982    pub fn len(&self) -> u8 {
983        self.string.len()
984            .try_into().unwrap()
985    }
986}
987
988/// Opcode for the ListInputDevices request
989pub const LIST_INPUT_DEVICES_REQUEST: u8 = 2;
990#[derive(Clone, Copy, Default)]
991#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
992#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
993pub struct ListInputDevicesRequest;
994impl_debug_if_no_extra_traits!(ListInputDevicesRequest, "ListInputDevicesRequest");
995impl ListInputDevicesRequest {
996    /// Serialize this request into bytes for the provided connection
997    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
998        let length_so_far = 0;
999        let mut request0 = vec![
1000            major_opcode,
1001            LIST_INPUT_DEVICES_REQUEST,
1002            0,
1003            0,
1004        ];
1005        let length_so_far = length_so_far + request0.len();
1006        assert_eq!(length_so_far % 4, 0);
1007        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1008        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1009        ([request0.into()], vec![])
1010    }
1011    /// Parse this request given its header, its body, and any fds that go along with it
1012    #[cfg(feature = "request-parsing")]
1013    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1014        if header.minor_opcode != LIST_INPUT_DEVICES_REQUEST {
1015            return Err(ParseError::InvalidValue);
1016        }
1017        let _ = value;
1018        Ok(ListInputDevicesRequest
1019        )
1020    }
1021}
1022impl Request for ListInputDevicesRequest {
1023    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1024
1025    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1026        let (bufs, fds) = self.serialize(major_opcode);
1027        // Flatten the buffers into a single vector
1028        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1029        (buf, fds)
1030    }
1031}
1032impl crate::x11_utils::ReplyRequest for ListInputDevicesRequest {
1033    type Reply = ListInputDevicesReply;
1034}
1035
1036#[derive(Clone)]
1037#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1038#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1039pub struct ListInputDevicesReply {
1040    pub xi_reply_type: u8,
1041    pub sequence: u16,
1042    pub length: u32,
1043    pub devices: Vec<DeviceInfo>,
1044    pub infos: Vec<InputInfo>,
1045    pub names: Vec<xproto::Str>,
1046}
1047impl_debug_if_no_extra_traits!(ListInputDevicesReply, "ListInputDevicesReply");
1048impl TryParse for ListInputDevicesReply {
1049    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1050        let remaining = initial_value;
1051        let value = remaining;
1052        let (response_type, remaining) = u8::try_parse(remaining)?;
1053        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
1054        let (sequence, remaining) = u16::try_parse(remaining)?;
1055        let (length, remaining) = u32::try_parse(remaining)?;
1056        let (devices_len, remaining) = u8::try_parse(remaining)?;
1057        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
1058        let (devices, remaining) = crate::x11_utils::parse_list::<DeviceInfo>(remaining, devices_len.try_to_usize()?)?;
1059        let (infos, remaining) = crate::x11_utils::parse_list::<InputInfo>(remaining, devices.iter().try_fold(0u32, |acc, x| acc.checked_add(u32::from(x.num_class_info)).ok_or(ParseError::InvalidExpression))?.try_to_usize()?)?;
1060        let (names, remaining) = crate::x11_utils::parse_list::<xproto::Str>(remaining, devices_len.try_to_usize()?)?;
1061        // Align offset to multiple of 4
1062        let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
1063        let misalignment = (4 - (offset % 4)) % 4;
1064        let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
1065        if response_type != 1 {
1066            return Err(ParseError::InvalidValue);
1067        }
1068        let result = ListInputDevicesReply { xi_reply_type, sequence, length, devices, infos, names };
1069        let _ = remaining;
1070        let remaining = initial_value.get(32 + length as usize * 4..)
1071            .ok_or(ParseError::InsufficientData)?;
1072        Ok((result, remaining))
1073    }
1074}
1075impl Serialize for ListInputDevicesReply {
1076    type Bytes = Vec<u8>;
1077    fn serialize(&self) -> Vec<u8> {
1078        let mut result = Vec::new();
1079        self.serialize_into(&mut result);
1080        result
1081    }
1082    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1083        bytes.reserve(32);
1084        let response_type_bytes = &[1];
1085        bytes.push(response_type_bytes[0]);
1086        self.xi_reply_type.serialize_into(bytes);
1087        self.sequence.serialize_into(bytes);
1088        self.length.serialize_into(bytes);
1089        let devices_len = u8::try_from(self.devices.len()).expect("`devices` has too many elements");
1090        devices_len.serialize_into(bytes);
1091        bytes.extend_from_slice(&[0; 23]);
1092        self.devices.serialize_into(bytes);
1093        assert_eq!(self.infos.len(), usize::try_from(self.devices.iter().fold(0u32, |acc, x| acc.checked_add(u32::from(x.num_class_info)).unwrap())).unwrap(), "`infos` has an incorrect length");
1094        self.infos.serialize_into(bytes);
1095        assert_eq!(self.names.len(), usize::try_from(devices_len).unwrap(), "`names` has an incorrect length");
1096        self.names.serialize_into(bytes);
1097        bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
1098    }
1099}
1100impl ListInputDevicesReply {
1101    /// Get the value of the `devices_len` field.
1102    ///
1103    /// The `devices_len` field is used as the length field of the `devices` field.
1104    /// This function computes the field's value again based on the length of the list.
1105    ///
1106    /// # Panics
1107    ///
1108    /// Panics if the value cannot be represented in the target type. This
1109    /// cannot happen with values of the struct received from the X11 server.
1110    pub fn devices_len(&self) -> u8 {
1111        self.devices.len()
1112            .try_into().unwrap()
1113    }
1114}
1115
1116pub type EventTypeBase = u8;
1117
1118#[derive(Clone, Copy, Default)]
1119#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1120#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1121pub struct InputClassInfo {
1122    pub class_id: InputClass,
1123    pub event_type_base: EventTypeBase,
1124}
1125impl_debug_if_no_extra_traits!(InputClassInfo, "InputClassInfo");
1126impl TryParse for InputClassInfo {
1127    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1128        let (class_id, remaining) = u8::try_parse(remaining)?;
1129        let (event_type_base, remaining) = EventTypeBase::try_parse(remaining)?;
1130        let class_id = class_id.into();
1131        let result = InputClassInfo { class_id, event_type_base };
1132        Ok((result, remaining))
1133    }
1134}
1135impl Serialize for InputClassInfo {
1136    type Bytes = [u8; 2];
1137    fn serialize(&self) -> [u8; 2] {
1138        let class_id_bytes = u8::from(self.class_id).serialize();
1139        let event_type_base_bytes = self.event_type_base.serialize();
1140        [
1141            class_id_bytes[0],
1142            event_type_base_bytes[0],
1143        ]
1144    }
1145    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1146        bytes.reserve(2);
1147        u8::from(self.class_id).serialize_into(bytes);
1148        self.event_type_base.serialize_into(bytes);
1149    }
1150}
1151
1152/// Opcode for the OpenDevice request
1153pub const OPEN_DEVICE_REQUEST: u8 = 3;
1154#[derive(Clone, Copy, Default)]
1155#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1156#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1157pub struct OpenDeviceRequest {
1158    pub device_id: u8,
1159}
1160impl_debug_if_no_extra_traits!(OpenDeviceRequest, "OpenDeviceRequest");
1161impl OpenDeviceRequest {
1162    /// Serialize this request into bytes for the provided connection
1163    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1164        let length_so_far = 0;
1165        let device_id_bytes = self.device_id.serialize();
1166        let mut request0 = vec![
1167            major_opcode,
1168            OPEN_DEVICE_REQUEST,
1169            0,
1170            0,
1171            device_id_bytes[0],
1172            0,
1173            0,
1174            0,
1175        ];
1176        let length_so_far = length_so_far + request0.len();
1177        assert_eq!(length_so_far % 4, 0);
1178        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1179        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1180        ([request0.into()], vec![])
1181    }
1182    /// Parse this request given its header, its body, and any fds that go along with it
1183    #[cfg(feature = "request-parsing")]
1184    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1185        if header.minor_opcode != OPEN_DEVICE_REQUEST {
1186            return Err(ParseError::InvalidValue);
1187        }
1188        let (device_id, remaining) = u8::try_parse(value)?;
1189        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
1190        let _ = remaining;
1191        Ok(OpenDeviceRequest {
1192            device_id,
1193        })
1194    }
1195}
1196impl Request for OpenDeviceRequest {
1197    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1198
1199    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1200        let (bufs, fds) = self.serialize(major_opcode);
1201        // Flatten the buffers into a single vector
1202        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1203        (buf, fds)
1204    }
1205}
1206impl crate::x11_utils::ReplyRequest for OpenDeviceRequest {
1207    type Reply = OpenDeviceReply;
1208}
1209
1210#[derive(Clone, Default)]
1211#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1212#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1213pub struct OpenDeviceReply {
1214    pub xi_reply_type: u8,
1215    pub sequence: u16,
1216    pub length: u32,
1217    pub class_info: Vec<InputClassInfo>,
1218}
1219impl_debug_if_no_extra_traits!(OpenDeviceReply, "OpenDeviceReply");
1220impl TryParse for OpenDeviceReply {
1221    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1222        let remaining = initial_value;
1223        let value = remaining;
1224        let (response_type, remaining) = u8::try_parse(remaining)?;
1225        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
1226        let (sequence, remaining) = u16::try_parse(remaining)?;
1227        let (length, remaining) = u32::try_parse(remaining)?;
1228        let (num_classes, remaining) = u8::try_parse(remaining)?;
1229        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
1230        let (class_info, remaining) = crate::x11_utils::parse_list::<InputClassInfo>(remaining, num_classes.try_to_usize()?)?;
1231        // Align offset to multiple of 4
1232        let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
1233        let misalignment = (4 - (offset % 4)) % 4;
1234        let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
1235        if response_type != 1 {
1236            return Err(ParseError::InvalidValue);
1237        }
1238        let result = OpenDeviceReply { xi_reply_type, sequence, length, class_info };
1239        let _ = remaining;
1240        let remaining = initial_value.get(32 + length as usize * 4..)
1241            .ok_or(ParseError::InsufficientData)?;
1242        Ok((result, remaining))
1243    }
1244}
1245impl Serialize for OpenDeviceReply {
1246    type Bytes = Vec<u8>;
1247    fn serialize(&self) -> Vec<u8> {
1248        let mut result = Vec::new();
1249        self.serialize_into(&mut result);
1250        result
1251    }
1252    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1253        bytes.reserve(32);
1254        let response_type_bytes = &[1];
1255        bytes.push(response_type_bytes[0]);
1256        self.xi_reply_type.serialize_into(bytes);
1257        self.sequence.serialize_into(bytes);
1258        self.length.serialize_into(bytes);
1259        let num_classes = u8::try_from(self.class_info.len()).expect("`class_info` has too many elements");
1260        num_classes.serialize_into(bytes);
1261        bytes.extend_from_slice(&[0; 23]);
1262        self.class_info.serialize_into(bytes);
1263        bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
1264    }
1265}
1266impl OpenDeviceReply {
1267    /// Get the value of the `num_classes` field.
1268    ///
1269    /// The `num_classes` field is used as the length field of the `class_info` field.
1270    /// This function computes the field's value again based on the length of the list.
1271    ///
1272    /// # Panics
1273    ///
1274    /// Panics if the value cannot be represented in the target type. This
1275    /// cannot happen with values of the struct received from the X11 server.
1276    pub fn num_classes(&self) -> u8 {
1277        self.class_info.len()
1278            .try_into().unwrap()
1279    }
1280}
1281
1282/// Opcode for the CloseDevice request
1283pub const CLOSE_DEVICE_REQUEST: u8 = 4;
1284#[derive(Clone, Copy, Default)]
1285#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1286#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1287pub struct CloseDeviceRequest {
1288    pub device_id: u8,
1289}
1290impl_debug_if_no_extra_traits!(CloseDeviceRequest, "CloseDeviceRequest");
1291impl CloseDeviceRequest {
1292    /// Serialize this request into bytes for the provided connection
1293    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1294        let length_so_far = 0;
1295        let device_id_bytes = self.device_id.serialize();
1296        let mut request0 = vec![
1297            major_opcode,
1298            CLOSE_DEVICE_REQUEST,
1299            0,
1300            0,
1301            device_id_bytes[0],
1302            0,
1303            0,
1304            0,
1305        ];
1306        let length_so_far = length_so_far + request0.len();
1307        assert_eq!(length_so_far % 4, 0);
1308        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1309        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1310        ([request0.into()], vec![])
1311    }
1312    /// Parse this request given its header, its body, and any fds that go along with it
1313    #[cfg(feature = "request-parsing")]
1314    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1315        if header.minor_opcode != CLOSE_DEVICE_REQUEST {
1316            return Err(ParseError::InvalidValue);
1317        }
1318        let (device_id, remaining) = u8::try_parse(value)?;
1319        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
1320        let _ = remaining;
1321        Ok(CloseDeviceRequest {
1322            device_id,
1323        })
1324    }
1325}
1326impl Request for CloseDeviceRequest {
1327    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1328
1329    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1330        let (bufs, fds) = self.serialize(major_opcode);
1331        // Flatten the buffers into a single vector
1332        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1333        (buf, fds)
1334    }
1335}
1336impl crate::x11_utils::VoidRequest for CloseDeviceRequest {
1337}
1338
1339/// Opcode for the SetDeviceMode request
1340pub const SET_DEVICE_MODE_REQUEST: u8 = 5;
1341#[derive(Clone, Copy, Default)]
1342#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1343#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1344pub struct SetDeviceModeRequest {
1345    pub device_id: u8,
1346    pub mode: ValuatorMode,
1347}
1348impl_debug_if_no_extra_traits!(SetDeviceModeRequest, "SetDeviceModeRequest");
1349impl SetDeviceModeRequest {
1350    /// Serialize this request into bytes for the provided connection
1351    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1352        let length_so_far = 0;
1353        let device_id_bytes = self.device_id.serialize();
1354        let mode_bytes = u8::from(self.mode).serialize();
1355        let mut request0 = vec![
1356            major_opcode,
1357            SET_DEVICE_MODE_REQUEST,
1358            0,
1359            0,
1360            device_id_bytes[0],
1361            mode_bytes[0],
1362            0,
1363            0,
1364        ];
1365        let length_so_far = length_so_far + request0.len();
1366        assert_eq!(length_so_far % 4, 0);
1367        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1368        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1369        ([request0.into()], vec![])
1370    }
1371    /// Parse this request given its header, its body, and any fds that go along with it
1372    #[cfg(feature = "request-parsing")]
1373    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1374        if header.minor_opcode != SET_DEVICE_MODE_REQUEST {
1375            return Err(ParseError::InvalidValue);
1376        }
1377        let (device_id, remaining) = u8::try_parse(value)?;
1378        let (mode, remaining) = u8::try_parse(remaining)?;
1379        let mode = mode.into();
1380        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1381        let _ = remaining;
1382        Ok(SetDeviceModeRequest {
1383            device_id,
1384            mode,
1385        })
1386    }
1387}
1388impl Request for SetDeviceModeRequest {
1389    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1390
1391    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1392        let (bufs, fds) = self.serialize(major_opcode);
1393        // Flatten the buffers into a single vector
1394        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1395        (buf, fds)
1396    }
1397}
1398impl crate::x11_utils::ReplyRequest for SetDeviceModeRequest {
1399    type Reply = SetDeviceModeReply;
1400}
1401
1402#[derive(Clone, Copy, Default)]
1403#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1404#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1405pub struct SetDeviceModeReply {
1406    pub xi_reply_type: u8,
1407    pub sequence: u16,
1408    pub length: u32,
1409    pub status: xproto::GrabStatus,
1410}
1411impl_debug_if_no_extra_traits!(SetDeviceModeReply, "SetDeviceModeReply");
1412impl TryParse for SetDeviceModeReply {
1413    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1414        let remaining = initial_value;
1415        let (response_type, remaining) = u8::try_parse(remaining)?;
1416        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
1417        let (sequence, remaining) = u16::try_parse(remaining)?;
1418        let (length, remaining) = u32::try_parse(remaining)?;
1419        let (status, remaining) = u8::try_parse(remaining)?;
1420        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
1421        if response_type != 1 {
1422            return Err(ParseError::InvalidValue);
1423        }
1424        let status = status.into();
1425        let result = SetDeviceModeReply { xi_reply_type, sequence, length, status };
1426        let _ = remaining;
1427        let remaining = initial_value.get(32 + length as usize * 4..)
1428            .ok_or(ParseError::InsufficientData)?;
1429        Ok((result, remaining))
1430    }
1431}
1432impl Serialize for SetDeviceModeReply {
1433    type Bytes = [u8; 32];
1434    fn serialize(&self) -> [u8; 32] {
1435        let response_type_bytes = &[1];
1436        let xi_reply_type_bytes = self.xi_reply_type.serialize();
1437        let sequence_bytes = self.sequence.serialize();
1438        let length_bytes = self.length.serialize();
1439        let status_bytes = u8::from(self.status).serialize();
1440        [
1441            response_type_bytes[0],
1442            xi_reply_type_bytes[0],
1443            sequence_bytes[0],
1444            sequence_bytes[1],
1445            length_bytes[0],
1446            length_bytes[1],
1447            length_bytes[2],
1448            length_bytes[3],
1449            status_bytes[0],
1450            0,
1451            0,
1452            0,
1453            0,
1454            0,
1455            0,
1456            0,
1457            0,
1458            0,
1459            0,
1460            0,
1461            0,
1462            0,
1463            0,
1464            0,
1465            0,
1466            0,
1467            0,
1468            0,
1469            0,
1470            0,
1471            0,
1472            0,
1473        ]
1474    }
1475    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1476        bytes.reserve(32);
1477        let response_type_bytes = &[1];
1478        bytes.push(response_type_bytes[0]);
1479        self.xi_reply_type.serialize_into(bytes);
1480        self.sequence.serialize_into(bytes);
1481        self.length.serialize_into(bytes);
1482        u8::from(self.status).serialize_into(bytes);
1483        bytes.extend_from_slice(&[0; 23]);
1484    }
1485}
1486
1487/// Opcode for the SelectExtensionEvent request
1488pub const SELECT_EXTENSION_EVENT_REQUEST: u8 = 6;
1489#[derive(Clone, Default)]
1490#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1491#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1492pub struct SelectExtensionEventRequest<'input> {
1493    pub window: xproto::Window,
1494    pub classes: Cow<'input, [EventClass]>,
1495}
1496impl_debug_if_no_extra_traits!(SelectExtensionEventRequest<'_>, "SelectExtensionEventRequest");
1497impl<'input> SelectExtensionEventRequest<'input> {
1498    /// Serialize this request into bytes for the provided connection
1499    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
1500        let length_so_far = 0;
1501        let window_bytes = self.window.serialize();
1502        let num_classes = u16::try_from(self.classes.len()).expect("`classes` has too many elements");
1503        let num_classes_bytes = num_classes.serialize();
1504        let mut request0 = vec![
1505            major_opcode,
1506            SELECT_EXTENSION_EVENT_REQUEST,
1507            0,
1508            0,
1509            window_bytes[0],
1510            window_bytes[1],
1511            window_bytes[2],
1512            window_bytes[3],
1513            num_classes_bytes[0],
1514            num_classes_bytes[1],
1515            0,
1516            0,
1517        ];
1518        let length_so_far = length_so_far + request0.len();
1519        let classes_bytes = self.classes.serialize();
1520        let length_so_far = length_so_far + classes_bytes.len();
1521        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
1522        let length_so_far = length_so_far + padding0.len();
1523        assert_eq!(length_so_far % 4, 0);
1524        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1525        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1526        ([request0.into(), classes_bytes.into(), padding0.into()], vec![])
1527    }
1528    /// Parse this request given its header, its body, and any fds that go along with it
1529    #[cfg(feature = "request-parsing")]
1530    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
1531        if header.minor_opcode != SELECT_EXTENSION_EVENT_REQUEST {
1532            return Err(ParseError::InvalidValue);
1533        }
1534        let (window, remaining) = xproto::Window::try_parse(value)?;
1535        let (num_classes, remaining) = u16::try_parse(remaining)?;
1536        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1537        let (classes, remaining) = crate::x11_utils::parse_list::<EventClass>(remaining, num_classes.try_to_usize()?)?;
1538        let _ = remaining;
1539        Ok(SelectExtensionEventRequest {
1540            window,
1541            classes: Cow::Owned(classes),
1542        })
1543    }
1544    /// Clone all borrowed data in this SelectExtensionEventRequest.
1545    pub fn into_owned(self) -> SelectExtensionEventRequest<'static> {
1546        SelectExtensionEventRequest {
1547            window: self.window,
1548            classes: Cow::Owned(self.classes.into_owned()),
1549        }
1550    }
1551}
1552impl<'input> Request for SelectExtensionEventRequest<'input> {
1553    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1554
1555    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1556        let (bufs, fds) = self.serialize(major_opcode);
1557        // Flatten the buffers into a single vector
1558        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1559        (buf, fds)
1560    }
1561}
1562impl<'input> crate::x11_utils::VoidRequest for SelectExtensionEventRequest<'input> {
1563}
1564
1565/// Opcode for the GetSelectedExtensionEvents request
1566pub const GET_SELECTED_EXTENSION_EVENTS_REQUEST: u8 = 7;
1567#[derive(Clone, Copy, Default)]
1568#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1569#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1570pub struct GetSelectedExtensionEventsRequest {
1571    pub window: xproto::Window,
1572}
1573impl_debug_if_no_extra_traits!(GetSelectedExtensionEventsRequest, "GetSelectedExtensionEventsRequest");
1574impl GetSelectedExtensionEventsRequest {
1575    /// Serialize this request into bytes for the provided connection
1576    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1577        let length_so_far = 0;
1578        let window_bytes = self.window.serialize();
1579        let mut request0 = vec![
1580            major_opcode,
1581            GET_SELECTED_EXTENSION_EVENTS_REQUEST,
1582            0,
1583            0,
1584            window_bytes[0],
1585            window_bytes[1],
1586            window_bytes[2],
1587            window_bytes[3],
1588        ];
1589        let length_so_far = length_so_far + request0.len();
1590        assert_eq!(length_so_far % 4, 0);
1591        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1592        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1593        ([request0.into()], vec![])
1594    }
1595    /// Parse this request given its header, its body, and any fds that go along with it
1596    #[cfg(feature = "request-parsing")]
1597    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1598        if header.minor_opcode != GET_SELECTED_EXTENSION_EVENTS_REQUEST {
1599            return Err(ParseError::InvalidValue);
1600        }
1601        let (window, remaining) = xproto::Window::try_parse(value)?;
1602        let _ = remaining;
1603        Ok(GetSelectedExtensionEventsRequest {
1604            window,
1605        })
1606    }
1607}
1608impl Request for GetSelectedExtensionEventsRequest {
1609    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1610
1611    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1612        let (bufs, fds) = self.serialize(major_opcode);
1613        // Flatten the buffers into a single vector
1614        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1615        (buf, fds)
1616    }
1617}
1618impl crate::x11_utils::ReplyRequest for GetSelectedExtensionEventsRequest {
1619    type Reply = GetSelectedExtensionEventsReply;
1620}
1621
1622#[derive(Clone, Default)]
1623#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1624#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1625pub struct GetSelectedExtensionEventsReply {
1626    pub xi_reply_type: u8,
1627    pub sequence: u16,
1628    pub length: u32,
1629    pub this_classes: Vec<EventClass>,
1630    pub all_classes: Vec<EventClass>,
1631}
1632impl_debug_if_no_extra_traits!(GetSelectedExtensionEventsReply, "GetSelectedExtensionEventsReply");
1633impl TryParse for GetSelectedExtensionEventsReply {
1634    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1635        let remaining = initial_value;
1636        let (response_type, remaining) = u8::try_parse(remaining)?;
1637        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
1638        let (sequence, remaining) = u16::try_parse(remaining)?;
1639        let (length, remaining) = u32::try_parse(remaining)?;
1640        let (num_this_classes, remaining) = u16::try_parse(remaining)?;
1641        let (num_all_classes, remaining) = u16::try_parse(remaining)?;
1642        let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
1643        let (this_classes, remaining) = crate::x11_utils::parse_list::<EventClass>(remaining, num_this_classes.try_to_usize()?)?;
1644        let (all_classes, remaining) = crate::x11_utils::parse_list::<EventClass>(remaining, num_all_classes.try_to_usize()?)?;
1645        if response_type != 1 {
1646            return Err(ParseError::InvalidValue);
1647        }
1648        let result = GetSelectedExtensionEventsReply { xi_reply_type, sequence, length, this_classes, all_classes };
1649        let _ = remaining;
1650        let remaining = initial_value.get(32 + length as usize * 4..)
1651            .ok_or(ParseError::InsufficientData)?;
1652        Ok((result, remaining))
1653    }
1654}
1655impl Serialize for GetSelectedExtensionEventsReply {
1656    type Bytes = Vec<u8>;
1657    fn serialize(&self) -> Vec<u8> {
1658        let mut result = Vec::new();
1659        self.serialize_into(&mut result);
1660        result
1661    }
1662    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1663        bytes.reserve(32);
1664        let response_type_bytes = &[1];
1665        bytes.push(response_type_bytes[0]);
1666        self.xi_reply_type.serialize_into(bytes);
1667        self.sequence.serialize_into(bytes);
1668        self.length.serialize_into(bytes);
1669        let num_this_classes = u16::try_from(self.this_classes.len()).expect("`this_classes` has too many elements");
1670        num_this_classes.serialize_into(bytes);
1671        let num_all_classes = u16::try_from(self.all_classes.len()).expect("`all_classes` has too many elements");
1672        num_all_classes.serialize_into(bytes);
1673        bytes.extend_from_slice(&[0; 20]);
1674        self.this_classes.serialize_into(bytes);
1675        self.all_classes.serialize_into(bytes);
1676    }
1677}
1678impl GetSelectedExtensionEventsReply {
1679    /// Get the value of the `num_this_classes` field.
1680    ///
1681    /// The `num_this_classes` field is used as the length field of the `this_classes` field.
1682    /// This function computes the field's value again based on the length of the list.
1683    ///
1684    /// # Panics
1685    ///
1686    /// Panics if the value cannot be represented in the target type. This
1687    /// cannot happen with values of the struct received from the X11 server.
1688    pub fn num_this_classes(&self) -> u16 {
1689        self.this_classes.len()
1690            .try_into().unwrap()
1691    }
1692    /// Get the value of the `num_all_classes` field.
1693    ///
1694    /// The `num_all_classes` field is used as the length field of the `all_classes` field.
1695    /// This function computes the field's value again based on the length of the list.
1696    ///
1697    /// # Panics
1698    ///
1699    /// Panics if the value cannot be represented in the target type. This
1700    /// cannot happen with values of the struct received from the X11 server.
1701    pub fn num_all_classes(&self) -> u16 {
1702        self.all_classes.len()
1703            .try_into().unwrap()
1704    }
1705}
1706
1707#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
1708#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1709pub struct PropagateMode(u8);
1710impl PropagateMode {
1711    pub const ADD_TO_LIST: Self = Self(0);
1712    pub const DELETE_FROM_LIST: Self = Self(1);
1713}
1714impl From<PropagateMode> for u8 {
1715    #[inline]
1716    fn from(input: PropagateMode) -> Self {
1717        input.0
1718    }
1719}
1720impl From<PropagateMode> for Option<u8> {
1721    #[inline]
1722    fn from(input: PropagateMode) -> Self {
1723        Some(input.0)
1724    }
1725}
1726impl From<PropagateMode> for u16 {
1727    #[inline]
1728    fn from(input: PropagateMode) -> Self {
1729        u16::from(input.0)
1730    }
1731}
1732impl From<PropagateMode> for Option<u16> {
1733    #[inline]
1734    fn from(input: PropagateMode) -> Self {
1735        Some(u16::from(input.0))
1736    }
1737}
1738impl From<PropagateMode> for u32 {
1739    #[inline]
1740    fn from(input: PropagateMode) -> Self {
1741        u32::from(input.0)
1742    }
1743}
1744impl From<PropagateMode> for Option<u32> {
1745    #[inline]
1746    fn from(input: PropagateMode) -> Self {
1747        Some(u32::from(input.0))
1748    }
1749}
1750impl From<u8> for PropagateMode {
1751    #[inline]
1752    fn from(value: u8) -> Self {
1753        Self(value)
1754    }
1755}
1756impl core::fmt::Debug for PropagateMode  {
1757    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1758        let variants = [
1759            (Self::ADD_TO_LIST.0.into(), "ADD_TO_LIST", "AddToList"),
1760            (Self::DELETE_FROM_LIST.0.into(), "DELETE_FROM_LIST", "DeleteFromList"),
1761        ];
1762        pretty_print_enum(fmt, self.0.into(), &variants)
1763    }
1764}
1765
1766/// Opcode for the ChangeDeviceDontPropagateList request
1767pub const CHANGE_DEVICE_DONT_PROPAGATE_LIST_REQUEST: u8 = 8;
1768#[derive(Clone, Default)]
1769#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1770#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1771pub struct ChangeDeviceDontPropagateListRequest<'input> {
1772    pub window: xproto::Window,
1773    pub mode: PropagateMode,
1774    pub classes: Cow<'input, [EventClass]>,
1775}
1776impl_debug_if_no_extra_traits!(ChangeDeviceDontPropagateListRequest<'_>, "ChangeDeviceDontPropagateListRequest");
1777impl<'input> ChangeDeviceDontPropagateListRequest<'input> {
1778    /// Serialize this request into bytes for the provided connection
1779    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
1780        let length_so_far = 0;
1781        let window_bytes = self.window.serialize();
1782        let num_classes = u16::try_from(self.classes.len()).expect("`classes` has too many elements");
1783        let num_classes_bytes = num_classes.serialize();
1784        let mode_bytes = u8::from(self.mode).serialize();
1785        let mut request0 = vec![
1786            major_opcode,
1787            CHANGE_DEVICE_DONT_PROPAGATE_LIST_REQUEST,
1788            0,
1789            0,
1790            window_bytes[0],
1791            window_bytes[1],
1792            window_bytes[2],
1793            window_bytes[3],
1794            num_classes_bytes[0],
1795            num_classes_bytes[1],
1796            mode_bytes[0],
1797            0,
1798        ];
1799        let length_so_far = length_so_far + request0.len();
1800        let classes_bytes = self.classes.serialize();
1801        let length_so_far = length_so_far + classes_bytes.len();
1802        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
1803        let length_so_far = length_so_far + padding0.len();
1804        assert_eq!(length_so_far % 4, 0);
1805        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1806        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1807        ([request0.into(), classes_bytes.into(), padding0.into()], vec![])
1808    }
1809    /// Parse this request given its header, its body, and any fds that go along with it
1810    #[cfg(feature = "request-parsing")]
1811    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
1812        if header.minor_opcode != CHANGE_DEVICE_DONT_PROPAGATE_LIST_REQUEST {
1813            return Err(ParseError::InvalidValue);
1814        }
1815        let (window, remaining) = xproto::Window::try_parse(value)?;
1816        let (num_classes, remaining) = u16::try_parse(remaining)?;
1817        let (mode, remaining) = u8::try_parse(remaining)?;
1818        let mode = mode.into();
1819        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1820        let (classes, remaining) = crate::x11_utils::parse_list::<EventClass>(remaining, num_classes.try_to_usize()?)?;
1821        let _ = remaining;
1822        Ok(ChangeDeviceDontPropagateListRequest {
1823            window,
1824            mode,
1825            classes: Cow::Owned(classes),
1826        })
1827    }
1828    /// Clone all borrowed data in this ChangeDeviceDontPropagateListRequest.
1829    pub fn into_owned(self) -> ChangeDeviceDontPropagateListRequest<'static> {
1830        ChangeDeviceDontPropagateListRequest {
1831            window: self.window,
1832            mode: self.mode,
1833            classes: Cow::Owned(self.classes.into_owned()),
1834        }
1835    }
1836}
1837impl<'input> Request for ChangeDeviceDontPropagateListRequest<'input> {
1838    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1839
1840    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1841        let (bufs, fds) = self.serialize(major_opcode);
1842        // Flatten the buffers into a single vector
1843        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1844        (buf, fds)
1845    }
1846}
1847impl<'input> crate::x11_utils::VoidRequest for ChangeDeviceDontPropagateListRequest<'input> {
1848}
1849
1850/// Opcode for the GetDeviceDontPropagateList request
1851pub const GET_DEVICE_DONT_PROPAGATE_LIST_REQUEST: u8 = 9;
1852#[derive(Clone, Copy, Default)]
1853#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1854#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1855pub struct GetDeviceDontPropagateListRequest {
1856    pub window: xproto::Window,
1857}
1858impl_debug_if_no_extra_traits!(GetDeviceDontPropagateListRequest, "GetDeviceDontPropagateListRequest");
1859impl GetDeviceDontPropagateListRequest {
1860    /// Serialize this request into bytes for the provided connection
1861    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1862        let length_so_far = 0;
1863        let window_bytes = self.window.serialize();
1864        let mut request0 = vec![
1865            major_opcode,
1866            GET_DEVICE_DONT_PROPAGATE_LIST_REQUEST,
1867            0,
1868            0,
1869            window_bytes[0],
1870            window_bytes[1],
1871            window_bytes[2],
1872            window_bytes[3],
1873        ];
1874        let length_so_far = length_so_far + request0.len();
1875        assert_eq!(length_so_far % 4, 0);
1876        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1877        request0[2..4].copy_from_slice(&length.to_ne_bytes());
1878        ([request0.into()], vec![])
1879    }
1880    /// Parse this request given its header, its body, and any fds that go along with it
1881    #[cfg(feature = "request-parsing")]
1882    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1883        if header.minor_opcode != GET_DEVICE_DONT_PROPAGATE_LIST_REQUEST {
1884            return Err(ParseError::InvalidValue);
1885        }
1886        let (window, remaining) = xproto::Window::try_parse(value)?;
1887        let _ = remaining;
1888        Ok(GetDeviceDontPropagateListRequest {
1889            window,
1890        })
1891    }
1892}
1893impl Request for GetDeviceDontPropagateListRequest {
1894    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1895
1896    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1897        let (bufs, fds) = self.serialize(major_opcode);
1898        // Flatten the buffers into a single vector
1899        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1900        (buf, fds)
1901    }
1902}
1903impl crate::x11_utils::ReplyRequest for GetDeviceDontPropagateListRequest {
1904    type Reply = GetDeviceDontPropagateListReply;
1905}
1906
1907#[derive(Clone, Default)]
1908#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1909#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1910pub struct GetDeviceDontPropagateListReply {
1911    pub xi_reply_type: u8,
1912    pub sequence: u16,
1913    pub length: u32,
1914    pub classes: Vec<EventClass>,
1915}
1916impl_debug_if_no_extra_traits!(GetDeviceDontPropagateListReply, "GetDeviceDontPropagateListReply");
1917impl TryParse for GetDeviceDontPropagateListReply {
1918    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1919        let remaining = initial_value;
1920        let (response_type, remaining) = u8::try_parse(remaining)?;
1921        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
1922        let (sequence, remaining) = u16::try_parse(remaining)?;
1923        let (length, remaining) = u32::try_parse(remaining)?;
1924        let (num_classes, remaining) = u16::try_parse(remaining)?;
1925        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
1926        let (classes, remaining) = crate::x11_utils::parse_list::<EventClass>(remaining, num_classes.try_to_usize()?)?;
1927        if response_type != 1 {
1928            return Err(ParseError::InvalidValue);
1929        }
1930        let result = GetDeviceDontPropagateListReply { xi_reply_type, sequence, length, classes };
1931        let _ = remaining;
1932        let remaining = initial_value.get(32 + length as usize * 4..)
1933            .ok_or(ParseError::InsufficientData)?;
1934        Ok((result, remaining))
1935    }
1936}
1937impl Serialize for GetDeviceDontPropagateListReply {
1938    type Bytes = Vec<u8>;
1939    fn serialize(&self) -> Vec<u8> {
1940        let mut result = Vec::new();
1941        self.serialize_into(&mut result);
1942        result
1943    }
1944    fn serialize_into(&self, bytes: &mut Vec<u8>) {
1945        bytes.reserve(32);
1946        let response_type_bytes = &[1];
1947        bytes.push(response_type_bytes[0]);
1948        self.xi_reply_type.serialize_into(bytes);
1949        self.sequence.serialize_into(bytes);
1950        self.length.serialize_into(bytes);
1951        let num_classes = u16::try_from(self.classes.len()).expect("`classes` has too many elements");
1952        num_classes.serialize_into(bytes);
1953        bytes.extend_from_slice(&[0; 22]);
1954        self.classes.serialize_into(bytes);
1955    }
1956}
1957impl GetDeviceDontPropagateListReply {
1958    /// Get the value of the `num_classes` field.
1959    ///
1960    /// The `num_classes` field is used as the length field of the `classes` field.
1961    /// This function computes the field's value again based on the length of the list.
1962    ///
1963    /// # Panics
1964    ///
1965    /// Panics if the value cannot be represented in the target type. This
1966    /// cannot happen with values of the struct received from the X11 server.
1967    pub fn num_classes(&self) -> u16 {
1968        self.classes.len()
1969            .try_into().unwrap()
1970    }
1971}
1972
1973#[derive(Clone, Default)]
1974#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1975#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1976pub struct DeviceTimeCoord {
1977    pub time: xproto::Timestamp,
1978    pub axisvalues: Vec<i32>,
1979}
1980impl_debug_if_no_extra_traits!(DeviceTimeCoord, "DeviceTimeCoord");
1981impl DeviceTimeCoord {
1982    pub fn try_parse(remaining: &[u8], num_axes: u8) -> Result<(Self, &[u8]), ParseError> {
1983        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
1984        let (axisvalues, remaining) = crate::x11_utils::parse_list::<i32>(remaining, num_axes.try_to_usize()?)?;
1985        let result = DeviceTimeCoord { time, axisvalues };
1986        Ok((result, remaining))
1987    }
1988}
1989impl DeviceTimeCoord {
1990    #[allow(dead_code)]
1991    fn serialize(&self, num_axes: u8) -> Vec<u8> {
1992        let mut result = Vec::new();
1993        self.serialize_into(&mut result, u8::from(num_axes));
1994        result
1995    }
1996    fn serialize_into(&self, bytes: &mut Vec<u8>, num_axes: u8) {
1997        self.time.serialize_into(bytes);
1998        assert_eq!(self.axisvalues.len(), usize::try_from(num_axes).unwrap(), "`axisvalues` has an incorrect length");
1999        self.axisvalues.serialize_into(bytes);
2000    }
2001}
2002
2003/// Opcode for the GetDeviceMotionEvents request
2004pub const GET_DEVICE_MOTION_EVENTS_REQUEST: u8 = 10;
2005#[derive(Clone, Copy, Default)]
2006#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2007#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2008pub struct GetDeviceMotionEventsRequest {
2009    pub start: xproto::Timestamp,
2010    pub stop: xproto::Timestamp,
2011    pub device_id: u8,
2012}
2013impl_debug_if_no_extra_traits!(GetDeviceMotionEventsRequest, "GetDeviceMotionEventsRequest");
2014impl GetDeviceMotionEventsRequest {
2015    /// Serialize this request into bytes for the provided connection
2016    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2017        let length_so_far = 0;
2018        let start_bytes = self.start.serialize();
2019        let stop_bytes = self.stop.serialize();
2020        let device_id_bytes = self.device_id.serialize();
2021        let mut request0 = vec![
2022            major_opcode,
2023            GET_DEVICE_MOTION_EVENTS_REQUEST,
2024            0,
2025            0,
2026            start_bytes[0],
2027            start_bytes[1],
2028            start_bytes[2],
2029            start_bytes[3],
2030            stop_bytes[0],
2031            stop_bytes[1],
2032            stop_bytes[2],
2033            stop_bytes[3],
2034            device_id_bytes[0],
2035            0,
2036            0,
2037            0,
2038        ];
2039        let length_so_far = length_so_far + request0.len();
2040        assert_eq!(length_so_far % 4, 0);
2041        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2042        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2043        ([request0.into()], vec![])
2044    }
2045    /// Parse this request given its header, its body, and any fds that go along with it
2046    #[cfg(feature = "request-parsing")]
2047    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2048        if header.minor_opcode != GET_DEVICE_MOTION_EVENTS_REQUEST {
2049            return Err(ParseError::InvalidValue);
2050        }
2051        let (start, remaining) = xproto::Timestamp::try_parse(value)?;
2052        let (stop, remaining) = xproto::Timestamp::try_parse(remaining)?;
2053        let (device_id, remaining) = u8::try_parse(remaining)?;
2054        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
2055        let _ = remaining;
2056        Ok(GetDeviceMotionEventsRequest {
2057            start,
2058            stop,
2059            device_id,
2060        })
2061    }
2062}
2063impl Request for GetDeviceMotionEventsRequest {
2064    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2065
2066    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2067        let (bufs, fds) = self.serialize(major_opcode);
2068        // Flatten the buffers into a single vector
2069        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2070        (buf, fds)
2071    }
2072}
2073impl crate::x11_utils::ReplyRequest for GetDeviceMotionEventsRequest {
2074    type Reply = GetDeviceMotionEventsReply;
2075}
2076
2077#[derive(Clone, Default)]
2078#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2079#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2080pub struct GetDeviceMotionEventsReply {
2081    pub xi_reply_type: u8,
2082    pub sequence: u16,
2083    pub length: u32,
2084    pub num_axes: u8,
2085    pub device_mode: ValuatorMode,
2086    pub events: Vec<DeviceTimeCoord>,
2087}
2088impl_debug_if_no_extra_traits!(GetDeviceMotionEventsReply, "GetDeviceMotionEventsReply");
2089impl TryParse for GetDeviceMotionEventsReply {
2090    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2091        let remaining = initial_value;
2092        let (response_type, remaining) = u8::try_parse(remaining)?;
2093        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
2094        let (sequence, remaining) = u16::try_parse(remaining)?;
2095        let (length, remaining) = u32::try_parse(remaining)?;
2096        let (num_events, remaining) = u32::try_parse(remaining)?;
2097        let (num_axes, remaining) = u8::try_parse(remaining)?;
2098        let (device_mode, remaining) = u8::try_parse(remaining)?;
2099        let remaining = remaining.get(18..).ok_or(ParseError::InsufficientData)?;
2100        let mut remaining = remaining;
2101        let list_length = num_events.try_to_usize()?;
2102        let mut events = Vec::with_capacity(list_length);
2103        for _ in 0..list_length {
2104            let (v, new_remaining) = DeviceTimeCoord::try_parse(remaining, num_axes)?;
2105            remaining = new_remaining;
2106            events.push(v);
2107        }
2108        if response_type != 1 {
2109            return Err(ParseError::InvalidValue);
2110        }
2111        let device_mode = device_mode.into();
2112        let result = GetDeviceMotionEventsReply { xi_reply_type, sequence, length, num_axes, device_mode, events };
2113        let _ = remaining;
2114        let remaining = initial_value.get(32 + length as usize * 4..)
2115            .ok_or(ParseError::InsufficientData)?;
2116        Ok((result, remaining))
2117    }
2118}
2119impl Serialize for GetDeviceMotionEventsReply {
2120    type Bytes = Vec<u8>;
2121    fn serialize(&self) -> Vec<u8> {
2122        let mut result = Vec::new();
2123        self.serialize_into(&mut result);
2124        result
2125    }
2126    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2127        bytes.reserve(32);
2128        let response_type_bytes = &[1];
2129        bytes.push(response_type_bytes[0]);
2130        self.xi_reply_type.serialize_into(bytes);
2131        self.sequence.serialize_into(bytes);
2132        self.length.serialize_into(bytes);
2133        let num_events = u32::try_from(self.events.len()).expect("`events` has too many elements");
2134        num_events.serialize_into(bytes);
2135        self.num_axes.serialize_into(bytes);
2136        u8::from(self.device_mode).serialize_into(bytes);
2137        bytes.extend_from_slice(&[0; 18]);
2138        for element in self.events.iter() {
2139            element.serialize_into(bytes, u8::from(self.num_axes));
2140        }
2141    }
2142}
2143impl GetDeviceMotionEventsReply {
2144    /// Get the value of the `num_events` field.
2145    ///
2146    /// The `num_events` field is used as the length field of the `events` field.
2147    /// This function computes the field's value again based on the length of the list.
2148    ///
2149    /// # Panics
2150    ///
2151    /// Panics if the value cannot be represented in the target type. This
2152    /// cannot happen with values of the struct received from the X11 server.
2153    pub fn num_events(&self) -> u32 {
2154        self.events.len()
2155            .try_into().unwrap()
2156    }
2157}
2158
2159/// Opcode for the ChangeKeyboardDevice request
2160pub const CHANGE_KEYBOARD_DEVICE_REQUEST: u8 = 11;
2161#[derive(Clone, Copy, Default)]
2162#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2163#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2164pub struct ChangeKeyboardDeviceRequest {
2165    pub device_id: u8,
2166}
2167impl_debug_if_no_extra_traits!(ChangeKeyboardDeviceRequest, "ChangeKeyboardDeviceRequest");
2168impl ChangeKeyboardDeviceRequest {
2169    /// Serialize this request into bytes for the provided connection
2170    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2171        let length_so_far = 0;
2172        let device_id_bytes = self.device_id.serialize();
2173        let mut request0 = vec![
2174            major_opcode,
2175            CHANGE_KEYBOARD_DEVICE_REQUEST,
2176            0,
2177            0,
2178            device_id_bytes[0],
2179            0,
2180            0,
2181            0,
2182        ];
2183        let length_so_far = length_so_far + request0.len();
2184        assert_eq!(length_so_far % 4, 0);
2185        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2186        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2187        ([request0.into()], vec![])
2188    }
2189    /// Parse this request given its header, its body, and any fds that go along with it
2190    #[cfg(feature = "request-parsing")]
2191    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2192        if header.minor_opcode != CHANGE_KEYBOARD_DEVICE_REQUEST {
2193            return Err(ParseError::InvalidValue);
2194        }
2195        let (device_id, remaining) = u8::try_parse(value)?;
2196        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
2197        let _ = remaining;
2198        Ok(ChangeKeyboardDeviceRequest {
2199            device_id,
2200        })
2201    }
2202}
2203impl Request for ChangeKeyboardDeviceRequest {
2204    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2205
2206    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2207        let (bufs, fds) = self.serialize(major_opcode);
2208        // Flatten the buffers into a single vector
2209        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2210        (buf, fds)
2211    }
2212}
2213impl crate::x11_utils::ReplyRequest for ChangeKeyboardDeviceRequest {
2214    type Reply = ChangeKeyboardDeviceReply;
2215}
2216
2217#[derive(Clone, Copy, Default)]
2218#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2219#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2220pub struct ChangeKeyboardDeviceReply {
2221    pub xi_reply_type: u8,
2222    pub sequence: u16,
2223    pub length: u32,
2224    pub status: xproto::GrabStatus,
2225}
2226impl_debug_if_no_extra_traits!(ChangeKeyboardDeviceReply, "ChangeKeyboardDeviceReply");
2227impl TryParse for ChangeKeyboardDeviceReply {
2228    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2229        let remaining = initial_value;
2230        let (response_type, remaining) = u8::try_parse(remaining)?;
2231        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
2232        let (sequence, remaining) = u16::try_parse(remaining)?;
2233        let (length, remaining) = u32::try_parse(remaining)?;
2234        let (status, remaining) = u8::try_parse(remaining)?;
2235        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
2236        if response_type != 1 {
2237            return Err(ParseError::InvalidValue);
2238        }
2239        let status = status.into();
2240        let result = ChangeKeyboardDeviceReply { xi_reply_type, sequence, length, status };
2241        let _ = remaining;
2242        let remaining = initial_value.get(32 + length as usize * 4..)
2243            .ok_or(ParseError::InsufficientData)?;
2244        Ok((result, remaining))
2245    }
2246}
2247impl Serialize for ChangeKeyboardDeviceReply {
2248    type Bytes = [u8; 32];
2249    fn serialize(&self) -> [u8; 32] {
2250        let response_type_bytes = &[1];
2251        let xi_reply_type_bytes = self.xi_reply_type.serialize();
2252        let sequence_bytes = self.sequence.serialize();
2253        let length_bytes = self.length.serialize();
2254        let status_bytes = u8::from(self.status).serialize();
2255        [
2256            response_type_bytes[0],
2257            xi_reply_type_bytes[0],
2258            sequence_bytes[0],
2259            sequence_bytes[1],
2260            length_bytes[0],
2261            length_bytes[1],
2262            length_bytes[2],
2263            length_bytes[3],
2264            status_bytes[0],
2265            0,
2266            0,
2267            0,
2268            0,
2269            0,
2270            0,
2271            0,
2272            0,
2273            0,
2274            0,
2275            0,
2276            0,
2277            0,
2278            0,
2279            0,
2280            0,
2281            0,
2282            0,
2283            0,
2284            0,
2285            0,
2286            0,
2287            0,
2288        ]
2289    }
2290    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2291        bytes.reserve(32);
2292        let response_type_bytes = &[1];
2293        bytes.push(response_type_bytes[0]);
2294        self.xi_reply_type.serialize_into(bytes);
2295        self.sequence.serialize_into(bytes);
2296        self.length.serialize_into(bytes);
2297        u8::from(self.status).serialize_into(bytes);
2298        bytes.extend_from_slice(&[0; 23]);
2299    }
2300}
2301
2302/// Opcode for the ChangePointerDevice request
2303pub const CHANGE_POINTER_DEVICE_REQUEST: u8 = 12;
2304#[derive(Clone, Copy, Default)]
2305#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2306#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2307pub struct ChangePointerDeviceRequest {
2308    pub x_axis: u8,
2309    pub y_axis: u8,
2310    pub device_id: u8,
2311}
2312impl_debug_if_no_extra_traits!(ChangePointerDeviceRequest, "ChangePointerDeviceRequest");
2313impl ChangePointerDeviceRequest {
2314    /// Serialize this request into bytes for the provided connection
2315    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2316        let length_so_far = 0;
2317        let x_axis_bytes = self.x_axis.serialize();
2318        let y_axis_bytes = self.y_axis.serialize();
2319        let device_id_bytes = self.device_id.serialize();
2320        let mut request0 = vec![
2321            major_opcode,
2322            CHANGE_POINTER_DEVICE_REQUEST,
2323            0,
2324            0,
2325            x_axis_bytes[0],
2326            y_axis_bytes[0],
2327            device_id_bytes[0],
2328            0,
2329        ];
2330        let length_so_far = length_so_far + request0.len();
2331        assert_eq!(length_so_far % 4, 0);
2332        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2333        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2334        ([request0.into()], vec![])
2335    }
2336    /// Parse this request given its header, its body, and any fds that go along with it
2337    #[cfg(feature = "request-parsing")]
2338    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2339        if header.minor_opcode != CHANGE_POINTER_DEVICE_REQUEST {
2340            return Err(ParseError::InvalidValue);
2341        }
2342        let (x_axis, remaining) = u8::try_parse(value)?;
2343        let (y_axis, remaining) = u8::try_parse(remaining)?;
2344        let (device_id, remaining) = u8::try_parse(remaining)?;
2345        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2346        let _ = remaining;
2347        Ok(ChangePointerDeviceRequest {
2348            x_axis,
2349            y_axis,
2350            device_id,
2351        })
2352    }
2353}
2354impl Request for ChangePointerDeviceRequest {
2355    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2356
2357    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2358        let (bufs, fds) = self.serialize(major_opcode);
2359        // Flatten the buffers into a single vector
2360        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2361        (buf, fds)
2362    }
2363}
2364impl crate::x11_utils::ReplyRequest for ChangePointerDeviceRequest {
2365    type Reply = ChangePointerDeviceReply;
2366}
2367
2368#[derive(Clone, Copy, Default)]
2369#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2370#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2371pub struct ChangePointerDeviceReply {
2372    pub xi_reply_type: u8,
2373    pub sequence: u16,
2374    pub length: u32,
2375    pub status: xproto::GrabStatus,
2376}
2377impl_debug_if_no_extra_traits!(ChangePointerDeviceReply, "ChangePointerDeviceReply");
2378impl TryParse for ChangePointerDeviceReply {
2379    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2380        let remaining = initial_value;
2381        let (response_type, remaining) = u8::try_parse(remaining)?;
2382        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
2383        let (sequence, remaining) = u16::try_parse(remaining)?;
2384        let (length, remaining) = u32::try_parse(remaining)?;
2385        let (status, remaining) = u8::try_parse(remaining)?;
2386        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
2387        if response_type != 1 {
2388            return Err(ParseError::InvalidValue);
2389        }
2390        let status = status.into();
2391        let result = ChangePointerDeviceReply { xi_reply_type, sequence, length, status };
2392        let _ = remaining;
2393        let remaining = initial_value.get(32 + length as usize * 4..)
2394            .ok_or(ParseError::InsufficientData)?;
2395        Ok((result, remaining))
2396    }
2397}
2398impl Serialize for ChangePointerDeviceReply {
2399    type Bytes = [u8; 32];
2400    fn serialize(&self) -> [u8; 32] {
2401        let response_type_bytes = &[1];
2402        let xi_reply_type_bytes = self.xi_reply_type.serialize();
2403        let sequence_bytes = self.sequence.serialize();
2404        let length_bytes = self.length.serialize();
2405        let status_bytes = u8::from(self.status).serialize();
2406        [
2407            response_type_bytes[0],
2408            xi_reply_type_bytes[0],
2409            sequence_bytes[0],
2410            sequence_bytes[1],
2411            length_bytes[0],
2412            length_bytes[1],
2413            length_bytes[2],
2414            length_bytes[3],
2415            status_bytes[0],
2416            0,
2417            0,
2418            0,
2419            0,
2420            0,
2421            0,
2422            0,
2423            0,
2424            0,
2425            0,
2426            0,
2427            0,
2428            0,
2429            0,
2430            0,
2431            0,
2432            0,
2433            0,
2434            0,
2435            0,
2436            0,
2437            0,
2438            0,
2439        ]
2440    }
2441    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2442        bytes.reserve(32);
2443        let response_type_bytes = &[1];
2444        bytes.push(response_type_bytes[0]);
2445        self.xi_reply_type.serialize_into(bytes);
2446        self.sequence.serialize_into(bytes);
2447        self.length.serialize_into(bytes);
2448        u8::from(self.status).serialize_into(bytes);
2449        bytes.extend_from_slice(&[0; 23]);
2450    }
2451}
2452
2453/// Opcode for the GrabDevice request
2454pub const GRAB_DEVICE_REQUEST: u8 = 13;
2455#[derive(Clone, Default)]
2456#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2457#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2458pub struct GrabDeviceRequest<'input> {
2459    pub grab_window: xproto::Window,
2460    pub time: xproto::Timestamp,
2461    pub this_device_mode: xproto::GrabMode,
2462    pub other_device_mode: xproto::GrabMode,
2463    pub owner_events: bool,
2464    pub device_id: u8,
2465    pub classes: Cow<'input, [EventClass]>,
2466}
2467impl_debug_if_no_extra_traits!(GrabDeviceRequest<'_>, "GrabDeviceRequest");
2468impl<'input> GrabDeviceRequest<'input> {
2469    /// Serialize this request into bytes for the provided connection
2470    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
2471        let length_so_far = 0;
2472        let grab_window_bytes = self.grab_window.serialize();
2473        let time_bytes = self.time.serialize();
2474        let num_classes = u16::try_from(self.classes.len()).expect("`classes` has too many elements");
2475        let num_classes_bytes = num_classes.serialize();
2476        let this_device_mode_bytes = u8::from(self.this_device_mode).serialize();
2477        let other_device_mode_bytes = u8::from(self.other_device_mode).serialize();
2478        let owner_events_bytes = self.owner_events.serialize();
2479        let device_id_bytes = self.device_id.serialize();
2480        let mut request0 = vec![
2481            major_opcode,
2482            GRAB_DEVICE_REQUEST,
2483            0,
2484            0,
2485            grab_window_bytes[0],
2486            grab_window_bytes[1],
2487            grab_window_bytes[2],
2488            grab_window_bytes[3],
2489            time_bytes[0],
2490            time_bytes[1],
2491            time_bytes[2],
2492            time_bytes[3],
2493            num_classes_bytes[0],
2494            num_classes_bytes[1],
2495            this_device_mode_bytes[0],
2496            other_device_mode_bytes[0],
2497            owner_events_bytes[0],
2498            device_id_bytes[0],
2499            0,
2500            0,
2501        ];
2502        let length_so_far = length_so_far + request0.len();
2503        let classes_bytes = self.classes.serialize();
2504        let length_so_far = length_so_far + classes_bytes.len();
2505        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
2506        let length_so_far = length_so_far + padding0.len();
2507        assert_eq!(length_so_far % 4, 0);
2508        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2509        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2510        ([request0.into(), classes_bytes.into(), padding0.into()], vec![])
2511    }
2512    /// Parse this request given its header, its body, and any fds that go along with it
2513    #[cfg(feature = "request-parsing")]
2514    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
2515        if header.minor_opcode != GRAB_DEVICE_REQUEST {
2516            return Err(ParseError::InvalidValue);
2517        }
2518        let (grab_window, remaining) = xproto::Window::try_parse(value)?;
2519        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
2520        let (num_classes, remaining) = u16::try_parse(remaining)?;
2521        let (this_device_mode, remaining) = u8::try_parse(remaining)?;
2522        let this_device_mode = this_device_mode.into();
2523        let (other_device_mode, remaining) = u8::try_parse(remaining)?;
2524        let other_device_mode = other_device_mode.into();
2525        let (owner_events, remaining) = bool::try_parse(remaining)?;
2526        let (device_id, remaining) = u8::try_parse(remaining)?;
2527        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
2528        let (classes, remaining) = crate::x11_utils::parse_list::<EventClass>(remaining, num_classes.try_to_usize()?)?;
2529        let _ = remaining;
2530        Ok(GrabDeviceRequest {
2531            grab_window,
2532            time,
2533            this_device_mode,
2534            other_device_mode,
2535            owner_events,
2536            device_id,
2537            classes: Cow::Owned(classes),
2538        })
2539    }
2540    /// Clone all borrowed data in this GrabDeviceRequest.
2541    pub fn into_owned(self) -> GrabDeviceRequest<'static> {
2542        GrabDeviceRequest {
2543            grab_window: self.grab_window,
2544            time: self.time,
2545            this_device_mode: self.this_device_mode,
2546            other_device_mode: self.other_device_mode,
2547            owner_events: self.owner_events,
2548            device_id: self.device_id,
2549            classes: Cow::Owned(self.classes.into_owned()),
2550        }
2551    }
2552}
2553impl<'input> Request for GrabDeviceRequest<'input> {
2554    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2555
2556    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2557        let (bufs, fds) = self.serialize(major_opcode);
2558        // Flatten the buffers into a single vector
2559        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2560        (buf, fds)
2561    }
2562}
2563impl<'input> crate::x11_utils::ReplyRequest for GrabDeviceRequest<'input> {
2564    type Reply = GrabDeviceReply;
2565}
2566
2567#[derive(Clone, Copy, Default)]
2568#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2569#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2570pub struct GrabDeviceReply {
2571    pub xi_reply_type: u8,
2572    pub sequence: u16,
2573    pub length: u32,
2574    pub status: xproto::GrabStatus,
2575}
2576impl_debug_if_no_extra_traits!(GrabDeviceReply, "GrabDeviceReply");
2577impl TryParse for GrabDeviceReply {
2578    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2579        let remaining = initial_value;
2580        let (response_type, remaining) = u8::try_parse(remaining)?;
2581        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
2582        let (sequence, remaining) = u16::try_parse(remaining)?;
2583        let (length, remaining) = u32::try_parse(remaining)?;
2584        let (status, remaining) = u8::try_parse(remaining)?;
2585        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
2586        if response_type != 1 {
2587            return Err(ParseError::InvalidValue);
2588        }
2589        let status = status.into();
2590        let result = GrabDeviceReply { xi_reply_type, sequence, length, status };
2591        let _ = remaining;
2592        let remaining = initial_value.get(32 + length as usize * 4..)
2593            .ok_or(ParseError::InsufficientData)?;
2594        Ok((result, remaining))
2595    }
2596}
2597impl Serialize for GrabDeviceReply {
2598    type Bytes = [u8; 32];
2599    fn serialize(&self) -> [u8; 32] {
2600        let response_type_bytes = &[1];
2601        let xi_reply_type_bytes = self.xi_reply_type.serialize();
2602        let sequence_bytes = self.sequence.serialize();
2603        let length_bytes = self.length.serialize();
2604        let status_bytes = u8::from(self.status).serialize();
2605        [
2606            response_type_bytes[0],
2607            xi_reply_type_bytes[0],
2608            sequence_bytes[0],
2609            sequence_bytes[1],
2610            length_bytes[0],
2611            length_bytes[1],
2612            length_bytes[2],
2613            length_bytes[3],
2614            status_bytes[0],
2615            0,
2616            0,
2617            0,
2618            0,
2619            0,
2620            0,
2621            0,
2622            0,
2623            0,
2624            0,
2625            0,
2626            0,
2627            0,
2628            0,
2629            0,
2630            0,
2631            0,
2632            0,
2633            0,
2634            0,
2635            0,
2636            0,
2637            0,
2638        ]
2639    }
2640    fn serialize_into(&self, bytes: &mut Vec<u8>) {
2641        bytes.reserve(32);
2642        let response_type_bytes = &[1];
2643        bytes.push(response_type_bytes[0]);
2644        self.xi_reply_type.serialize_into(bytes);
2645        self.sequence.serialize_into(bytes);
2646        self.length.serialize_into(bytes);
2647        u8::from(self.status).serialize_into(bytes);
2648        bytes.extend_from_slice(&[0; 23]);
2649    }
2650}
2651
2652/// Opcode for the UngrabDevice request
2653pub const UNGRAB_DEVICE_REQUEST: u8 = 14;
2654#[derive(Clone, Copy, Default)]
2655#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2656#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2657pub struct UngrabDeviceRequest {
2658    pub time: xproto::Timestamp,
2659    pub device_id: u8,
2660}
2661impl_debug_if_no_extra_traits!(UngrabDeviceRequest, "UngrabDeviceRequest");
2662impl UngrabDeviceRequest {
2663    /// Serialize this request into bytes for the provided connection
2664    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2665        let length_so_far = 0;
2666        let time_bytes = self.time.serialize();
2667        let device_id_bytes = self.device_id.serialize();
2668        let mut request0 = vec![
2669            major_opcode,
2670            UNGRAB_DEVICE_REQUEST,
2671            0,
2672            0,
2673            time_bytes[0],
2674            time_bytes[1],
2675            time_bytes[2],
2676            time_bytes[3],
2677            device_id_bytes[0],
2678            0,
2679            0,
2680            0,
2681        ];
2682        let length_so_far = length_so_far + request0.len();
2683        assert_eq!(length_so_far % 4, 0);
2684        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2685        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2686        ([request0.into()], vec![])
2687    }
2688    /// Parse this request given its header, its body, and any fds that go along with it
2689    #[cfg(feature = "request-parsing")]
2690    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2691        if header.minor_opcode != UNGRAB_DEVICE_REQUEST {
2692            return Err(ParseError::InvalidValue);
2693        }
2694        let (time, remaining) = xproto::Timestamp::try_parse(value)?;
2695        let (device_id, remaining) = u8::try_parse(remaining)?;
2696        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
2697        let _ = remaining;
2698        Ok(UngrabDeviceRequest {
2699            time,
2700            device_id,
2701        })
2702    }
2703}
2704impl Request for UngrabDeviceRequest {
2705    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2706
2707    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2708        let (bufs, fds) = self.serialize(major_opcode);
2709        // Flatten the buffers into a single vector
2710        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2711        (buf, fds)
2712    }
2713}
2714impl crate::x11_utils::VoidRequest for UngrabDeviceRequest {
2715}
2716
2717#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
2718#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2719pub struct ModifierDevice(u8);
2720impl ModifierDevice {
2721    pub const USE_X_KEYBOARD: Self = Self(255);
2722}
2723impl From<ModifierDevice> for u8 {
2724    #[inline]
2725    fn from(input: ModifierDevice) -> Self {
2726        input.0
2727    }
2728}
2729impl From<ModifierDevice> for Option<u8> {
2730    #[inline]
2731    fn from(input: ModifierDevice) -> Self {
2732        Some(input.0)
2733    }
2734}
2735impl From<ModifierDevice> for u16 {
2736    #[inline]
2737    fn from(input: ModifierDevice) -> Self {
2738        u16::from(input.0)
2739    }
2740}
2741impl From<ModifierDevice> for Option<u16> {
2742    #[inline]
2743    fn from(input: ModifierDevice) -> Self {
2744        Some(u16::from(input.0))
2745    }
2746}
2747impl From<ModifierDevice> for u32 {
2748    #[inline]
2749    fn from(input: ModifierDevice) -> Self {
2750        u32::from(input.0)
2751    }
2752}
2753impl From<ModifierDevice> for Option<u32> {
2754    #[inline]
2755    fn from(input: ModifierDevice) -> Self {
2756        Some(u32::from(input.0))
2757    }
2758}
2759impl From<u8> for ModifierDevice {
2760    #[inline]
2761    fn from(value: u8) -> Self {
2762        Self(value)
2763    }
2764}
2765impl core::fmt::Debug for ModifierDevice  {
2766    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
2767        let variants = [
2768            (Self::USE_X_KEYBOARD.0.into(), "USE_X_KEYBOARD", "UseXKeyboard"),
2769        ];
2770        pretty_print_enum(fmt, self.0.into(), &variants)
2771    }
2772}
2773
2774/// Opcode for the GrabDeviceKey request
2775pub const GRAB_DEVICE_KEY_REQUEST: u8 = 15;
2776#[derive(Clone, Default)]
2777#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2778#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2779pub struct GrabDeviceKeyRequest<'input> {
2780    pub grab_window: xproto::Window,
2781    pub modifiers: xproto::ModMask,
2782    pub modifier_device: u8,
2783    pub grabbed_device: u8,
2784    pub key: u8,
2785    pub this_device_mode: xproto::GrabMode,
2786    pub other_device_mode: xproto::GrabMode,
2787    pub owner_events: bool,
2788    pub classes: Cow<'input, [EventClass]>,
2789}
2790impl_debug_if_no_extra_traits!(GrabDeviceKeyRequest<'_>, "GrabDeviceKeyRequest");
2791impl<'input> GrabDeviceKeyRequest<'input> {
2792    /// Serialize this request into bytes for the provided connection
2793    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
2794        let length_so_far = 0;
2795        let grab_window_bytes = self.grab_window.serialize();
2796        let num_classes = u16::try_from(self.classes.len()).expect("`classes` has too many elements");
2797        let num_classes_bytes = num_classes.serialize();
2798        let modifiers_bytes = u16::from(self.modifiers).serialize();
2799        let modifier_device_bytes = self.modifier_device.serialize();
2800        let grabbed_device_bytes = self.grabbed_device.serialize();
2801        let key_bytes = self.key.serialize();
2802        let this_device_mode_bytes = u8::from(self.this_device_mode).serialize();
2803        let other_device_mode_bytes = u8::from(self.other_device_mode).serialize();
2804        let owner_events_bytes = self.owner_events.serialize();
2805        let mut request0 = vec![
2806            major_opcode,
2807            GRAB_DEVICE_KEY_REQUEST,
2808            0,
2809            0,
2810            grab_window_bytes[0],
2811            grab_window_bytes[1],
2812            grab_window_bytes[2],
2813            grab_window_bytes[3],
2814            num_classes_bytes[0],
2815            num_classes_bytes[1],
2816            modifiers_bytes[0],
2817            modifiers_bytes[1],
2818            modifier_device_bytes[0],
2819            grabbed_device_bytes[0],
2820            key_bytes[0],
2821            this_device_mode_bytes[0],
2822            other_device_mode_bytes[0],
2823            owner_events_bytes[0],
2824            0,
2825            0,
2826        ];
2827        let length_so_far = length_so_far + request0.len();
2828        let classes_bytes = self.classes.serialize();
2829        let length_so_far = length_so_far + classes_bytes.len();
2830        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
2831        let length_so_far = length_so_far + padding0.len();
2832        assert_eq!(length_so_far % 4, 0);
2833        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2834        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2835        ([request0.into(), classes_bytes.into(), padding0.into()], vec![])
2836    }
2837    /// Parse this request given its header, its body, and any fds that go along with it
2838    #[cfg(feature = "request-parsing")]
2839    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
2840        if header.minor_opcode != GRAB_DEVICE_KEY_REQUEST {
2841            return Err(ParseError::InvalidValue);
2842        }
2843        let (grab_window, remaining) = xproto::Window::try_parse(value)?;
2844        let (num_classes, remaining) = u16::try_parse(remaining)?;
2845        let (modifiers, remaining) = u16::try_parse(remaining)?;
2846        let modifiers = modifiers.into();
2847        let (modifier_device, remaining) = u8::try_parse(remaining)?;
2848        let (grabbed_device, remaining) = u8::try_parse(remaining)?;
2849        let (key, remaining) = u8::try_parse(remaining)?;
2850        let (this_device_mode, remaining) = u8::try_parse(remaining)?;
2851        let this_device_mode = this_device_mode.into();
2852        let (other_device_mode, remaining) = u8::try_parse(remaining)?;
2853        let other_device_mode = other_device_mode.into();
2854        let (owner_events, remaining) = bool::try_parse(remaining)?;
2855        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
2856        let (classes, remaining) = crate::x11_utils::parse_list::<EventClass>(remaining, num_classes.try_to_usize()?)?;
2857        let _ = remaining;
2858        Ok(GrabDeviceKeyRequest {
2859            grab_window,
2860            modifiers,
2861            modifier_device,
2862            grabbed_device,
2863            key,
2864            this_device_mode,
2865            other_device_mode,
2866            owner_events,
2867            classes: Cow::Owned(classes),
2868        })
2869    }
2870    /// Clone all borrowed data in this GrabDeviceKeyRequest.
2871    pub fn into_owned(self) -> GrabDeviceKeyRequest<'static> {
2872        GrabDeviceKeyRequest {
2873            grab_window: self.grab_window,
2874            modifiers: self.modifiers,
2875            modifier_device: self.modifier_device,
2876            grabbed_device: self.grabbed_device,
2877            key: self.key,
2878            this_device_mode: self.this_device_mode,
2879            other_device_mode: self.other_device_mode,
2880            owner_events: self.owner_events,
2881            classes: Cow::Owned(self.classes.into_owned()),
2882        }
2883    }
2884}
2885impl<'input> Request for GrabDeviceKeyRequest<'input> {
2886    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2887
2888    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2889        let (bufs, fds) = self.serialize(major_opcode);
2890        // Flatten the buffers into a single vector
2891        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2892        (buf, fds)
2893    }
2894}
2895impl<'input> crate::x11_utils::VoidRequest for GrabDeviceKeyRequest<'input> {
2896}
2897
2898/// Opcode for the UngrabDeviceKey request
2899pub const UNGRAB_DEVICE_KEY_REQUEST: u8 = 16;
2900#[derive(Clone, Copy, Default)]
2901#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2902#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2903pub struct UngrabDeviceKeyRequest {
2904    pub grab_window: xproto::Window,
2905    pub modifiers: xproto::ModMask,
2906    pub modifier_device: u8,
2907    pub key: u8,
2908    pub grabbed_device: u8,
2909}
2910impl_debug_if_no_extra_traits!(UngrabDeviceKeyRequest, "UngrabDeviceKeyRequest");
2911impl UngrabDeviceKeyRequest {
2912    /// Serialize this request into bytes for the provided connection
2913    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2914        let length_so_far = 0;
2915        let grab_window_bytes = self.grab_window.serialize();
2916        let modifiers_bytes = u16::from(self.modifiers).serialize();
2917        let modifier_device_bytes = self.modifier_device.serialize();
2918        let key_bytes = self.key.serialize();
2919        let grabbed_device_bytes = self.grabbed_device.serialize();
2920        let mut request0 = vec![
2921            major_opcode,
2922            UNGRAB_DEVICE_KEY_REQUEST,
2923            0,
2924            0,
2925            grab_window_bytes[0],
2926            grab_window_bytes[1],
2927            grab_window_bytes[2],
2928            grab_window_bytes[3],
2929            modifiers_bytes[0],
2930            modifiers_bytes[1],
2931            modifier_device_bytes[0],
2932            key_bytes[0],
2933            grabbed_device_bytes[0],
2934            0,
2935            0,
2936            0,
2937        ];
2938        let length_so_far = length_so_far + request0.len();
2939        assert_eq!(length_so_far % 4, 0);
2940        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2941        request0[2..4].copy_from_slice(&length.to_ne_bytes());
2942        ([request0.into()], vec![])
2943    }
2944    /// Parse this request given its header, its body, and any fds that go along with it
2945    #[cfg(feature = "request-parsing")]
2946    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2947        if header.minor_opcode != UNGRAB_DEVICE_KEY_REQUEST {
2948            return Err(ParseError::InvalidValue);
2949        }
2950        let (grab_window, remaining) = xproto::Window::try_parse(value)?;
2951        let (modifiers, remaining) = u16::try_parse(remaining)?;
2952        let modifiers = modifiers.into();
2953        let (modifier_device, remaining) = u8::try_parse(remaining)?;
2954        let (key, remaining) = u8::try_parse(remaining)?;
2955        let (grabbed_device, remaining) = u8::try_parse(remaining)?;
2956        let _ = remaining;
2957        Ok(UngrabDeviceKeyRequest {
2958            grab_window,
2959            modifiers,
2960            modifier_device,
2961            key,
2962            grabbed_device,
2963        })
2964    }
2965}
2966impl Request for UngrabDeviceKeyRequest {
2967    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2968
2969    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2970        let (bufs, fds) = self.serialize(major_opcode);
2971        // Flatten the buffers into a single vector
2972        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2973        (buf, fds)
2974    }
2975}
2976impl crate::x11_utils::VoidRequest for UngrabDeviceKeyRequest {
2977}
2978
2979/// Opcode for the GrabDeviceButton request
2980pub const GRAB_DEVICE_BUTTON_REQUEST: u8 = 17;
2981#[derive(Clone, Default)]
2982#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2983#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2984pub struct GrabDeviceButtonRequest<'input> {
2985    pub grab_window: xproto::Window,
2986    pub grabbed_device: u8,
2987    pub modifier_device: u8,
2988    pub modifiers: xproto::ModMask,
2989    pub this_device_mode: xproto::GrabMode,
2990    pub other_device_mode: xproto::GrabMode,
2991    pub button: u8,
2992    pub owner_events: bool,
2993    pub classes: Cow<'input, [EventClass]>,
2994}
2995impl_debug_if_no_extra_traits!(GrabDeviceButtonRequest<'_>, "GrabDeviceButtonRequest");
2996impl<'input> GrabDeviceButtonRequest<'input> {
2997    /// Serialize this request into bytes for the provided connection
2998    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
2999        let length_so_far = 0;
3000        let grab_window_bytes = self.grab_window.serialize();
3001        let grabbed_device_bytes = self.grabbed_device.serialize();
3002        let modifier_device_bytes = self.modifier_device.serialize();
3003        let num_classes = u16::try_from(self.classes.len()).expect("`classes` has too many elements");
3004        let num_classes_bytes = num_classes.serialize();
3005        let modifiers_bytes = u16::from(self.modifiers).serialize();
3006        let this_device_mode_bytes = u8::from(self.this_device_mode).serialize();
3007        let other_device_mode_bytes = u8::from(self.other_device_mode).serialize();
3008        let button_bytes = self.button.serialize();
3009        let owner_events_bytes = self.owner_events.serialize();
3010        let mut request0 = vec![
3011            major_opcode,
3012            GRAB_DEVICE_BUTTON_REQUEST,
3013            0,
3014            0,
3015            grab_window_bytes[0],
3016            grab_window_bytes[1],
3017            grab_window_bytes[2],
3018            grab_window_bytes[3],
3019            grabbed_device_bytes[0],
3020            modifier_device_bytes[0],
3021            num_classes_bytes[0],
3022            num_classes_bytes[1],
3023            modifiers_bytes[0],
3024            modifiers_bytes[1],
3025            this_device_mode_bytes[0],
3026            other_device_mode_bytes[0],
3027            button_bytes[0],
3028            owner_events_bytes[0],
3029            0,
3030            0,
3031        ];
3032        let length_so_far = length_so_far + request0.len();
3033        let classes_bytes = self.classes.serialize();
3034        let length_so_far = length_so_far + classes_bytes.len();
3035        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
3036        let length_so_far = length_so_far + padding0.len();
3037        assert_eq!(length_so_far % 4, 0);
3038        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
3039        request0[2..4].copy_from_slice(&length.to_ne_bytes());
3040        ([request0.into(), classes_bytes.into(), padding0.into()], vec![])
3041    }
3042    /// Parse this request given its header, its body, and any fds that go along with it
3043    #[cfg(feature = "request-parsing")]
3044    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
3045        if header.minor_opcode != GRAB_DEVICE_BUTTON_REQUEST {
3046            return Err(ParseError::InvalidValue);
3047        }
3048        let (grab_window, remaining) = xproto::Window::try_parse(value)?;
3049        let (grabbed_device, remaining) = u8::try_parse(remaining)?;
3050        let (modifier_device, remaining) = u8::try_parse(remaining)?;
3051        let (num_classes, remaining) = u16::try_parse(remaining)?;
3052        let (modifiers, remaining) = u16::try_parse(remaining)?;
3053        let modifiers = modifiers.into();
3054        let (this_device_mode, remaining) = u8::try_parse(remaining)?;
3055        let this_device_mode = this_device_mode.into();
3056        let (other_device_mode, remaining) = u8::try_parse(remaining)?;
3057        let other_device_mode = other_device_mode.into();
3058        let (button, remaining) = u8::try_parse(remaining)?;
3059        let (owner_events, remaining) = bool::try_parse(remaining)?;
3060        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
3061        let (classes, remaining) = crate::x11_utils::parse_list::<EventClass>(remaining, num_classes.try_to_usize()?)?;
3062        let _ = remaining;
3063        Ok(GrabDeviceButtonRequest {
3064            grab_window,
3065            grabbed_device,
3066            modifier_device,
3067            modifiers,
3068            this_device_mode,
3069            other_device_mode,
3070            button,
3071            owner_events,
3072            classes: Cow::Owned(classes),
3073        })
3074    }
3075    /// Clone all borrowed data in this GrabDeviceButtonRequest.
3076    pub fn into_owned(self) -> GrabDeviceButtonRequest<'static> {
3077        GrabDeviceButtonRequest {
3078            grab_window: self.grab_window,
3079            grabbed_device: self.grabbed_device,
3080            modifier_device: self.modifier_device,
3081            modifiers: self.modifiers,
3082            this_device_mode: self.this_device_mode,
3083            other_device_mode: self.other_device_mode,
3084            button: self.button,
3085            owner_events: self.owner_events,
3086            classes: Cow::Owned(self.classes.into_owned()),
3087        }
3088    }
3089}
3090impl<'input> Request for GrabDeviceButtonRequest<'input> {
3091    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
3092
3093    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
3094        let (bufs, fds) = self.serialize(major_opcode);
3095        // Flatten the buffers into a single vector
3096        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
3097        (buf, fds)
3098    }
3099}
3100impl<'input> crate::x11_utils::VoidRequest for GrabDeviceButtonRequest<'input> {
3101}
3102
3103/// Opcode for the UngrabDeviceButton request
3104pub const UNGRAB_DEVICE_BUTTON_REQUEST: u8 = 18;
3105#[derive(Clone, Copy, Default)]
3106#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3107#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3108pub struct UngrabDeviceButtonRequest {
3109    pub grab_window: xproto::Window,
3110    pub modifiers: xproto::ModMask,
3111    pub modifier_device: u8,
3112    pub button: u8,
3113    pub grabbed_device: u8,
3114}
3115impl_debug_if_no_extra_traits!(UngrabDeviceButtonRequest, "UngrabDeviceButtonRequest");
3116impl UngrabDeviceButtonRequest {
3117    /// Serialize this request into bytes for the provided connection
3118    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
3119        let length_so_far = 0;
3120        let grab_window_bytes = self.grab_window.serialize();
3121        let modifiers_bytes = u16::from(self.modifiers).serialize();
3122        let modifier_device_bytes = self.modifier_device.serialize();
3123        let button_bytes = self.button.serialize();
3124        let grabbed_device_bytes = self.grabbed_device.serialize();
3125        let mut request0 = vec![
3126            major_opcode,
3127            UNGRAB_DEVICE_BUTTON_REQUEST,
3128            0,
3129            0,
3130            grab_window_bytes[0],
3131            grab_window_bytes[1],
3132            grab_window_bytes[2],
3133            grab_window_bytes[3],
3134            modifiers_bytes[0],
3135            modifiers_bytes[1],
3136            modifier_device_bytes[0],
3137            button_bytes[0],
3138            grabbed_device_bytes[0],
3139            0,
3140            0,
3141            0,
3142        ];
3143        let length_so_far = length_so_far + request0.len();
3144        assert_eq!(length_so_far % 4, 0);
3145        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
3146        request0[2..4].copy_from_slice(&length.to_ne_bytes());
3147        ([request0.into()], vec![])
3148    }
3149    /// Parse this request given its header, its body, and any fds that go along with it
3150    #[cfg(feature = "request-parsing")]
3151    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
3152        if header.minor_opcode != UNGRAB_DEVICE_BUTTON_REQUEST {
3153            return Err(ParseError::InvalidValue);
3154        }
3155        let (grab_window, remaining) = xproto::Window::try_parse(value)?;
3156        let (modifiers, remaining) = u16::try_parse(remaining)?;
3157        let modifiers = modifiers.into();
3158        let (modifier_device, remaining) = u8::try_parse(remaining)?;
3159        let (button, remaining) = u8::try_parse(remaining)?;
3160        let (grabbed_device, remaining) = u8::try_parse(remaining)?;
3161        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
3162        let _ = remaining;
3163        Ok(UngrabDeviceButtonRequest {
3164            grab_window,
3165            modifiers,
3166            modifier_device,
3167            button,
3168            grabbed_device,
3169        })
3170    }
3171}
3172impl Request for UngrabDeviceButtonRequest {
3173    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
3174
3175    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
3176        let (bufs, fds) = self.serialize(major_opcode);
3177        // Flatten the buffers into a single vector
3178        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
3179        (buf, fds)
3180    }
3181}
3182impl crate::x11_utils::VoidRequest for UngrabDeviceButtonRequest {
3183}
3184
3185#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
3186#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3187pub struct DeviceInputMode(u8);
3188impl DeviceInputMode {
3189    pub const ASYNC_THIS_DEVICE: Self = Self(0);
3190    pub const SYNC_THIS_DEVICE: Self = Self(1);
3191    pub const REPLAY_THIS_DEVICE: Self = Self(2);
3192    pub const ASYNC_OTHER_DEVICES: Self = Self(3);
3193    pub const ASYNC_ALL: Self = Self(4);
3194    pub const SYNC_ALL: Self = Self(5);
3195}
3196impl From<DeviceInputMode> for u8 {
3197    #[inline]
3198    fn from(input: DeviceInputMode) -> Self {
3199        input.0
3200    }
3201}
3202impl From<DeviceInputMode> for Option<u8> {
3203    #[inline]
3204    fn from(input: DeviceInputMode) -> Self {
3205        Some(input.0)
3206    }
3207}
3208impl From<DeviceInputMode> for u16 {
3209    #[inline]
3210    fn from(input: DeviceInputMode) -> Self {
3211        u16::from(input.0)
3212    }
3213}
3214impl From<DeviceInputMode> for Option<u16> {
3215    #[inline]
3216    fn from(input: DeviceInputMode) -> Self {
3217        Some(u16::from(input.0))
3218    }
3219}
3220impl From<DeviceInputMode> for u32 {
3221    #[inline]
3222    fn from(input: DeviceInputMode) -> Self {
3223        u32::from(input.0)
3224    }
3225}
3226impl From<DeviceInputMode> for Option<u32> {
3227    #[inline]
3228    fn from(input: DeviceInputMode) -> Self {
3229        Some(u32::from(input.0))
3230    }
3231}
3232impl From<u8> for DeviceInputMode {
3233    #[inline]
3234    fn from(value: u8) -> Self {
3235        Self(value)
3236    }
3237}
3238impl core::fmt::Debug for DeviceInputMode  {
3239    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
3240        let variants = [
3241            (Self::ASYNC_THIS_DEVICE.0.into(), "ASYNC_THIS_DEVICE", "AsyncThisDevice"),
3242            (Self::SYNC_THIS_DEVICE.0.into(), "SYNC_THIS_DEVICE", "SyncThisDevice"),
3243            (Self::REPLAY_THIS_DEVICE.0.into(), "REPLAY_THIS_DEVICE", "ReplayThisDevice"),
3244            (Self::ASYNC_OTHER_DEVICES.0.into(), "ASYNC_OTHER_DEVICES", "AsyncOtherDevices"),
3245            (Self::ASYNC_ALL.0.into(), "ASYNC_ALL", "AsyncAll"),
3246            (Self::SYNC_ALL.0.into(), "SYNC_ALL", "SyncAll"),
3247        ];
3248        pretty_print_enum(fmt, self.0.into(), &variants)
3249    }
3250}
3251
3252/// Opcode for the AllowDeviceEvents request
3253pub const ALLOW_DEVICE_EVENTS_REQUEST: u8 = 19;
3254#[derive(Clone, Copy, Default)]
3255#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3256#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3257pub struct AllowDeviceEventsRequest {
3258    pub time: xproto::Timestamp,
3259    pub mode: DeviceInputMode,
3260    pub device_id: u8,
3261}
3262impl_debug_if_no_extra_traits!(AllowDeviceEventsRequest, "AllowDeviceEventsRequest");
3263impl AllowDeviceEventsRequest {
3264    /// Serialize this request into bytes for the provided connection
3265    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
3266        let length_so_far = 0;
3267        let time_bytes = self.time.serialize();
3268        let mode_bytes = u8::from(self.mode).serialize();
3269        let device_id_bytes = self.device_id.serialize();
3270        let mut request0 = vec![
3271            major_opcode,
3272            ALLOW_DEVICE_EVENTS_REQUEST,
3273            0,
3274            0,
3275            time_bytes[0],
3276            time_bytes[1],
3277            time_bytes[2],
3278            time_bytes[3],
3279            mode_bytes[0],
3280            device_id_bytes[0],
3281            0,
3282            0,
3283        ];
3284        let length_so_far = length_so_far + request0.len();
3285        assert_eq!(length_so_far % 4, 0);
3286        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
3287        request0[2..4].copy_from_slice(&length.to_ne_bytes());
3288        ([request0.into()], vec![])
3289    }
3290    /// Parse this request given its header, its body, and any fds that go along with it
3291    #[cfg(feature = "request-parsing")]
3292    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
3293        if header.minor_opcode != ALLOW_DEVICE_EVENTS_REQUEST {
3294            return Err(ParseError::InvalidValue);
3295        }
3296        let (time, remaining) = xproto::Timestamp::try_parse(value)?;
3297        let (mode, remaining) = u8::try_parse(remaining)?;
3298        let mode = mode.into();
3299        let (device_id, remaining) = u8::try_parse(remaining)?;
3300        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
3301        let _ = remaining;
3302        Ok(AllowDeviceEventsRequest {
3303            time,
3304            mode,
3305            device_id,
3306        })
3307    }
3308}
3309impl Request for AllowDeviceEventsRequest {
3310    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
3311
3312    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
3313        let (bufs, fds) = self.serialize(major_opcode);
3314        // Flatten the buffers into a single vector
3315        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
3316        (buf, fds)
3317    }
3318}
3319impl crate::x11_utils::VoidRequest for AllowDeviceEventsRequest {
3320}
3321
3322/// Opcode for the GetDeviceFocus request
3323pub const GET_DEVICE_FOCUS_REQUEST: u8 = 20;
3324#[derive(Clone, Copy, Default)]
3325#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3326#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3327pub struct GetDeviceFocusRequest {
3328    pub device_id: u8,
3329}
3330impl_debug_if_no_extra_traits!(GetDeviceFocusRequest, "GetDeviceFocusRequest");
3331impl GetDeviceFocusRequest {
3332    /// Serialize this request into bytes for the provided connection
3333    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
3334        let length_so_far = 0;
3335        let device_id_bytes = self.device_id.serialize();
3336        let mut request0 = vec![
3337            major_opcode,
3338            GET_DEVICE_FOCUS_REQUEST,
3339            0,
3340            0,
3341            device_id_bytes[0],
3342            0,
3343            0,
3344            0,
3345        ];
3346        let length_so_far = length_so_far + request0.len();
3347        assert_eq!(length_so_far % 4, 0);
3348        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
3349        request0[2..4].copy_from_slice(&length.to_ne_bytes());
3350        ([request0.into()], vec![])
3351    }
3352    /// Parse this request given its header, its body, and any fds that go along with it
3353    #[cfg(feature = "request-parsing")]
3354    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
3355        if header.minor_opcode != GET_DEVICE_FOCUS_REQUEST {
3356            return Err(ParseError::InvalidValue);
3357        }
3358        let (device_id, remaining) = u8::try_parse(value)?;
3359        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
3360        let _ = remaining;
3361        Ok(GetDeviceFocusRequest {
3362            device_id,
3363        })
3364    }
3365}
3366impl Request for GetDeviceFocusRequest {
3367    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
3368
3369    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
3370        let (bufs, fds) = self.serialize(major_opcode);
3371        // Flatten the buffers into a single vector
3372        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
3373        (buf, fds)
3374    }
3375}
3376impl crate::x11_utils::ReplyRequest for GetDeviceFocusRequest {
3377    type Reply = GetDeviceFocusReply;
3378}
3379
3380#[derive(Clone, Copy, Default)]
3381#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3382#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3383pub struct GetDeviceFocusReply {
3384    pub xi_reply_type: u8,
3385    pub sequence: u16,
3386    pub length: u32,
3387    pub focus: xproto::Window,
3388    pub time: xproto::Timestamp,
3389    pub revert_to: xproto::InputFocus,
3390}
3391impl_debug_if_no_extra_traits!(GetDeviceFocusReply, "GetDeviceFocusReply");
3392impl TryParse for GetDeviceFocusReply {
3393    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3394        let remaining = initial_value;
3395        let (response_type, remaining) = u8::try_parse(remaining)?;
3396        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
3397        let (sequence, remaining) = u16::try_parse(remaining)?;
3398        let (length, remaining) = u32::try_parse(remaining)?;
3399        let (focus, remaining) = xproto::Window::try_parse(remaining)?;
3400        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
3401        let (revert_to, remaining) = u8::try_parse(remaining)?;
3402        let remaining = remaining.get(15..).ok_or(ParseError::InsufficientData)?;
3403        if response_type != 1 {
3404            return Err(ParseError::InvalidValue);
3405        }
3406        let revert_to = revert_to.into();
3407        let result = GetDeviceFocusReply { xi_reply_type, sequence, length, focus, time, revert_to };
3408        let _ = remaining;
3409        let remaining = initial_value.get(32 + length as usize * 4..)
3410            .ok_or(ParseError::InsufficientData)?;
3411        Ok((result, remaining))
3412    }
3413}
3414impl Serialize for GetDeviceFocusReply {
3415    type Bytes = [u8; 32];
3416    fn serialize(&self) -> [u8; 32] {
3417        let response_type_bytes = &[1];
3418        let xi_reply_type_bytes = self.xi_reply_type.serialize();
3419        let sequence_bytes = self.sequence.serialize();
3420        let length_bytes = self.length.serialize();
3421        let focus_bytes = self.focus.serialize();
3422        let time_bytes = self.time.serialize();
3423        let revert_to_bytes = u8::from(self.revert_to).serialize();
3424        [
3425            response_type_bytes[0],
3426            xi_reply_type_bytes[0],
3427            sequence_bytes[0],
3428            sequence_bytes[1],
3429            length_bytes[0],
3430            length_bytes[1],
3431            length_bytes[2],
3432            length_bytes[3],
3433            focus_bytes[0],
3434            focus_bytes[1],
3435            focus_bytes[2],
3436            focus_bytes[3],
3437            time_bytes[0],
3438            time_bytes[1],
3439            time_bytes[2],
3440            time_bytes[3],
3441            revert_to_bytes[0],
3442            0,
3443            0,
3444            0,
3445            0,
3446            0,
3447            0,
3448            0,
3449            0,
3450            0,
3451            0,
3452            0,
3453            0,
3454            0,
3455            0,
3456            0,
3457        ]
3458    }
3459    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3460        bytes.reserve(32);
3461        let response_type_bytes = &[1];
3462        bytes.push(response_type_bytes[0]);
3463        self.xi_reply_type.serialize_into(bytes);
3464        self.sequence.serialize_into(bytes);
3465        self.length.serialize_into(bytes);
3466        self.focus.serialize_into(bytes);
3467        self.time.serialize_into(bytes);
3468        u8::from(self.revert_to).serialize_into(bytes);
3469        bytes.extend_from_slice(&[0; 15]);
3470    }
3471}
3472
3473/// Opcode for the SetDeviceFocus request
3474pub const SET_DEVICE_FOCUS_REQUEST: u8 = 21;
3475#[derive(Clone, Copy, Default)]
3476#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3477#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3478pub struct SetDeviceFocusRequest {
3479    pub focus: xproto::Window,
3480    pub time: xproto::Timestamp,
3481    pub revert_to: xproto::InputFocus,
3482    pub device_id: u8,
3483}
3484impl_debug_if_no_extra_traits!(SetDeviceFocusRequest, "SetDeviceFocusRequest");
3485impl SetDeviceFocusRequest {
3486    /// Serialize this request into bytes for the provided connection
3487    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
3488        let length_so_far = 0;
3489        let focus_bytes = self.focus.serialize();
3490        let time_bytes = self.time.serialize();
3491        let revert_to_bytes = u8::from(self.revert_to).serialize();
3492        let device_id_bytes = self.device_id.serialize();
3493        let mut request0 = vec![
3494            major_opcode,
3495            SET_DEVICE_FOCUS_REQUEST,
3496            0,
3497            0,
3498            focus_bytes[0],
3499            focus_bytes[1],
3500            focus_bytes[2],
3501            focus_bytes[3],
3502            time_bytes[0],
3503            time_bytes[1],
3504            time_bytes[2],
3505            time_bytes[3],
3506            revert_to_bytes[0],
3507            device_id_bytes[0],
3508            0,
3509            0,
3510        ];
3511        let length_so_far = length_so_far + request0.len();
3512        assert_eq!(length_so_far % 4, 0);
3513        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
3514        request0[2..4].copy_from_slice(&length.to_ne_bytes());
3515        ([request0.into()], vec![])
3516    }
3517    /// Parse this request given its header, its body, and any fds that go along with it
3518    #[cfg(feature = "request-parsing")]
3519    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
3520        if header.minor_opcode != SET_DEVICE_FOCUS_REQUEST {
3521            return Err(ParseError::InvalidValue);
3522        }
3523        let (focus, remaining) = xproto::Window::try_parse(value)?;
3524        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
3525        let (revert_to, remaining) = u8::try_parse(remaining)?;
3526        let revert_to = revert_to.into();
3527        let (device_id, remaining) = u8::try_parse(remaining)?;
3528        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
3529        let _ = remaining;
3530        Ok(SetDeviceFocusRequest {
3531            focus,
3532            time,
3533            revert_to,
3534            device_id,
3535        })
3536    }
3537}
3538impl Request for SetDeviceFocusRequest {
3539    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
3540
3541    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
3542        let (bufs, fds) = self.serialize(major_opcode);
3543        // Flatten the buffers into a single vector
3544        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
3545        (buf, fds)
3546    }
3547}
3548impl crate::x11_utils::VoidRequest for SetDeviceFocusRequest {
3549}
3550
3551#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
3552#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3553pub struct FeedbackClass(u8);
3554impl FeedbackClass {
3555    pub const KEYBOARD: Self = Self(0);
3556    pub const POINTER: Self = Self(1);
3557    pub const STRING: Self = Self(2);
3558    pub const INTEGER: Self = Self(3);
3559    pub const LED: Self = Self(4);
3560    pub const BELL: Self = Self(5);
3561}
3562impl From<FeedbackClass> for u8 {
3563    #[inline]
3564    fn from(input: FeedbackClass) -> Self {
3565        input.0
3566    }
3567}
3568impl From<FeedbackClass> for Option<u8> {
3569    #[inline]
3570    fn from(input: FeedbackClass) -> Self {
3571        Some(input.0)
3572    }
3573}
3574impl From<FeedbackClass> for u16 {
3575    #[inline]
3576    fn from(input: FeedbackClass) -> Self {
3577        u16::from(input.0)
3578    }
3579}
3580impl From<FeedbackClass> for Option<u16> {
3581    #[inline]
3582    fn from(input: FeedbackClass) -> Self {
3583        Some(u16::from(input.0))
3584    }
3585}
3586impl From<FeedbackClass> for u32 {
3587    #[inline]
3588    fn from(input: FeedbackClass) -> Self {
3589        u32::from(input.0)
3590    }
3591}
3592impl From<FeedbackClass> for Option<u32> {
3593    #[inline]
3594    fn from(input: FeedbackClass) -> Self {
3595        Some(u32::from(input.0))
3596    }
3597}
3598impl From<u8> for FeedbackClass {
3599    #[inline]
3600    fn from(value: u8) -> Self {
3601        Self(value)
3602    }
3603}
3604impl core::fmt::Debug for FeedbackClass  {
3605    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
3606        let variants = [
3607            (Self::KEYBOARD.0.into(), "KEYBOARD", "Keyboard"),
3608            (Self::POINTER.0.into(), "POINTER", "Pointer"),
3609            (Self::STRING.0.into(), "STRING", "String"),
3610            (Self::INTEGER.0.into(), "INTEGER", "Integer"),
3611            (Self::LED.0.into(), "LED", "Led"),
3612            (Self::BELL.0.into(), "BELL", "Bell"),
3613        ];
3614        pretty_print_enum(fmt, self.0.into(), &variants)
3615    }
3616}
3617
3618#[derive(Clone, Copy, Default)]
3619#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3620#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3621pub struct KbdFeedbackState {
3622    pub class_id: FeedbackClass,
3623    pub feedback_id: u8,
3624    pub len: u16,
3625    pub pitch: u16,
3626    pub duration: u16,
3627    pub led_mask: u32,
3628    pub led_values: u32,
3629    pub global_auto_repeat: bool,
3630    pub click: u8,
3631    pub percent: u8,
3632    pub auto_repeats: [u8; 32],
3633}
3634impl_debug_if_no_extra_traits!(KbdFeedbackState, "KbdFeedbackState");
3635impl TryParse for KbdFeedbackState {
3636    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3637        let (class_id, remaining) = u8::try_parse(remaining)?;
3638        let (feedback_id, remaining) = u8::try_parse(remaining)?;
3639        let (len, remaining) = u16::try_parse(remaining)?;
3640        let (pitch, remaining) = u16::try_parse(remaining)?;
3641        let (duration, remaining) = u16::try_parse(remaining)?;
3642        let (led_mask, remaining) = u32::try_parse(remaining)?;
3643        let (led_values, remaining) = u32::try_parse(remaining)?;
3644        let (global_auto_repeat, remaining) = bool::try_parse(remaining)?;
3645        let (click, remaining) = u8::try_parse(remaining)?;
3646        let (percent, remaining) = u8::try_parse(remaining)?;
3647        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
3648        let (auto_repeats, remaining) = crate::x11_utils::parse_u8_array::<32>(remaining)?;
3649        let class_id = class_id.into();
3650        let result = KbdFeedbackState { class_id, feedback_id, len, pitch, duration, led_mask, led_values, global_auto_repeat, click, percent, auto_repeats };
3651        Ok((result, remaining))
3652    }
3653}
3654impl Serialize for KbdFeedbackState {
3655    type Bytes = [u8; 52];
3656    fn serialize(&self) -> [u8; 52] {
3657        let class_id_bytes = u8::from(self.class_id).serialize();
3658        let feedback_id_bytes = self.feedback_id.serialize();
3659        let len_bytes = self.len.serialize();
3660        let pitch_bytes = self.pitch.serialize();
3661        let duration_bytes = self.duration.serialize();
3662        let led_mask_bytes = self.led_mask.serialize();
3663        let led_values_bytes = self.led_values.serialize();
3664        let global_auto_repeat_bytes = self.global_auto_repeat.serialize();
3665        let click_bytes = self.click.serialize();
3666        let percent_bytes = self.percent.serialize();
3667        [
3668            class_id_bytes[0],
3669            feedback_id_bytes[0],
3670            len_bytes[0],
3671            len_bytes[1],
3672            pitch_bytes[0],
3673            pitch_bytes[1],
3674            duration_bytes[0],
3675            duration_bytes[1],
3676            led_mask_bytes[0],
3677            led_mask_bytes[1],
3678            led_mask_bytes[2],
3679            led_mask_bytes[3],
3680            led_values_bytes[0],
3681            led_values_bytes[1],
3682            led_values_bytes[2],
3683            led_values_bytes[3],
3684            global_auto_repeat_bytes[0],
3685            click_bytes[0],
3686            percent_bytes[0],
3687            0,
3688            self.auto_repeats[0],
3689            self.auto_repeats[1],
3690            self.auto_repeats[2],
3691            self.auto_repeats[3],
3692            self.auto_repeats[4],
3693            self.auto_repeats[5],
3694            self.auto_repeats[6],
3695            self.auto_repeats[7],
3696            self.auto_repeats[8],
3697            self.auto_repeats[9],
3698            self.auto_repeats[10],
3699            self.auto_repeats[11],
3700            self.auto_repeats[12],
3701            self.auto_repeats[13],
3702            self.auto_repeats[14],
3703            self.auto_repeats[15],
3704            self.auto_repeats[16],
3705            self.auto_repeats[17],
3706            self.auto_repeats[18],
3707            self.auto_repeats[19],
3708            self.auto_repeats[20],
3709            self.auto_repeats[21],
3710            self.auto_repeats[22],
3711            self.auto_repeats[23],
3712            self.auto_repeats[24],
3713            self.auto_repeats[25],
3714            self.auto_repeats[26],
3715            self.auto_repeats[27],
3716            self.auto_repeats[28],
3717            self.auto_repeats[29],
3718            self.auto_repeats[30],
3719            self.auto_repeats[31],
3720        ]
3721    }
3722    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3723        bytes.reserve(52);
3724        u8::from(self.class_id).serialize_into(bytes);
3725        self.feedback_id.serialize_into(bytes);
3726        self.len.serialize_into(bytes);
3727        self.pitch.serialize_into(bytes);
3728        self.duration.serialize_into(bytes);
3729        self.led_mask.serialize_into(bytes);
3730        self.led_values.serialize_into(bytes);
3731        self.global_auto_repeat.serialize_into(bytes);
3732        self.click.serialize_into(bytes);
3733        self.percent.serialize_into(bytes);
3734        bytes.extend_from_slice(&[0; 1]);
3735        bytes.extend_from_slice(&self.auto_repeats);
3736    }
3737}
3738
3739#[derive(Clone, Copy, Default)]
3740#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3741#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3742pub struct PtrFeedbackState {
3743    pub class_id: FeedbackClass,
3744    pub feedback_id: u8,
3745    pub len: u16,
3746    pub accel_num: u16,
3747    pub accel_denom: u16,
3748    pub threshold: u16,
3749}
3750impl_debug_if_no_extra_traits!(PtrFeedbackState, "PtrFeedbackState");
3751impl TryParse for PtrFeedbackState {
3752    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3753        let (class_id, remaining) = u8::try_parse(remaining)?;
3754        let (feedback_id, remaining) = u8::try_parse(remaining)?;
3755        let (len, remaining) = u16::try_parse(remaining)?;
3756        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
3757        let (accel_num, remaining) = u16::try_parse(remaining)?;
3758        let (accel_denom, remaining) = u16::try_parse(remaining)?;
3759        let (threshold, remaining) = u16::try_parse(remaining)?;
3760        let class_id = class_id.into();
3761        let result = PtrFeedbackState { class_id, feedback_id, len, accel_num, accel_denom, threshold };
3762        Ok((result, remaining))
3763    }
3764}
3765impl Serialize for PtrFeedbackState {
3766    type Bytes = [u8; 12];
3767    fn serialize(&self) -> [u8; 12] {
3768        let class_id_bytes = u8::from(self.class_id).serialize();
3769        let feedback_id_bytes = self.feedback_id.serialize();
3770        let len_bytes = self.len.serialize();
3771        let accel_num_bytes = self.accel_num.serialize();
3772        let accel_denom_bytes = self.accel_denom.serialize();
3773        let threshold_bytes = self.threshold.serialize();
3774        [
3775            class_id_bytes[0],
3776            feedback_id_bytes[0],
3777            len_bytes[0],
3778            len_bytes[1],
3779            0,
3780            0,
3781            accel_num_bytes[0],
3782            accel_num_bytes[1],
3783            accel_denom_bytes[0],
3784            accel_denom_bytes[1],
3785            threshold_bytes[0],
3786            threshold_bytes[1],
3787        ]
3788    }
3789    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3790        bytes.reserve(12);
3791        u8::from(self.class_id).serialize_into(bytes);
3792        self.feedback_id.serialize_into(bytes);
3793        self.len.serialize_into(bytes);
3794        bytes.extend_from_slice(&[0; 2]);
3795        self.accel_num.serialize_into(bytes);
3796        self.accel_denom.serialize_into(bytes);
3797        self.threshold.serialize_into(bytes);
3798    }
3799}
3800
3801#[derive(Clone, Copy, Default)]
3802#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3803#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3804pub struct IntegerFeedbackState {
3805    pub class_id: FeedbackClass,
3806    pub feedback_id: u8,
3807    pub len: u16,
3808    pub resolution: u32,
3809    pub min_value: i32,
3810    pub max_value: i32,
3811}
3812impl_debug_if_no_extra_traits!(IntegerFeedbackState, "IntegerFeedbackState");
3813impl TryParse for IntegerFeedbackState {
3814    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3815        let (class_id, remaining) = u8::try_parse(remaining)?;
3816        let (feedback_id, remaining) = u8::try_parse(remaining)?;
3817        let (len, remaining) = u16::try_parse(remaining)?;
3818        let (resolution, remaining) = u32::try_parse(remaining)?;
3819        let (min_value, remaining) = i32::try_parse(remaining)?;
3820        let (max_value, remaining) = i32::try_parse(remaining)?;
3821        let class_id = class_id.into();
3822        let result = IntegerFeedbackState { class_id, feedback_id, len, resolution, min_value, max_value };
3823        Ok((result, remaining))
3824    }
3825}
3826impl Serialize for IntegerFeedbackState {
3827    type Bytes = [u8; 16];
3828    fn serialize(&self) -> [u8; 16] {
3829        let class_id_bytes = u8::from(self.class_id).serialize();
3830        let feedback_id_bytes = self.feedback_id.serialize();
3831        let len_bytes = self.len.serialize();
3832        let resolution_bytes = self.resolution.serialize();
3833        let min_value_bytes = self.min_value.serialize();
3834        let max_value_bytes = self.max_value.serialize();
3835        [
3836            class_id_bytes[0],
3837            feedback_id_bytes[0],
3838            len_bytes[0],
3839            len_bytes[1],
3840            resolution_bytes[0],
3841            resolution_bytes[1],
3842            resolution_bytes[2],
3843            resolution_bytes[3],
3844            min_value_bytes[0],
3845            min_value_bytes[1],
3846            min_value_bytes[2],
3847            min_value_bytes[3],
3848            max_value_bytes[0],
3849            max_value_bytes[1],
3850            max_value_bytes[2],
3851            max_value_bytes[3],
3852        ]
3853    }
3854    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3855        bytes.reserve(16);
3856        u8::from(self.class_id).serialize_into(bytes);
3857        self.feedback_id.serialize_into(bytes);
3858        self.len.serialize_into(bytes);
3859        self.resolution.serialize_into(bytes);
3860        self.min_value.serialize_into(bytes);
3861        self.max_value.serialize_into(bytes);
3862    }
3863}
3864
3865#[derive(Clone, Default)]
3866#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3867#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3868pub struct StringFeedbackState {
3869    pub class_id: FeedbackClass,
3870    pub feedback_id: u8,
3871    pub len: u16,
3872    pub max_symbols: u16,
3873    pub keysyms: Vec<xproto::Keysym>,
3874}
3875impl_debug_if_no_extra_traits!(StringFeedbackState, "StringFeedbackState");
3876impl TryParse for StringFeedbackState {
3877    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3878        let (class_id, remaining) = u8::try_parse(remaining)?;
3879        let (feedback_id, remaining) = u8::try_parse(remaining)?;
3880        let (len, remaining) = u16::try_parse(remaining)?;
3881        let (max_symbols, remaining) = u16::try_parse(remaining)?;
3882        let (num_keysyms, remaining) = u16::try_parse(remaining)?;
3883        let (keysyms, remaining) = crate::x11_utils::parse_list::<xproto::Keysym>(remaining, num_keysyms.try_to_usize()?)?;
3884        let class_id = class_id.into();
3885        let result = StringFeedbackState { class_id, feedback_id, len, max_symbols, keysyms };
3886        Ok((result, remaining))
3887    }
3888}
3889impl Serialize for StringFeedbackState {
3890    type Bytes = Vec<u8>;
3891    fn serialize(&self) -> Vec<u8> {
3892        let mut result = Vec::new();
3893        self.serialize_into(&mut result);
3894        result
3895    }
3896    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3897        bytes.reserve(8);
3898        u8::from(self.class_id).serialize_into(bytes);
3899        self.feedback_id.serialize_into(bytes);
3900        self.len.serialize_into(bytes);
3901        self.max_symbols.serialize_into(bytes);
3902        let num_keysyms = u16::try_from(self.keysyms.len()).expect("`keysyms` has too many elements");
3903        num_keysyms.serialize_into(bytes);
3904        self.keysyms.serialize_into(bytes);
3905    }
3906}
3907impl StringFeedbackState {
3908    /// Get the value of the `num_keysyms` field.
3909    ///
3910    /// The `num_keysyms` field is used as the length field of the `keysyms` field.
3911    /// This function computes the field's value again based on the length of the list.
3912    ///
3913    /// # Panics
3914    ///
3915    /// Panics if the value cannot be represented in the target type. This
3916    /// cannot happen with values of the struct received from the X11 server.
3917    pub fn num_keysyms(&self) -> u16 {
3918        self.keysyms.len()
3919            .try_into().unwrap()
3920    }
3921}
3922
3923#[derive(Clone, Copy, Default)]
3924#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3925#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3926pub struct BellFeedbackState {
3927    pub class_id: FeedbackClass,
3928    pub feedback_id: u8,
3929    pub len: u16,
3930    pub percent: u8,
3931    pub pitch: u16,
3932    pub duration: u16,
3933}
3934impl_debug_if_no_extra_traits!(BellFeedbackState, "BellFeedbackState");
3935impl TryParse for BellFeedbackState {
3936    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3937        let (class_id, remaining) = u8::try_parse(remaining)?;
3938        let (feedback_id, remaining) = u8::try_parse(remaining)?;
3939        let (len, remaining) = u16::try_parse(remaining)?;
3940        let (percent, remaining) = u8::try_parse(remaining)?;
3941        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
3942        let (pitch, remaining) = u16::try_parse(remaining)?;
3943        let (duration, remaining) = u16::try_parse(remaining)?;
3944        let class_id = class_id.into();
3945        let result = BellFeedbackState { class_id, feedback_id, len, percent, pitch, duration };
3946        Ok((result, remaining))
3947    }
3948}
3949impl Serialize for BellFeedbackState {
3950    type Bytes = [u8; 12];
3951    fn serialize(&self) -> [u8; 12] {
3952        let class_id_bytes = u8::from(self.class_id).serialize();
3953        let feedback_id_bytes = self.feedback_id.serialize();
3954        let len_bytes = self.len.serialize();
3955        let percent_bytes = self.percent.serialize();
3956        let pitch_bytes = self.pitch.serialize();
3957        let duration_bytes = self.duration.serialize();
3958        [
3959            class_id_bytes[0],
3960            feedback_id_bytes[0],
3961            len_bytes[0],
3962            len_bytes[1],
3963            percent_bytes[0],
3964            0,
3965            0,
3966            0,
3967            pitch_bytes[0],
3968            pitch_bytes[1],
3969            duration_bytes[0],
3970            duration_bytes[1],
3971        ]
3972    }
3973    fn serialize_into(&self, bytes: &mut Vec<u8>) {
3974        bytes.reserve(12);
3975        u8::from(self.class_id).serialize_into(bytes);
3976        self.feedback_id.serialize_into(bytes);
3977        self.len.serialize_into(bytes);
3978        self.percent.serialize_into(bytes);
3979        bytes.extend_from_slice(&[0; 3]);
3980        self.pitch.serialize_into(bytes);
3981        self.duration.serialize_into(bytes);
3982    }
3983}
3984
3985#[derive(Clone, Copy, Default)]
3986#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3987#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3988pub struct LedFeedbackState {
3989    pub class_id: FeedbackClass,
3990    pub feedback_id: u8,
3991    pub len: u16,
3992    pub led_mask: u32,
3993    pub led_values: u32,
3994}
3995impl_debug_if_no_extra_traits!(LedFeedbackState, "LedFeedbackState");
3996impl TryParse for LedFeedbackState {
3997    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3998        let (class_id, remaining) = u8::try_parse(remaining)?;
3999        let (feedback_id, remaining) = u8::try_parse(remaining)?;
4000        let (len, remaining) = u16::try_parse(remaining)?;
4001        let (led_mask, remaining) = u32::try_parse(remaining)?;
4002        let (led_values, remaining) = u32::try_parse(remaining)?;
4003        let class_id = class_id.into();
4004        let result = LedFeedbackState { class_id, feedback_id, len, led_mask, led_values };
4005        Ok((result, remaining))
4006    }
4007}
4008impl Serialize for LedFeedbackState {
4009    type Bytes = [u8; 12];
4010    fn serialize(&self) -> [u8; 12] {
4011        let class_id_bytes = u8::from(self.class_id).serialize();
4012        let feedback_id_bytes = self.feedback_id.serialize();
4013        let len_bytes = self.len.serialize();
4014        let led_mask_bytes = self.led_mask.serialize();
4015        let led_values_bytes = self.led_values.serialize();
4016        [
4017            class_id_bytes[0],
4018            feedback_id_bytes[0],
4019            len_bytes[0],
4020            len_bytes[1],
4021            led_mask_bytes[0],
4022            led_mask_bytes[1],
4023            led_mask_bytes[2],
4024            led_mask_bytes[3],
4025            led_values_bytes[0],
4026            led_values_bytes[1],
4027            led_values_bytes[2],
4028            led_values_bytes[3],
4029        ]
4030    }
4031    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4032        bytes.reserve(12);
4033        u8::from(self.class_id).serialize_into(bytes);
4034        self.feedback_id.serialize_into(bytes);
4035        self.len.serialize_into(bytes);
4036        self.led_mask.serialize_into(bytes);
4037        self.led_values.serialize_into(bytes);
4038    }
4039}
4040
4041#[derive(Clone, Copy)]
4042#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4043#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4044pub struct FeedbackStateDataKeyboard {
4045    pub pitch: u16,
4046    pub duration: u16,
4047    pub led_mask: u32,
4048    pub led_values: u32,
4049    pub global_auto_repeat: bool,
4050    pub click: u8,
4051    pub percent: u8,
4052    pub auto_repeats: [u8; 32],
4053}
4054impl_debug_if_no_extra_traits!(FeedbackStateDataKeyboard, "FeedbackStateDataKeyboard");
4055impl TryParse for FeedbackStateDataKeyboard {
4056    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4057        let (pitch, remaining) = u16::try_parse(remaining)?;
4058        let (duration, remaining) = u16::try_parse(remaining)?;
4059        let (led_mask, remaining) = u32::try_parse(remaining)?;
4060        let (led_values, remaining) = u32::try_parse(remaining)?;
4061        let (global_auto_repeat, remaining) = bool::try_parse(remaining)?;
4062        let (click, remaining) = u8::try_parse(remaining)?;
4063        let (percent, remaining) = u8::try_parse(remaining)?;
4064        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
4065        let (auto_repeats, remaining) = crate::x11_utils::parse_u8_array::<32>(remaining)?;
4066        let result = FeedbackStateDataKeyboard { pitch, duration, led_mask, led_values, global_auto_repeat, click, percent, auto_repeats };
4067        Ok((result, remaining))
4068    }
4069}
4070impl Serialize for FeedbackStateDataKeyboard {
4071    type Bytes = [u8; 48];
4072    fn serialize(&self) -> [u8; 48] {
4073        let pitch_bytes = self.pitch.serialize();
4074        let duration_bytes = self.duration.serialize();
4075        let led_mask_bytes = self.led_mask.serialize();
4076        let led_values_bytes = self.led_values.serialize();
4077        let global_auto_repeat_bytes = self.global_auto_repeat.serialize();
4078        let click_bytes = self.click.serialize();
4079        let percent_bytes = self.percent.serialize();
4080        [
4081            pitch_bytes[0],
4082            pitch_bytes[1],
4083            duration_bytes[0],
4084            duration_bytes[1],
4085            led_mask_bytes[0],
4086            led_mask_bytes[1],
4087            led_mask_bytes[2],
4088            led_mask_bytes[3],
4089            led_values_bytes[0],
4090            led_values_bytes[1],
4091            led_values_bytes[2],
4092            led_values_bytes[3],
4093            global_auto_repeat_bytes[0],
4094            click_bytes[0],
4095            percent_bytes[0],
4096            0,
4097            self.auto_repeats[0],
4098            self.auto_repeats[1],
4099            self.auto_repeats[2],
4100            self.auto_repeats[3],
4101            self.auto_repeats[4],
4102            self.auto_repeats[5],
4103            self.auto_repeats[6],
4104            self.auto_repeats[7],
4105            self.auto_repeats[8],
4106            self.auto_repeats[9],
4107            self.auto_repeats[10],
4108            self.auto_repeats[11],
4109            self.auto_repeats[12],
4110            self.auto_repeats[13],
4111            self.auto_repeats[14],
4112            self.auto_repeats[15],
4113            self.auto_repeats[16],
4114            self.auto_repeats[17],
4115            self.auto_repeats[18],
4116            self.auto_repeats[19],
4117            self.auto_repeats[20],
4118            self.auto_repeats[21],
4119            self.auto_repeats[22],
4120            self.auto_repeats[23],
4121            self.auto_repeats[24],
4122            self.auto_repeats[25],
4123            self.auto_repeats[26],
4124            self.auto_repeats[27],
4125            self.auto_repeats[28],
4126            self.auto_repeats[29],
4127            self.auto_repeats[30],
4128            self.auto_repeats[31],
4129        ]
4130    }
4131    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4132        bytes.reserve(48);
4133        self.pitch.serialize_into(bytes);
4134        self.duration.serialize_into(bytes);
4135        self.led_mask.serialize_into(bytes);
4136        self.led_values.serialize_into(bytes);
4137        self.global_auto_repeat.serialize_into(bytes);
4138        self.click.serialize_into(bytes);
4139        self.percent.serialize_into(bytes);
4140        bytes.extend_from_slice(&[0; 1]);
4141        bytes.extend_from_slice(&self.auto_repeats);
4142    }
4143}
4144#[derive(Clone, Copy)]
4145#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4146#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4147pub struct FeedbackStateDataPointer {
4148    pub accel_num: u16,
4149    pub accel_denom: u16,
4150    pub threshold: u16,
4151}
4152impl_debug_if_no_extra_traits!(FeedbackStateDataPointer, "FeedbackStateDataPointer");
4153impl TryParse for FeedbackStateDataPointer {
4154    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4155        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
4156        let (accel_num, remaining) = u16::try_parse(remaining)?;
4157        let (accel_denom, remaining) = u16::try_parse(remaining)?;
4158        let (threshold, remaining) = u16::try_parse(remaining)?;
4159        let result = FeedbackStateDataPointer { accel_num, accel_denom, threshold };
4160        Ok((result, remaining))
4161    }
4162}
4163impl Serialize for FeedbackStateDataPointer {
4164    type Bytes = [u8; 8];
4165    fn serialize(&self) -> [u8; 8] {
4166        let accel_num_bytes = self.accel_num.serialize();
4167        let accel_denom_bytes = self.accel_denom.serialize();
4168        let threshold_bytes = self.threshold.serialize();
4169        [
4170            0,
4171            0,
4172            accel_num_bytes[0],
4173            accel_num_bytes[1],
4174            accel_denom_bytes[0],
4175            accel_denom_bytes[1],
4176            threshold_bytes[0],
4177            threshold_bytes[1],
4178        ]
4179    }
4180    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4181        bytes.reserve(8);
4182        bytes.extend_from_slice(&[0; 2]);
4183        self.accel_num.serialize_into(bytes);
4184        self.accel_denom.serialize_into(bytes);
4185        self.threshold.serialize_into(bytes);
4186    }
4187}
4188#[derive(Clone)]
4189#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4190#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4191pub struct FeedbackStateDataString {
4192    pub max_symbols: u16,
4193    pub keysyms: Vec<xproto::Keysym>,
4194}
4195impl_debug_if_no_extra_traits!(FeedbackStateDataString, "FeedbackStateDataString");
4196impl TryParse for FeedbackStateDataString {
4197    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4198        let (max_symbols, remaining) = u16::try_parse(remaining)?;
4199        let (num_keysyms, remaining) = u16::try_parse(remaining)?;
4200        let (keysyms, remaining) = crate::x11_utils::parse_list::<xproto::Keysym>(remaining, num_keysyms.try_to_usize()?)?;
4201        let result = FeedbackStateDataString { max_symbols, keysyms };
4202        Ok((result, remaining))
4203    }
4204}
4205impl Serialize for FeedbackStateDataString {
4206    type Bytes = Vec<u8>;
4207    fn serialize(&self) -> Vec<u8> {
4208        let mut result = Vec::new();
4209        self.serialize_into(&mut result);
4210        result
4211    }
4212    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4213        bytes.reserve(4);
4214        self.max_symbols.serialize_into(bytes);
4215        let num_keysyms = u16::try_from(self.keysyms.len()).expect("`keysyms` has too many elements");
4216        num_keysyms.serialize_into(bytes);
4217        self.keysyms.serialize_into(bytes);
4218    }
4219}
4220impl FeedbackStateDataString {
4221    /// Get the value of the `num_keysyms` field.
4222    ///
4223    /// The `num_keysyms` field is used as the length field of the `keysyms` field.
4224    /// This function computes the field's value again based on the length of the list.
4225    ///
4226    /// # Panics
4227    ///
4228    /// Panics if the value cannot be represented in the target type. This
4229    /// cannot happen with values of the struct received from the X11 server.
4230    pub fn num_keysyms(&self) -> u16 {
4231        self.keysyms.len()
4232            .try_into().unwrap()
4233    }
4234}
4235#[derive(Clone, Copy)]
4236#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4237#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4238pub struct FeedbackStateDataInteger {
4239    pub resolution: u32,
4240    pub min_value: i32,
4241    pub max_value: i32,
4242}
4243impl_debug_if_no_extra_traits!(FeedbackStateDataInteger, "FeedbackStateDataInteger");
4244impl TryParse for FeedbackStateDataInteger {
4245    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4246        let (resolution, remaining) = u32::try_parse(remaining)?;
4247        let (min_value, remaining) = i32::try_parse(remaining)?;
4248        let (max_value, remaining) = i32::try_parse(remaining)?;
4249        let result = FeedbackStateDataInteger { resolution, min_value, max_value };
4250        Ok((result, remaining))
4251    }
4252}
4253impl Serialize for FeedbackStateDataInteger {
4254    type Bytes = [u8; 12];
4255    fn serialize(&self) -> [u8; 12] {
4256        let resolution_bytes = self.resolution.serialize();
4257        let min_value_bytes = self.min_value.serialize();
4258        let max_value_bytes = self.max_value.serialize();
4259        [
4260            resolution_bytes[0],
4261            resolution_bytes[1],
4262            resolution_bytes[2],
4263            resolution_bytes[3],
4264            min_value_bytes[0],
4265            min_value_bytes[1],
4266            min_value_bytes[2],
4267            min_value_bytes[3],
4268            max_value_bytes[0],
4269            max_value_bytes[1],
4270            max_value_bytes[2],
4271            max_value_bytes[3],
4272        ]
4273    }
4274    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4275        bytes.reserve(12);
4276        self.resolution.serialize_into(bytes);
4277        self.min_value.serialize_into(bytes);
4278        self.max_value.serialize_into(bytes);
4279    }
4280}
4281#[derive(Clone, Copy)]
4282#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4283#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4284pub struct FeedbackStateDataLed {
4285    pub led_mask: u32,
4286    pub led_values: u32,
4287}
4288impl_debug_if_no_extra_traits!(FeedbackStateDataLed, "FeedbackStateDataLed");
4289impl TryParse for FeedbackStateDataLed {
4290    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4291        let (led_mask, remaining) = u32::try_parse(remaining)?;
4292        let (led_values, remaining) = u32::try_parse(remaining)?;
4293        let result = FeedbackStateDataLed { led_mask, led_values };
4294        Ok((result, remaining))
4295    }
4296}
4297impl Serialize for FeedbackStateDataLed {
4298    type Bytes = [u8; 8];
4299    fn serialize(&self) -> [u8; 8] {
4300        let led_mask_bytes = self.led_mask.serialize();
4301        let led_values_bytes = self.led_values.serialize();
4302        [
4303            led_mask_bytes[0],
4304            led_mask_bytes[1],
4305            led_mask_bytes[2],
4306            led_mask_bytes[3],
4307            led_values_bytes[0],
4308            led_values_bytes[1],
4309            led_values_bytes[2],
4310            led_values_bytes[3],
4311        ]
4312    }
4313    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4314        bytes.reserve(8);
4315        self.led_mask.serialize_into(bytes);
4316        self.led_values.serialize_into(bytes);
4317    }
4318}
4319#[derive(Clone, Copy)]
4320#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4321#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4322pub struct FeedbackStateDataBell {
4323    pub percent: u8,
4324    pub pitch: u16,
4325    pub duration: u16,
4326}
4327impl_debug_if_no_extra_traits!(FeedbackStateDataBell, "FeedbackStateDataBell");
4328impl TryParse for FeedbackStateDataBell {
4329    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4330        let (percent, remaining) = u8::try_parse(remaining)?;
4331        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
4332        let (pitch, remaining) = u16::try_parse(remaining)?;
4333        let (duration, remaining) = u16::try_parse(remaining)?;
4334        let result = FeedbackStateDataBell { percent, pitch, duration };
4335        Ok((result, remaining))
4336    }
4337}
4338impl Serialize for FeedbackStateDataBell {
4339    type Bytes = [u8; 8];
4340    fn serialize(&self) -> [u8; 8] {
4341        let percent_bytes = self.percent.serialize();
4342        let pitch_bytes = self.pitch.serialize();
4343        let duration_bytes = self.duration.serialize();
4344        [
4345            percent_bytes[0],
4346            0,
4347            0,
4348            0,
4349            pitch_bytes[0],
4350            pitch_bytes[1],
4351            duration_bytes[0],
4352            duration_bytes[1],
4353        ]
4354    }
4355    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4356        bytes.reserve(8);
4357        self.percent.serialize_into(bytes);
4358        bytes.extend_from_slice(&[0; 3]);
4359        self.pitch.serialize_into(bytes);
4360        self.duration.serialize_into(bytes);
4361    }
4362}
4363#[derive(Clone)]
4364#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4365#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4366pub enum FeedbackStateData {
4367    Keyboard(FeedbackStateDataKeyboard),
4368    Pointer(FeedbackStateDataPointer),
4369    String(FeedbackStateDataString),
4370    Integer(FeedbackStateDataInteger),
4371    Led(FeedbackStateDataLed),
4372    Bell(FeedbackStateDataBell),
4373    /// This variant is returned when the server sends a discriminant
4374    /// value that does not match any of the defined by the protocol.
4375    ///
4376    /// Usually, this should be considered a parsing error, but there
4377    /// are some cases where the server violates the protocol.
4378    ///
4379    /// Trying to use `serialize` or `serialize_into` with this variant
4380    /// will raise a panic.
4381    InvalidValue(u8),
4382}
4383impl_debug_if_no_extra_traits!(FeedbackStateData, "FeedbackStateData");
4384impl FeedbackStateData {
4385    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
4386    fn try_parse(value: &[u8], class_id: u8) -> Result<(Self, &[u8]), ParseError> {
4387        let switch_expr = u8::from(class_id);
4388        let mut outer_remaining = value;
4389        let mut parse_result = None;
4390        if switch_expr == u8::from(FeedbackClass::KEYBOARD) {
4391            let (keyboard, new_remaining) = FeedbackStateDataKeyboard::try_parse(outer_remaining)?;
4392            outer_remaining = new_remaining;
4393            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
4394            parse_result = Some(FeedbackStateData::Keyboard(keyboard));
4395        }
4396        if switch_expr == u8::from(FeedbackClass::POINTER) {
4397            let (pointer, new_remaining) = FeedbackStateDataPointer::try_parse(outer_remaining)?;
4398            outer_remaining = new_remaining;
4399            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
4400            parse_result = Some(FeedbackStateData::Pointer(pointer));
4401        }
4402        if switch_expr == u8::from(FeedbackClass::STRING) {
4403            let (string, new_remaining) = FeedbackStateDataString::try_parse(outer_remaining)?;
4404            outer_remaining = new_remaining;
4405            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
4406            parse_result = Some(FeedbackStateData::String(string));
4407        }
4408        if switch_expr == u8::from(FeedbackClass::INTEGER) {
4409            let (integer, new_remaining) = FeedbackStateDataInteger::try_parse(outer_remaining)?;
4410            outer_remaining = new_remaining;
4411            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
4412            parse_result = Some(FeedbackStateData::Integer(integer));
4413        }
4414        if switch_expr == u8::from(FeedbackClass::LED) {
4415            let (led, new_remaining) = FeedbackStateDataLed::try_parse(outer_remaining)?;
4416            outer_remaining = new_remaining;
4417            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
4418            parse_result = Some(FeedbackStateData::Led(led));
4419        }
4420        if switch_expr == u8::from(FeedbackClass::BELL) {
4421            let (bell, new_remaining) = FeedbackStateDataBell::try_parse(outer_remaining)?;
4422            outer_remaining = new_remaining;
4423            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
4424            parse_result = Some(FeedbackStateData::Bell(bell));
4425        }
4426        match parse_result {
4427            None => Ok((FeedbackStateData::InvalidValue(switch_expr), &[])),
4428            Some(result) => Ok((result, outer_remaining)),
4429        }
4430    }
4431}
4432impl FeedbackStateData {
4433    pub fn as_keyboard(&self) -> Option<&FeedbackStateDataKeyboard> {
4434        match self {
4435            FeedbackStateData::Keyboard(value) => Some(value),
4436            _ => None,
4437        }
4438    }
4439    pub fn as_pointer(&self) -> Option<&FeedbackStateDataPointer> {
4440        match self {
4441            FeedbackStateData::Pointer(value) => Some(value),
4442            _ => None,
4443        }
4444    }
4445    pub fn as_string(&self) -> Option<&FeedbackStateDataString> {
4446        match self {
4447            FeedbackStateData::String(value) => Some(value),
4448            _ => None,
4449        }
4450    }
4451    pub fn as_integer(&self) -> Option<&FeedbackStateDataInteger> {
4452        match self {
4453            FeedbackStateData::Integer(value) => Some(value),
4454            _ => None,
4455        }
4456    }
4457    pub fn as_led(&self) -> Option<&FeedbackStateDataLed> {
4458        match self {
4459            FeedbackStateData::Led(value) => Some(value),
4460            _ => None,
4461        }
4462    }
4463    pub fn as_bell(&self) -> Option<&FeedbackStateDataBell> {
4464        match self {
4465            FeedbackStateData::Bell(value) => Some(value),
4466            _ => None,
4467        }
4468    }
4469}
4470impl FeedbackStateData {
4471    #[allow(dead_code)]
4472    fn serialize(&self, class_id: u8) -> Vec<u8> {
4473        let mut result = Vec::new();
4474        self.serialize_into(&mut result, u8::from(class_id));
4475        result
4476    }
4477    fn serialize_into(&self, bytes: &mut Vec<u8>, class_id: u8) {
4478        assert_eq!(self.switch_expr(), u8::from(class_id), "switch `data` has an inconsistent discriminant");
4479        match self {
4480            FeedbackStateData::Keyboard(keyboard) => keyboard.serialize_into(bytes),
4481            FeedbackStateData::Pointer(pointer) => pointer.serialize_into(bytes),
4482            FeedbackStateData::String(string) => string.serialize_into(bytes),
4483            FeedbackStateData::Integer(integer) => integer.serialize_into(bytes),
4484            FeedbackStateData::Led(led) => led.serialize_into(bytes),
4485            FeedbackStateData::Bell(bell) => bell.serialize_into(bytes),
4486            FeedbackStateData::InvalidValue(_) => panic!("attempted to serialize invalid switch case"),
4487        }
4488    }
4489}
4490impl FeedbackStateData {
4491    fn switch_expr(&self) -> u8 {
4492        match self {
4493            FeedbackStateData::Keyboard(_) => u8::from(FeedbackClass::KEYBOARD),
4494            FeedbackStateData::Pointer(_) => u8::from(FeedbackClass::POINTER),
4495            FeedbackStateData::String(_) => u8::from(FeedbackClass::STRING),
4496            FeedbackStateData::Integer(_) => u8::from(FeedbackClass::INTEGER),
4497            FeedbackStateData::Led(_) => u8::from(FeedbackClass::LED),
4498            FeedbackStateData::Bell(_) => u8::from(FeedbackClass::BELL),
4499            FeedbackStateData::InvalidValue(switch_expr) => *switch_expr,
4500        }
4501    }
4502}
4503
4504#[derive(Clone)]
4505#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4506#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4507pub struct FeedbackState {
4508    pub feedback_id: u8,
4509    pub len: u16,
4510    pub data: FeedbackStateData,
4511}
4512impl_debug_if_no_extra_traits!(FeedbackState, "FeedbackState");
4513impl TryParse for FeedbackState {
4514    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4515        let (class_id, remaining) = u8::try_parse(remaining)?;
4516        let (feedback_id, remaining) = u8::try_parse(remaining)?;
4517        let (len, remaining) = u16::try_parse(remaining)?;
4518        let (data, remaining) = FeedbackStateData::try_parse(remaining, u8::from(class_id))?;
4519        let result = FeedbackState { feedback_id, len, data };
4520        Ok((result, remaining))
4521    }
4522}
4523impl Serialize for FeedbackState {
4524    type Bytes = Vec<u8>;
4525    fn serialize(&self) -> Vec<u8> {
4526        let mut result = Vec::new();
4527        self.serialize_into(&mut result);
4528        result
4529    }
4530    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4531        bytes.reserve(4);
4532        let class_id: u8 = self.data.switch_expr();
4533        class_id.serialize_into(bytes);
4534        self.feedback_id.serialize_into(bytes);
4535        self.len.serialize_into(bytes);
4536        self.data.serialize_into(bytes, u8::from(class_id));
4537    }
4538}
4539
4540/// Opcode for the GetFeedbackControl request
4541pub const GET_FEEDBACK_CONTROL_REQUEST: u8 = 22;
4542#[derive(Clone, Copy, Default)]
4543#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4544#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4545pub struct GetFeedbackControlRequest {
4546    pub device_id: u8,
4547}
4548impl_debug_if_no_extra_traits!(GetFeedbackControlRequest, "GetFeedbackControlRequest");
4549impl GetFeedbackControlRequest {
4550    /// Serialize this request into bytes for the provided connection
4551    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
4552        let length_so_far = 0;
4553        let device_id_bytes = self.device_id.serialize();
4554        let mut request0 = vec![
4555            major_opcode,
4556            GET_FEEDBACK_CONTROL_REQUEST,
4557            0,
4558            0,
4559            device_id_bytes[0],
4560            0,
4561            0,
4562            0,
4563        ];
4564        let length_so_far = length_so_far + request0.len();
4565        assert_eq!(length_so_far % 4, 0);
4566        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
4567        request0[2..4].copy_from_slice(&length.to_ne_bytes());
4568        ([request0.into()], vec![])
4569    }
4570    /// Parse this request given its header, its body, and any fds that go along with it
4571    #[cfg(feature = "request-parsing")]
4572    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
4573        if header.minor_opcode != GET_FEEDBACK_CONTROL_REQUEST {
4574            return Err(ParseError::InvalidValue);
4575        }
4576        let (device_id, remaining) = u8::try_parse(value)?;
4577        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
4578        let _ = remaining;
4579        Ok(GetFeedbackControlRequest {
4580            device_id,
4581        })
4582    }
4583}
4584impl Request for GetFeedbackControlRequest {
4585    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
4586
4587    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
4588        let (bufs, fds) = self.serialize(major_opcode);
4589        // Flatten the buffers into a single vector
4590        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
4591        (buf, fds)
4592    }
4593}
4594impl crate::x11_utils::ReplyRequest for GetFeedbackControlRequest {
4595    type Reply = GetFeedbackControlReply;
4596}
4597
4598#[derive(Clone)]
4599#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4600#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4601pub struct GetFeedbackControlReply {
4602    pub xi_reply_type: u8,
4603    pub sequence: u16,
4604    pub length: u32,
4605    pub feedbacks: Vec<FeedbackState>,
4606}
4607impl_debug_if_no_extra_traits!(GetFeedbackControlReply, "GetFeedbackControlReply");
4608impl TryParse for GetFeedbackControlReply {
4609    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4610        let remaining = initial_value;
4611        let (response_type, remaining) = u8::try_parse(remaining)?;
4612        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
4613        let (sequence, remaining) = u16::try_parse(remaining)?;
4614        let (length, remaining) = u32::try_parse(remaining)?;
4615        let (num_feedbacks, remaining) = u16::try_parse(remaining)?;
4616        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
4617        let (feedbacks, remaining) = crate::x11_utils::parse_list::<FeedbackState>(remaining, num_feedbacks.try_to_usize()?)?;
4618        if response_type != 1 {
4619            return Err(ParseError::InvalidValue);
4620        }
4621        let result = GetFeedbackControlReply { xi_reply_type, sequence, length, feedbacks };
4622        let _ = remaining;
4623        let remaining = initial_value.get(32 + length as usize * 4..)
4624            .ok_or(ParseError::InsufficientData)?;
4625        Ok((result, remaining))
4626    }
4627}
4628impl Serialize for GetFeedbackControlReply {
4629    type Bytes = Vec<u8>;
4630    fn serialize(&self) -> Vec<u8> {
4631        let mut result = Vec::new();
4632        self.serialize_into(&mut result);
4633        result
4634    }
4635    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4636        bytes.reserve(32);
4637        let response_type_bytes = &[1];
4638        bytes.push(response_type_bytes[0]);
4639        self.xi_reply_type.serialize_into(bytes);
4640        self.sequence.serialize_into(bytes);
4641        self.length.serialize_into(bytes);
4642        let num_feedbacks = u16::try_from(self.feedbacks.len()).expect("`feedbacks` has too many elements");
4643        num_feedbacks.serialize_into(bytes);
4644        bytes.extend_from_slice(&[0; 22]);
4645        self.feedbacks.serialize_into(bytes);
4646    }
4647}
4648impl GetFeedbackControlReply {
4649    /// Get the value of the `num_feedbacks` field.
4650    ///
4651    /// The `num_feedbacks` field is used as the length field of the `feedbacks` field.
4652    /// This function computes the field's value again based on the length of the list.
4653    ///
4654    /// # Panics
4655    ///
4656    /// Panics if the value cannot be represented in the target type. This
4657    /// cannot happen with values of the struct received from the X11 server.
4658    pub fn num_feedbacks(&self) -> u16 {
4659        self.feedbacks.len()
4660            .try_into().unwrap()
4661    }
4662}
4663
4664#[derive(Clone, Copy, Default)]
4665#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4666#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4667pub struct KbdFeedbackCtl {
4668    pub class_id: FeedbackClass,
4669    pub feedback_id: u8,
4670    pub len: u16,
4671    pub key: KeyCode,
4672    pub auto_repeat_mode: u8,
4673    pub key_click_percent: i8,
4674    pub bell_percent: i8,
4675    pub bell_pitch: i16,
4676    pub bell_duration: i16,
4677    pub led_mask: u32,
4678    pub led_values: u32,
4679}
4680impl_debug_if_no_extra_traits!(KbdFeedbackCtl, "KbdFeedbackCtl");
4681impl TryParse for KbdFeedbackCtl {
4682    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4683        let (class_id, remaining) = u8::try_parse(remaining)?;
4684        let (feedback_id, remaining) = u8::try_parse(remaining)?;
4685        let (len, remaining) = u16::try_parse(remaining)?;
4686        let (key, remaining) = KeyCode::try_parse(remaining)?;
4687        let (auto_repeat_mode, remaining) = u8::try_parse(remaining)?;
4688        let (key_click_percent, remaining) = i8::try_parse(remaining)?;
4689        let (bell_percent, remaining) = i8::try_parse(remaining)?;
4690        let (bell_pitch, remaining) = i16::try_parse(remaining)?;
4691        let (bell_duration, remaining) = i16::try_parse(remaining)?;
4692        let (led_mask, remaining) = u32::try_parse(remaining)?;
4693        let (led_values, remaining) = u32::try_parse(remaining)?;
4694        let class_id = class_id.into();
4695        let result = KbdFeedbackCtl { class_id, feedback_id, len, key, auto_repeat_mode, key_click_percent, bell_percent, bell_pitch, bell_duration, led_mask, led_values };
4696        Ok((result, remaining))
4697    }
4698}
4699impl Serialize for KbdFeedbackCtl {
4700    type Bytes = [u8; 20];
4701    fn serialize(&self) -> [u8; 20] {
4702        let class_id_bytes = u8::from(self.class_id).serialize();
4703        let feedback_id_bytes = self.feedback_id.serialize();
4704        let len_bytes = self.len.serialize();
4705        let key_bytes = self.key.serialize();
4706        let auto_repeat_mode_bytes = self.auto_repeat_mode.serialize();
4707        let key_click_percent_bytes = self.key_click_percent.serialize();
4708        let bell_percent_bytes = self.bell_percent.serialize();
4709        let bell_pitch_bytes = self.bell_pitch.serialize();
4710        let bell_duration_bytes = self.bell_duration.serialize();
4711        let led_mask_bytes = self.led_mask.serialize();
4712        let led_values_bytes = self.led_values.serialize();
4713        [
4714            class_id_bytes[0],
4715            feedback_id_bytes[0],
4716            len_bytes[0],
4717            len_bytes[1],
4718            key_bytes[0],
4719            auto_repeat_mode_bytes[0],
4720            key_click_percent_bytes[0],
4721            bell_percent_bytes[0],
4722            bell_pitch_bytes[0],
4723            bell_pitch_bytes[1],
4724            bell_duration_bytes[0],
4725            bell_duration_bytes[1],
4726            led_mask_bytes[0],
4727            led_mask_bytes[1],
4728            led_mask_bytes[2],
4729            led_mask_bytes[3],
4730            led_values_bytes[0],
4731            led_values_bytes[1],
4732            led_values_bytes[2],
4733            led_values_bytes[3],
4734        ]
4735    }
4736    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4737        bytes.reserve(20);
4738        u8::from(self.class_id).serialize_into(bytes);
4739        self.feedback_id.serialize_into(bytes);
4740        self.len.serialize_into(bytes);
4741        self.key.serialize_into(bytes);
4742        self.auto_repeat_mode.serialize_into(bytes);
4743        self.key_click_percent.serialize_into(bytes);
4744        self.bell_percent.serialize_into(bytes);
4745        self.bell_pitch.serialize_into(bytes);
4746        self.bell_duration.serialize_into(bytes);
4747        self.led_mask.serialize_into(bytes);
4748        self.led_values.serialize_into(bytes);
4749    }
4750}
4751
4752#[derive(Clone, Copy, Default)]
4753#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4754#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4755pub struct PtrFeedbackCtl {
4756    pub class_id: FeedbackClass,
4757    pub feedback_id: u8,
4758    pub len: u16,
4759    pub num: i16,
4760    pub denom: i16,
4761    pub threshold: i16,
4762}
4763impl_debug_if_no_extra_traits!(PtrFeedbackCtl, "PtrFeedbackCtl");
4764impl TryParse for PtrFeedbackCtl {
4765    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4766        let (class_id, remaining) = u8::try_parse(remaining)?;
4767        let (feedback_id, remaining) = u8::try_parse(remaining)?;
4768        let (len, remaining) = u16::try_parse(remaining)?;
4769        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
4770        let (num, remaining) = i16::try_parse(remaining)?;
4771        let (denom, remaining) = i16::try_parse(remaining)?;
4772        let (threshold, remaining) = i16::try_parse(remaining)?;
4773        let class_id = class_id.into();
4774        let result = PtrFeedbackCtl { class_id, feedback_id, len, num, denom, threshold };
4775        Ok((result, remaining))
4776    }
4777}
4778impl Serialize for PtrFeedbackCtl {
4779    type Bytes = [u8; 12];
4780    fn serialize(&self) -> [u8; 12] {
4781        let class_id_bytes = u8::from(self.class_id).serialize();
4782        let feedback_id_bytes = self.feedback_id.serialize();
4783        let len_bytes = self.len.serialize();
4784        let num_bytes = self.num.serialize();
4785        let denom_bytes = self.denom.serialize();
4786        let threshold_bytes = self.threshold.serialize();
4787        [
4788            class_id_bytes[0],
4789            feedback_id_bytes[0],
4790            len_bytes[0],
4791            len_bytes[1],
4792            0,
4793            0,
4794            num_bytes[0],
4795            num_bytes[1],
4796            denom_bytes[0],
4797            denom_bytes[1],
4798            threshold_bytes[0],
4799            threshold_bytes[1],
4800        ]
4801    }
4802    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4803        bytes.reserve(12);
4804        u8::from(self.class_id).serialize_into(bytes);
4805        self.feedback_id.serialize_into(bytes);
4806        self.len.serialize_into(bytes);
4807        bytes.extend_from_slice(&[0; 2]);
4808        self.num.serialize_into(bytes);
4809        self.denom.serialize_into(bytes);
4810        self.threshold.serialize_into(bytes);
4811    }
4812}
4813
4814#[derive(Clone, Copy, Default)]
4815#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4816#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4817pub struct IntegerFeedbackCtl {
4818    pub class_id: FeedbackClass,
4819    pub feedback_id: u8,
4820    pub len: u16,
4821    pub int_to_display: i32,
4822}
4823impl_debug_if_no_extra_traits!(IntegerFeedbackCtl, "IntegerFeedbackCtl");
4824impl TryParse for IntegerFeedbackCtl {
4825    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4826        let (class_id, remaining) = u8::try_parse(remaining)?;
4827        let (feedback_id, remaining) = u8::try_parse(remaining)?;
4828        let (len, remaining) = u16::try_parse(remaining)?;
4829        let (int_to_display, remaining) = i32::try_parse(remaining)?;
4830        let class_id = class_id.into();
4831        let result = IntegerFeedbackCtl { class_id, feedback_id, len, int_to_display };
4832        Ok((result, remaining))
4833    }
4834}
4835impl Serialize for IntegerFeedbackCtl {
4836    type Bytes = [u8; 8];
4837    fn serialize(&self) -> [u8; 8] {
4838        let class_id_bytes = u8::from(self.class_id).serialize();
4839        let feedback_id_bytes = self.feedback_id.serialize();
4840        let len_bytes = self.len.serialize();
4841        let int_to_display_bytes = self.int_to_display.serialize();
4842        [
4843            class_id_bytes[0],
4844            feedback_id_bytes[0],
4845            len_bytes[0],
4846            len_bytes[1],
4847            int_to_display_bytes[0],
4848            int_to_display_bytes[1],
4849            int_to_display_bytes[2],
4850            int_to_display_bytes[3],
4851        ]
4852    }
4853    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4854        bytes.reserve(8);
4855        u8::from(self.class_id).serialize_into(bytes);
4856        self.feedback_id.serialize_into(bytes);
4857        self.len.serialize_into(bytes);
4858        self.int_to_display.serialize_into(bytes);
4859    }
4860}
4861
4862#[derive(Clone, Default)]
4863#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4864#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4865pub struct StringFeedbackCtl {
4866    pub class_id: FeedbackClass,
4867    pub feedback_id: u8,
4868    pub len: u16,
4869    pub keysyms: Vec<xproto::Keysym>,
4870}
4871impl_debug_if_no_extra_traits!(StringFeedbackCtl, "StringFeedbackCtl");
4872impl TryParse for StringFeedbackCtl {
4873    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4874        let (class_id, remaining) = u8::try_parse(remaining)?;
4875        let (feedback_id, remaining) = u8::try_parse(remaining)?;
4876        let (len, remaining) = u16::try_parse(remaining)?;
4877        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
4878        let (num_keysyms, remaining) = u16::try_parse(remaining)?;
4879        let (keysyms, remaining) = crate::x11_utils::parse_list::<xproto::Keysym>(remaining, num_keysyms.try_to_usize()?)?;
4880        let class_id = class_id.into();
4881        let result = StringFeedbackCtl { class_id, feedback_id, len, keysyms };
4882        Ok((result, remaining))
4883    }
4884}
4885impl Serialize for StringFeedbackCtl {
4886    type Bytes = Vec<u8>;
4887    fn serialize(&self) -> Vec<u8> {
4888        let mut result = Vec::new();
4889        self.serialize_into(&mut result);
4890        result
4891    }
4892    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4893        bytes.reserve(8);
4894        u8::from(self.class_id).serialize_into(bytes);
4895        self.feedback_id.serialize_into(bytes);
4896        self.len.serialize_into(bytes);
4897        bytes.extend_from_slice(&[0; 2]);
4898        let num_keysyms = u16::try_from(self.keysyms.len()).expect("`keysyms` has too many elements");
4899        num_keysyms.serialize_into(bytes);
4900        self.keysyms.serialize_into(bytes);
4901    }
4902}
4903impl StringFeedbackCtl {
4904    /// Get the value of the `num_keysyms` field.
4905    ///
4906    /// The `num_keysyms` field is used as the length field of the `keysyms` field.
4907    /// This function computes the field's value again based on the length of the list.
4908    ///
4909    /// # Panics
4910    ///
4911    /// Panics if the value cannot be represented in the target type. This
4912    /// cannot happen with values of the struct received from the X11 server.
4913    pub fn num_keysyms(&self) -> u16 {
4914        self.keysyms.len()
4915            .try_into().unwrap()
4916    }
4917}
4918
4919#[derive(Clone, Copy, Default)]
4920#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4921#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4922pub struct BellFeedbackCtl {
4923    pub class_id: FeedbackClass,
4924    pub feedback_id: u8,
4925    pub len: u16,
4926    pub percent: i8,
4927    pub pitch: i16,
4928    pub duration: i16,
4929}
4930impl_debug_if_no_extra_traits!(BellFeedbackCtl, "BellFeedbackCtl");
4931impl TryParse for BellFeedbackCtl {
4932    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4933        let (class_id, remaining) = u8::try_parse(remaining)?;
4934        let (feedback_id, remaining) = u8::try_parse(remaining)?;
4935        let (len, remaining) = u16::try_parse(remaining)?;
4936        let (percent, remaining) = i8::try_parse(remaining)?;
4937        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
4938        let (pitch, remaining) = i16::try_parse(remaining)?;
4939        let (duration, remaining) = i16::try_parse(remaining)?;
4940        let class_id = class_id.into();
4941        let result = BellFeedbackCtl { class_id, feedback_id, len, percent, pitch, duration };
4942        Ok((result, remaining))
4943    }
4944}
4945impl Serialize for BellFeedbackCtl {
4946    type Bytes = [u8; 12];
4947    fn serialize(&self) -> [u8; 12] {
4948        let class_id_bytes = u8::from(self.class_id).serialize();
4949        let feedback_id_bytes = self.feedback_id.serialize();
4950        let len_bytes = self.len.serialize();
4951        let percent_bytes = self.percent.serialize();
4952        let pitch_bytes = self.pitch.serialize();
4953        let duration_bytes = self.duration.serialize();
4954        [
4955            class_id_bytes[0],
4956            feedback_id_bytes[0],
4957            len_bytes[0],
4958            len_bytes[1],
4959            percent_bytes[0],
4960            0,
4961            0,
4962            0,
4963            pitch_bytes[0],
4964            pitch_bytes[1],
4965            duration_bytes[0],
4966            duration_bytes[1],
4967        ]
4968    }
4969    fn serialize_into(&self, bytes: &mut Vec<u8>) {
4970        bytes.reserve(12);
4971        u8::from(self.class_id).serialize_into(bytes);
4972        self.feedback_id.serialize_into(bytes);
4973        self.len.serialize_into(bytes);
4974        self.percent.serialize_into(bytes);
4975        bytes.extend_from_slice(&[0; 3]);
4976        self.pitch.serialize_into(bytes);
4977        self.duration.serialize_into(bytes);
4978    }
4979}
4980
4981#[derive(Clone, Copy, Default)]
4982#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
4983#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4984pub struct LedFeedbackCtl {
4985    pub class_id: FeedbackClass,
4986    pub feedback_id: u8,
4987    pub len: u16,
4988    pub led_mask: u32,
4989    pub led_values: u32,
4990}
4991impl_debug_if_no_extra_traits!(LedFeedbackCtl, "LedFeedbackCtl");
4992impl TryParse for LedFeedbackCtl {
4993    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
4994        let (class_id, remaining) = u8::try_parse(remaining)?;
4995        let (feedback_id, remaining) = u8::try_parse(remaining)?;
4996        let (len, remaining) = u16::try_parse(remaining)?;
4997        let (led_mask, remaining) = u32::try_parse(remaining)?;
4998        let (led_values, remaining) = u32::try_parse(remaining)?;
4999        let class_id = class_id.into();
5000        let result = LedFeedbackCtl { class_id, feedback_id, len, led_mask, led_values };
5001        Ok((result, remaining))
5002    }
5003}
5004impl Serialize for LedFeedbackCtl {
5005    type Bytes = [u8; 12];
5006    fn serialize(&self) -> [u8; 12] {
5007        let class_id_bytes = u8::from(self.class_id).serialize();
5008        let feedback_id_bytes = self.feedback_id.serialize();
5009        let len_bytes = self.len.serialize();
5010        let led_mask_bytes = self.led_mask.serialize();
5011        let led_values_bytes = self.led_values.serialize();
5012        [
5013            class_id_bytes[0],
5014            feedback_id_bytes[0],
5015            len_bytes[0],
5016            len_bytes[1],
5017            led_mask_bytes[0],
5018            led_mask_bytes[1],
5019            led_mask_bytes[2],
5020            led_mask_bytes[3],
5021            led_values_bytes[0],
5022            led_values_bytes[1],
5023            led_values_bytes[2],
5024            led_values_bytes[3],
5025        ]
5026    }
5027    fn serialize_into(&self, bytes: &mut Vec<u8>) {
5028        bytes.reserve(12);
5029        u8::from(self.class_id).serialize_into(bytes);
5030        self.feedback_id.serialize_into(bytes);
5031        self.len.serialize_into(bytes);
5032        self.led_mask.serialize_into(bytes);
5033        self.led_values.serialize_into(bytes);
5034    }
5035}
5036
5037#[derive(Clone, Copy)]
5038#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5039#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5040pub struct FeedbackCtlDataKeyboard {
5041    pub key: KeyCode,
5042    pub auto_repeat_mode: u8,
5043    pub key_click_percent: i8,
5044    pub bell_percent: i8,
5045    pub bell_pitch: i16,
5046    pub bell_duration: i16,
5047    pub led_mask: u32,
5048    pub led_values: u32,
5049}
5050impl_debug_if_no_extra_traits!(FeedbackCtlDataKeyboard, "FeedbackCtlDataKeyboard");
5051impl TryParse for FeedbackCtlDataKeyboard {
5052    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
5053        let (key, remaining) = KeyCode::try_parse(remaining)?;
5054        let (auto_repeat_mode, remaining) = u8::try_parse(remaining)?;
5055        let (key_click_percent, remaining) = i8::try_parse(remaining)?;
5056        let (bell_percent, remaining) = i8::try_parse(remaining)?;
5057        let (bell_pitch, remaining) = i16::try_parse(remaining)?;
5058        let (bell_duration, remaining) = i16::try_parse(remaining)?;
5059        let (led_mask, remaining) = u32::try_parse(remaining)?;
5060        let (led_values, remaining) = u32::try_parse(remaining)?;
5061        let result = FeedbackCtlDataKeyboard { key, auto_repeat_mode, key_click_percent, bell_percent, bell_pitch, bell_duration, led_mask, led_values };
5062        Ok((result, remaining))
5063    }
5064}
5065impl Serialize for FeedbackCtlDataKeyboard {
5066    type Bytes = [u8; 16];
5067    fn serialize(&self) -> [u8; 16] {
5068        let key_bytes = self.key.serialize();
5069        let auto_repeat_mode_bytes = self.auto_repeat_mode.serialize();
5070        let key_click_percent_bytes = self.key_click_percent.serialize();
5071        let bell_percent_bytes = self.bell_percent.serialize();
5072        let bell_pitch_bytes = self.bell_pitch.serialize();
5073        let bell_duration_bytes = self.bell_duration.serialize();
5074        let led_mask_bytes = self.led_mask.serialize();
5075        let led_values_bytes = self.led_values.serialize();
5076        [
5077            key_bytes[0],
5078            auto_repeat_mode_bytes[0],
5079            key_click_percent_bytes[0],
5080            bell_percent_bytes[0],
5081            bell_pitch_bytes[0],
5082            bell_pitch_bytes[1],
5083            bell_duration_bytes[0],
5084            bell_duration_bytes[1],
5085            led_mask_bytes[0],
5086            led_mask_bytes[1],
5087            led_mask_bytes[2],
5088            led_mask_bytes[3],
5089            led_values_bytes[0],
5090            led_values_bytes[1],
5091            led_values_bytes[2],
5092            led_values_bytes[3],
5093        ]
5094    }
5095    fn serialize_into(&self, bytes: &mut Vec<u8>) {
5096        bytes.reserve(16);
5097        self.key.serialize_into(bytes);
5098        self.auto_repeat_mode.serialize_into(bytes);
5099        self.key_click_percent.serialize_into(bytes);
5100        self.bell_percent.serialize_into(bytes);
5101        self.bell_pitch.serialize_into(bytes);
5102        self.bell_duration.serialize_into(bytes);
5103        self.led_mask.serialize_into(bytes);
5104        self.led_values.serialize_into(bytes);
5105    }
5106}
5107#[derive(Clone, Copy)]
5108#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5109#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5110pub struct FeedbackCtlDataPointer {
5111    pub num: i16,
5112    pub denom: i16,
5113    pub threshold: i16,
5114}
5115impl_debug_if_no_extra_traits!(FeedbackCtlDataPointer, "FeedbackCtlDataPointer");
5116impl TryParse for FeedbackCtlDataPointer {
5117    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
5118        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
5119        let (num, remaining) = i16::try_parse(remaining)?;
5120        let (denom, remaining) = i16::try_parse(remaining)?;
5121        let (threshold, remaining) = i16::try_parse(remaining)?;
5122        let result = FeedbackCtlDataPointer { num, denom, threshold };
5123        Ok((result, remaining))
5124    }
5125}
5126impl Serialize for FeedbackCtlDataPointer {
5127    type Bytes = [u8; 8];
5128    fn serialize(&self) -> [u8; 8] {
5129        let num_bytes = self.num.serialize();
5130        let denom_bytes = self.denom.serialize();
5131        let threshold_bytes = self.threshold.serialize();
5132        [
5133            0,
5134            0,
5135            num_bytes[0],
5136            num_bytes[1],
5137            denom_bytes[0],
5138            denom_bytes[1],
5139            threshold_bytes[0],
5140            threshold_bytes[1],
5141        ]
5142    }
5143    fn serialize_into(&self, bytes: &mut Vec<u8>) {
5144        bytes.reserve(8);
5145        bytes.extend_from_slice(&[0; 2]);
5146        self.num.serialize_into(bytes);
5147        self.denom.serialize_into(bytes);
5148        self.threshold.serialize_into(bytes);
5149    }
5150}
5151#[derive(Clone)]
5152#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5153#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5154pub struct FeedbackCtlDataString {
5155    pub keysyms: Vec<xproto::Keysym>,
5156}
5157impl_debug_if_no_extra_traits!(FeedbackCtlDataString, "FeedbackCtlDataString");
5158impl TryParse for FeedbackCtlDataString {
5159    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
5160        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
5161        let (num_keysyms, remaining) = u16::try_parse(remaining)?;
5162        let (keysyms, remaining) = crate::x11_utils::parse_list::<xproto::Keysym>(remaining, num_keysyms.try_to_usize()?)?;
5163        let result = FeedbackCtlDataString { keysyms };
5164        Ok((result, remaining))
5165    }
5166}
5167impl Serialize for FeedbackCtlDataString {
5168    type Bytes = Vec<u8>;
5169    fn serialize(&self) -> Vec<u8> {
5170        let mut result = Vec::new();
5171        self.serialize_into(&mut result);
5172        result
5173    }
5174    fn serialize_into(&self, bytes: &mut Vec<u8>) {
5175        bytes.reserve(4);
5176        bytes.extend_from_slice(&[0; 2]);
5177        let num_keysyms = u16::try_from(self.keysyms.len()).expect("`keysyms` has too many elements");
5178        num_keysyms.serialize_into(bytes);
5179        self.keysyms.serialize_into(bytes);
5180    }
5181}
5182impl FeedbackCtlDataString {
5183    /// Get the value of the `num_keysyms` field.
5184    ///
5185    /// The `num_keysyms` field is used as the length field of the `keysyms` field.
5186    /// This function computes the field's value again based on the length of the list.
5187    ///
5188    /// # Panics
5189    ///
5190    /// Panics if the value cannot be represented in the target type. This
5191    /// cannot happen with values of the struct received from the X11 server.
5192    pub fn num_keysyms(&self) -> u16 {
5193        self.keysyms.len()
5194            .try_into().unwrap()
5195    }
5196}
5197#[derive(Clone, Copy)]
5198#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5199#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5200pub struct FeedbackCtlDataInteger {
5201    pub int_to_display: i32,
5202}
5203impl_debug_if_no_extra_traits!(FeedbackCtlDataInteger, "FeedbackCtlDataInteger");
5204impl TryParse for FeedbackCtlDataInteger {
5205    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
5206        let (int_to_display, remaining) = i32::try_parse(remaining)?;
5207        let result = FeedbackCtlDataInteger { int_to_display };
5208        Ok((result, remaining))
5209    }
5210}
5211impl Serialize for FeedbackCtlDataInteger {
5212    type Bytes = [u8; 4];
5213    fn serialize(&self) -> [u8; 4] {
5214        let int_to_display_bytes = self.int_to_display.serialize();
5215        [
5216            int_to_display_bytes[0],
5217            int_to_display_bytes[1],
5218            int_to_display_bytes[2],
5219            int_to_display_bytes[3],
5220        ]
5221    }
5222    fn serialize_into(&self, bytes: &mut Vec<u8>) {
5223        bytes.reserve(4);
5224        self.int_to_display.serialize_into(bytes);
5225    }
5226}
5227#[derive(Clone, Copy)]
5228#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5229#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5230pub struct FeedbackCtlDataLed {
5231    pub led_mask: u32,
5232    pub led_values: u32,
5233}
5234impl_debug_if_no_extra_traits!(FeedbackCtlDataLed, "FeedbackCtlDataLed");
5235impl TryParse for FeedbackCtlDataLed {
5236    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
5237        let (led_mask, remaining) = u32::try_parse(remaining)?;
5238        let (led_values, remaining) = u32::try_parse(remaining)?;
5239        let result = FeedbackCtlDataLed { led_mask, led_values };
5240        Ok((result, remaining))
5241    }
5242}
5243impl Serialize for FeedbackCtlDataLed {
5244    type Bytes = [u8; 8];
5245    fn serialize(&self) -> [u8; 8] {
5246        let led_mask_bytes = self.led_mask.serialize();
5247        let led_values_bytes = self.led_values.serialize();
5248        [
5249            led_mask_bytes[0],
5250            led_mask_bytes[1],
5251            led_mask_bytes[2],
5252            led_mask_bytes[3],
5253            led_values_bytes[0],
5254            led_values_bytes[1],
5255            led_values_bytes[2],
5256            led_values_bytes[3],
5257        ]
5258    }
5259    fn serialize_into(&self, bytes: &mut Vec<u8>) {
5260        bytes.reserve(8);
5261        self.led_mask.serialize_into(bytes);
5262        self.led_values.serialize_into(bytes);
5263    }
5264}
5265#[derive(Clone, Copy)]
5266#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5267#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5268pub struct FeedbackCtlDataBell {
5269    pub percent: i8,
5270    pub pitch: i16,
5271    pub duration: i16,
5272}
5273impl_debug_if_no_extra_traits!(FeedbackCtlDataBell, "FeedbackCtlDataBell");
5274impl TryParse for FeedbackCtlDataBell {
5275    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
5276        let (percent, remaining) = i8::try_parse(remaining)?;
5277        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
5278        let (pitch, remaining) = i16::try_parse(remaining)?;
5279        let (duration, remaining) = i16::try_parse(remaining)?;
5280        let result = FeedbackCtlDataBell { percent, pitch, duration };
5281        Ok((result, remaining))
5282    }
5283}
5284impl Serialize for FeedbackCtlDataBell {
5285    type Bytes = [u8; 8];
5286    fn serialize(&self) -> [u8; 8] {
5287        let percent_bytes = self.percent.serialize();
5288        let pitch_bytes = self.pitch.serialize();
5289        let duration_bytes = self.duration.serialize();
5290        [
5291            percent_bytes[0],
5292            0,
5293            0,
5294            0,
5295            pitch_bytes[0],
5296            pitch_bytes[1],
5297            duration_bytes[0],
5298            duration_bytes[1],
5299        ]
5300    }
5301    fn serialize_into(&self, bytes: &mut Vec<u8>) {
5302        bytes.reserve(8);
5303        self.percent.serialize_into(bytes);
5304        bytes.extend_from_slice(&[0; 3]);
5305        self.pitch.serialize_into(bytes);
5306        self.duration.serialize_into(bytes);
5307    }
5308}
5309#[derive(Clone)]
5310#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5311#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5312pub enum FeedbackCtlData {
5313    Keyboard(FeedbackCtlDataKeyboard),
5314    Pointer(FeedbackCtlDataPointer),
5315    String(FeedbackCtlDataString),
5316    Integer(FeedbackCtlDataInteger),
5317    Led(FeedbackCtlDataLed),
5318    Bell(FeedbackCtlDataBell),
5319    /// This variant is returned when the server sends a discriminant
5320    /// value that does not match any of the defined by the protocol.
5321    ///
5322    /// Usually, this should be considered a parsing error, but there
5323    /// are some cases where the server violates the protocol.
5324    ///
5325    /// Trying to use `serialize` or `serialize_into` with this variant
5326    /// will raise a panic.
5327    InvalidValue(u8),
5328}
5329impl_debug_if_no_extra_traits!(FeedbackCtlData, "FeedbackCtlData");
5330impl FeedbackCtlData {
5331    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
5332    fn try_parse(value: &[u8], class_id: u8) -> Result<(Self, &[u8]), ParseError> {
5333        let switch_expr = u8::from(class_id);
5334        let mut outer_remaining = value;
5335        let mut parse_result = None;
5336        if switch_expr == u8::from(FeedbackClass::KEYBOARD) {
5337            let (keyboard, new_remaining) = FeedbackCtlDataKeyboard::try_parse(outer_remaining)?;
5338            outer_remaining = new_remaining;
5339            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
5340            parse_result = Some(FeedbackCtlData::Keyboard(keyboard));
5341        }
5342        if switch_expr == u8::from(FeedbackClass::POINTER) {
5343            let (pointer, new_remaining) = FeedbackCtlDataPointer::try_parse(outer_remaining)?;
5344            outer_remaining = new_remaining;
5345            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
5346            parse_result = Some(FeedbackCtlData::Pointer(pointer));
5347        }
5348        if switch_expr == u8::from(FeedbackClass::STRING) {
5349            let (string, new_remaining) = FeedbackCtlDataString::try_parse(outer_remaining)?;
5350            outer_remaining = new_remaining;
5351            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
5352            parse_result = Some(FeedbackCtlData::String(string));
5353        }
5354        if switch_expr == u8::from(FeedbackClass::INTEGER) {
5355            let (integer, new_remaining) = FeedbackCtlDataInteger::try_parse(outer_remaining)?;
5356            outer_remaining = new_remaining;
5357            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
5358            parse_result = Some(FeedbackCtlData::Integer(integer));
5359        }
5360        if switch_expr == u8::from(FeedbackClass::LED) {
5361            let (led, new_remaining) = FeedbackCtlDataLed::try_parse(outer_remaining)?;
5362            outer_remaining = new_remaining;
5363            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
5364            parse_result = Some(FeedbackCtlData::Led(led));
5365        }
5366        if switch_expr == u8::from(FeedbackClass::BELL) {
5367            let (bell, new_remaining) = FeedbackCtlDataBell::try_parse(outer_remaining)?;
5368            outer_remaining = new_remaining;
5369            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
5370            parse_result = Some(FeedbackCtlData::Bell(bell));
5371        }
5372        match parse_result {
5373            None => Ok((FeedbackCtlData::InvalidValue(switch_expr), &[])),
5374            Some(result) => Ok((result, outer_remaining)),
5375        }
5376    }
5377}
5378impl FeedbackCtlData {
5379    pub fn as_keyboard(&self) -> Option<&FeedbackCtlDataKeyboard> {
5380        match self {
5381            FeedbackCtlData::Keyboard(value) => Some(value),
5382            _ => None,
5383        }
5384    }
5385    pub fn as_pointer(&self) -> Option<&FeedbackCtlDataPointer> {
5386        match self {
5387            FeedbackCtlData::Pointer(value) => Some(value),
5388            _ => None,
5389        }
5390    }
5391    pub fn as_string(&self) -> Option<&FeedbackCtlDataString> {
5392        match self {
5393            FeedbackCtlData::String(value) => Some(value),
5394            _ => None,
5395        }
5396    }
5397    pub fn as_integer(&self) -> Option<&FeedbackCtlDataInteger> {
5398        match self {
5399            FeedbackCtlData::Integer(value) => Some(value),
5400            _ => None,
5401        }
5402    }
5403    pub fn as_led(&self) -> Option<&FeedbackCtlDataLed> {
5404        match self {
5405            FeedbackCtlData::Led(value) => Some(value),
5406            _ => None,
5407        }
5408    }
5409    pub fn as_bell(&self) -> Option<&FeedbackCtlDataBell> {
5410        match self {
5411            FeedbackCtlData::Bell(value) => Some(value),
5412            _ => None,
5413        }
5414    }
5415}
5416impl FeedbackCtlData {
5417    #[allow(dead_code)]
5418    fn serialize(&self, class_id: u8) -> Vec<u8> {
5419        let mut result = Vec::new();
5420        self.serialize_into(&mut result, u8::from(class_id));
5421        result
5422    }
5423    fn serialize_into(&self, bytes: &mut Vec<u8>, class_id: u8) {
5424        assert_eq!(self.switch_expr(), u8::from(class_id), "switch `data` has an inconsistent discriminant");
5425        match self {
5426            FeedbackCtlData::Keyboard(keyboard) => keyboard.serialize_into(bytes),
5427            FeedbackCtlData::Pointer(pointer) => pointer.serialize_into(bytes),
5428            FeedbackCtlData::String(string) => string.serialize_into(bytes),
5429            FeedbackCtlData::Integer(integer) => integer.serialize_into(bytes),
5430            FeedbackCtlData::Led(led) => led.serialize_into(bytes),
5431            FeedbackCtlData::Bell(bell) => bell.serialize_into(bytes),
5432            FeedbackCtlData::InvalidValue(_) => panic!("attempted to serialize invalid switch case"),
5433        }
5434    }
5435}
5436impl FeedbackCtlData {
5437    fn switch_expr(&self) -> u8 {
5438        match self {
5439            FeedbackCtlData::Keyboard(_) => u8::from(FeedbackClass::KEYBOARD),
5440            FeedbackCtlData::Pointer(_) => u8::from(FeedbackClass::POINTER),
5441            FeedbackCtlData::String(_) => u8::from(FeedbackClass::STRING),
5442            FeedbackCtlData::Integer(_) => u8::from(FeedbackClass::INTEGER),
5443            FeedbackCtlData::Led(_) => u8::from(FeedbackClass::LED),
5444            FeedbackCtlData::Bell(_) => u8::from(FeedbackClass::BELL),
5445            FeedbackCtlData::InvalidValue(switch_expr) => *switch_expr,
5446        }
5447    }
5448}
5449
5450#[derive(Clone)]
5451#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5452#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5453pub struct FeedbackCtl {
5454    pub feedback_id: u8,
5455    pub len: u16,
5456    pub data: FeedbackCtlData,
5457}
5458impl_debug_if_no_extra_traits!(FeedbackCtl, "FeedbackCtl");
5459impl TryParse for FeedbackCtl {
5460    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
5461        let (class_id, remaining) = u8::try_parse(remaining)?;
5462        let (feedback_id, remaining) = u8::try_parse(remaining)?;
5463        let (len, remaining) = u16::try_parse(remaining)?;
5464        let (data, remaining) = FeedbackCtlData::try_parse(remaining, u8::from(class_id))?;
5465        let result = FeedbackCtl { feedback_id, len, data };
5466        Ok((result, remaining))
5467    }
5468}
5469impl Serialize for FeedbackCtl {
5470    type Bytes = Vec<u8>;
5471    fn serialize(&self) -> Vec<u8> {
5472        let mut result = Vec::new();
5473        self.serialize_into(&mut result);
5474        result
5475    }
5476    fn serialize_into(&self, bytes: &mut Vec<u8>) {
5477        bytes.reserve(4);
5478        let class_id: u8 = self.data.switch_expr();
5479        class_id.serialize_into(bytes);
5480        self.feedback_id.serialize_into(bytes);
5481        self.len.serialize_into(bytes);
5482        self.data.serialize_into(bytes, u8::from(class_id));
5483    }
5484}
5485
5486#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
5487#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5488pub struct ChangeFeedbackControlMask(u32);
5489impl ChangeFeedbackControlMask {
5490    pub const KEY_CLICK_PERCENT: Self = Self(1 << 0);
5491    pub const PERCENT: Self = Self(1 << 1);
5492    pub const PITCH: Self = Self(1 << 2);
5493    pub const DURATION: Self = Self(1 << 3);
5494    pub const LED: Self = Self(1 << 4);
5495    pub const LED_MODE: Self = Self(1 << 5);
5496    pub const KEY: Self = Self(1 << 6);
5497    pub const AUTO_REPEAT_MODE: Self = Self(1 << 7);
5498    pub const STRING: Self = Self(1 << 0);
5499    pub const INTEGER: Self = Self(1 << 0);
5500    pub const ACCEL_NUM: Self = Self(1 << 0);
5501    pub const ACCEL_DENOM: Self = Self(1 << 1);
5502    pub const THRESHOLD: Self = Self(1 << 2);
5503}
5504impl From<ChangeFeedbackControlMask> for u32 {
5505    #[inline]
5506    fn from(input: ChangeFeedbackControlMask) -> Self {
5507        input.0
5508    }
5509}
5510impl From<ChangeFeedbackControlMask> for Option<u32> {
5511    #[inline]
5512    fn from(input: ChangeFeedbackControlMask) -> Self {
5513        Some(input.0)
5514    }
5515}
5516impl From<u8> for ChangeFeedbackControlMask {
5517    #[inline]
5518    fn from(value: u8) -> Self {
5519        Self(value.into())
5520    }
5521}
5522impl From<u16> for ChangeFeedbackControlMask {
5523    #[inline]
5524    fn from(value: u16) -> Self {
5525        Self(value.into())
5526    }
5527}
5528impl From<u32> for ChangeFeedbackControlMask {
5529    #[inline]
5530    fn from(value: u32) -> Self {
5531        Self(value)
5532    }
5533}
5534impl core::fmt::Debug for ChangeFeedbackControlMask  {
5535    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
5536        let variants = [
5537            (Self::KEY_CLICK_PERCENT.0, "KEY_CLICK_PERCENT", "KeyClickPercent"),
5538            (Self::PERCENT.0, "PERCENT", "Percent"),
5539            (Self::PITCH.0, "PITCH", "Pitch"),
5540            (Self::DURATION.0, "DURATION", "Duration"),
5541            (Self::LED.0, "LED", "Led"),
5542            (Self::LED_MODE.0, "LED_MODE", "LedMode"),
5543            (Self::KEY.0, "KEY", "Key"),
5544            (Self::AUTO_REPEAT_MODE.0, "AUTO_REPEAT_MODE", "AutoRepeatMode"),
5545            (Self::STRING.0, "STRING", "String"),
5546            (Self::INTEGER.0, "INTEGER", "Integer"),
5547            (Self::ACCEL_NUM.0, "ACCEL_NUM", "AccelNum"),
5548            (Self::ACCEL_DENOM.0, "ACCEL_DENOM", "AccelDenom"),
5549            (Self::THRESHOLD.0, "THRESHOLD", "Threshold"),
5550        ];
5551        pretty_print_bitmask(fmt, self.0, &variants)
5552    }
5553}
5554bitmask_binop!(ChangeFeedbackControlMask, u32);
5555
5556/// Opcode for the ChangeFeedbackControl request
5557pub const CHANGE_FEEDBACK_CONTROL_REQUEST: u8 = 23;
5558#[derive(Clone)]
5559#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5560#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5561pub struct ChangeFeedbackControlRequest {
5562    pub mask: ChangeFeedbackControlMask,
5563    pub device_id: u8,
5564    pub feedback_id: u8,
5565    pub feedback: FeedbackCtl,
5566}
5567impl_debug_if_no_extra_traits!(ChangeFeedbackControlRequest, "ChangeFeedbackControlRequest");
5568impl ChangeFeedbackControlRequest {
5569    /// Serialize this request into bytes for the provided connection
5570    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 3]> {
5571        let length_so_far = 0;
5572        let mask_bytes = u32::from(self.mask).serialize();
5573        let device_id_bytes = self.device_id.serialize();
5574        let feedback_id_bytes = self.feedback_id.serialize();
5575        let mut request0 = vec![
5576            major_opcode,
5577            CHANGE_FEEDBACK_CONTROL_REQUEST,
5578            0,
5579            0,
5580            mask_bytes[0],
5581            mask_bytes[1],
5582            mask_bytes[2],
5583            mask_bytes[3],
5584            device_id_bytes[0],
5585            feedback_id_bytes[0],
5586            0,
5587            0,
5588        ];
5589        let length_so_far = length_so_far + request0.len();
5590        let feedback_bytes = self.feedback.serialize();
5591        let length_so_far = length_so_far + feedback_bytes.len();
5592        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
5593        let length_so_far = length_so_far + padding0.len();
5594        assert_eq!(length_so_far % 4, 0);
5595        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
5596        request0[2..4].copy_from_slice(&length.to_ne_bytes());
5597        ([request0.into(), feedback_bytes.into(), padding0.into()], vec![])
5598    }
5599    /// Parse this request given its header, its body, and any fds that go along with it
5600    #[cfg(feature = "request-parsing")]
5601    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
5602        if header.minor_opcode != CHANGE_FEEDBACK_CONTROL_REQUEST {
5603            return Err(ParseError::InvalidValue);
5604        }
5605        let (mask, remaining) = u32::try_parse(value)?;
5606        let mask = mask.into();
5607        let (device_id, remaining) = u8::try_parse(remaining)?;
5608        let (feedback_id, remaining) = u8::try_parse(remaining)?;
5609        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
5610        let (feedback, remaining) = FeedbackCtl::try_parse(remaining)?;
5611        let _ = remaining;
5612        Ok(ChangeFeedbackControlRequest {
5613            mask,
5614            device_id,
5615            feedback_id,
5616            feedback,
5617        })
5618    }
5619}
5620impl Request for ChangeFeedbackControlRequest {
5621    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
5622
5623    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
5624        let (bufs, fds) = self.serialize(major_opcode);
5625        // Flatten the buffers into a single vector
5626        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
5627        (buf, fds)
5628    }
5629}
5630impl crate::x11_utils::VoidRequest for ChangeFeedbackControlRequest {
5631}
5632
5633/// Opcode for the GetDeviceKeyMapping request
5634pub const GET_DEVICE_KEY_MAPPING_REQUEST: u8 = 24;
5635#[derive(Clone, Copy, Default)]
5636#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5637#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5638pub struct GetDeviceKeyMappingRequest {
5639    pub device_id: u8,
5640    pub first_keycode: KeyCode,
5641    pub count: u8,
5642}
5643impl_debug_if_no_extra_traits!(GetDeviceKeyMappingRequest, "GetDeviceKeyMappingRequest");
5644impl GetDeviceKeyMappingRequest {
5645    /// Serialize this request into bytes for the provided connection
5646    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
5647        let length_so_far = 0;
5648        let device_id_bytes = self.device_id.serialize();
5649        let first_keycode_bytes = self.first_keycode.serialize();
5650        let count_bytes = self.count.serialize();
5651        let mut request0 = vec![
5652            major_opcode,
5653            GET_DEVICE_KEY_MAPPING_REQUEST,
5654            0,
5655            0,
5656            device_id_bytes[0],
5657            first_keycode_bytes[0],
5658            count_bytes[0],
5659            0,
5660        ];
5661        let length_so_far = length_so_far + request0.len();
5662        assert_eq!(length_so_far % 4, 0);
5663        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
5664        request0[2..4].copy_from_slice(&length.to_ne_bytes());
5665        ([request0.into()], vec![])
5666    }
5667    /// Parse this request given its header, its body, and any fds that go along with it
5668    #[cfg(feature = "request-parsing")]
5669    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
5670        if header.minor_opcode != GET_DEVICE_KEY_MAPPING_REQUEST {
5671            return Err(ParseError::InvalidValue);
5672        }
5673        let (device_id, remaining) = u8::try_parse(value)?;
5674        let (first_keycode, remaining) = KeyCode::try_parse(remaining)?;
5675        let (count, remaining) = u8::try_parse(remaining)?;
5676        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
5677        let _ = remaining;
5678        Ok(GetDeviceKeyMappingRequest {
5679            device_id,
5680            first_keycode,
5681            count,
5682        })
5683    }
5684}
5685impl Request for GetDeviceKeyMappingRequest {
5686    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
5687
5688    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
5689        let (bufs, fds) = self.serialize(major_opcode);
5690        // Flatten the buffers into a single vector
5691        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
5692        (buf, fds)
5693    }
5694}
5695impl crate::x11_utils::ReplyRequest for GetDeviceKeyMappingRequest {
5696    type Reply = GetDeviceKeyMappingReply;
5697}
5698
5699#[derive(Clone, Default)]
5700#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5701#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5702pub struct GetDeviceKeyMappingReply {
5703    pub xi_reply_type: u8,
5704    pub sequence: u16,
5705    pub keysyms_per_keycode: u8,
5706    pub keysyms: Vec<xproto::Keysym>,
5707}
5708impl_debug_if_no_extra_traits!(GetDeviceKeyMappingReply, "GetDeviceKeyMappingReply");
5709impl TryParse for GetDeviceKeyMappingReply {
5710    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
5711        let remaining = initial_value;
5712        let (response_type, remaining) = u8::try_parse(remaining)?;
5713        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
5714        let (sequence, remaining) = u16::try_parse(remaining)?;
5715        let (length, remaining) = u32::try_parse(remaining)?;
5716        let (keysyms_per_keycode, remaining) = u8::try_parse(remaining)?;
5717        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
5718        let (keysyms, remaining) = crate::x11_utils::parse_list::<xproto::Keysym>(remaining, length.try_to_usize()?)?;
5719        if response_type != 1 {
5720            return Err(ParseError::InvalidValue);
5721        }
5722        let result = GetDeviceKeyMappingReply { xi_reply_type, sequence, keysyms_per_keycode, keysyms };
5723        let _ = remaining;
5724        let remaining = initial_value.get(32 + length as usize * 4..)
5725            .ok_or(ParseError::InsufficientData)?;
5726        Ok((result, remaining))
5727    }
5728}
5729impl Serialize for GetDeviceKeyMappingReply {
5730    type Bytes = Vec<u8>;
5731    fn serialize(&self) -> Vec<u8> {
5732        let mut result = Vec::new();
5733        self.serialize_into(&mut result);
5734        result
5735    }
5736    fn serialize_into(&self, bytes: &mut Vec<u8>) {
5737        bytes.reserve(32);
5738        let response_type_bytes = &[1];
5739        bytes.push(response_type_bytes[0]);
5740        self.xi_reply_type.serialize_into(bytes);
5741        self.sequence.serialize_into(bytes);
5742        let length = u32::try_from(self.keysyms.len()).expect("`keysyms` has too many elements");
5743        length.serialize_into(bytes);
5744        self.keysyms_per_keycode.serialize_into(bytes);
5745        bytes.extend_from_slice(&[0; 23]);
5746        self.keysyms.serialize_into(bytes);
5747    }
5748}
5749impl GetDeviceKeyMappingReply {
5750    /// Get the value of the `length` field.
5751    ///
5752    /// The `length` field is used as the length field of the `keysyms` field.
5753    /// This function computes the field's value again based on the length of the list.
5754    ///
5755    /// # Panics
5756    ///
5757    /// Panics if the value cannot be represented in the target type. This
5758    /// cannot happen with values of the struct received from the X11 server.
5759    pub fn length(&self) -> u32 {
5760        self.keysyms.len()
5761            .try_into().unwrap()
5762    }
5763}
5764
5765/// Opcode for the ChangeDeviceKeyMapping request
5766pub const CHANGE_DEVICE_KEY_MAPPING_REQUEST: u8 = 25;
5767#[derive(Clone, Default)]
5768#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5769#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5770pub struct ChangeDeviceKeyMappingRequest<'input> {
5771    pub device_id: u8,
5772    pub first_keycode: KeyCode,
5773    pub keysyms_per_keycode: u8,
5774    pub keycode_count: u8,
5775    pub keysyms: Cow<'input, [xproto::Keysym]>,
5776}
5777impl_debug_if_no_extra_traits!(ChangeDeviceKeyMappingRequest<'_>, "ChangeDeviceKeyMappingRequest");
5778impl<'input> ChangeDeviceKeyMappingRequest<'input> {
5779    /// Serialize this request into bytes for the provided connection
5780    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
5781        let length_so_far = 0;
5782        let device_id_bytes = self.device_id.serialize();
5783        let first_keycode_bytes = self.first_keycode.serialize();
5784        let keysyms_per_keycode_bytes = self.keysyms_per_keycode.serialize();
5785        let keycode_count_bytes = self.keycode_count.serialize();
5786        let mut request0 = vec![
5787            major_opcode,
5788            CHANGE_DEVICE_KEY_MAPPING_REQUEST,
5789            0,
5790            0,
5791            device_id_bytes[0],
5792            first_keycode_bytes[0],
5793            keysyms_per_keycode_bytes[0],
5794            keycode_count_bytes[0],
5795        ];
5796        let length_so_far = length_so_far + request0.len();
5797        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");
5798        let keysyms_bytes = self.keysyms.serialize();
5799        let length_so_far = length_so_far + keysyms_bytes.len();
5800        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
5801        let length_so_far = length_so_far + padding0.len();
5802        assert_eq!(length_so_far % 4, 0);
5803        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
5804        request0[2..4].copy_from_slice(&length.to_ne_bytes());
5805        ([request0.into(), keysyms_bytes.into(), padding0.into()], vec![])
5806    }
5807    /// Parse this request given its header, its body, and any fds that go along with it
5808    #[cfg(feature = "request-parsing")]
5809    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
5810        if header.minor_opcode != CHANGE_DEVICE_KEY_MAPPING_REQUEST {
5811            return Err(ParseError::InvalidValue);
5812        }
5813        let (device_id, remaining) = u8::try_parse(value)?;
5814        let (first_keycode, remaining) = KeyCode::try_parse(remaining)?;
5815        let (keysyms_per_keycode, remaining) = u8::try_parse(remaining)?;
5816        let (keycode_count, remaining) = u8::try_parse(remaining)?;
5817        let (keysyms, remaining) = crate::x11_utils::parse_list::<xproto::Keysym>(remaining, u32::from(keycode_count).checked_mul(u32::from(keysyms_per_keycode)).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
5818        let _ = remaining;
5819        Ok(ChangeDeviceKeyMappingRequest {
5820            device_id,
5821            first_keycode,
5822            keysyms_per_keycode,
5823            keycode_count,
5824            keysyms: Cow::Owned(keysyms),
5825        })
5826    }
5827    /// Clone all borrowed data in this ChangeDeviceKeyMappingRequest.
5828    pub fn into_owned(self) -> ChangeDeviceKeyMappingRequest<'static> {
5829        ChangeDeviceKeyMappingRequest {
5830            device_id: self.device_id,
5831            first_keycode: self.first_keycode,
5832            keysyms_per_keycode: self.keysyms_per_keycode,
5833            keycode_count: self.keycode_count,
5834            keysyms: Cow::Owned(self.keysyms.into_owned()),
5835        }
5836    }
5837}
5838impl<'input> Request for ChangeDeviceKeyMappingRequest<'input> {
5839    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
5840
5841    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
5842        let (bufs, fds) = self.serialize(major_opcode);
5843        // Flatten the buffers into a single vector
5844        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
5845        (buf, fds)
5846    }
5847}
5848impl<'input> crate::x11_utils::VoidRequest for ChangeDeviceKeyMappingRequest<'input> {
5849}
5850
5851/// Opcode for the GetDeviceModifierMapping request
5852pub const GET_DEVICE_MODIFIER_MAPPING_REQUEST: u8 = 26;
5853#[derive(Clone, Copy, Default)]
5854#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5855#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5856pub struct GetDeviceModifierMappingRequest {
5857    pub device_id: u8,
5858}
5859impl_debug_if_no_extra_traits!(GetDeviceModifierMappingRequest, "GetDeviceModifierMappingRequest");
5860impl GetDeviceModifierMappingRequest {
5861    /// Serialize this request into bytes for the provided connection
5862    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
5863        let length_so_far = 0;
5864        let device_id_bytes = self.device_id.serialize();
5865        let mut request0 = vec![
5866            major_opcode,
5867            GET_DEVICE_MODIFIER_MAPPING_REQUEST,
5868            0,
5869            0,
5870            device_id_bytes[0],
5871            0,
5872            0,
5873            0,
5874        ];
5875        let length_so_far = length_so_far + request0.len();
5876        assert_eq!(length_so_far % 4, 0);
5877        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
5878        request0[2..4].copy_from_slice(&length.to_ne_bytes());
5879        ([request0.into()], vec![])
5880    }
5881    /// Parse this request given its header, its body, and any fds that go along with it
5882    #[cfg(feature = "request-parsing")]
5883    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
5884        if header.minor_opcode != GET_DEVICE_MODIFIER_MAPPING_REQUEST {
5885            return Err(ParseError::InvalidValue);
5886        }
5887        let (device_id, remaining) = u8::try_parse(value)?;
5888        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
5889        let _ = remaining;
5890        Ok(GetDeviceModifierMappingRequest {
5891            device_id,
5892        })
5893    }
5894}
5895impl Request for GetDeviceModifierMappingRequest {
5896    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
5897
5898    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
5899        let (bufs, fds) = self.serialize(major_opcode);
5900        // Flatten the buffers into a single vector
5901        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
5902        (buf, fds)
5903    }
5904}
5905impl crate::x11_utils::ReplyRequest for GetDeviceModifierMappingRequest {
5906    type Reply = GetDeviceModifierMappingReply;
5907}
5908
5909#[derive(Clone, Default)]
5910#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5911#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5912pub struct GetDeviceModifierMappingReply {
5913    pub xi_reply_type: u8,
5914    pub sequence: u16,
5915    pub length: u32,
5916    pub keymaps: Vec<u8>,
5917}
5918impl_debug_if_no_extra_traits!(GetDeviceModifierMappingReply, "GetDeviceModifierMappingReply");
5919impl TryParse for GetDeviceModifierMappingReply {
5920    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
5921        let remaining = initial_value;
5922        let (response_type, remaining) = u8::try_parse(remaining)?;
5923        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
5924        let (sequence, remaining) = u16::try_parse(remaining)?;
5925        let (length, remaining) = u32::try_parse(remaining)?;
5926        let (keycodes_per_modifier, remaining) = u8::try_parse(remaining)?;
5927        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
5928        let (keymaps, remaining) = crate::x11_utils::parse_u8_list(remaining, u32::from(keycodes_per_modifier).checked_mul(8u32).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
5929        let keymaps = keymaps.to_vec();
5930        if response_type != 1 {
5931            return Err(ParseError::InvalidValue);
5932        }
5933        let result = GetDeviceModifierMappingReply { xi_reply_type, sequence, length, keymaps };
5934        let _ = remaining;
5935        let remaining = initial_value.get(32 + length as usize * 4..)
5936            .ok_or(ParseError::InsufficientData)?;
5937        Ok((result, remaining))
5938    }
5939}
5940impl Serialize for GetDeviceModifierMappingReply {
5941    type Bytes = Vec<u8>;
5942    fn serialize(&self) -> Vec<u8> {
5943        let mut result = Vec::new();
5944        self.serialize_into(&mut result);
5945        result
5946    }
5947    fn serialize_into(&self, bytes: &mut Vec<u8>) {
5948        bytes.reserve(32);
5949        let response_type_bytes = &[1];
5950        bytes.push(response_type_bytes[0]);
5951        self.xi_reply_type.serialize_into(bytes);
5952        self.sequence.serialize_into(bytes);
5953        self.length.serialize_into(bytes);
5954        assert_eq!(self.keymaps.len() % 8, 0, "`keymaps` has an incorrect length, must be a multiple of 8");
5955        let keycodes_per_modifier = u8::try_from(self.keymaps.len() / 8).expect("`keymaps` has too many elements");
5956        keycodes_per_modifier.serialize_into(bytes);
5957        bytes.extend_from_slice(&[0; 23]);
5958        bytes.extend_from_slice(&self.keymaps);
5959    }
5960}
5961impl GetDeviceModifierMappingReply {
5962    /// Get the value of the `keycodes_per_modifier` field.
5963    ///
5964    /// The `keycodes_per_modifier` field is used as the length field of the `keymaps` field.
5965    /// This function computes the field's value again based on the length of the list.
5966    ///
5967    /// # Panics
5968    ///
5969    /// Panics if the value cannot be represented in the target type. This
5970    /// cannot happen with values of the struct received from the X11 server.
5971    pub fn keycodes_per_modifier(&self) -> u8 {
5972        self.keymaps.len()
5973            .checked_div(8).unwrap()
5974            .try_into().unwrap()
5975    }
5976}
5977
5978/// Opcode for the SetDeviceModifierMapping request
5979pub const SET_DEVICE_MODIFIER_MAPPING_REQUEST: u8 = 27;
5980#[derive(Clone, Default)]
5981#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
5982#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
5983pub struct SetDeviceModifierMappingRequest<'input> {
5984    pub device_id: u8,
5985    pub keymaps: Cow<'input, [u8]>,
5986}
5987impl_debug_if_no_extra_traits!(SetDeviceModifierMappingRequest<'_>, "SetDeviceModifierMappingRequest");
5988impl<'input> SetDeviceModifierMappingRequest<'input> {
5989    /// Serialize this request into bytes for the provided connection
5990    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
5991        let length_so_far = 0;
5992        let device_id_bytes = self.device_id.serialize();
5993        assert_eq!(self.keymaps.len() % 8, 0, "`keymaps` has an incorrect length, must be a multiple of 8");
5994        let keycodes_per_modifier = u8::try_from(self.keymaps.len() / 8).expect("`keymaps` has too many elements");
5995        let keycodes_per_modifier_bytes = keycodes_per_modifier.serialize();
5996        let mut request0 = vec![
5997            major_opcode,
5998            SET_DEVICE_MODIFIER_MAPPING_REQUEST,
5999            0,
6000            0,
6001            device_id_bytes[0],
6002            keycodes_per_modifier_bytes[0],
6003            0,
6004            0,
6005        ];
6006        let length_so_far = length_so_far + request0.len();
6007        let length_so_far = length_so_far + self.keymaps.len();
6008        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
6009        let length_so_far = length_so_far + padding0.len();
6010        assert_eq!(length_so_far % 4, 0);
6011        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
6012        request0[2..4].copy_from_slice(&length.to_ne_bytes());
6013        ([request0.into(), self.keymaps, padding0.into()], vec![])
6014    }
6015    /// Parse this request given its header, its body, and any fds that go along with it
6016    #[cfg(feature = "request-parsing")]
6017    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
6018        if header.minor_opcode != SET_DEVICE_MODIFIER_MAPPING_REQUEST {
6019            return Err(ParseError::InvalidValue);
6020        }
6021        let (device_id, remaining) = u8::try_parse(value)?;
6022        let (keycodes_per_modifier, remaining) = u8::try_parse(remaining)?;
6023        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
6024        let (keymaps, remaining) = crate::x11_utils::parse_u8_list(remaining, u32::from(keycodes_per_modifier).checked_mul(8u32).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
6025        let _ = remaining;
6026        Ok(SetDeviceModifierMappingRequest {
6027            device_id,
6028            keymaps: Cow::Borrowed(keymaps),
6029        })
6030    }
6031    /// Clone all borrowed data in this SetDeviceModifierMappingRequest.
6032    pub fn into_owned(self) -> SetDeviceModifierMappingRequest<'static> {
6033        SetDeviceModifierMappingRequest {
6034            device_id: self.device_id,
6035            keymaps: Cow::Owned(self.keymaps.into_owned()),
6036        }
6037    }
6038}
6039impl<'input> Request for SetDeviceModifierMappingRequest<'input> {
6040    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
6041
6042    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
6043        let (bufs, fds) = self.serialize(major_opcode);
6044        // Flatten the buffers into a single vector
6045        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
6046        (buf, fds)
6047    }
6048}
6049impl<'input> crate::x11_utils::ReplyRequest for SetDeviceModifierMappingRequest<'input> {
6050    type Reply = SetDeviceModifierMappingReply;
6051}
6052
6053#[derive(Clone, Copy, Default)]
6054#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6055#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6056pub struct SetDeviceModifierMappingReply {
6057    pub xi_reply_type: u8,
6058    pub sequence: u16,
6059    pub length: u32,
6060    pub status: xproto::MappingStatus,
6061}
6062impl_debug_if_no_extra_traits!(SetDeviceModifierMappingReply, "SetDeviceModifierMappingReply");
6063impl TryParse for SetDeviceModifierMappingReply {
6064    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
6065        let remaining = initial_value;
6066        let (response_type, remaining) = u8::try_parse(remaining)?;
6067        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
6068        let (sequence, remaining) = u16::try_parse(remaining)?;
6069        let (length, remaining) = u32::try_parse(remaining)?;
6070        let (status, remaining) = u8::try_parse(remaining)?;
6071        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
6072        if response_type != 1 {
6073            return Err(ParseError::InvalidValue);
6074        }
6075        let status = status.into();
6076        let result = SetDeviceModifierMappingReply { xi_reply_type, sequence, length, status };
6077        let _ = remaining;
6078        let remaining = initial_value.get(32 + length as usize * 4..)
6079            .ok_or(ParseError::InsufficientData)?;
6080        Ok((result, remaining))
6081    }
6082}
6083impl Serialize for SetDeviceModifierMappingReply {
6084    type Bytes = [u8; 32];
6085    fn serialize(&self) -> [u8; 32] {
6086        let response_type_bytes = &[1];
6087        let xi_reply_type_bytes = self.xi_reply_type.serialize();
6088        let sequence_bytes = self.sequence.serialize();
6089        let length_bytes = self.length.serialize();
6090        let status_bytes = u8::from(self.status).serialize();
6091        [
6092            response_type_bytes[0],
6093            xi_reply_type_bytes[0],
6094            sequence_bytes[0],
6095            sequence_bytes[1],
6096            length_bytes[0],
6097            length_bytes[1],
6098            length_bytes[2],
6099            length_bytes[3],
6100            status_bytes[0],
6101            0,
6102            0,
6103            0,
6104            0,
6105            0,
6106            0,
6107            0,
6108            0,
6109            0,
6110            0,
6111            0,
6112            0,
6113            0,
6114            0,
6115            0,
6116            0,
6117            0,
6118            0,
6119            0,
6120            0,
6121            0,
6122            0,
6123            0,
6124        ]
6125    }
6126    fn serialize_into(&self, bytes: &mut Vec<u8>) {
6127        bytes.reserve(32);
6128        let response_type_bytes = &[1];
6129        bytes.push(response_type_bytes[0]);
6130        self.xi_reply_type.serialize_into(bytes);
6131        self.sequence.serialize_into(bytes);
6132        self.length.serialize_into(bytes);
6133        u8::from(self.status).serialize_into(bytes);
6134        bytes.extend_from_slice(&[0; 23]);
6135    }
6136}
6137
6138/// Opcode for the GetDeviceButtonMapping request
6139pub const GET_DEVICE_BUTTON_MAPPING_REQUEST: u8 = 28;
6140#[derive(Clone, Copy, Default)]
6141#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6142#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6143pub struct GetDeviceButtonMappingRequest {
6144    pub device_id: u8,
6145}
6146impl_debug_if_no_extra_traits!(GetDeviceButtonMappingRequest, "GetDeviceButtonMappingRequest");
6147impl GetDeviceButtonMappingRequest {
6148    /// Serialize this request into bytes for the provided connection
6149    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
6150        let length_so_far = 0;
6151        let device_id_bytes = self.device_id.serialize();
6152        let mut request0 = vec![
6153            major_opcode,
6154            GET_DEVICE_BUTTON_MAPPING_REQUEST,
6155            0,
6156            0,
6157            device_id_bytes[0],
6158            0,
6159            0,
6160            0,
6161        ];
6162        let length_so_far = length_so_far + request0.len();
6163        assert_eq!(length_so_far % 4, 0);
6164        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
6165        request0[2..4].copy_from_slice(&length.to_ne_bytes());
6166        ([request0.into()], vec![])
6167    }
6168    /// Parse this request given its header, its body, and any fds that go along with it
6169    #[cfg(feature = "request-parsing")]
6170    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
6171        if header.minor_opcode != GET_DEVICE_BUTTON_MAPPING_REQUEST {
6172            return Err(ParseError::InvalidValue);
6173        }
6174        let (device_id, remaining) = u8::try_parse(value)?;
6175        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
6176        let _ = remaining;
6177        Ok(GetDeviceButtonMappingRequest {
6178            device_id,
6179        })
6180    }
6181}
6182impl Request for GetDeviceButtonMappingRequest {
6183    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
6184
6185    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
6186        let (bufs, fds) = self.serialize(major_opcode);
6187        // Flatten the buffers into a single vector
6188        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
6189        (buf, fds)
6190    }
6191}
6192impl crate::x11_utils::ReplyRequest for GetDeviceButtonMappingRequest {
6193    type Reply = GetDeviceButtonMappingReply;
6194}
6195
6196#[derive(Clone, Default)]
6197#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6198#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6199pub struct GetDeviceButtonMappingReply {
6200    pub xi_reply_type: u8,
6201    pub sequence: u16,
6202    pub length: u32,
6203    pub map: Vec<u8>,
6204}
6205impl_debug_if_no_extra_traits!(GetDeviceButtonMappingReply, "GetDeviceButtonMappingReply");
6206impl TryParse for GetDeviceButtonMappingReply {
6207    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
6208        let remaining = initial_value;
6209        let value = remaining;
6210        let (response_type, remaining) = u8::try_parse(remaining)?;
6211        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
6212        let (sequence, remaining) = u16::try_parse(remaining)?;
6213        let (length, remaining) = u32::try_parse(remaining)?;
6214        let (map_size, remaining) = u8::try_parse(remaining)?;
6215        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
6216        let (map, remaining) = crate::x11_utils::parse_u8_list(remaining, map_size.try_to_usize()?)?;
6217        let map = map.to_vec();
6218        // Align offset to multiple of 4
6219        let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
6220        let misalignment = (4 - (offset % 4)) % 4;
6221        let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
6222        if response_type != 1 {
6223            return Err(ParseError::InvalidValue);
6224        }
6225        let result = GetDeviceButtonMappingReply { xi_reply_type, sequence, length, map };
6226        let _ = remaining;
6227        let remaining = initial_value.get(32 + length as usize * 4..)
6228            .ok_or(ParseError::InsufficientData)?;
6229        Ok((result, remaining))
6230    }
6231}
6232impl Serialize for GetDeviceButtonMappingReply {
6233    type Bytes = Vec<u8>;
6234    fn serialize(&self) -> Vec<u8> {
6235        let mut result = Vec::new();
6236        self.serialize_into(&mut result);
6237        result
6238    }
6239    fn serialize_into(&self, bytes: &mut Vec<u8>) {
6240        bytes.reserve(32);
6241        let response_type_bytes = &[1];
6242        bytes.push(response_type_bytes[0]);
6243        self.xi_reply_type.serialize_into(bytes);
6244        self.sequence.serialize_into(bytes);
6245        self.length.serialize_into(bytes);
6246        let map_size = u8::try_from(self.map.len()).expect("`map` has too many elements");
6247        map_size.serialize_into(bytes);
6248        bytes.extend_from_slice(&[0; 23]);
6249        bytes.extend_from_slice(&self.map);
6250        bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
6251    }
6252}
6253impl GetDeviceButtonMappingReply {
6254    /// Get the value of the `map_size` field.
6255    ///
6256    /// The `map_size` field is used as the length field of the `map` field.
6257    /// This function computes the field's value again based on the length of the list.
6258    ///
6259    /// # Panics
6260    ///
6261    /// Panics if the value cannot be represented in the target type. This
6262    /// cannot happen with values of the struct received from the X11 server.
6263    pub fn map_size(&self) -> u8 {
6264        self.map.len()
6265            .try_into().unwrap()
6266    }
6267}
6268
6269/// Opcode for the SetDeviceButtonMapping request
6270pub const SET_DEVICE_BUTTON_MAPPING_REQUEST: u8 = 29;
6271#[derive(Clone, Default)]
6272#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6273#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6274pub struct SetDeviceButtonMappingRequest<'input> {
6275    pub device_id: u8,
6276    pub map: Cow<'input, [u8]>,
6277}
6278impl_debug_if_no_extra_traits!(SetDeviceButtonMappingRequest<'_>, "SetDeviceButtonMappingRequest");
6279impl<'input> SetDeviceButtonMappingRequest<'input> {
6280    /// Serialize this request into bytes for the provided connection
6281    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
6282        let length_so_far = 0;
6283        let device_id_bytes = self.device_id.serialize();
6284        let map_size = u8::try_from(self.map.len()).expect("`map` has too many elements");
6285        let map_size_bytes = map_size.serialize();
6286        let mut request0 = vec![
6287            major_opcode,
6288            SET_DEVICE_BUTTON_MAPPING_REQUEST,
6289            0,
6290            0,
6291            device_id_bytes[0],
6292            map_size_bytes[0],
6293            0,
6294            0,
6295        ];
6296        let length_so_far = length_so_far + request0.len();
6297        let length_so_far = length_so_far + self.map.len();
6298        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
6299        let length_so_far = length_so_far + padding0.len();
6300        assert_eq!(length_so_far % 4, 0);
6301        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
6302        request0[2..4].copy_from_slice(&length.to_ne_bytes());
6303        ([request0.into(), self.map, padding0.into()], vec![])
6304    }
6305    /// Parse this request given its header, its body, and any fds that go along with it
6306    #[cfg(feature = "request-parsing")]
6307    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
6308        if header.minor_opcode != SET_DEVICE_BUTTON_MAPPING_REQUEST {
6309            return Err(ParseError::InvalidValue);
6310        }
6311        let (device_id, remaining) = u8::try_parse(value)?;
6312        let (map_size, remaining) = u8::try_parse(remaining)?;
6313        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
6314        let (map, remaining) = crate::x11_utils::parse_u8_list(remaining, map_size.try_to_usize()?)?;
6315        let _ = remaining;
6316        Ok(SetDeviceButtonMappingRequest {
6317            device_id,
6318            map: Cow::Borrowed(map),
6319        })
6320    }
6321    /// Clone all borrowed data in this SetDeviceButtonMappingRequest.
6322    pub fn into_owned(self) -> SetDeviceButtonMappingRequest<'static> {
6323        SetDeviceButtonMappingRequest {
6324            device_id: self.device_id,
6325            map: Cow::Owned(self.map.into_owned()),
6326        }
6327    }
6328}
6329impl<'input> Request for SetDeviceButtonMappingRequest<'input> {
6330    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
6331
6332    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
6333        let (bufs, fds) = self.serialize(major_opcode);
6334        // Flatten the buffers into a single vector
6335        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
6336        (buf, fds)
6337    }
6338}
6339impl<'input> crate::x11_utils::ReplyRequest for SetDeviceButtonMappingRequest<'input> {
6340    type Reply = SetDeviceButtonMappingReply;
6341}
6342
6343#[derive(Clone, Copy, Default)]
6344#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6345#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6346pub struct SetDeviceButtonMappingReply {
6347    pub xi_reply_type: u8,
6348    pub sequence: u16,
6349    pub length: u32,
6350    pub status: xproto::MappingStatus,
6351}
6352impl_debug_if_no_extra_traits!(SetDeviceButtonMappingReply, "SetDeviceButtonMappingReply");
6353impl TryParse for SetDeviceButtonMappingReply {
6354    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
6355        let remaining = initial_value;
6356        let (response_type, remaining) = u8::try_parse(remaining)?;
6357        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
6358        let (sequence, remaining) = u16::try_parse(remaining)?;
6359        let (length, remaining) = u32::try_parse(remaining)?;
6360        let (status, remaining) = u8::try_parse(remaining)?;
6361        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
6362        if response_type != 1 {
6363            return Err(ParseError::InvalidValue);
6364        }
6365        let status = status.into();
6366        let result = SetDeviceButtonMappingReply { xi_reply_type, sequence, length, status };
6367        let _ = remaining;
6368        let remaining = initial_value.get(32 + length as usize * 4..)
6369            .ok_or(ParseError::InsufficientData)?;
6370        Ok((result, remaining))
6371    }
6372}
6373impl Serialize for SetDeviceButtonMappingReply {
6374    type Bytes = [u8; 32];
6375    fn serialize(&self) -> [u8; 32] {
6376        let response_type_bytes = &[1];
6377        let xi_reply_type_bytes = self.xi_reply_type.serialize();
6378        let sequence_bytes = self.sequence.serialize();
6379        let length_bytes = self.length.serialize();
6380        let status_bytes = u8::from(self.status).serialize();
6381        [
6382            response_type_bytes[0],
6383            xi_reply_type_bytes[0],
6384            sequence_bytes[0],
6385            sequence_bytes[1],
6386            length_bytes[0],
6387            length_bytes[1],
6388            length_bytes[2],
6389            length_bytes[3],
6390            status_bytes[0],
6391            0,
6392            0,
6393            0,
6394            0,
6395            0,
6396            0,
6397            0,
6398            0,
6399            0,
6400            0,
6401            0,
6402            0,
6403            0,
6404            0,
6405            0,
6406            0,
6407            0,
6408            0,
6409            0,
6410            0,
6411            0,
6412            0,
6413            0,
6414        ]
6415    }
6416    fn serialize_into(&self, bytes: &mut Vec<u8>) {
6417        bytes.reserve(32);
6418        let response_type_bytes = &[1];
6419        bytes.push(response_type_bytes[0]);
6420        self.xi_reply_type.serialize_into(bytes);
6421        self.sequence.serialize_into(bytes);
6422        self.length.serialize_into(bytes);
6423        u8::from(self.status).serialize_into(bytes);
6424        bytes.extend_from_slice(&[0; 23]);
6425    }
6426}
6427
6428#[derive(Clone, Copy, Default)]
6429#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6430#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6431pub struct KeyState {
6432    pub class_id: InputClass,
6433    pub len: u8,
6434    pub num_keys: u8,
6435    pub keys: [u8; 32],
6436}
6437impl_debug_if_no_extra_traits!(KeyState, "KeyState");
6438impl TryParse for KeyState {
6439    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
6440        let (class_id, remaining) = u8::try_parse(remaining)?;
6441        let (len, remaining) = u8::try_parse(remaining)?;
6442        let (num_keys, remaining) = u8::try_parse(remaining)?;
6443        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
6444        let (keys, remaining) = crate::x11_utils::parse_u8_array::<32>(remaining)?;
6445        let class_id = class_id.into();
6446        let result = KeyState { class_id, len, num_keys, keys };
6447        Ok((result, remaining))
6448    }
6449}
6450impl Serialize for KeyState {
6451    type Bytes = [u8; 36];
6452    fn serialize(&self) -> [u8; 36] {
6453        let class_id_bytes = u8::from(self.class_id).serialize();
6454        let len_bytes = self.len.serialize();
6455        let num_keys_bytes = self.num_keys.serialize();
6456        [
6457            class_id_bytes[0],
6458            len_bytes[0],
6459            num_keys_bytes[0],
6460            0,
6461            self.keys[0],
6462            self.keys[1],
6463            self.keys[2],
6464            self.keys[3],
6465            self.keys[4],
6466            self.keys[5],
6467            self.keys[6],
6468            self.keys[7],
6469            self.keys[8],
6470            self.keys[9],
6471            self.keys[10],
6472            self.keys[11],
6473            self.keys[12],
6474            self.keys[13],
6475            self.keys[14],
6476            self.keys[15],
6477            self.keys[16],
6478            self.keys[17],
6479            self.keys[18],
6480            self.keys[19],
6481            self.keys[20],
6482            self.keys[21],
6483            self.keys[22],
6484            self.keys[23],
6485            self.keys[24],
6486            self.keys[25],
6487            self.keys[26],
6488            self.keys[27],
6489            self.keys[28],
6490            self.keys[29],
6491            self.keys[30],
6492            self.keys[31],
6493        ]
6494    }
6495    fn serialize_into(&self, bytes: &mut Vec<u8>) {
6496        bytes.reserve(36);
6497        u8::from(self.class_id).serialize_into(bytes);
6498        self.len.serialize_into(bytes);
6499        self.num_keys.serialize_into(bytes);
6500        bytes.extend_from_slice(&[0; 1]);
6501        bytes.extend_from_slice(&self.keys);
6502    }
6503}
6504
6505#[derive(Clone, Copy, Default)]
6506#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6507#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6508pub struct ButtonState {
6509    pub class_id: InputClass,
6510    pub len: u8,
6511    pub num_buttons: u8,
6512    pub buttons: [u8; 32],
6513}
6514impl_debug_if_no_extra_traits!(ButtonState, "ButtonState");
6515impl TryParse for ButtonState {
6516    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
6517        let (class_id, remaining) = u8::try_parse(remaining)?;
6518        let (len, remaining) = u8::try_parse(remaining)?;
6519        let (num_buttons, remaining) = u8::try_parse(remaining)?;
6520        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
6521        let (buttons, remaining) = crate::x11_utils::parse_u8_array::<32>(remaining)?;
6522        let class_id = class_id.into();
6523        let result = ButtonState { class_id, len, num_buttons, buttons };
6524        Ok((result, remaining))
6525    }
6526}
6527impl Serialize for ButtonState {
6528    type Bytes = [u8; 36];
6529    fn serialize(&self) -> [u8; 36] {
6530        let class_id_bytes = u8::from(self.class_id).serialize();
6531        let len_bytes = self.len.serialize();
6532        let num_buttons_bytes = self.num_buttons.serialize();
6533        [
6534            class_id_bytes[0],
6535            len_bytes[0],
6536            num_buttons_bytes[0],
6537            0,
6538            self.buttons[0],
6539            self.buttons[1],
6540            self.buttons[2],
6541            self.buttons[3],
6542            self.buttons[4],
6543            self.buttons[5],
6544            self.buttons[6],
6545            self.buttons[7],
6546            self.buttons[8],
6547            self.buttons[9],
6548            self.buttons[10],
6549            self.buttons[11],
6550            self.buttons[12],
6551            self.buttons[13],
6552            self.buttons[14],
6553            self.buttons[15],
6554            self.buttons[16],
6555            self.buttons[17],
6556            self.buttons[18],
6557            self.buttons[19],
6558            self.buttons[20],
6559            self.buttons[21],
6560            self.buttons[22],
6561            self.buttons[23],
6562            self.buttons[24],
6563            self.buttons[25],
6564            self.buttons[26],
6565            self.buttons[27],
6566            self.buttons[28],
6567            self.buttons[29],
6568            self.buttons[30],
6569            self.buttons[31],
6570        ]
6571    }
6572    fn serialize_into(&self, bytes: &mut Vec<u8>) {
6573        bytes.reserve(36);
6574        u8::from(self.class_id).serialize_into(bytes);
6575        self.len.serialize_into(bytes);
6576        self.num_buttons.serialize_into(bytes);
6577        bytes.extend_from_slice(&[0; 1]);
6578        bytes.extend_from_slice(&self.buttons);
6579    }
6580}
6581
6582#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
6583#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6584pub struct ValuatorStateModeMask(u8);
6585impl ValuatorStateModeMask {
6586    pub const DEVICE_MODE_ABSOLUTE: Self = Self(1 << 0);
6587    pub const OUT_OF_PROXIMITY: Self = Self(1 << 1);
6588}
6589impl From<ValuatorStateModeMask> for u8 {
6590    #[inline]
6591    fn from(input: ValuatorStateModeMask) -> Self {
6592        input.0
6593    }
6594}
6595impl From<ValuatorStateModeMask> for Option<u8> {
6596    #[inline]
6597    fn from(input: ValuatorStateModeMask) -> Self {
6598        Some(input.0)
6599    }
6600}
6601impl From<ValuatorStateModeMask> for u16 {
6602    #[inline]
6603    fn from(input: ValuatorStateModeMask) -> Self {
6604        u16::from(input.0)
6605    }
6606}
6607impl From<ValuatorStateModeMask> for Option<u16> {
6608    #[inline]
6609    fn from(input: ValuatorStateModeMask) -> Self {
6610        Some(u16::from(input.0))
6611    }
6612}
6613impl From<ValuatorStateModeMask> for u32 {
6614    #[inline]
6615    fn from(input: ValuatorStateModeMask) -> Self {
6616        u32::from(input.0)
6617    }
6618}
6619impl From<ValuatorStateModeMask> for Option<u32> {
6620    #[inline]
6621    fn from(input: ValuatorStateModeMask) -> Self {
6622        Some(u32::from(input.0))
6623    }
6624}
6625impl From<u8> for ValuatorStateModeMask {
6626    #[inline]
6627    fn from(value: u8) -> Self {
6628        Self(value)
6629    }
6630}
6631impl core::fmt::Debug for ValuatorStateModeMask  {
6632    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
6633        let variants = [
6634            (Self::DEVICE_MODE_ABSOLUTE.0.into(), "DEVICE_MODE_ABSOLUTE", "DeviceModeAbsolute"),
6635            (Self::OUT_OF_PROXIMITY.0.into(), "OUT_OF_PROXIMITY", "OutOfProximity"),
6636        ];
6637        pretty_print_bitmask(fmt, self.0.into(), &variants)
6638    }
6639}
6640bitmask_binop!(ValuatorStateModeMask, u8);
6641
6642#[derive(Clone, Default)]
6643#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6644#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6645pub struct ValuatorState {
6646    pub class_id: InputClass,
6647    pub len: u8,
6648    pub mode: ValuatorStateModeMask,
6649    pub valuators: Vec<i32>,
6650}
6651impl_debug_if_no_extra_traits!(ValuatorState, "ValuatorState");
6652impl TryParse for ValuatorState {
6653    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
6654        let (class_id, remaining) = u8::try_parse(remaining)?;
6655        let (len, remaining) = u8::try_parse(remaining)?;
6656        let (num_valuators, remaining) = u8::try_parse(remaining)?;
6657        let (mode, remaining) = u8::try_parse(remaining)?;
6658        let (valuators, remaining) = crate::x11_utils::parse_list::<i32>(remaining, num_valuators.try_to_usize()?)?;
6659        let class_id = class_id.into();
6660        let mode = mode.into();
6661        let result = ValuatorState { class_id, len, mode, valuators };
6662        Ok((result, remaining))
6663    }
6664}
6665impl Serialize for ValuatorState {
6666    type Bytes = Vec<u8>;
6667    fn serialize(&self) -> Vec<u8> {
6668        let mut result = Vec::new();
6669        self.serialize_into(&mut result);
6670        result
6671    }
6672    fn serialize_into(&self, bytes: &mut Vec<u8>) {
6673        bytes.reserve(4);
6674        u8::from(self.class_id).serialize_into(bytes);
6675        self.len.serialize_into(bytes);
6676        let num_valuators = u8::try_from(self.valuators.len()).expect("`valuators` has too many elements");
6677        num_valuators.serialize_into(bytes);
6678        u8::from(self.mode).serialize_into(bytes);
6679        self.valuators.serialize_into(bytes);
6680    }
6681}
6682impl ValuatorState {
6683    /// Get the value of the `num_valuators` field.
6684    ///
6685    /// The `num_valuators` field is used as the length field of the `valuators` field.
6686    /// This function computes the field's value again based on the length of the list.
6687    ///
6688    /// # Panics
6689    ///
6690    /// Panics if the value cannot be represented in the target type. This
6691    /// cannot happen with values of the struct received from the X11 server.
6692    pub fn num_valuators(&self) -> u8 {
6693        self.valuators.len()
6694            .try_into().unwrap()
6695    }
6696}
6697
6698#[derive(Clone, Copy)]
6699#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6700#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6701pub struct InputStateDataKey {
6702    pub num_keys: u8,
6703    pub keys: [u8; 32],
6704}
6705impl_debug_if_no_extra_traits!(InputStateDataKey, "InputStateDataKey");
6706impl TryParse for InputStateDataKey {
6707    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
6708        let (num_keys, remaining) = u8::try_parse(remaining)?;
6709        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
6710        let (keys, remaining) = crate::x11_utils::parse_u8_array::<32>(remaining)?;
6711        let result = InputStateDataKey { num_keys, keys };
6712        Ok((result, remaining))
6713    }
6714}
6715impl Serialize for InputStateDataKey {
6716    type Bytes = [u8; 34];
6717    fn serialize(&self) -> [u8; 34] {
6718        let num_keys_bytes = self.num_keys.serialize();
6719        [
6720            num_keys_bytes[0],
6721            0,
6722            self.keys[0],
6723            self.keys[1],
6724            self.keys[2],
6725            self.keys[3],
6726            self.keys[4],
6727            self.keys[5],
6728            self.keys[6],
6729            self.keys[7],
6730            self.keys[8],
6731            self.keys[9],
6732            self.keys[10],
6733            self.keys[11],
6734            self.keys[12],
6735            self.keys[13],
6736            self.keys[14],
6737            self.keys[15],
6738            self.keys[16],
6739            self.keys[17],
6740            self.keys[18],
6741            self.keys[19],
6742            self.keys[20],
6743            self.keys[21],
6744            self.keys[22],
6745            self.keys[23],
6746            self.keys[24],
6747            self.keys[25],
6748            self.keys[26],
6749            self.keys[27],
6750            self.keys[28],
6751            self.keys[29],
6752            self.keys[30],
6753            self.keys[31],
6754        ]
6755    }
6756    fn serialize_into(&self, bytes: &mut Vec<u8>) {
6757        bytes.reserve(34);
6758        self.num_keys.serialize_into(bytes);
6759        bytes.extend_from_slice(&[0; 1]);
6760        bytes.extend_from_slice(&self.keys);
6761    }
6762}
6763#[derive(Clone, Copy)]
6764#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6765#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6766pub struct InputStateDataButton {
6767    pub num_buttons: u8,
6768    pub buttons: [u8; 32],
6769}
6770impl_debug_if_no_extra_traits!(InputStateDataButton, "InputStateDataButton");
6771impl TryParse for InputStateDataButton {
6772    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
6773        let (num_buttons, remaining) = u8::try_parse(remaining)?;
6774        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
6775        let (buttons, remaining) = crate::x11_utils::parse_u8_array::<32>(remaining)?;
6776        let result = InputStateDataButton { num_buttons, buttons };
6777        Ok((result, remaining))
6778    }
6779}
6780impl Serialize for InputStateDataButton {
6781    type Bytes = [u8; 34];
6782    fn serialize(&self) -> [u8; 34] {
6783        let num_buttons_bytes = self.num_buttons.serialize();
6784        [
6785            num_buttons_bytes[0],
6786            0,
6787            self.buttons[0],
6788            self.buttons[1],
6789            self.buttons[2],
6790            self.buttons[3],
6791            self.buttons[4],
6792            self.buttons[5],
6793            self.buttons[6],
6794            self.buttons[7],
6795            self.buttons[8],
6796            self.buttons[9],
6797            self.buttons[10],
6798            self.buttons[11],
6799            self.buttons[12],
6800            self.buttons[13],
6801            self.buttons[14],
6802            self.buttons[15],
6803            self.buttons[16],
6804            self.buttons[17],
6805            self.buttons[18],
6806            self.buttons[19],
6807            self.buttons[20],
6808            self.buttons[21],
6809            self.buttons[22],
6810            self.buttons[23],
6811            self.buttons[24],
6812            self.buttons[25],
6813            self.buttons[26],
6814            self.buttons[27],
6815            self.buttons[28],
6816            self.buttons[29],
6817            self.buttons[30],
6818            self.buttons[31],
6819        ]
6820    }
6821    fn serialize_into(&self, bytes: &mut Vec<u8>) {
6822        bytes.reserve(34);
6823        self.num_buttons.serialize_into(bytes);
6824        bytes.extend_from_slice(&[0; 1]);
6825        bytes.extend_from_slice(&self.buttons);
6826    }
6827}
6828#[derive(Clone)]
6829#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6830#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6831pub struct InputStateDataValuator {
6832    pub mode: ValuatorStateModeMask,
6833    pub valuators: Vec<i32>,
6834}
6835impl_debug_if_no_extra_traits!(InputStateDataValuator, "InputStateDataValuator");
6836impl TryParse for InputStateDataValuator {
6837    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
6838        let (num_valuators, remaining) = u8::try_parse(remaining)?;
6839        let (mode, remaining) = u8::try_parse(remaining)?;
6840        let (valuators, remaining) = crate::x11_utils::parse_list::<i32>(remaining, num_valuators.try_to_usize()?)?;
6841        let mode = mode.into();
6842        let result = InputStateDataValuator { mode, valuators };
6843        Ok((result, remaining))
6844    }
6845}
6846impl Serialize for InputStateDataValuator {
6847    type Bytes = Vec<u8>;
6848    fn serialize(&self) -> Vec<u8> {
6849        let mut result = Vec::new();
6850        self.serialize_into(&mut result);
6851        result
6852    }
6853    fn serialize_into(&self, bytes: &mut Vec<u8>) {
6854        bytes.reserve(2);
6855        let num_valuators = u8::try_from(self.valuators.len()).expect("`valuators` has too many elements");
6856        num_valuators.serialize_into(bytes);
6857        u8::from(self.mode).serialize_into(bytes);
6858        self.valuators.serialize_into(bytes);
6859    }
6860}
6861impl InputStateDataValuator {
6862    /// Get the value of the `num_valuators` field.
6863    ///
6864    /// The `num_valuators` field is used as the length field of the `valuators` field.
6865    /// This function computes the field's value again based on the length of the list.
6866    ///
6867    /// # Panics
6868    ///
6869    /// Panics if the value cannot be represented in the target type. This
6870    /// cannot happen with values of the struct received from the X11 server.
6871    pub fn num_valuators(&self) -> u8 {
6872        self.valuators.len()
6873            .try_into().unwrap()
6874    }
6875}
6876#[derive(Clone)]
6877#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6878#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6879pub enum InputStateData {
6880    Key(InputStateDataKey),
6881    Button(InputStateDataButton),
6882    Valuator(InputStateDataValuator),
6883    /// This variant is returned when the server sends a discriminant
6884    /// value that does not match any of the defined by the protocol.
6885    ///
6886    /// Usually, this should be considered a parsing error, but there
6887    /// are some cases where the server violates the protocol.
6888    ///
6889    /// Trying to use `serialize` or `serialize_into` with this variant
6890    /// will raise a panic.
6891    InvalidValue(u8),
6892}
6893impl_debug_if_no_extra_traits!(InputStateData, "InputStateData");
6894impl InputStateData {
6895    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
6896    fn try_parse(value: &[u8], class_id: u8) -> Result<(Self, &[u8]), ParseError> {
6897        let switch_expr = u8::from(class_id);
6898        let mut outer_remaining = value;
6899        let mut parse_result = None;
6900        if switch_expr == u8::from(InputClass::KEY) {
6901            let (key, new_remaining) = InputStateDataKey::try_parse(outer_remaining)?;
6902            outer_remaining = new_remaining;
6903            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
6904            parse_result = Some(InputStateData::Key(key));
6905        }
6906        if switch_expr == u8::from(InputClass::BUTTON) {
6907            let (button, new_remaining) = InputStateDataButton::try_parse(outer_remaining)?;
6908            outer_remaining = new_remaining;
6909            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
6910            parse_result = Some(InputStateData::Button(button));
6911        }
6912        if switch_expr == u8::from(InputClass::VALUATOR) {
6913            let (valuator, new_remaining) = InputStateDataValuator::try_parse(outer_remaining)?;
6914            outer_remaining = new_remaining;
6915            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
6916            parse_result = Some(InputStateData::Valuator(valuator));
6917        }
6918        match parse_result {
6919            None => Ok((InputStateData::InvalidValue(switch_expr), &[])),
6920            Some(result) => Ok((result, outer_remaining)),
6921        }
6922    }
6923}
6924impl InputStateData {
6925    pub fn as_key(&self) -> Option<&InputStateDataKey> {
6926        match self {
6927            InputStateData::Key(value) => Some(value),
6928            _ => None,
6929        }
6930    }
6931    pub fn as_button(&self) -> Option<&InputStateDataButton> {
6932        match self {
6933            InputStateData::Button(value) => Some(value),
6934            _ => None,
6935        }
6936    }
6937    pub fn as_valuator(&self) -> Option<&InputStateDataValuator> {
6938        match self {
6939            InputStateData::Valuator(value) => Some(value),
6940            _ => None,
6941        }
6942    }
6943}
6944impl InputStateData {
6945    #[allow(dead_code)]
6946    fn serialize(&self, class_id: u8) -> Vec<u8> {
6947        let mut result = Vec::new();
6948        self.serialize_into(&mut result, u8::from(class_id));
6949        result
6950    }
6951    fn serialize_into(&self, bytes: &mut Vec<u8>, class_id: u8) {
6952        assert_eq!(self.switch_expr(), u8::from(class_id), "switch `data` has an inconsistent discriminant");
6953        match self {
6954            InputStateData::Key(key) => key.serialize_into(bytes),
6955            InputStateData::Button(button) => button.serialize_into(bytes),
6956            InputStateData::Valuator(valuator) => valuator.serialize_into(bytes),
6957            InputStateData::InvalidValue(_) => panic!("attempted to serialize invalid switch case"),
6958        }
6959    }
6960}
6961impl InputStateData {
6962    fn switch_expr(&self) -> u8 {
6963        match self {
6964            InputStateData::Key(_) => u8::from(InputClass::KEY),
6965            InputStateData::Button(_) => u8::from(InputClass::BUTTON),
6966            InputStateData::Valuator(_) => u8::from(InputClass::VALUATOR),
6967            InputStateData::InvalidValue(switch_expr) => *switch_expr,
6968        }
6969    }
6970}
6971
6972#[derive(Clone)]
6973#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
6974#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6975pub struct InputState {
6976    pub len: u8,
6977    pub data: InputStateData,
6978}
6979impl_debug_if_no_extra_traits!(InputState, "InputState");
6980impl TryParse for InputState {
6981    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
6982        let (class_id, remaining) = u8::try_parse(remaining)?;
6983        let (len, remaining) = u8::try_parse(remaining)?;
6984        let (data, remaining) = InputStateData::try_parse(remaining, u8::from(class_id))?;
6985        let result = InputState { len, data };
6986        Ok((result, remaining))
6987    }
6988}
6989impl Serialize for InputState {
6990    type Bytes = Vec<u8>;
6991    fn serialize(&self) -> Vec<u8> {
6992        let mut result = Vec::new();
6993        self.serialize_into(&mut result);
6994        result
6995    }
6996    fn serialize_into(&self, bytes: &mut Vec<u8>) {
6997        bytes.reserve(2);
6998        let class_id: u8 = self.data.switch_expr();
6999        class_id.serialize_into(bytes);
7000        self.len.serialize_into(bytes);
7001        self.data.serialize_into(bytes, u8::from(class_id));
7002    }
7003}
7004
7005/// Opcode for the QueryDeviceState request
7006pub const QUERY_DEVICE_STATE_REQUEST: u8 = 30;
7007#[derive(Clone, Copy, Default)]
7008#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7009#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7010pub struct QueryDeviceStateRequest {
7011    pub device_id: u8,
7012}
7013impl_debug_if_no_extra_traits!(QueryDeviceStateRequest, "QueryDeviceStateRequest");
7014impl QueryDeviceStateRequest {
7015    /// Serialize this request into bytes for the provided connection
7016    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
7017        let length_so_far = 0;
7018        let device_id_bytes = self.device_id.serialize();
7019        let mut request0 = vec![
7020            major_opcode,
7021            QUERY_DEVICE_STATE_REQUEST,
7022            0,
7023            0,
7024            device_id_bytes[0],
7025            0,
7026            0,
7027            0,
7028        ];
7029        let length_so_far = length_so_far + request0.len();
7030        assert_eq!(length_so_far % 4, 0);
7031        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
7032        request0[2..4].copy_from_slice(&length.to_ne_bytes());
7033        ([request0.into()], vec![])
7034    }
7035    /// Parse this request given its header, its body, and any fds that go along with it
7036    #[cfg(feature = "request-parsing")]
7037    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
7038        if header.minor_opcode != QUERY_DEVICE_STATE_REQUEST {
7039            return Err(ParseError::InvalidValue);
7040        }
7041        let (device_id, remaining) = u8::try_parse(value)?;
7042        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
7043        let _ = remaining;
7044        Ok(QueryDeviceStateRequest {
7045            device_id,
7046        })
7047    }
7048}
7049impl Request for QueryDeviceStateRequest {
7050    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
7051
7052    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
7053        let (bufs, fds) = self.serialize(major_opcode);
7054        // Flatten the buffers into a single vector
7055        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
7056        (buf, fds)
7057    }
7058}
7059impl crate::x11_utils::ReplyRequest for QueryDeviceStateRequest {
7060    type Reply = QueryDeviceStateReply;
7061}
7062
7063#[derive(Clone)]
7064#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7065#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7066pub struct QueryDeviceStateReply {
7067    pub xi_reply_type: u8,
7068    pub sequence: u16,
7069    pub length: u32,
7070    pub classes: Vec<InputState>,
7071}
7072impl_debug_if_no_extra_traits!(QueryDeviceStateReply, "QueryDeviceStateReply");
7073impl TryParse for QueryDeviceStateReply {
7074    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
7075        let remaining = initial_value;
7076        let (response_type, remaining) = u8::try_parse(remaining)?;
7077        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
7078        let (sequence, remaining) = u16::try_parse(remaining)?;
7079        let (length, remaining) = u32::try_parse(remaining)?;
7080        let (num_classes, remaining) = u8::try_parse(remaining)?;
7081        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
7082        let (classes, remaining) = crate::x11_utils::parse_list::<InputState>(remaining, num_classes.try_to_usize()?)?;
7083        if response_type != 1 {
7084            return Err(ParseError::InvalidValue);
7085        }
7086        let result = QueryDeviceStateReply { xi_reply_type, sequence, length, classes };
7087        let _ = remaining;
7088        let remaining = initial_value.get(32 + length as usize * 4..)
7089            .ok_or(ParseError::InsufficientData)?;
7090        Ok((result, remaining))
7091    }
7092}
7093impl Serialize for QueryDeviceStateReply {
7094    type Bytes = Vec<u8>;
7095    fn serialize(&self) -> Vec<u8> {
7096        let mut result = Vec::new();
7097        self.serialize_into(&mut result);
7098        result
7099    }
7100    fn serialize_into(&self, bytes: &mut Vec<u8>) {
7101        bytes.reserve(32);
7102        let response_type_bytes = &[1];
7103        bytes.push(response_type_bytes[0]);
7104        self.xi_reply_type.serialize_into(bytes);
7105        self.sequence.serialize_into(bytes);
7106        self.length.serialize_into(bytes);
7107        let num_classes = u8::try_from(self.classes.len()).expect("`classes` has too many elements");
7108        num_classes.serialize_into(bytes);
7109        bytes.extend_from_slice(&[0; 23]);
7110        self.classes.serialize_into(bytes);
7111    }
7112}
7113impl QueryDeviceStateReply {
7114    /// Get the value of the `num_classes` field.
7115    ///
7116    /// The `num_classes` field is used as the length field of the `classes` field.
7117    /// This function computes the field's value again based on the length of the list.
7118    ///
7119    /// # Panics
7120    ///
7121    /// Panics if the value cannot be represented in the target type. This
7122    /// cannot happen with values of the struct received from the X11 server.
7123    pub fn num_classes(&self) -> u8 {
7124        self.classes.len()
7125            .try_into().unwrap()
7126    }
7127}
7128
7129/// Opcode for the DeviceBell request
7130pub const DEVICE_BELL_REQUEST: u8 = 32;
7131#[derive(Clone, Copy, Default)]
7132#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7133#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7134pub struct DeviceBellRequest {
7135    pub device_id: u8,
7136    pub feedback_id: u8,
7137    pub feedback_class: u8,
7138    pub percent: i8,
7139}
7140impl_debug_if_no_extra_traits!(DeviceBellRequest, "DeviceBellRequest");
7141impl DeviceBellRequest {
7142    /// Serialize this request into bytes for the provided connection
7143    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
7144        let length_so_far = 0;
7145        let device_id_bytes = self.device_id.serialize();
7146        let feedback_id_bytes = self.feedback_id.serialize();
7147        let feedback_class_bytes = self.feedback_class.serialize();
7148        let percent_bytes = self.percent.serialize();
7149        let mut request0 = vec![
7150            major_opcode,
7151            DEVICE_BELL_REQUEST,
7152            0,
7153            0,
7154            device_id_bytes[0],
7155            feedback_id_bytes[0],
7156            feedback_class_bytes[0],
7157            percent_bytes[0],
7158        ];
7159        let length_so_far = length_so_far + request0.len();
7160        assert_eq!(length_so_far % 4, 0);
7161        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
7162        request0[2..4].copy_from_slice(&length.to_ne_bytes());
7163        ([request0.into()], vec![])
7164    }
7165    /// Parse this request given its header, its body, and any fds that go along with it
7166    #[cfg(feature = "request-parsing")]
7167    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
7168        if header.minor_opcode != DEVICE_BELL_REQUEST {
7169            return Err(ParseError::InvalidValue);
7170        }
7171        let (device_id, remaining) = u8::try_parse(value)?;
7172        let (feedback_id, remaining) = u8::try_parse(remaining)?;
7173        let (feedback_class, remaining) = u8::try_parse(remaining)?;
7174        let (percent, remaining) = i8::try_parse(remaining)?;
7175        let _ = remaining;
7176        Ok(DeviceBellRequest {
7177            device_id,
7178            feedback_id,
7179            feedback_class,
7180            percent,
7181        })
7182    }
7183}
7184impl Request for DeviceBellRequest {
7185    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
7186
7187    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
7188        let (bufs, fds) = self.serialize(major_opcode);
7189        // Flatten the buffers into a single vector
7190        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
7191        (buf, fds)
7192    }
7193}
7194impl crate::x11_utils::VoidRequest for DeviceBellRequest {
7195}
7196
7197/// Opcode for the SetDeviceValuators request
7198pub const SET_DEVICE_VALUATORS_REQUEST: u8 = 33;
7199#[derive(Clone, Default)]
7200#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7201#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7202pub struct SetDeviceValuatorsRequest<'input> {
7203    pub device_id: u8,
7204    pub first_valuator: u8,
7205    pub valuators: Cow<'input, [i32]>,
7206}
7207impl_debug_if_no_extra_traits!(SetDeviceValuatorsRequest<'_>, "SetDeviceValuatorsRequest");
7208impl<'input> SetDeviceValuatorsRequest<'input> {
7209    /// Serialize this request into bytes for the provided connection
7210    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
7211        let length_so_far = 0;
7212        let device_id_bytes = self.device_id.serialize();
7213        let first_valuator_bytes = self.first_valuator.serialize();
7214        let num_valuators = u8::try_from(self.valuators.len()).expect("`valuators` has too many elements");
7215        let num_valuators_bytes = num_valuators.serialize();
7216        let mut request0 = vec![
7217            major_opcode,
7218            SET_DEVICE_VALUATORS_REQUEST,
7219            0,
7220            0,
7221            device_id_bytes[0],
7222            first_valuator_bytes[0],
7223            num_valuators_bytes[0],
7224            0,
7225        ];
7226        let length_so_far = length_so_far + request0.len();
7227        let valuators_bytes = self.valuators.serialize();
7228        let length_so_far = length_so_far + valuators_bytes.len();
7229        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
7230        let length_so_far = length_so_far + padding0.len();
7231        assert_eq!(length_so_far % 4, 0);
7232        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
7233        request0[2..4].copy_from_slice(&length.to_ne_bytes());
7234        ([request0.into(), valuators_bytes.into(), padding0.into()], vec![])
7235    }
7236    /// Parse this request given its header, its body, and any fds that go along with it
7237    #[cfg(feature = "request-parsing")]
7238    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
7239        if header.minor_opcode != SET_DEVICE_VALUATORS_REQUEST {
7240            return Err(ParseError::InvalidValue);
7241        }
7242        let (device_id, remaining) = u8::try_parse(value)?;
7243        let (first_valuator, remaining) = u8::try_parse(remaining)?;
7244        let (num_valuators, remaining) = u8::try_parse(remaining)?;
7245        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
7246        let (valuators, remaining) = crate::x11_utils::parse_list::<i32>(remaining, num_valuators.try_to_usize()?)?;
7247        let _ = remaining;
7248        Ok(SetDeviceValuatorsRequest {
7249            device_id,
7250            first_valuator,
7251            valuators: Cow::Owned(valuators),
7252        })
7253    }
7254    /// Clone all borrowed data in this SetDeviceValuatorsRequest.
7255    pub fn into_owned(self) -> SetDeviceValuatorsRequest<'static> {
7256        SetDeviceValuatorsRequest {
7257            device_id: self.device_id,
7258            first_valuator: self.first_valuator,
7259            valuators: Cow::Owned(self.valuators.into_owned()),
7260        }
7261    }
7262}
7263impl<'input> Request for SetDeviceValuatorsRequest<'input> {
7264    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
7265
7266    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
7267        let (bufs, fds) = self.serialize(major_opcode);
7268        // Flatten the buffers into a single vector
7269        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
7270        (buf, fds)
7271    }
7272}
7273impl<'input> crate::x11_utils::ReplyRequest for SetDeviceValuatorsRequest<'input> {
7274    type Reply = SetDeviceValuatorsReply;
7275}
7276
7277#[derive(Clone, Copy, Default)]
7278#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7279#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7280pub struct SetDeviceValuatorsReply {
7281    pub xi_reply_type: u8,
7282    pub sequence: u16,
7283    pub length: u32,
7284    pub status: xproto::GrabStatus,
7285}
7286impl_debug_if_no_extra_traits!(SetDeviceValuatorsReply, "SetDeviceValuatorsReply");
7287impl TryParse for SetDeviceValuatorsReply {
7288    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
7289        let remaining = initial_value;
7290        let (response_type, remaining) = u8::try_parse(remaining)?;
7291        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
7292        let (sequence, remaining) = u16::try_parse(remaining)?;
7293        let (length, remaining) = u32::try_parse(remaining)?;
7294        let (status, remaining) = u8::try_parse(remaining)?;
7295        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
7296        if response_type != 1 {
7297            return Err(ParseError::InvalidValue);
7298        }
7299        let status = status.into();
7300        let result = SetDeviceValuatorsReply { xi_reply_type, sequence, length, status };
7301        let _ = remaining;
7302        let remaining = initial_value.get(32 + length as usize * 4..)
7303            .ok_or(ParseError::InsufficientData)?;
7304        Ok((result, remaining))
7305    }
7306}
7307impl Serialize for SetDeviceValuatorsReply {
7308    type Bytes = [u8; 32];
7309    fn serialize(&self) -> [u8; 32] {
7310        let response_type_bytes = &[1];
7311        let xi_reply_type_bytes = self.xi_reply_type.serialize();
7312        let sequence_bytes = self.sequence.serialize();
7313        let length_bytes = self.length.serialize();
7314        let status_bytes = u8::from(self.status).serialize();
7315        [
7316            response_type_bytes[0],
7317            xi_reply_type_bytes[0],
7318            sequence_bytes[0],
7319            sequence_bytes[1],
7320            length_bytes[0],
7321            length_bytes[1],
7322            length_bytes[2],
7323            length_bytes[3],
7324            status_bytes[0],
7325            0,
7326            0,
7327            0,
7328            0,
7329            0,
7330            0,
7331            0,
7332            0,
7333            0,
7334            0,
7335            0,
7336            0,
7337            0,
7338            0,
7339            0,
7340            0,
7341            0,
7342            0,
7343            0,
7344            0,
7345            0,
7346            0,
7347            0,
7348        ]
7349    }
7350    fn serialize_into(&self, bytes: &mut Vec<u8>) {
7351        bytes.reserve(32);
7352        let response_type_bytes = &[1];
7353        bytes.push(response_type_bytes[0]);
7354        self.xi_reply_type.serialize_into(bytes);
7355        self.sequence.serialize_into(bytes);
7356        self.length.serialize_into(bytes);
7357        u8::from(self.status).serialize_into(bytes);
7358        bytes.extend_from_slice(&[0; 23]);
7359    }
7360}
7361
7362#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
7363#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7364pub struct DeviceControl(u16);
7365impl DeviceControl {
7366    pub const RESOLUTION: Self = Self(1);
7367    pub const ABSCALIB: Self = Self(2);
7368    pub const CORE: Self = Self(3);
7369    pub const ENABLE: Self = Self(4);
7370    pub const ABSAREA: Self = Self(5);
7371}
7372impl From<DeviceControl> for u16 {
7373    #[inline]
7374    fn from(input: DeviceControl) -> Self {
7375        input.0
7376    }
7377}
7378impl From<DeviceControl> for Option<u16> {
7379    #[inline]
7380    fn from(input: DeviceControl) -> Self {
7381        Some(input.0)
7382    }
7383}
7384impl From<DeviceControl> for u32 {
7385    #[inline]
7386    fn from(input: DeviceControl) -> Self {
7387        u32::from(input.0)
7388    }
7389}
7390impl From<DeviceControl> for Option<u32> {
7391    #[inline]
7392    fn from(input: DeviceControl) -> Self {
7393        Some(u32::from(input.0))
7394    }
7395}
7396impl From<u8> for DeviceControl {
7397    #[inline]
7398    fn from(value: u8) -> Self {
7399        Self(value.into())
7400    }
7401}
7402impl From<u16> for DeviceControl {
7403    #[inline]
7404    fn from(value: u16) -> Self {
7405        Self(value)
7406    }
7407}
7408impl core::fmt::Debug for DeviceControl  {
7409    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
7410        let variants = [
7411            (Self::RESOLUTION.0.into(), "RESOLUTION", "Resolution"),
7412            (Self::ABSCALIB.0.into(), "ABSCALIB", "Abscalib"),
7413            (Self::CORE.0.into(), "CORE", "Core"),
7414            (Self::ENABLE.0.into(), "ENABLE", "Enable"),
7415            (Self::ABSAREA.0.into(), "ABSAREA", "Absarea"),
7416        ];
7417        pretty_print_enum(fmt, self.0.into(), &variants)
7418    }
7419}
7420
7421#[derive(Clone, Default)]
7422#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7423#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7424pub struct DeviceResolutionState {
7425    pub control_id: DeviceControl,
7426    pub len: u16,
7427    pub resolution_values: Vec<u32>,
7428    pub resolution_min: Vec<u32>,
7429    pub resolution_max: Vec<u32>,
7430}
7431impl_debug_if_no_extra_traits!(DeviceResolutionState, "DeviceResolutionState");
7432impl TryParse for DeviceResolutionState {
7433    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
7434        let (control_id, remaining) = u16::try_parse(remaining)?;
7435        let (len, remaining) = u16::try_parse(remaining)?;
7436        let (num_valuators, remaining) = u32::try_parse(remaining)?;
7437        let (resolution_values, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_valuators.try_to_usize()?)?;
7438        let (resolution_min, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_valuators.try_to_usize()?)?;
7439        let (resolution_max, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_valuators.try_to_usize()?)?;
7440        let control_id = control_id.into();
7441        let result = DeviceResolutionState { control_id, len, resolution_values, resolution_min, resolution_max };
7442        Ok((result, remaining))
7443    }
7444}
7445impl Serialize for DeviceResolutionState {
7446    type Bytes = Vec<u8>;
7447    fn serialize(&self) -> Vec<u8> {
7448        let mut result = Vec::new();
7449        self.serialize_into(&mut result);
7450        result
7451    }
7452    fn serialize_into(&self, bytes: &mut Vec<u8>) {
7453        bytes.reserve(8);
7454        u16::from(self.control_id).serialize_into(bytes);
7455        self.len.serialize_into(bytes);
7456        let num_valuators = u32::try_from(self.resolution_values.len()).expect("`resolution_values` has too many elements");
7457        num_valuators.serialize_into(bytes);
7458        self.resolution_values.serialize_into(bytes);
7459        assert_eq!(self.resolution_min.len(), usize::try_from(num_valuators).unwrap(), "`resolution_min` has an incorrect length");
7460        self.resolution_min.serialize_into(bytes);
7461        assert_eq!(self.resolution_max.len(), usize::try_from(num_valuators).unwrap(), "`resolution_max` has an incorrect length");
7462        self.resolution_max.serialize_into(bytes);
7463    }
7464}
7465impl DeviceResolutionState {
7466    /// Get the value of the `num_valuators` field.
7467    ///
7468    /// The `num_valuators` field is used as the length field of the `resolution_values` field.
7469    /// This function computes the field's value again based on the length of the list.
7470    ///
7471    /// # Panics
7472    ///
7473    /// Panics if the value cannot be represented in the target type. This
7474    /// cannot happen with values of the struct received from the X11 server.
7475    pub fn num_valuators(&self) -> u32 {
7476        self.resolution_values.len()
7477            .try_into().unwrap()
7478    }
7479}
7480
7481#[derive(Clone, Copy, Default)]
7482#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7483#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7484pub struct DeviceAbsCalibState {
7485    pub control_id: DeviceControl,
7486    pub len: u16,
7487    pub min_x: i32,
7488    pub max_x: i32,
7489    pub min_y: i32,
7490    pub max_y: i32,
7491    pub flip_x: u32,
7492    pub flip_y: u32,
7493    pub rotation: u32,
7494    pub button_threshold: u32,
7495}
7496impl_debug_if_no_extra_traits!(DeviceAbsCalibState, "DeviceAbsCalibState");
7497impl TryParse for DeviceAbsCalibState {
7498    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
7499        let (control_id, remaining) = u16::try_parse(remaining)?;
7500        let (len, remaining) = u16::try_parse(remaining)?;
7501        let (min_x, remaining) = i32::try_parse(remaining)?;
7502        let (max_x, remaining) = i32::try_parse(remaining)?;
7503        let (min_y, remaining) = i32::try_parse(remaining)?;
7504        let (max_y, remaining) = i32::try_parse(remaining)?;
7505        let (flip_x, remaining) = u32::try_parse(remaining)?;
7506        let (flip_y, remaining) = u32::try_parse(remaining)?;
7507        let (rotation, remaining) = u32::try_parse(remaining)?;
7508        let (button_threshold, remaining) = u32::try_parse(remaining)?;
7509        let control_id = control_id.into();
7510        let result = DeviceAbsCalibState { control_id, len, min_x, max_x, min_y, max_y, flip_x, flip_y, rotation, button_threshold };
7511        Ok((result, remaining))
7512    }
7513}
7514impl Serialize for DeviceAbsCalibState {
7515    type Bytes = [u8; 36];
7516    fn serialize(&self) -> [u8; 36] {
7517        let control_id_bytes = u16::from(self.control_id).serialize();
7518        let len_bytes = self.len.serialize();
7519        let min_x_bytes = self.min_x.serialize();
7520        let max_x_bytes = self.max_x.serialize();
7521        let min_y_bytes = self.min_y.serialize();
7522        let max_y_bytes = self.max_y.serialize();
7523        let flip_x_bytes = self.flip_x.serialize();
7524        let flip_y_bytes = self.flip_y.serialize();
7525        let rotation_bytes = self.rotation.serialize();
7526        let button_threshold_bytes = self.button_threshold.serialize();
7527        [
7528            control_id_bytes[0],
7529            control_id_bytes[1],
7530            len_bytes[0],
7531            len_bytes[1],
7532            min_x_bytes[0],
7533            min_x_bytes[1],
7534            min_x_bytes[2],
7535            min_x_bytes[3],
7536            max_x_bytes[0],
7537            max_x_bytes[1],
7538            max_x_bytes[2],
7539            max_x_bytes[3],
7540            min_y_bytes[0],
7541            min_y_bytes[1],
7542            min_y_bytes[2],
7543            min_y_bytes[3],
7544            max_y_bytes[0],
7545            max_y_bytes[1],
7546            max_y_bytes[2],
7547            max_y_bytes[3],
7548            flip_x_bytes[0],
7549            flip_x_bytes[1],
7550            flip_x_bytes[2],
7551            flip_x_bytes[3],
7552            flip_y_bytes[0],
7553            flip_y_bytes[1],
7554            flip_y_bytes[2],
7555            flip_y_bytes[3],
7556            rotation_bytes[0],
7557            rotation_bytes[1],
7558            rotation_bytes[2],
7559            rotation_bytes[3],
7560            button_threshold_bytes[0],
7561            button_threshold_bytes[1],
7562            button_threshold_bytes[2],
7563            button_threshold_bytes[3],
7564        ]
7565    }
7566    fn serialize_into(&self, bytes: &mut Vec<u8>) {
7567        bytes.reserve(36);
7568        u16::from(self.control_id).serialize_into(bytes);
7569        self.len.serialize_into(bytes);
7570        self.min_x.serialize_into(bytes);
7571        self.max_x.serialize_into(bytes);
7572        self.min_y.serialize_into(bytes);
7573        self.max_y.serialize_into(bytes);
7574        self.flip_x.serialize_into(bytes);
7575        self.flip_y.serialize_into(bytes);
7576        self.rotation.serialize_into(bytes);
7577        self.button_threshold.serialize_into(bytes);
7578    }
7579}
7580
7581#[derive(Clone, Copy, Default)]
7582#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7583#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7584pub struct DeviceAbsAreaState {
7585    pub control_id: DeviceControl,
7586    pub len: u16,
7587    pub offset_x: u32,
7588    pub offset_y: u32,
7589    pub width: u32,
7590    pub height: u32,
7591    pub screen: u32,
7592    pub following: u32,
7593}
7594impl_debug_if_no_extra_traits!(DeviceAbsAreaState, "DeviceAbsAreaState");
7595impl TryParse for DeviceAbsAreaState {
7596    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
7597        let (control_id, remaining) = u16::try_parse(remaining)?;
7598        let (len, remaining) = u16::try_parse(remaining)?;
7599        let (offset_x, remaining) = u32::try_parse(remaining)?;
7600        let (offset_y, remaining) = u32::try_parse(remaining)?;
7601        let (width, remaining) = u32::try_parse(remaining)?;
7602        let (height, remaining) = u32::try_parse(remaining)?;
7603        let (screen, remaining) = u32::try_parse(remaining)?;
7604        let (following, remaining) = u32::try_parse(remaining)?;
7605        let control_id = control_id.into();
7606        let result = DeviceAbsAreaState { control_id, len, offset_x, offset_y, width, height, screen, following };
7607        Ok((result, remaining))
7608    }
7609}
7610impl Serialize for DeviceAbsAreaState {
7611    type Bytes = [u8; 28];
7612    fn serialize(&self) -> [u8; 28] {
7613        let control_id_bytes = u16::from(self.control_id).serialize();
7614        let len_bytes = self.len.serialize();
7615        let offset_x_bytes = self.offset_x.serialize();
7616        let offset_y_bytes = self.offset_y.serialize();
7617        let width_bytes = self.width.serialize();
7618        let height_bytes = self.height.serialize();
7619        let screen_bytes = self.screen.serialize();
7620        let following_bytes = self.following.serialize();
7621        [
7622            control_id_bytes[0],
7623            control_id_bytes[1],
7624            len_bytes[0],
7625            len_bytes[1],
7626            offset_x_bytes[0],
7627            offset_x_bytes[1],
7628            offset_x_bytes[2],
7629            offset_x_bytes[3],
7630            offset_y_bytes[0],
7631            offset_y_bytes[1],
7632            offset_y_bytes[2],
7633            offset_y_bytes[3],
7634            width_bytes[0],
7635            width_bytes[1],
7636            width_bytes[2],
7637            width_bytes[3],
7638            height_bytes[0],
7639            height_bytes[1],
7640            height_bytes[2],
7641            height_bytes[3],
7642            screen_bytes[0],
7643            screen_bytes[1],
7644            screen_bytes[2],
7645            screen_bytes[3],
7646            following_bytes[0],
7647            following_bytes[1],
7648            following_bytes[2],
7649            following_bytes[3],
7650        ]
7651    }
7652    fn serialize_into(&self, bytes: &mut Vec<u8>) {
7653        bytes.reserve(28);
7654        u16::from(self.control_id).serialize_into(bytes);
7655        self.len.serialize_into(bytes);
7656        self.offset_x.serialize_into(bytes);
7657        self.offset_y.serialize_into(bytes);
7658        self.width.serialize_into(bytes);
7659        self.height.serialize_into(bytes);
7660        self.screen.serialize_into(bytes);
7661        self.following.serialize_into(bytes);
7662    }
7663}
7664
7665#[derive(Clone, Copy, Default)]
7666#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7667#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7668pub struct DeviceCoreState {
7669    pub control_id: DeviceControl,
7670    pub len: u16,
7671    pub status: u8,
7672    pub iscore: u8,
7673}
7674impl_debug_if_no_extra_traits!(DeviceCoreState, "DeviceCoreState");
7675impl TryParse for DeviceCoreState {
7676    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
7677        let (control_id, remaining) = u16::try_parse(remaining)?;
7678        let (len, remaining) = u16::try_parse(remaining)?;
7679        let (status, remaining) = u8::try_parse(remaining)?;
7680        let (iscore, remaining) = u8::try_parse(remaining)?;
7681        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
7682        let control_id = control_id.into();
7683        let result = DeviceCoreState { control_id, len, status, iscore };
7684        Ok((result, remaining))
7685    }
7686}
7687impl Serialize for DeviceCoreState {
7688    type Bytes = [u8; 8];
7689    fn serialize(&self) -> [u8; 8] {
7690        let control_id_bytes = u16::from(self.control_id).serialize();
7691        let len_bytes = self.len.serialize();
7692        let status_bytes = self.status.serialize();
7693        let iscore_bytes = self.iscore.serialize();
7694        [
7695            control_id_bytes[0],
7696            control_id_bytes[1],
7697            len_bytes[0],
7698            len_bytes[1],
7699            status_bytes[0],
7700            iscore_bytes[0],
7701            0,
7702            0,
7703        ]
7704    }
7705    fn serialize_into(&self, bytes: &mut Vec<u8>) {
7706        bytes.reserve(8);
7707        u16::from(self.control_id).serialize_into(bytes);
7708        self.len.serialize_into(bytes);
7709        self.status.serialize_into(bytes);
7710        self.iscore.serialize_into(bytes);
7711        bytes.extend_from_slice(&[0; 2]);
7712    }
7713}
7714
7715#[derive(Clone, Copy, Default)]
7716#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7717#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7718pub struct DeviceEnableState {
7719    pub control_id: DeviceControl,
7720    pub len: u16,
7721    pub enable: u8,
7722}
7723impl_debug_if_no_extra_traits!(DeviceEnableState, "DeviceEnableState");
7724impl TryParse for DeviceEnableState {
7725    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
7726        let (control_id, remaining) = u16::try_parse(remaining)?;
7727        let (len, remaining) = u16::try_parse(remaining)?;
7728        let (enable, remaining) = u8::try_parse(remaining)?;
7729        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
7730        let control_id = control_id.into();
7731        let result = DeviceEnableState { control_id, len, enable };
7732        Ok((result, remaining))
7733    }
7734}
7735impl Serialize for DeviceEnableState {
7736    type Bytes = [u8; 8];
7737    fn serialize(&self) -> [u8; 8] {
7738        let control_id_bytes = u16::from(self.control_id).serialize();
7739        let len_bytes = self.len.serialize();
7740        let enable_bytes = self.enable.serialize();
7741        [
7742            control_id_bytes[0],
7743            control_id_bytes[1],
7744            len_bytes[0],
7745            len_bytes[1],
7746            enable_bytes[0],
7747            0,
7748            0,
7749            0,
7750        ]
7751    }
7752    fn serialize_into(&self, bytes: &mut Vec<u8>) {
7753        bytes.reserve(8);
7754        u16::from(self.control_id).serialize_into(bytes);
7755        self.len.serialize_into(bytes);
7756        self.enable.serialize_into(bytes);
7757        bytes.extend_from_slice(&[0; 3]);
7758    }
7759}
7760
7761#[derive(Clone)]
7762#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7763#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7764pub struct DeviceStateDataResolution {
7765    pub resolution_values: Vec<u32>,
7766    pub resolution_min: Vec<u32>,
7767    pub resolution_max: Vec<u32>,
7768}
7769impl_debug_if_no_extra_traits!(DeviceStateDataResolution, "DeviceStateDataResolution");
7770impl TryParse for DeviceStateDataResolution {
7771    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
7772        let (num_valuators, remaining) = u32::try_parse(remaining)?;
7773        let (resolution_values, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_valuators.try_to_usize()?)?;
7774        let (resolution_min, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_valuators.try_to_usize()?)?;
7775        let (resolution_max, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_valuators.try_to_usize()?)?;
7776        let result = DeviceStateDataResolution { resolution_values, resolution_min, resolution_max };
7777        Ok((result, remaining))
7778    }
7779}
7780impl Serialize for DeviceStateDataResolution {
7781    type Bytes = Vec<u8>;
7782    fn serialize(&self) -> Vec<u8> {
7783        let mut result = Vec::new();
7784        self.serialize_into(&mut result);
7785        result
7786    }
7787    fn serialize_into(&self, bytes: &mut Vec<u8>) {
7788        let num_valuators = u32::try_from(self.resolution_values.len()).expect("`resolution_values` has too many elements");
7789        num_valuators.serialize_into(bytes);
7790        self.resolution_values.serialize_into(bytes);
7791        assert_eq!(self.resolution_min.len(), usize::try_from(num_valuators).unwrap(), "`resolution_min` has an incorrect length");
7792        self.resolution_min.serialize_into(bytes);
7793        assert_eq!(self.resolution_max.len(), usize::try_from(num_valuators).unwrap(), "`resolution_max` has an incorrect length");
7794        self.resolution_max.serialize_into(bytes);
7795    }
7796}
7797impl DeviceStateDataResolution {
7798    /// Get the value of the `num_valuators` field.
7799    ///
7800    /// The `num_valuators` field is used as the length field of the `resolution_values` field.
7801    /// This function computes the field's value again based on the length of the list.
7802    ///
7803    /// # Panics
7804    ///
7805    /// Panics if the value cannot be represented in the target type. This
7806    /// cannot happen with values of the struct received from the X11 server.
7807    pub fn num_valuators(&self) -> u32 {
7808        self.resolution_values.len()
7809            .try_into().unwrap()
7810    }
7811}
7812#[derive(Clone, Copy)]
7813#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7814#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7815pub struct DeviceStateDataAbsCalib {
7816    pub min_x: i32,
7817    pub max_x: i32,
7818    pub min_y: i32,
7819    pub max_y: i32,
7820    pub flip_x: u32,
7821    pub flip_y: u32,
7822    pub rotation: u32,
7823    pub button_threshold: u32,
7824}
7825impl_debug_if_no_extra_traits!(DeviceStateDataAbsCalib, "DeviceStateDataAbsCalib");
7826impl TryParse for DeviceStateDataAbsCalib {
7827    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
7828        let (min_x, remaining) = i32::try_parse(remaining)?;
7829        let (max_x, remaining) = i32::try_parse(remaining)?;
7830        let (min_y, remaining) = i32::try_parse(remaining)?;
7831        let (max_y, remaining) = i32::try_parse(remaining)?;
7832        let (flip_x, remaining) = u32::try_parse(remaining)?;
7833        let (flip_y, remaining) = u32::try_parse(remaining)?;
7834        let (rotation, remaining) = u32::try_parse(remaining)?;
7835        let (button_threshold, remaining) = u32::try_parse(remaining)?;
7836        let result = DeviceStateDataAbsCalib { min_x, max_x, min_y, max_y, flip_x, flip_y, rotation, button_threshold };
7837        Ok((result, remaining))
7838    }
7839}
7840impl Serialize for DeviceStateDataAbsCalib {
7841    type Bytes = [u8; 32];
7842    fn serialize(&self) -> [u8; 32] {
7843        let min_x_bytes = self.min_x.serialize();
7844        let max_x_bytes = self.max_x.serialize();
7845        let min_y_bytes = self.min_y.serialize();
7846        let max_y_bytes = self.max_y.serialize();
7847        let flip_x_bytes = self.flip_x.serialize();
7848        let flip_y_bytes = self.flip_y.serialize();
7849        let rotation_bytes = self.rotation.serialize();
7850        let button_threshold_bytes = self.button_threshold.serialize();
7851        [
7852            min_x_bytes[0],
7853            min_x_bytes[1],
7854            min_x_bytes[2],
7855            min_x_bytes[3],
7856            max_x_bytes[0],
7857            max_x_bytes[1],
7858            max_x_bytes[2],
7859            max_x_bytes[3],
7860            min_y_bytes[0],
7861            min_y_bytes[1],
7862            min_y_bytes[2],
7863            min_y_bytes[3],
7864            max_y_bytes[0],
7865            max_y_bytes[1],
7866            max_y_bytes[2],
7867            max_y_bytes[3],
7868            flip_x_bytes[0],
7869            flip_x_bytes[1],
7870            flip_x_bytes[2],
7871            flip_x_bytes[3],
7872            flip_y_bytes[0],
7873            flip_y_bytes[1],
7874            flip_y_bytes[2],
7875            flip_y_bytes[3],
7876            rotation_bytes[0],
7877            rotation_bytes[1],
7878            rotation_bytes[2],
7879            rotation_bytes[3],
7880            button_threshold_bytes[0],
7881            button_threshold_bytes[1],
7882            button_threshold_bytes[2],
7883            button_threshold_bytes[3],
7884        ]
7885    }
7886    fn serialize_into(&self, bytes: &mut Vec<u8>) {
7887        bytes.reserve(32);
7888        self.min_x.serialize_into(bytes);
7889        self.max_x.serialize_into(bytes);
7890        self.min_y.serialize_into(bytes);
7891        self.max_y.serialize_into(bytes);
7892        self.flip_x.serialize_into(bytes);
7893        self.flip_y.serialize_into(bytes);
7894        self.rotation.serialize_into(bytes);
7895        self.button_threshold.serialize_into(bytes);
7896    }
7897}
7898#[derive(Clone, Copy)]
7899#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7900#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7901pub struct DeviceStateDataCore {
7902    pub status: u8,
7903    pub iscore: u8,
7904}
7905impl_debug_if_no_extra_traits!(DeviceStateDataCore, "DeviceStateDataCore");
7906impl TryParse for DeviceStateDataCore {
7907    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
7908        let (status, remaining) = u8::try_parse(remaining)?;
7909        let (iscore, remaining) = u8::try_parse(remaining)?;
7910        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
7911        let result = DeviceStateDataCore { status, iscore };
7912        Ok((result, remaining))
7913    }
7914}
7915impl Serialize for DeviceStateDataCore {
7916    type Bytes = [u8; 4];
7917    fn serialize(&self) -> [u8; 4] {
7918        let status_bytes = self.status.serialize();
7919        let iscore_bytes = self.iscore.serialize();
7920        [
7921            status_bytes[0],
7922            iscore_bytes[0],
7923            0,
7924            0,
7925        ]
7926    }
7927    fn serialize_into(&self, bytes: &mut Vec<u8>) {
7928        bytes.reserve(4);
7929        self.status.serialize_into(bytes);
7930        self.iscore.serialize_into(bytes);
7931        bytes.extend_from_slice(&[0; 2]);
7932    }
7933}
7934#[derive(Clone, Copy)]
7935#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
7936#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7937pub struct DeviceStateDataAbsArea {
7938    pub offset_x: u32,
7939    pub offset_y: u32,
7940    pub width: u32,
7941    pub height: u32,
7942    pub screen: u32,
7943    pub following: u32,
7944}
7945impl_debug_if_no_extra_traits!(DeviceStateDataAbsArea, "DeviceStateDataAbsArea");
7946impl TryParse for DeviceStateDataAbsArea {
7947    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
7948        let (offset_x, remaining) = u32::try_parse(remaining)?;
7949        let (offset_y, remaining) = u32::try_parse(remaining)?;
7950        let (width, remaining) = u32::try_parse(remaining)?;
7951        let (height, remaining) = u32::try_parse(remaining)?;
7952        let (screen, remaining) = u32::try_parse(remaining)?;
7953        let (following, remaining) = u32::try_parse(remaining)?;
7954        let result = DeviceStateDataAbsArea { offset_x, offset_y, width, height, screen, following };
7955        Ok((result, remaining))
7956    }
7957}
7958impl Serialize for DeviceStateDataAbsArea {
7959    type Bytes = [u8; 24];
7960    fn serialize(&self) -> [u8; 24] {
7961        let offset_x_bytes = self.offset_x.serialize();
7962        let offset_y_bytes = self.offset_y.serialize();
7963        let width_bytes = self.width.serialize();
7964        let height_bytes = self.height.serialize();
7965        let screen_bytes = self.screen.serialize();
7966        let following_bytes = self.following.serialize();
7967        [
7968            offset_x_bytes[0],
7969            offset_x_bytes[1],
7970            offset_x_bytes[2],
7971            offset_x_bytes[3],
7972            offset_y_bytes[0],
7973            offset_y_bytes[1],
7974            offset_y_bytes[2],
7975            offset_y_bytes[3],
7976            width_bytes[0],
7977            width_bytes[1],
7978            width_bytes[2],
7979            width_bytes[3],
7980            height_bytes[0],
7981            height_bytes[1],
7982            height_bytes[2],
7983            height_bytes[3],
7984            screen_bytes[0],
7985            screen_bytes[1],
7986            screen_bytes[2],
7987            screen_bytes[3],
7988            following_bytes[0],
7989            following_bytes[1],
7990            following_bytes[2],
7991            following_bytes[3],
7992        ]
7993    }
7994    fn serialize_into(&self, bytes: &mut Vec<u8>) {
7995        bytes.reserve(24);
7996        self.offset_x.serialize_into(bytes);
7997        self.offset_y.serialize_into(bytes);
7998        self.width.serialize_into(bytes);
7999        self.height.serialize_into(bytes);
8000        self.screen.serialize_into(bytes);
8001        self.following.serialize_into(bytes);
8002    }
8003}
8004#[derive(Clone)]
8005#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8006#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8007pub enum DeviceStateData {
8008    Resolution(DeviceStateDataResolution),
8009    AbsCalib(DeviceStateDataAbsCalib),
8010    Core(DeviceStateDataCore),
8011    Enable(u8),
8012    AbsArea(DeviceStateDataAbsArea),
8013    /// This variant is returned when the server sends a discriminant
8014    /// value that does not match any of the defined by the protocol.
8015    ///
8016    /// Usually, this should be considered a parsing error, but there
8017    /// are some cases where the server violates the protocol.
8018    ///
8019    /// Trying to use `serialize` or `serialize_into` with this variant
8020    /// will raise a panic.
8021    InvalidValue(u16),
8022}
8023impl_debug_if_no_extra_traits!(DeviceStateData, "DeviceStateData");
8024impl DeviceStateData {
8025    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
8026    fn try_parse(value: &[u8], control_id: u16) -> Result<(Self, &[u8]), ParseError> {
8027        let switch_expr = u16::from(control_id);
8028        let mut outer_remaining = value;
8029        let mut parse_result = None;
8030        if switch_expr == u16::from(DeviceControl::RESOLUTION) {
8031            let (resolution, new_remaining) = DeviceStateDataResolution::try_parse(outer_remaining)?;
8032            outer_remaining = new_remaining;
8033            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
8034            parse_result = Some(DeviceStateData::Resolution(resolution));
8035        }
8036        if switch_expr == u16::from(DeviceControl::ABSCALIB) {
8037            let (abs_calib, new_remaining) = DeviceStateDataAbsCalib::try_parse(outer_remaining)?;
8038            outer_remaining = new_remaining;
8039            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
8040            parse_result = Some(DeviceStateData::AbsCalib(abs_calib));
8041        }
8042        if switch_expr == u16::from(DeviceControl::CORE) {
8043            let (core, new_remaining) = DeviceStateDataCore::try_parse(outer_remaining)?;
8044            outer_remaining = new_remaining;
8045            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
8046            parse_result = Some(DeviceStateData::Core(core));
8047        }
8048        if switch_expr == u16::from(DeviceControl::ENABLE) {
8049            let remaining = outer_remaining;
8050            let (enable, remaining) = u8::try_parse(remaining)?;
8051            let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
8052            outer_remaining = remaining;
8053            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
8054            parse_result = Some(DeviceStateData::Enable(enable));
8055        }
8056        if switch_expr == u16::from(DeviceControl::ABSAREA) {
8057            let (abs_area, new_remaining) = DeviceStateDataAbsArea::try_parse(outer_remaining)?;
8058            outer_remaining = new_remaining;
8059            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
8060            parse_result = Some(DeviceStateData::AbsArea(abs_area));
8061        }
8062        match parse_result {
8063            None => Ok((DeviceStateData::InvalidValue(switch_expr), &[])),
8064            Some(result) => Ok((result, outer_remaining)),
8065        }
8066    }
8067}
8068impl DeviceStateData {
8069    pub fn as_resolution(&self) -> Option<&DeviceStateDataResolution> {
8070        match self {
8071            DeviceStateData::Resolution(value) => Some(value),
8072            _ => None,
8073        }
8074    }
8075    pub fn as_abs_calib(&self) -> Option<&DeviceStateDataAbsCalib> {
8076        match self {
8077            DeviceStateData::AbsCalib(value) => Some(value),
8078            _ => None,
8079        }
8080    }
8081    pub fn as_core(&self) -> Option<&DeviceStateDataCore> {
8082        match self {
8083            DeviceStateData::Core(value) => Some(value),
8084            _ => None,
8085        }
8086    }
8087    pub fn as_enable(&self) -> Option<&u8> {
8088        match self {
8089            DeviceStateData::Enable(value) => Some(value),
8090            _ => None,
8091        }
8092    }
8093    pub fn as_abs_area(&self) -> Option<&DeviceStateDataAbsArea> {
8094        match self {
8095            DeviceStateData::AbsArea(value) => Some(value),
8096            _ => None,
8097        }
8098    }
8099}
8100impl DeviceStateData {
8101    #[allow(dead_code)]
8102    fn serialize(&self, control_id: u16) -> Vec<u8> {
8103        let mut result = Vec::new();
8104        self.serialize_into(&mut result, u16::from(control_id));
8105        result
8106    }
8107    fn serialize_into(&self, bytes: &mut Vec<u8>, control_id: u16) {
8108        assert_eq!(self.switch_expr(), u16::from(control_id), "switch `data` has an inconsistent discriminant");
8109        match self {
8110            DeviceStateData::Resolution(resolution) => resolution.serialize_into(bytes),
8111            DeviceStateData::AbsCalib(abs_calib) => abs_calib.serialize_into(bytes),
8112            DeviceStateData::Core(core) => core.serialize_into(bytes),
8113            DeviceStateData::Enable(enable) => {
8114                bytes.reserve(4);
8115                enable.serialize_into(bytes);
8116                bytes.extend_from_slice(&[0; 3]);
8117            }
8118            DeviceStateData::AbsArea(abs_area) => abs_area.serialize_into(bytes),
8119            DeviceStateData::InvalidValue(_) => panic!("attempted to serialize invalid switch case"),
8120        }
8121    }
8122}
8123impl DeviceStateData {
8124    fn switch_expr(&self) -> u16 {
8125        match self {
8126            DeviceStateData::Resolution(_) => u16::from(DeviceControl::RESOLUTION),
8127            DeviceStateData::AbsCalib(_) => u16::from(DeviceControl::ABSCALIB),
8128            DeviceStateData::Core(_) => u16::from(DeviceControl::CORE),
8129            DeviceStateData::Enable(_) => u16::from(DeviceControl::ENABLE),
8130            DeviceStateData::AbsArea(_) => u16::from(DeviceControl::ABSAREA),
8131            DeviceStateData::InvalidValue(switch_expr) => *switch_expr,
8132        }
8133    }
8134}
8135
8136#[derive(Clone)]
8137#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8138#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8139pub struct DeviceState {
8140    pub len: u16,
8141    pub data: DeviceStateData,
8142}
8143impl_debug_if_no_extra_traits!(DeviceState, "DeviceState");
8144impl TryParse for DeviceState {
8145    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
8146        let (control_id, remaining) = u16::try_parse(remaining)?;
8147        let (len, remaining) = u16::try_parse(remaining)?;
8148        let (data, remaining) = DeviceStateData::try_parse(remaining, u16::from(control_id))?;
8149        let result = DeviceState { len, data };
8150        Ok((result, remaining))
8151    }
8152}
8153impl Serialize for DeviceState {
8154    type Bytes = Vec<u8>;
8155    fn serialize(&self) -> Vec<u8> {
8156        let mut result = Vec::new();
8157        self.serialize_into(&mut result);
8158        result
8159    }
8160    fn serialize_into(&self, bytes: &mut Vec<u8>) {
8161        bytes.reserve(4);
8162        let control_id: u16 = self.data.switch_expr();
8163        control_id.serialize_into(bytes);
8164        self.len.serialize_into(bytes);
8165        self.data.serialize_into(bytes, u16::from(control_id));
8166    }
8167}
8168
8169/// Opcode for the GetDeviceControl request
8170pub const GET_DEVICE_CONTROL_REQUEST: u8 = 34;
8171#[derive(Clone, Copy, Default)]
8172#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8173#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8174pub struct GetDeviceControlRequest {
8175    pub control_id: DeviceControl,
8176    pub device_id: u8,
8177}
8178impl_debug_if_no_extra_traits!(GetDeviceControlRequest, "GetDeviceControlRequest");
8179impl GetDeviceControlRequest {
8180    /// Serialize this request into bytes for the provided connection
8181    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
8182        let length_so_far = 0;
8183        let control_id_bytes = u16::from(self.control_id).serialize();
8184        let device_id_bytes = self.device_id.serialize();
8185        let mut request0 = vec![
8186            major_opcode,
8187            GET_DEVICE_CONTROL_REQUEST,
8188            0,
8189            0,
8190            control_id_bytes[0],
8191            control_id_bytes[1],
8192            device_id_bytes[0],
8193            0,
8194        ];
8195        let length_so_far = length_so_far + request0.len();
8196        assert_eq!(length_so_far % 4, 0);
8197        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
8198        request0[2..4].copy_from_slice(&length.to_ne_bytes());
8199        ([request0.into()], vec![])
8200    }
8201    /// Parse this request given its header, its body, and any fds that go along with it
8202    #[cfg(feature = "request-parsing")]
8203    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
8204        if header.minor_opcode != GET_DEVICE_CONTROL_REQUEST {
8205            return Err(ParseError::InvalidValue);
8206        }
8207        let (control_id, remaining) = u16::try_parse(value)?;
8208        let control_id = control_id.into();
8209        let (device_id, remaining) = u8::try_parse(remaining)?;
8210        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
8211        let _ = remaining;
8212        Ok(GetDeviceControlRequest {
8213            control_id,
8214            device_id,
8215        })
8216    }
8217}
8218impl Request for GetDeviceControlRequest {
8219    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
8220
8221    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
8222        let (bufs, fds) = self.serialize(major_opcode);
8223        // Flatten the buffers into a single vector
8224        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
8225        (buf, fds)
8226    }
8227}
8228impl crate::x11_utils::ReplyRequest for GetDeviceControlRequest {
8229    type Reply = GetDeviceControlReply;
8230}
8231
8232#[derive(Clone)]
8233#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8234#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8235pub struct GetDeviceControlReply {
8236    pub xi_reply_type: u8,
8237    pub sequence: u16,
8238    pub length: u32,
8239    pub status: u8,
8240    pub control: DeviceState,
8241}
8242impl_debug_if_no_extra_traits!(GetDeviceControlReply, "GetDeviceControlReply");
8243impl TryParse for GetDeviceControlReply {
8244    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
8245        let remaining = initial_value;
8246        let (response_type, remaining) = u8::try_parse(remaining)?;
8247        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
8248        let (sequence, remaining) = u16::try_parse(remaining)?;
8249        let (length, remaining) = u32::try_parse(remaining)?;
8250        let (status, remaining) = u8::try_parse(remaining)?;
8251        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
8252        let (control, remaining) = DeviceState::try_parse(remaining)?;
8253        if response_type != 1 {
8254            return Err(ParseError::InvalidValue);
8255        }
8256        let result = GetDeviceControlReply { xi_reply_type, sequence, length, status, control };
8257        let _ = remaining;
8258        let remaining = initial_value.get(32 + length as usize * 4..)
8259            .ok_or(ParseError::InsufficientData)?;
8260        Ok((result, remaining))
8261    }
8262}
8263impl Serialize for GetDeviceControlReply {
8264    type Bytes = Vec<u8>;
8265    fn serialize(&self) -> Vec<u8> {
8266        let mut result = Vec::new();
8267        self.serialize_into(&mut result);
8268        result
8269    }
8270    fn serialize_into(&self, bytes: &mut Vec<u8>) {
8271        bytes.reserve(32);
8272        let response_type_bytes = &[1];
8273        bytes.push(response_type_bytes[0]);
8274        self.xi_reply_type.serialize_into(bytes);
8275        self.sequence.serialize_into(bytes);
8276        self.length.serialize_into(bytes);
8277        self.status.serialize_into(bytes);
8278        bytes.extend_from_slice(&[0; 23]);
8279        self.control.serialize_into(bytes);
8280    }
8281}
8282
8283#[derive(Clone, Default)]
8284#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8285#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8286pub struct DeviceResolutionCtl {
8287    pub control_id: DeviceControl,
8288    pub len: u16,
8289    pub first_valuator: u8,
8290    pub resolution_values: Vec<u32>,
8291}
8292impl_debug_if_no_extra_traits!(DeviceResolutionCtl, "DeviceResolutionCtl");
8293impl TryParse for DeviceResolutionCtl {
8294    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
8295        let (control_id, remaining) = u16::try_parse(remaining)?;
8296        let (len, remaining) = u16::try_parse(remaining)?;
8297        let (first_valuator, remaining) = u8::try_parse(remaining)?;
8298        let (num_valuators, remaining) = u8::try_parse(remaining)?;
8299        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
8300        let (resolution_values, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_valuators.try_to_usize()?)?;
8301        let control_id = control_id.into();
8302        let result = DeviceResolutionCtl { control_id, len, first_valuator, resolution_values };
8303        Ok((result, remaining))
8304    }
8305}
8306impl Serialize for DeviceResolutionCtl {
8307    type Bytes = Vec<u8>;
8308    fn serialize(&self) -> Vec<u8> {
8309        let mut result = Vec::new();
8310        self.serialize_into(&mut result);
8311        result
8312    }
8313    fn serialize_into(&self, bytes: &mut Vec<u8>) {
8314        bytes.reserve(8);
8315        u16::from(self.control_id).serialize_into(bytes);
8316        self.len.serialize_into(bytes);
8317        self.first_valuator.serialize_into(bytes);
8318        let num_valuators = u8::try_from(self.resolution_values.len()).expect("`resolution_values` has too many elements");
8319        num_valuators.serialize_into(bytes);
8320        bytes.extend_from_slice(&[0; 2]);
8321        self.resolution_values.serialize_into(bytes);
8322    }
8323}
8324impl DeviceResolutionCtl {
8325    /// Get the value of the `num_valuators` field.
8326    ///
8327    /// The `num_valuators` field is used as the length field of the `resolution_values` field.
8328    /// This function computes the field's value again based on the length of the list.
8329    ///
8330    /// # Panics
8331    ///
8332    /// Panics if the value cannot be represented in the target type. This
8333    /// cannot happen with values of the struct received from the X11 server.
8334    pub fn num_valuators(&self) -> u8 {
8335        self.resolution_values.len()
8336            .try_into().unwrap()
8337    }
8338}
8339
8340#[derive(Clone, Copy, Default)]
8341#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8342#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8343pub struct DeviceAbsCalibCtl {
8344    pub control_id: DeviceControl,
8345    pub len: u16,
8346    pub min_x: i32,
8347    pub max_x: i32,
8348    pub min_y: i32,
8349    pub max_y: i32,
8350    pub flip_x: u32,
8351    pub flip_y: u32,
8352    pub rotation: u32,
8353    pub button_threshold: u32,
8354}
8355impl_debug_if_no_extra_traits!(DeviceAbsCalibCtl, "DeviceAbsCalibCtl");
8356impl TryParse for DeviceAbsCalibCtl {
8357    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
8358        let (control_id, remaining) = u16::try_parse(remaining)?;
8359        let (len, remaining) = u16::try_parse(remaining)?;
8360        let (min_x, remaining) = i32::try_parse(remaining)?;
8361        let (max_x, remaining) = i32::try_parse(remaining)?;
8362        let (min_y, remaining) = i32::try_parse(remaining)?;
8363        let (max_y, remaining) = i32::try_parse(remaining)?;
8364        let (flip_x, remaining) = u32::try_parse(remaining)?;
8365        let (flip_y, remaining) = u32::try_parse(remaining)?;
8366        let (rotation, remaining) = u32::try_parse(remaining)?;
8367        let (button_threshold, remaining) = u32::try_parse(remaining)?;
8368        let control_id = control_id.into();
8369        let result = DeviceAbsCalibCtl { control_id, len, min_x, max_x, min_y, max_y, flip_x, flip_y, rotation, button_threshold };
8370        Ok((result, remaining))
8371    }
8372}
8373impl Serialize for DeviceAbsCalibCtl {
8374    type Bytes = [u8; 36];
8375    fn serialize(&self) -> [u8; 36] {
8376        let control_id_bytes = u16::from(self.control_id).serialize();
8377        let len_bytes = self.len.serialize();
8378        let min_x_bytes = self.min_x.serialize();
8379        let max_x_bytes = self.max_x.serialize();
8380        let min_y_bytes = self.min_y.serialize();
8381        let max_y_bytes = self.max_y.serialize();
8382        let flip_x_bytes = self.flip_x.serialize();
8383        let flip_y_bytes = self.flip_y.serialize();
8384        let rotation_bytes = self.rotation.serialize();
8385        let button_threshold_bytes = self.button_threshold.serialize();
8386        [
8387            control_id_bytes[0],
8388            control_id_bytes[1],
8389            len_bytes[0],
8390            len_bytes[1],
8391            min_x_bytes[0],
8392            min_x_bytes[1],
8393            min_x_bytes[2],
8394            min_x_bytes[3],
8395            max_x_bytes[0],
8396            max_x_bytes[1],
8397            max_x_bytes[2],
8398            max_x_bytes[3],
8399            min_y_bytes[0],
8400            min_y_bytes[1],
8401            min_y_bytes[2],
8402            min_y_bytes[3],
8403            max_y_bytes[0],
8404            max_y_bytes[1],
8405            max_y_bytes[2],
8406            max_y_bytes[3],
8407            flip_x_bytes[0],
8408            flip_x_bytes[1],
8409            flip_x_bytes[2],
8410            flip_x_bytes[3],
8411            flip_y_bytes[0],
8412            flip_y_bytes[1],
8413            flip_y_bytes[2],
8414            flip_y_bytes[3],
8415            rotation_bytes[0],
8416            rotation_bytes[1],
8417            rotation_bytes[2],
8418            rotation_bytes[3],
8419            button_threshold_bytes[0],
8420            button_threshold_bytes[1],
8421            button_threshold_bytes[2],
8422            button_threshold_bytes[3],
8423        ]
8424    }
8425    fn serialize_into(&self, bytes: &mut Vec<u8>) {
8426        bytes.reserve(36);
8427        u16::from(self.control_id).serialize_into(bytes);
8428        self.len.serialize_into(bytes);
8429        self.min_x.serialize_into(bytes);
8430        self.max_x.serialize_into(bytes);
8431        self.min_y.serialize_into(bytes);
8432        self.max_y.serialize_into(bytes);
8433        self.flip_x.serialize_into(bytes);
8434        self.flip_y.serialize_into(bytes);
8435        self.rotation.serialize_into(bytes);
8436        self.button_threshold.serialize_into(bytes);
8437    }
8438}
8439
8440#[derive(Clone, Copy, Default)]
8441#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8442#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8443pub struct DeviceAbsAreaCtrl {
8444    pub control_id: DeviceControl,
8445    pub len: u16,
8446    pub offset_x: u32,
8447    pub offset_y: u32,
8448    pub width: i32,
8449    pub height: i32,
8450    pub screen: i32,
8451    pub following: u32,
8452}
8453impl_debug_if_no_extra_traits!(DeviceAbsAreaCtrl, "DeviceAbsAreaCtrl");
8454impl TryParse for DeviceAbsAreaCtrl {
8455    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
8456        let (control_id, remaining) = u16::try_parse(remaining)?;
8457        let (len, remaining) = u16::try_parse(remaining)?;
8458        let (offset_x, remaining) = u32::try_parse(remaining)?;
8459        let (offset_y, remaining) = u32::try_parse(remaining)?;
8460        let (width, remaining) = i32::try_parse(remaining)?;
8461        let (height, remaining) = i32::try_parse(remaining)?;
8462        let (screen, remaining) = i32::try_parse(remaining)?;
8463        let (following, remaining) = u32::try_parse(remaining)?;
8464        let control_id = control_id.into();
8465        let result = DeviceAbsAreaCtrl { control_id, len, offset_x, offset_y, width, height, screen, following };
8466        Ok((result, remaining))
8467    }
8468}
8469impl Serialize for DeviceAbsAreaCtrl {
8470    type Bytes = [u8; 28];
8471    fn serialize(&self) -> [u8; 28] {
8472        let control_id_bytes = u16::from(self.control_id).serialize();
8473        let len_bytes = self.len.serialize();
8474        let offset_x_bytes = self.offset_x.serialize();
8475        let offset_y_bytes = self.offset_y.serialize();
8476        let width_bytes = self.width.serialize();
8477        let height_bytes = self.height.serialize();
8478        let screen_bytes = self.screen.serialize();
8479        let following_bytes = self.following.serialize();
8480        [
8481            control_id_bytes[0],
8482            control_id_bytes[1],
8483            len_bytes[0],
8484            len_bytes[1],
8485            offset_x_bytes[0],
8486            offset_x_bytes[1],
8487            offset_x_bytes[2],
8488            offset_x_bytes[3],
8489            offset_y_bytes[0],
8490            offset_y_bytes[1],
8491            offset_y_bytes[2],
8492            offset_y_bytes[3],
8493            width_bytes[0],
8494            width_bytes[1],
8495            width_bytes[2],
8496            width_bytes[3],
8497            height_bytes[0],
8498            height_bytes[1],
8499            height_bytes[2],
8500            height_bytes[3],
8501            screen_bytes[0],
8502            screen_bytes[1],
8503            screen_bytes[2],
8504            screen_bytes[3],
8505            following_bytes[0],
8506            following_bytes[1],
8507            following_bytes[2],
8508            following_bytes[3],
8509        ]
8510    }
8511    fn serialize_into(&self, bytes: &mut Vec<u8>) {
8512        bytes.reserve(28);
8513        u16::from(self.control_id).serialize_into(bytes);
8514        self.len.serialize_into(bytes);
8515        self.offset_x.serialize_into(bytes);
8516        self.offset_y.serialize_into(bytes);
8517        self.width.serialize_into(bytes);
8518        self.height.serialize_into(bytes);
8519        self.screen.serialize_into(bytes);
8520        self.following.serialize_into(bytes);
8521    }
8522}
8523
8524#[derive(Clone, Copy, Default)]
8525#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8526#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8527pub struct DeviceCoreCtrl {
8528    pub control_id: DeviceControl,
8529    pub len: u16,
8530    pub status: u8,
8531}
8532impl_debug_if_no_extra_traits!(DeviceCoreCtrl, "DeviceCoreCtrl");
8533impl TryParse for DeviceCoreCtrl {
8534    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
8535        let (control_id, remaining) = u16::try_parse(remaining)?;
8536        let (len, remaining) = u16::try_parse(remaining)?;
8537        let (status, remaining) = u8::try_parse(remaining)?;
8538        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
8539        let control_id = control_id.into();
8540        let result = DeviceCoreCtrl { control_id, len, status };
8541        Ok((result, remaining))
8542    }
8543}
8544impl Serialize for DeviceCoreCtrl {
8545    type Bytes = [u8; 8];
8546    fn serialize(&self) -> [u8; 8] {
8547        let control_id_bytes = u16::from(self.control_id).serialize();
8548        let len_bytes = self.len.serialize();
8549        let status_bytes = self.status.serialize();
8550        [
8551            control_id_bytes[0],
8552            control_id_bytes[1],
8553            len_bytes[0],
8554            len_bytes[1],
8555            status_bytes[0],
8556            0,
8557            0,
8558            0,
8559        ]
8560    }
8561    fn serialize_into(&self, bytes: &mut Vec<u8>) {
8562        bytes.reserve(8);
8563        u16::from(self.control_id).serialize_into(bytes);
8564        self.len.serialize_into(bytes);
8565        self.status.serialize_into(bytes);
8566        bytes.extend_from_slice(&[0; 3]);
8567    }
8568}
8569
8570#[derive(Clone, Copy, Default)]
8571#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8572#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8573pub struct DeviceEnableCtrl {
8574    pub control_id: DeviceControl,
8575    pub len: u16,
8576    pub enable: u8,
8577}
8578impl_debug_if_no_extra_traits!(DeviceEnableCtrl, "DeviceEnableCtrl");
8579impl TryParse for DeviceEnableCtrl {
8580    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
8581        let (control_id, remaining) = u16::try_parse(remaining)?;
8582        let (len, remaining) = u16::try_parse(remaining)?;
8583        let (enable, remaining) = u8::try_parse(remaining)?;
8584        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
8585        let control_id = control_id.into();
8586        let result = DeviceEnableCtrl { control_id, len, enable };
8587        Ok((result, remaining))
8588    }
8589}
8590impl Serialize for DeviceEnableCtrl {
8591    type Bytes = [u8; 8];
8592    fn serialize(&self) -> [u8; 8] {
8593        let control_id_bytes = u16::from(self.control_id).serialize();
8594        let len_bytes = self.len.serialize();
8595        let enable_bytes = self.enable.serialize();
8596        [
8597            control_id_bytes[0],
8598            control_id_bytes[1],
8599            len_bytes[0],
8600            len_bytes[1],
8601            enable_bytes[0],
8602            0,
8603            0,
8604            0,
8605        ]
8606    }
8607    fn serialize_into(&self, bytes: &mut Vec<u8>) {
8608        bytes.reserve(8);
8609        u16::from(self.control_id).serialize_into(bytes);
8610        self.len.serialize_into(bytes);
8611        self.enable.serialize_into(bytes);
8612        bytes.extend_from_slice(&[0; 3]);
8613    }
8614}
8615
8616#[derive(Clone)]
8617#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8618#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8619pub struct DeviceCtlDataResolution {
8620    pub first_valuator: u8,
8621    pub resolution_values: Vec<u32>,
8622}
8623impl_debug_if_no_extra_traits!(DeviceCtlDataResolution, "DeviceCtlDataResolution");
8624impl TryParse for DeviceCtlDataResolution {
8625    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
8626        let (first_valuator, remaining) = u8::try_parse(remaining)?;
8627        let (num_valuators, remaining) = u8::try_parse(remaining)?;
8628        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
8629        let (resolution_values, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_valuators.try_to_usize()?)?;
8630        let result = DeviceCtlDataResolution { first_valuator, resolution_values };
8631        Ok((result, remaining))
8632    }
8633}
8634impl Serialize for DeviceCtlDataResolution {
8635    type Bytes = Vec<u8>;
8636    fn serialize(&self) -> Vec<u8> {
8637        let mut result = Vec::new();
8638        self.serialize_into(&mut result);
8639        result
8640    }
8641    fn serialize_into(&self, bytes: &mut Vec<u8>) {
8642        bytes.reserve(4);
8643        self.first_valuator.serialize_into(bytes);
8644        let num_valuators = u8::try_from(self.resolution_values.len()).expect("`resolution_values` has too many elements");
8645        num_valuators.serialize_into(bytes);
8646        bytes.extend_from_slice(&[0; 2]);
8647        self.resolution_values.serialize_into(bytes);
8648    }
8649}
8650impl DeviceCtlDataResolution {
8651    /// Get the value of the `num_valuators` field.
8652    ///
8653    /// The `num_valuators` field is used as the length field of the `resolution_values` field.
8654    /// This function computes the field's value again based on the length of the list.
8655    ///
8656    /// # Panics
8657    ///
8658    /// Panics if the value cannot be represented in the target type. This
8659    /// cannot happen with values of the struct received from the X11 server.
8660    pub fn num_valuators(&self) -> u8 {
8661        self.resolution_values.len()
8662            .try_into().unwrap()
8663    }
8664}
8665#[derive(Clone, Copy)]
8666#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8667#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8668pub struct DeviceCtlDataAbsCalib {
8669    pub min_x: i32,
8670    pub max_x: i32,
8671    pub min_y: i32,
8672    pub max_y: i32,
8673    pub flip_x: u32,
8674    pub flip_y: u32,
8675    pub rotation: u32,
8676    pub button_threshold: u32,
8677}
8678impl_debug_if_no_extra_traits!(DeviceCtlDataAbsCalib, "DeviceCtlDataAbsCalib");
8679impl TryParse for DeviceCtlDataAbsCalib {
8680    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
8681        let (min_x, remaining) = i32::try_parse(remaining)?;
8682        let (max_x, remaining) = i32::try_parse(remaining)?;
8683        let (min_y, remaining) = i32::try_parse(remaining)?;
8684        let (max_y, remaining) = i32::try_parse(remaining)?;
8685        let (flip_x, remaining) = u32::try_parse(remaining)?;
8686        let (flip_y, remaining) = u32::try_parse(remaining)?;
8687        let (rotation, remaining) = u32::try_parse(remaining)?;
8688        let (button_threshold, remaining) = u32::try_parse(remaining)?;
8689        let result = DeviceCtlDataAbsCalib { min_x, max_x, min_y, max_y, flip_x, flip_y, rotation, button_threshold };
8690        Ok((result, remaining))
8691    }
8692}
8693impl Serialize for DeviceCtlDataAbsCalib {
8694    type Bytes = [u8; 32];
8695    fn serialize(&self) -> [u8; 32] {
8696        let min_x_bytes = self.min_x.serialize();
8697        let max_x_bytes = self.max_x.serialize();
8698        let min_y_bytes = self.min_y.serialize();
8699        let max_y_bytes = self.max_y.serialize();
8700        let flip_x_bytes = self.flip_x.serialize();
8701        let flip_y_bytes = self.flip_y.serialize();
8702        let rotation_bytes = self.rotation.serialize();
8703        let button_threshold_bytes = self.button_threshold.serialize();
8704        [
8705            min_x_bytes[0],
8706            min_x_bytes[1],
8707            min_x_bytes[2],
8708            min_x_bytes[3],
8709            max_x_bytes[0],
8710            max_x_bytes[1],
8711            max_x_bytes[2],
8712            max_x_bytes[3],
8713            min_y_bytes[0],
8714            min_y_bytes[1],
8715            min_y_bytes[2],
8716            min_y_bytes[3],
8717            max_y_bytes[0],
8718            max_y_bytes[1],
8719            max_y_bytes[2],
8720            max_y_bytes[3],
8721            flip_x_bytes[0],
8722            flip_x_bytes[1],
8723            flip_x_bytes[2],
8724            flip_x_bytes[3],
8725            flip_y_bytes[0],
8726            flip_y_bytes[1],
8727            flip_y_bytes[2],
8728            flip_y_bytes[3],
8729            rotation_bytes[0],
8730            rotation_bytes[1],
8731            rotation_bytes[2],
8732            rotation_bytes[3],
8733            button_threshold_bytes[0],
8734            button_threshold_bytes[1],
8735            button_threshold_bytes[2],
8736            button_threshold_bytes[3],
8737        ]
8738    }
8739    fn serialize_into(&self, bytes: &mut Vec<u8>) {
8740        bytes.reserve(32);
8741        self.min_x.serialize_into(bytes);
8742        self.max_x.serialize_into(bytes);
8743        self.min_y.serialize_into(bytes);
8744        self.max_y.serialize_into(bytes);
8745        self.flip_x.serialize_into(bytes);
8746        self.flip_y.serialize_into(bytes);
8747        self.rotation.serialize_into(bytes);
8748        self.button_threshold.serialize_into(bytes);
8749    }
8750}
8751#[derive(Clone, Copy)]
8752#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8753#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8754pub struct DeviceCtlDataCore {
8755    pub status: u8,
8756}
8757impl_debug_if_no_extra_traits!(DeviceCtlDataCore, "DeviceCtlDataCore");
8758impl TryParse for DeviceCtlDataCore {
8759    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
8760        let (status, remaining) = u8::try_parse(remaining)?;
8761        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
8762        let result = DeviceCtlDataCore { status };
8763        Ok((result, remaining))
8764    }
8765}
8766impl Serialize for DeviceCtlDataCore {
8767    type Bytes = [u8; 4];
8768    fn serialize(&self) -> [u8; 4] {
8769        let status_bytes = self.status.serialize();
8770        [
8771            status_bytes[0],
8772            0,
8773            0,
8774            0,
8775        ]
8776    }
8777    fn serialize_into(&self, bytes: &mut Vec<u8>) {
8778        bytes.reserve(4);
8779        self.status.serialize_into(bytes);
8780        bytes.extend_from_slice(&[0; 3]);
8781    }
8782}
8783#[derive(Clone, Copy)]
8784#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8785#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8786pub struct DeviceCtlDataAbsArea {
8787    pub offset_x: u32,
8788    pub offset_y: u32,
8789    pub width: i32,
8790    pub height: i32,
8791    pub screen: i32,
8792    pub following: u32,
8793}
8794impl_debug_if_no_extra_traits!(DeviceCtlDataAbsArea, "DeviceCtlDataAbsArea");
8795impl TryParse for DeviceCtlDataAbsArea {
8796    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
8797        let (offset_x, remaining) = u32::try_parse(remaining)?;
8798        let (offset_y, remaining) = u32::try_parse(remaining)?;
8799        let (width, remaining) = i32::try_parse(remaining)?;
8800        let (height, remaining) = i32::try_parse(remaining)?;
8801        let (screen, remaining) = i32::try_parse(remaining)?;
8802        let (following, remaining) = u32::try_parse(remaining)?;
8803        let result = DeviceCtlDataAbsArea { offset_x, offset_y, width, height, screen, following };
8804        Ok((result, remaining))
8805    }
8806}
8807impl Serialize for DeviceCtlDataAbsArea {
8808    type Bytes = [u8; 24];
8809    fn serialize(&self) -> [u8; 24] {
8810        let offset_x_bytes = self.offset_x.serialize();
8811        let offset_y_bytes = self.offset_y.serialize();
8812        let width_bytes = self.width.serialize();
8813        let height_bytes = self.height.serialize();
8814        let screen_bytes = self.screen.serialize();
8815        let following_bytes = self.following.serialize();
8816        [
8817            offset_x_bytes[0],
8818            offset_x_bytes[1],
8819            offset_x_bytes[2],
8820            offset_x_bytes[3],
8821            offset_y_bytes[0],
8822            offset_y_bytes[1],
8823            offset_y_bytes[2],
8824            offset_y_bytes[3],
8825            width_bytes[0],
8826            width_bytes[1],
8827            width_bytes[2],
8828            width_bytes[3],
8829            height_bytes[0],
8830            height_bytes[1],
8831            height_bytes[2],
8832            height_bytes[3],
8833            screen_bytes[0],
8834            screen_bytes[1],
8835            screen_bytes[2],
8836            screen_bytes[3],
8837            following_bytes[0],
8838            following_bytes[1],
8839            following_bytes[2],
8840            following_bytes[3],
8841        ]
8842    }
8843    fn serialize_into(&self, bytes: &mut Vec<u8>) {
8844        bytes.reserve(24);
8845        self.offset_x.serialize_into(bytes);
8846        self.offset_y.serialize_into(bytes);
8847        self.width.serialize_into(bytes);
8848        self.height.serialize_into(bytes);
8849        self.screen.serialize_into(bytes);
8850        self.following.serialize_into(bytes);
8851    }
8852}
8853#[derive(Clone)]
8854#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8855#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8856pub enum DeviceCtlData {
8857    Resolution(DeviceCtlDataResolution),
8858    AbsCalib(DeviceCtlDataAbsCalib),
8859    Core(DeviceCtlDataCore),
8860    Enable(u8),
8861    AbsArea(DeviceCtlDataAbsArea),
8862    /// This variant is returned when the server sends a discriminant
8863    /// value that does not match any of the defined by the protocol.
8864    ///
8865    /// Usually, this should be considered a parsing error, but there
8866    /// are some cases where the server violates the protocol.
8867    ///
8868    /// Trying to use `serialize` or `serialize_into` with this variant
8869    /// will raise a panic.
8870    InvalidValue(u16),
8871}
8872impl_debug_if_no_extra_traits!(DeviceCtlData, "DeviceCtlData");
8873impl DeviceCtlData {
8874    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
8875    fn try_parse(value: &[u8], control_id: u16) -> Result<(Self, &[u8]), ParseError> {
8876        let switch_expr = u16::from(control_id);
8877        let mut outer_remaining = value;
8878        let mut parse_result = None;
8879        if switch_expr == u16::from(DeviceControl::RESOLUTION) {
8880            let (resolution, new_remaining) = DeviceCtlDataResolution::try_parse(outer_remaining)?;
8881            outer_remaining = new_remaining;
8882            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
8883            parse_result = Some(DeviceCtlData::Resolution(resolution));
8884        }
8885        if switch_expr == u16::from(DeviceControl::ABSCALIB) {
8886            let (abs_calib, new_remaining) = DeviceCtlDataAbsCalib::try_parse(outer_remaining)?;
8887            outer_remaining = new_remaining;
8888            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
8889            parse_result = Some(DeviceCtlData::AbsCalib(abs_calib));
8890        }
8891        if switch_expr == u16::from(DeviceControl::CORE) {
8892            let (core, new_remaining) = DeviceCtlDataCore::try_parse(outer_remaining)?;
8893            outer_remaining = new_remaining;
8894            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
8895            parse_result = Some(DeviceCtlData::Core(core));
8896        }
8897        if switch_expr == u16::from(DeviceControl::ENABLE) {
8898            let remaining = outer_remaining;
8899            let (enable, remaining) = u8::try_parse(remaining)?;
8900            let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
8901            outer_remaining = remaining;
8902            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
8903            parse_result = Some(DeviceCtlData::Enable(enable));
8904        }
8905        if switch_expr == u16::from(DeviceControl::ABSAREA) {
8906            let (abs_area, new_remaining) = DeviceCtlDataAbsArea::try_parse(outer_remaining)?;
8907            outer_remaining = new_remaining;
8908            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
8909            parse_result = Some(DeviceCtlData::AbsArea(abs_area));
8910        }
8911        match parse_result {
8912            None => Ok((DeviceCtlData::InvalidValue(switch_expr), &[])),
8913            Some(result) => Ok((result, outer_remaining)),
8914        }
8915    }
8916}
8917impl DeviceCtlData {
8918    pub fn as_resolution(&self) -> Option<&DeviceCtlDataResolution> {
8919        match self {
8920            DeviceCtlData::Resolution(value) => Some(value),
8921            _ => None,
8922        }
8923    }
8924    pub fn as_abs_calib(&self) -> Option<&DeviceCtlDataAbsCalib> {
8925        match self {
8926            DeviceCtlData::AbsCalib(value) => Some(value),
8927            _ => None,
8928        }
8929    }
8930    pub fn as_core(&self) -> Option<&DeviceCtlDataCore> {
8931        match self {
8932            DeviceCtlData::Core(value) => Some(value),
8933            _ => None,
8934        }
8935    }
8936    pub fn as_enable(&self) -> Option<&u8> {
8937        match self {
8938            DeviceCtlData::Enable(value) => Some(value),
8939            _ => None,
8940        }
8941    }
8942    pub fn as_abs_area(&self) -> Option<&DeviceCtlDataAbsArea> {
8943        match self {
8944            DeviceCtlData::AbsArea(value) => Some(value),
8945            _ => None,
8946        }
8947    }
8948}
8949impl DeviceCtlData {
8950    #[allow(dead_code)]
8951    fn serialize(&self, control_id: u16) -> Vec<u8> {
8952        let mut result = Vec::new();
8953        self.serialize_into(&mut result, u16::from(control_id));
8954        result
8955    }
8956    fn serialize_into(&self, bytes: &mut Vec<u8>, control_id: u16) {
8957        assert_eq!(self.switch_expr(), u16::from(control_id), "switch `data` has an inconsistent discriminant");
8958        match self {
8959            DeviceCtlData::Resolution(resolution) => resolution.serialize_into(bytes),
8960            DeviceCtlData::AbsCalib(abs_calib) => abs_calib.serialize_into(bytes),
8961            DeviceCtlData::Core(core) => core.serialize_into(bytes),
8962            DeviceCtlData::Enable(enable) => {
8963                bytes.reserve(4);
8964                enable.serialize_into(bytes);
8965                bytes.extend_from_slice(&[0; 3]);
8966            }
8967            DeviceCtlData::AbsArea(abs_area) => abs_area.serialize_into(bytes),
8968            DeviceCtlData::InvalidValue(_) => panic!("attempted to serialize invalid switch case"),
8969        }
8970    }
8971}
8972impl DeviceCtlData {
8973    fn switch_expr(&self) -> u16 {
8974        match self {
8975            DeviceCtlData::Resolution(_) => u16::from(DeviceControl::RESOLUTION),
8976            DeviceCtlData::AbsCalib(_) => u16::from(DeviceControl::ABSCALIB),
8977            DeviceCtlData::Core(_) => u16::from(DeviceControl::CORE),
8978            DeviceCtlData::Enable(_) => u16::from(DeviceControl::ENABLE),
8979            DeviceCtlData::AbsArea(_) => u16::from(DeviceControl::ABSAREA),
8980            DeviceCtlData::InvalidValue(switch_expr) => *switch_expr,
8981        }
8982    }
8983}
8984
8985#[derive(Clone)]
8986#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
8987#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8988pub struct DeviceCtl {
8989    pub len: u16,
8990    pub data: DeviceCtlData,
8991}
8992impl_debug_if_no_extra_traits!(DeviceCtl, "DeviceCtl");
8993impl TryParse for DeviceCtl {
8994    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
8995        let (control_id, remaining) = u16::try_parse(remaining)?;
8996        let (len, remaining) = u16::try_parse(remaining)?;
8997        let (data, remaining) = DeviceCtlData::try_parse(remaining, u16::from(control_id))?;
8998        let result = DeviceCtl { len, data };
8999        Ok((result, remaining))
9000    }
9001}
9002impl Serialize for DeviceCtl {
9003    type Bytes = Vec<u8>;
9004    fn serialize(&self) -> Vec<u8> {
9005        let mut result = Vec::new();
9006        self.serialize_into(&mut result);
9007        result
9008    }
9009    fn serialize_into(&self, bytes: &mut Vec<u8>) {
9010        bytes.reserve(4);
9011        let control_id: u16 = self.data.switch_expr();
9012        control_id.serialize_into(bytes);
9013        self.len.serialize_into(bytes);
9014        self.data.serialize_into(bytes, u16::from(control_id));
9015    }
9016}
9017
9018/// Opcode for the ChangeDeviceControl request
9019pub const CHANGE_DEVICE_CONTROL_REQUEST: u8 = 35;
9020#[derive(Clone)]
9021#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9022#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9023pub struct ChangeDeviceControlRequest {
9024    pub control_id: DeviceControl,
9025    pub device_id: u8,
9026    pub control: DeviceCtl,
9027}
9028impl_debug_if_no_extra_traits!(ChangeDeviceControlRequest, "ChangeDeviceControlRequest");
9029impl ChangeDeviceControlRequest {
9030    /// Serialize this request into bytes for the provided connection
9031    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 3]> {
9032        let length_so_far = 0;
9033        let control_id_bytes = u16::from(self.control_id).serialize();
9034        let device_id_bytes = self.device_id.serialize();
9035        let mut request0 = vec![
9036            major_opcode,
9037            CHANGE_DEVICE_CONTROL_REQUEST,
9038            0,
9039            0,
9040            control_id_bytes[0],
9041            control_id_bytes[1],
9042            device_id_bytes[0],
9043            0,
9044        ];
9045        let length_so_far = length_so_far + request0.len();
9046        let control_bytes = self.control.serialize();
9047        let length_so_far = length_so_far + control_bytes.len();
9048        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
9049        let length_so_far = length_so_far + padding0.len();
9050        assert_eq!(length_so_far % 4, 0);
9051        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
9052        request0[2..4].copy_from_slice(&length.to_ne_bytes());
9053        ([request0.into(), control_bytes.into(), padding0.into()], vec![])
9054    }
9055    /// Parse this request given its header, its body, and any fds that go along with it
9056    #[cfg(feature = "request-parsing")]
9057    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
9058        if header.minor_opcode != CHANGE_DEVICE_CONTROL_REQUEST {
9059            return Err(ParseError::InvalidValue);
9060        }
9061        let (control_id, remaining) = u16::try_parse(value)?;
9062        let control_id = control_id.into();
9063        let (device_id, remaining) = u8::try_parse(remaining)?;
9064        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
9065        let (control, remaining) = DeviceCtl::try_parse(remaining)?;
9066        let _ = remaining;
9067        Ok(ChangeDeviceControlRequest {
9068            control_id,
9069            device_id,
9070            control,
9071        })
9072    }
9073}
9074impl Request for ChangeDeviceControlRequest {
9075    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
9076
9077    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
9078        let (bufs, fds) = self.serialize(major_opcode);
9079        // Flatten the buffers into a single vector
9080        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
9081        (buf, fds)
9082    }
9083}
9084impl crate::x11_utils::ReplyRequest for ChangeDeviceControlRequest {
9085    type Reply = ChangeDeviceControlReply;
9086}
9087
9088#[derive(Clone, Copy, Default)]
9089#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9090#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9091pub struct ChangeDeviceControlReply {
9092    pub xi_reply_type: u8,
9093    pub sequence: u16,
9094    pub length: u32,
9095    pub status: u8,
9096}
9097impl_debug_if_no_extra_traits!(ChangeDeviceControlReply, "ChangeDeviceControlReply");
9098impl TryParse for ChangeDeviceControlReply {
9099    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
9100        let remaining = initial_value;
9101        let (response_type, remaining) = u8::try_parse(remaining)?;
9102        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
9103        let (sequence, remaining) = u16::try_parse(remaining)?;
9104        let (length, remaining) = u32::try_parse(remaining)?;
9105        let (status, remaining) = u8::try_parse(remaining)?;
9106        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
9107        if response_type != 1 {
9108            return Err(ParseError::InvalidValue);
9109        }
9110        let result = ChangeDeviceControlReply { xi_reply_type, sequence, length, status };
9111        let _ = remaining;
9112        let remaining = initial_value.get(32 + length as usize * 4..)
9113            .ok_or(ParseError::InsufficientData)?;
9114        Ok((result, remaining))
9115    }
9116}
9117impl Serialize for ChangeDeviceControlReply {
9118    type Bytes = [u8; 32];
9119    fn serialize(&self) -> [u8; 32] {
9120        let response_type_bytes = &[1];
9121        let xi_reply_type_bytes = self.xi_reply_type.serialize();
9122        let sequence_bytes = self.sequence.serialize();
9123        let length_bytes = self.length.serialize();
9124        let status_bytes = self.status.serialize();
9125        [
9126            response_type_bytes[0],
9127            xi_reply_type_bytes[0],
9128            sequence_bytes[0],
9129            sequence_bytes[1],
9130            length_bytes[0],
9131            length_bytes[1],
9132            length_bytes[2],
9133            length_bytes[3],
9134            status_bytes[0],
9135            0,
9136            0,
9137            0,
9138            0,
9139            0,
9140            0,
9141            0,
9142            0,
9143            0,
9144            0,
9145            0,
9146            0,
9147            0,
9148            0,
9149            0,
9150            0,
9151            0,
9152            0,
9153            0,
9154            0,
9155            0,
9156            0,
9157            0,
9158        ]
9159    }
9160    fn serialize_into(&self, bytes: &mut Vec<u8>) {
9161        bytes.reserve(32);
9162        let response_type_bytes = &[1];
9163        bytes.push(response_type_bytes[0]);
9164        self.xi_reply_type.serialize_into(bytes);
9165        self.sequence.serialize_into(bytes);
9166        self.length.serialize_into(bytes);
9167        self.status.serialize_into(bytes);
9168        bytes.extend_from_slice(&[0; 23]);
9169    }
9170}
9171
9172/// Opcode for the ListDeviceProperties request
9173pub const LIST_DEVICE_PROPERTIES_REQUEST: u8 = 36;
9174#[derive(Clone, Copy, Default)]
9175#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9176#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9177pub struct ListDevicePropertiesRequest {
9178    pub device_id: u8,
9179}
9180impl_debug_if_no_extra_traits!(ListDevicePropertiesRequest, "ListDevicePropertiesRequest");
9181impl ListDevicePropertiesRequest {
9182    /// Serialize this request into bytes for the provided connection
9183    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
9184        let length_so_far = 0;
9185        let device_id_bytes = self.device_id.serialize();
9186        let mut request0 = vec![
9187            major_opcode,
9188            LIST_DEVICE_PROPERTIES_REQUEST,
9189            0,
9190            0,
9191            device_id_bytes[0],
9192            0,
9193            0,
9194            0,
9195        ];
9196        let length_so_far = length_so_far + request0.len();
9197        assert_eq!(length_so_far % 4, 0);
9198        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
9199        request0[2..4].copy_from_slice(&length.to_ne_bytes());
9200        ([request0.into()], vec![])
9201    }
9202    /// Parse this request given its header, its body, and any fds that go along with it
9203    #[cfg(feature = "request-parsing")]
9204    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
9205        if header.minor_opcode != LIST_DEVICE_PROPERTIES_REQUEST {
9206            return Err(ParseError::InvalidValue);
9207        }
9208        let (device_id, remaining) = u8::try_parse(value)?;
9209        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
9210        let _ = remaining;
9211        Ok(ListDevicePropertiesRequest {
9212            device_id,
9213        })
9214    }
9215}
9216impl Request for ListDevicePropertiesRequest {
9217    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
9218
9219    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
9220        let (bufs, fds) = self.serialize(major_opcode);
9221        // Flatten the buffers into a single vector
9222        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
9223        (buf, fds)
9224    }
9225}
9226impl crate::x11_utils::ReplyRequest for ListDevicePropertiesRequest {
9227    type Reply = ListDevicePropertiesReply;
9228}
9229
9230#[derive(Clone, Default)]
9231#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9232#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9233pub struct ListDevicePropertiesReply {
9234    pub xi_reply_type: u8,
9235    pub sequence: u16,
9236    pub length: u32,
9237    pub atoms: Vec<xproto::Atom>,
9238}
9239impl_debug_if_no_extra_traits!(ListDevicePropertiesReply, "ListDevicePropertiesReply");
9240impl TryParse for ListDevicePropertiesReply {
9241    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
9242        let remaining = initial_value;
9243        let (response_type, remaining) = u8::try_parse(remaining)?;
9244        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
9245        let (sequence, remaining) = u16::try_parse(remaining)?;
9246        let (length, remaining) = u32::try_parse(remaining)?;
9247        let (num_atoms, remaining) = u16::try_parse(remaining)?;
9248        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
9249        let (atoms, remaining) = crate::x11_utils::parse_list::<xproto::Atom>(remaining, num_atoms.try_to_usize()?)?;
9250        if response_type != 1 {
9251            return Err(ParseError::InvalidValue);
9252        }
9253        let result = ListDevicePropertiesReply { xi_reply_type, sequence, length, atoms };
9254        let _ = remaining;
9255        let remaining = initial_value.get(32 + length as usize * 4..)
9256            .ok_or(ParseError::InsufficientData)?;
9257        Ok((result, remaining))
9258    }
9259}
9260impl Serialize for ListDevicePropertiesReply {
9261    type Bytes = Vec<u8>;
9262    fn serialize(&self) -> Vec<u8> {
9263        let mut result = Vec::new();
9264        self.serialize_into(&mut result);
9265        result
9266    }
9267    fn serialize_into(&self, bytes: &mut Vec<u8>) {
9268        bytes.reserve(32);
9269        let response_type_bytes = &[1];
9270        bytes.push(response_type_bytes[0]);
9271        self.xi_reply_type.serialize_into(bytes);
9272        self.sequence.serialize_into(bytes);
9273        self.length.serialize_into(bytes);
9274        let num_atoms = u16::try_from(self.atoms.len()).expect("`atoms` has too many elements");
9275        num_atoms.serialize_into(bytes);
9276        bytes.extend_from_slice(&[0; 22]);
9277        self.atoms.serialize_into(bytes);
9278    }
9279}
9280impl ListDevicePropertiesReply {
9281    /// Get the value of the `num_atoms` field.
9282    ///
9283    /// The `num_atoms` field is used as the length field of the `atoms` field.
9284    /// This function computes the field's value again based on the length of the list.
9285    ///
9286    /// # Panics
9287    ///
9288    /// Panics if the value cannot be represented in the target type. This
9289    /// cannot happen with values of the struct received from the X11 server.
9290    pub fn num_atoms(&self) -> u16 {
9291        self.atoms.len()
9292            .try_into().unwrap()
9293    }
9294}
9295
9296#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
9297#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9298pub struct PropertyFormat(u8);
9299impl PropertyFormat {
9300    pub const M8_BITS: Self = Self(8);
9301    pub const M16_BITS: Self = Self(16);
9302    pub const M32_BITS: Self = Self(32);
9303}
9304impl From<PropertyFormat> for u8 {
9305    #[inline]
9306    fn from(input: PropertyFormat) -> Self {
9307        input.0
9308    }
9309}
9310impl From<PropertyFormat> for Option<u8> {
9311    #[inline]
9312    fn from(input: PropertyFormat) -> Self {
9313        Some(input.0)
9314    }
9315}
9316impl From<PropertyFormat> for u16 {
9317    #[inline]
9318    fn from(input: PropertyFormat) -> Self {
9319        u16::from(input.0)
9320    }
9321}
9322impl From<PropertyFormat> for Option<u16> {
9323    #[inline]
9324    fn from(input: PropertyFormat) -> Self {
9325        Some(u16::from(input.0))
9326    }
9327}
9328impl From<PropertyFormat> for u32 {
9329    #[inline]
9330    fn from(input: PropertyFormat) -> Self {
9331        u32::from(input.0)
9332    }
9333}
9334impl From<PropertyFormat> for Option<u32> {
9335    #[inline]
9336    fn from(input: PropertyFormat) -> Self {
9337        Some(u32::from(input.0))
9338    }
9339}
9340impl From<u8> for PropertyFormat {
9341    #[inline]
9342    fn from(value: u8) -> Self {
9343        Self(value)
9344    }
9345}
9346impl core::fmt::Debug for PropertyFormat  {
9347    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
9348        let variants = [
9349            (Self::M8_BITS.0.into(), "M8_BITS", "M8Bits"),
9350            (Self::M16_BITS.0.into(), "M16_BITS", "M16Bits"),
9351            (Self::M32_BITS.0.into(), "M32_BITS", "M32Bits"),
9352        ];
9353        pretty_print_enum(fmt, self.0.into(), &variants)
9354    }
9355}
9356
9357#[derive(Clone)]
9358#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9359#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9360pub enum ChangeDevicePropertyAux {
9361    Data8(Vec<u8>),
9362    Data16(Vec<u16>),
9363    Data32(Vec<u32>),
9364    /// This variant is returned when the server sends a discriminant
9365    /// value that does not match any of the defined by the protocol.
9366    ///
9367    /// Usually, this should be considered a parsing error, but there
9368    /// are some cases where the server violates the protocol.
9369    ///
9370    /// Trying to use `serialize` or `serialize_into` with this variant
9371    /// will raise a panic.
9372    InvalidValue(u8),
9373}
9374impl_debug_if_no_extra_traits!(ChangeDevicePropertyAux, "ChangeDevicePropertyAux");
9375impl ChangeDevicePropertyAux {
9376    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
9377    fn try_parse(value: &[u8], format: u8, num_items: u32) -> Result<(Self, &[u8]), ParseError> {
9378        let switch_expr = u8::from(format);
9379        let mut outer_remaining = value;
9380        let mut parse_result = None;
9381        if switch_expr == u8::from(PropertyFormat::M8_BITS) {
9382            let remaining = outer_remaining;
9383            let value = remaining;
9384            let (data8, remaining) = crate::x11_utils::parse_u8_list(remaining, num_items.try_to_usize()?)?;
9385            let data8 = data8.to_vec();
9386            // Align offset to multiple of 4
9387            let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
9388            let misalignment = (4 - (offset % 4)) % 4;
9389            let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
9390            outer_remaining = remaining;
9391            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
9392            parse_result = Some(ChangeDevicePropertyAux::Data8(data8));
9393        }
9394        if switch_expr == u8::from(PropertyFormat::M16_BITS) {
9395            let remaining = outer_remaining;
9396            let value = remaining;
9397            let (data16, remaining) = crate::x11_utils::parse_list::<u16>(remaining, num_items.try_to_usize()?)?;
9398            // Align offset to multiple of 4
9399            let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
9400            let misalignment = (4 - (offset % 4)) % 4;
9401            let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
9402            outer_remaining = remaining;
9403            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
9404            parse_result = Some(ChangeDevicePropertyAux::Data16(data16));
9405        }
9406        if switch_expr == u8::from(PropertyFormat::M32_BITS) {
9407            let remaining = outer_remaining;
9408            let (data32, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_items.try_to_usize()?)?;
9409            outer_remaining = remaining;
9410            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
9411            parse_result = Some(ChangeDevicePropertyAux::Data32(data32));
9412        }
9413        match parse_result {
9414            None => Ok((ChangeDevicePropertyAux::InvalidValue(switch_expr), &[])),
9415            Some(result) => Ok((result, outer_remaining)),
9416        }
9417    }
9418}
9419impl ChangeDevicePropertyAux {
9420    pub fn as_data8(&self) -> Option<&Vec<u8>> {
9421        match self {
9422            ChangeDevicePropertyAux::Data8(value) => Some(value),
9423            _ => None,
9424        }
9425    }
9426    pub fn as_data16(&self) -> Option<&Vec<u16>> {
9427        match self {
9428            ChangeDevicePropertyAux::Data16(value) => Some(value),
9429            _ => None,
9430        }
9431    }
9432    pub fn as_data32(&self) -> Option<&Vec<u32>> {
9433        match self {
9434            ChangeDevicePropertyAux::Data32(value) => Some(value),
9435            _ => None,
9436        }
9437    }
9438}
9439impl ChangeDevicePropertyAux {
9440    #[allow(dead_code)]
9441    fn serialize(&self, format: u8, num_items: u32) -> Vec<u8> {
9442        let mut result = Vec::new();
9443        self.serialize_into(&mut result, u8::from(format), u32::from(num_items));
9444        result
9445    }
9446    fn serialize_into(&self, bytes: &mut Vec<u8>, format: u8, num_items: u32) {
9447        assert_eq!(self.switch_expr(), u8::from(format), "switch `items` has an inconsistent discriminant");
9448        match self {
9449            ChangeDevicePropertyAux::Data8(data8) => {
9450                assert_eq!(data8.len(), usize::try_from(num_items).unwrap(), "`data8` has an incorrect length");
9451                bytes.extend_from_slice(&data8);
9452                bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
9453            }
9454            ChangeDevicePropertyAux::Data16(data16) => {
9455                assert_eq!(data16.len(), usize::try_from(num_items).unwrap(), "`data16` has an incorrect length");
9456                data16.serialize_into(bytes);
9457                bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
9458            }
9459            ChangeDevicePropertyAux::Data32(data32) => {
9460                assert_eq!(data32.len(), usize::try_from(num_items).unwrap(), "`data32` has an incorrect length");
9461                data32.serialize_into(bytes);
9462            }
9463            ChangeDevicePropertyAux::InvalidValue(_) => panic!("attempted to serialize invalid switch case"),
9464        }
9465    }
9466}
9467impl ChangeDevicePropertyAux {
9468    fn switch_expr(&self) -> u8 {
9469        match self {
9470            ChangeDevicePropertyAux::Data8(_) => u8::from(PropertyFormat::M8_BITS),
9471            ChangeDevicePropertyAux::Data16(_) => u8::from(PropertyFormat::M16_BITS),
9472            ChangeDevicePropertyAux::Data32(_) => u8::from(PropertyFormat::M32_BITS),
9473            ChangeDevicePropertyAux::InvalidValue(switch_expr) => *switch_expr,
9474        }
9475    }
9476}
9477
9478/// Opcode for the ChangeDeviceProperty request
9479pub const CHANGE_DEVICE_PROPERTY_REQUEST: u8 = 37;
9480#[derive(Clone)]
9481#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9482#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9483pub struct ChangeDevicePropertyRequest<'input> {
9484    pub property: xproto::Atom,
9485    pub type_: xproto::Atom,
9486    pub device_id: u8,
9487    pub mode: xproto::PropMode,
9488    pub num_items: u32,
9489    pub items: Cow<'input, ChangeDevicePropertyAux>,
9490}
9491impl_debug_if_no_extra_traits!(ChangeDevicePropertyRequest<'_>, "ChangeDevicePropertyRequest");
9492impl<'input> ChangeDevicePropertyRequest<'input> {
9493    /// Serialize this request into bytes for the provided connection
9494    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
9495        let length_so_far = 0;
9496        let property_bytes = self.property.serialize();
9497        let type_bytes = self.type_.serialize();
9498        let device_id_bytes = self.device_id.serialize();
9499        let format: u8 = self.items.switch_expr();
9500        let format_bytes = format.serialize();
9501        let mode_bytes = u8::from(self.mode).serialize();
9502        let num_items_bytes = self.num_items.serialize();
9503        let mut request0 = vec![
9504            major_opcode,
9505            CHANGE_DEVICE_PROPERTY_REQUEST,
9506            0,
9507            0,
9508            property_bytes[0],
9509            property_bytes[1],
9510            property_bytes[2],
9511            property_bytes[3],
9512            type_bytes[0],
9513            type_bytes[1],
9514            type_bytes[2],
9515            type_bytes[3],
9516            device_id_bytes[0],
9517            format_bytes[0],
9518            mode_bytes[0],
9519            0,
9520            num_items_bytes[0],
9521            num_items_bytes[1],
9522            num_items_bytes[2],
9523            num_items_bytes[3],
9524        ];
9525        let length_so_far = length_so_far + request0.len();
9526        let items_bytes = self.items.serialize(u8::from(format), u32::from(self.num_items));
9527        let length_so_far = length_so_far + items_bytes.len();
9528        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
9529        let length_so_far = length_so_far + padding0.len();
9530        assert_eq!(length_so_far % 4, 0);
9531        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
9532        request0[2..4].copy_from_slice(&length.to_ne_bytes());
9533        ([request0.into(), items_bytes.into(), padding0.into()], vec![])
9534    }
9535    /// Parse this request given its header, its body, and any fds that go along with it
9536    #[cfg(feature = "request-parsing")]
9537    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
9538        if header.minor_opcode != CHANGE_DEVICE_PROPERTY_REQUEST {
9539            return Err(ParseError::InvalidValue);
9540        }
9541        let (property, remaining) = xproto::Atom::try_parse(value)?;
9542        let (type_, remaining) = xproto::Atom::try_parse(remaining)?;
9543        let (device_id, remaining) = u8::try_parse(remaining)?;
9544        let (format, remaining) = u8::try_parse(remaining)?;
9545        let (mode, remaining) = u8::try_parse(remaining)?;
9546        let mode = mode.into();
9547        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
9548        let (num_items, remaining) = u32::try_parse(remaining)?;
9549        let (items, remaining) = ChangeDevicePropertyAux::try_parse(remaining, u8::from(format), u32::from(num_items))?;
9550        let _ = remaining;
9551        Ok(ChangeDevicePropertyRequest {
9552            property,
9553            type_,
9554            device_id,
9555            mode,
9556            num_items,
9557            items: Cow::Owned(items),
9558        })
9559    }
9560    /// Clone all borrowed data in this ChangeDevicePropertyRequest.
9561    pub fn into_owned(self) -> ChangeDevicePropertyRequest<'static> {
9562        ChangeDevicePropertyRequest {
9563            property: self.property,
9564            type_: self.type_,
9565            device_id: self.device_id,
9566            mode: self.mode,
9567            num_items: self.num_items,
9568            items: Cow::Owned(self.items.into_owned()),
9569        }
9570    }
9571}
9572impl<'input> Request for ChangeDevicePropertyRequest<'input> {
9573    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
9574
9575    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
9576        let (bufs, fds) = self.serialize(major_opcode);
9577        // Flatten the buffers into a single vector
9578        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
9579        (buf, fds)
9580    }
9581}
9582impl<'input> crate::x11_utils::VoidRequest for ChangeDevicePropertyRequest<'input> {
9583}
9584
9585/// Opcode for the DeleteDeviceProperty request
9586pub const DELETE_DEVICE_PROPERTY_REQUEST: u8 = 38;
9587#[derive(Clone, Copy, Default)]
9588#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9589#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9590pub struct DeleteDevicePropertyRequest {
9591    pub property: xproto::Atom,
9592    pub device_id: u8,
9593}
9594impl_debug_if_no_extra_traits!(DeleteDevicePropertyRequest, "DeleteDevicePropertyRequest");
9595impl DeleteDevicePropertyRequest {
9596    /// Serialize this request into bytes for the provided connection
9597    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
9598        let length_so_far = 0;
9599        let property_bytes = self.property.serialize();
9600        let device_id_bytes = self.device_id.serialize();
9601        let mut request0 = vec![
9602            major_opcode,
9603            DELETE_DEVICE_PROPERTY_REQUEST,
9604            0,
9605            0,
9606            property_bytes[0],
9607            property_bytes[1],
9608            property_bytes[2],
9609            property_bytes[3],
9610            device_id_bytes[0],
9611            0,
9612            0,
9613            0,
9614        ];
9615        let length_so_far = length_so_far + request0.len();
9616        assert_eq!(length_so_far % 4, 0);
9617        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
9618        request0[2..4].copy_from_slice(&length.to_ne_bytes());
9619        ([request0.into()], vec![])
9620    }
9621    /// Parse this request given its header, its body, and any fds that go along with it
9622    #[cfg(feature = "request-parsing")]
9623    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
9624        if header.minor_opcode != DELETE_DEVICE_PROPERTY_REQUEST {
9625            return Err(ParseError::InvalidValue);
9626        }
9627        let (property, remaining) = xproto::Atom::try_parse(value)?;
9628        let (device_id, remaining) = u8::try_parse(remaining)?;
9629        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
9630        let _ = remaining;
9631        Ok(DeleteDevicePropertyRequest {
9632            property,
9633            device_id,
9634        })
9635    }
9636}
9637impl Request for DeleteDevicePropertyRequest {
9638    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
9639
9640    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
9641        let (bufs, fds) = self.serialize(major_opcode);
9642        // Flatten the buffers into a single vector
9643        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
9644        (buf, fds)
9645    }
9646}
9647impl crate::x11_utils::VoidRequest for DeleteDevicePropertyRequest {
9648}
9649
9650/// Opcode for the GetDeviceProperty request
9651pub const GET_DEVICE_PROPERTY_REQUEST: u8 = 39;
9652#[derive(Clone, Copy, Default)]
9653#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9654#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9655pub struct GetDevicePropertyRequest {
9656    pub property: xproto::Atom,
9657    pub type_: xproto::Atom,
9658    pub offset: u32,
9659    pub len: u32,
9660    pub device_id: u8,
9661    pub delete: bool,
9662}
9663impl_debug_if_no_extra_traits!(GetDevicePropertyRequest, "GetDevicePropertyRequest");
9664impl GetDevicePropertyRequest {
9665    /// Serialize this request into bytes for the provided connection
9666    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
9667        let length_so_far = 0;
9668        let property_bytes = self.property.serialize();
9669        let type_bytes = self.type_.serialize();
9670        let offset_bytes = self.offset.serialize();
9671        let len_bytes = self.len.serialize();
9672        let device_id_bytes = self.device_id.serialize();
9673        let delete_bytes = self.delete.serialize();
9674        let mut request0 = vec![
9675            major_opcode,
9676            GET_DEVICE_PROPERTY_REQUEST,
9677            0,
9678            0,
9679            property_bytes[0],
9680            property_bytes[1],
9681            property_bytes[2],
9682            property_bytes[3],
9683            type_bytes[0],
9684            type_bytes[1],
9685            type_bytes[2],
9686            type_bytes[3],
9687            offset_bytes[0],
9688            offset_bytes[1],
9689            offset_bytes[2],
9690            offset_bytes[3],
9691            len_bytes[0],
9692            len_bytes[1],
9693            len_bytes[2],
9694            len_bytes[3],
9695            device_id_bytes[0],
9696            delete_bytes[0],
9697            0,
9698            0,
9699        ];
9700        let length_so_far = length_so_far + request0.len();
9701        assert_eq!(length_so_far % 4, 0);
9702        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
9703        request0[2..4].copy_from_slice(&length.to_ne_bytes());
9704        ([request0.into()], vec![])
9705    }
9706    /// Parse this request given its header, its body, and any fds that go along with it
9707    #[cfg(feature = "request-parsing")]
9708    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
9709        if header.minor_opcode != GET_DEVICE_PROPERTY_REQUEST {
9710            return Err(ParseError::InvalidValue);
9711        }
9712        let (property, remaining) = xproto::Atom::try_parse(value)?;
9713        let (type_, remaining) = xproto::Atom::try_parse(remaining)?;
9714        let (offset, remaining) = u32::try_parse(remaining)?;
9715        let (len, remaining) = u32::try_parse(remaining)?;
9716        let (device_id, remaining) = u8::try_parse(remaining)?;
9717        let (delete, remaining) = bool::try_parse(remaining)?;
9718        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
9719        let _ = remaining;
9720        Ok(GetDevicePropertyRequest {
9721            property,
9722            type_,
9723            offset,
9724            len,
9725            device_id,
9726            delete,
9727        })
9728    }
9729}
9730impl Request for GetDevicePropertyRequest {
9731    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
9732
9733    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
9734        let (bufs, fds) = self.serialize(major_opcode);
9735        // Flatten the buffers into a single vector
9736        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
9737        (buf, fds)
9738    }
9739}
9740impl crate::x11_utils::ReplyRequest for GetDevicePropertyRequest {
9741    type Reply = GetDevicePropertyReply;
9742}
9743
9744#[derive(Clone)]
9745#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9746#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9747pub enum GetDevicePropertyItems {
9748    Data8(Vec<u8>),
9749    Data16(Vec<u16>),
9750    Data32(Vec<u32>),
9751    /// This variant is returned when the server sends a discriminant
9752    /// value that does not match any of the defined by the protocol.
9753    ///
9754    /// Usually, this should be considered a parsing error, but there
9755    /// are some cases where the server violates the protocol.
9756    ///
9757    /// Trying to use `serialize` or `serialize_into` with this variant
9758    /// will raise a panic.
9759    InvalidValue(u8),
9760}
9761impl_debug_if_no_extra_traits!(GetDevicePropertyItems, "GetDevicePropertyItems");
9762impl GetDevicePropertyItems {
9763    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
9764    fn try_parse(value: &[u8], format: u8, num_items: u32) -> Result<(Self, &[u8]), ParseError> {
9765        let switch_expr = u8::from(format);
9766        let mut outer_remaining = value;
9767        let mut parse_result = None;
9768        if switch_expr == u8::from(PropertyFormat::M8_BITS) {
9769            let remaining = outer_remaining;
9770            let value = remaining;
9771            let (data8, remaining) = crate::x11_utils::parse_u8_list(remaining, num_items.try_to_usize()?)?;
9772            let data8 = data8.to_vec();
9773            // Align offset to multiple of 4
9774            let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
9775            let misalignment = (4 - (offset % 4)) % 4;
9776            let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
9777            outer_remaining = remaining;
9778            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
9779            parse_result = Some(GetDevicePropertyItems::Data8(data8));
9780        }
9781        if switch_expr == u8::from(PropertyFormat::M16_BITS) {
9782            let remaining = outer_remaining;
9783            let value = remaining;
9784            let (data16, remaining) = crate::x11_utils::parse_list::<u16>(remaining, num_items.try_to_usize()?)?;
9785            // Align offset to multiple of 4
9786            let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
9787            let misalignment = (4 - (offset % 4)) % 4;
9788            let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
9789            outer_remaining = remaining;
9790            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
9791            parse_result = Some(GetDevicePropertyItems::Data16(data16));
9792        }
9793        if switch_expr == u8::from(PropertyFormat::M32_BITS) {
9794            let remaining = outer_remaining;
9795            let (data32, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_items.try_to_usize()?)?;
9796            outer_remaining = remaining;
9797            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
9798            parse_result = Some(GetDevicePropertyItems::Data32(data32));
9799        }
9800        match parse_result {
9801            None => Ok((GetDevicePropertyItems::InvalidValue(switch_expr), &[])),
9802            Some(result) => Ok((result, outer_remaining)),
9803        }
9804    }
9805}
9806impl GetDevicePropertyItems {
9807    pub fn as_data8(&self) -> Option<&Vec<u8>> {
9808        match self {
9809            GetDevicePropertyItems::Data8(value) => Some(value),
9810            _ => None,
9811        }
9812    }
9813    pub fn as_data16(&self) -> Option<&Vec<u16>> {
9814        match self {
9815            GetDevicePropertyItems::Data16(value) => Some(value),
9816            _ => None,
9817        }
9818    }
9819    pub fn as_data32(&self) -> Option<&Vec<u32>> {
9820        match self {
9821            GetDevicePropertyItems::Data32(value) => Some(value),
9822            _ => None,
9823        }
9824    }
9825}
9826impl GetDevicePropertyItems {
9827    #[allow(dead_code)]
9828    fn serialize(&self, format: u8, num_items: u32) -> Vec<u8> {
9829        let mut result = Vec::new();
9830        self.serialize_into(&mut result, u8::from(format), u32::from(num_items));
9831        result
9832    }
9833    fn serialize_into(&self, bytes: &mut Vec<u8>, format: u8, num_items: u32) {
9834        assert_eq!(self.switch_expr(), u8::from(format), "switch `items` has an inconsistent discriminant");
9835        match self {
9836            GetDevicePropertyItems::Data8(data8) => {
9837                assert_eq!(data8.len(), usize::try_from(num_items).unwrap(), "`data8` has an incorrect length");
9838                bytes.extend_from_slice(&data8);
9839                bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
9840            }
9841            GetDevicePropertyItems::Data16(data16) => {
9842                assert_eq!(data16.len(), usize::try_from(num_items).unwrap(), "`data16` has an incorrect length");
9843                data16.serialize_into(bytes);
9844                bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
9845            }
9846            GetDevicePropertyItems::Data32(data32) => {
9847                assert_eq!(data32.len(), usize::try_from(num_items).unwrap(), "`data32` has an incorrect length");
9848                data32.serialize_into(bytes);
9849            }
9850            GetDevicePropertyItems::InvalidValue(_) => panic!("attempted to serialize invalid switch case"),
9851        }
9852    }
9853}
9854impl GetDevicePropertyItems {
9855    fn switch_expr(&self) -> u8 {
9856        match self {
9857            GetDevicePropertyItems::Data8(_) => u8::from(PropertyFormat::M8_BITS),
9858            GetDevicePropertyItems::Data16(_) => u8::from(PropertyFormat::M16_BITS),
9859            GetDevicePropertyItems::Data32(_) => u8::from(PropertyFormat::M32_BITS),
9860            GetDevicePropertyItems::InvalidValue(switch_expr) => *switch_expr,
9861        }
9862    }
9863}
9864
9865#[derive(Clone)]
9866#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
9867#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9868pub struct GetDevicePropertyReply {
9869    pub xi_reply_type: u8,
9870    pub sequence: u16,
9871    pub length: u32,
9872    pub type_: xproto::Atom,
9873    pub bytes_after: u32,
9874    pub num_items: u32,
9875    pub device_id: u8,
9876    pub items: GetDevicePropertyItems,
9877}
9878impl_debug_if_no_extra_traits!(GetDevicePropertyReply, "GetDevicePropertyReply");
9879impl TryParse for GetDevicePropertyReply {
9880    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
9881        let remaining = initial_value;
9882        let (response_type, remaining) = u8::try_parse(remaining)?;
9883        let (xi_reply_type, remaining) = u8::try_parse(remaining)?;
9884        let (sequence, remaining) = u16::try_parse(remaining)?;
9885        let (length, remaining) = u32::try_parse(remaining)?;
9886        let (type_, remaining) = xproto::Atom::try_parse(remaining)?;
9887        let (bytes_after, remaining) = u32::try_parse(remaining)?;
9888        let (num_items, remaining) = u32::try_parse(remaining)?;
9889        let (format, remaining) = u8::try_parse(remaining)?;
9890        let (device_id, remaining) = u8::try_parse(remaining)?;
9891        let remaining = remaining.get(10..).ok_or(ParseError::InsufficientData)?;
9892        let (items, remaining) = GetDevicePropertyItems::try_parse(remaining, u8::from(format), u32::from(num_items))?;
9893        if response_type != 1 {
9894            return Err(ParseError::InvalidValue);
9895        }
9896        let result = GetDevicePropertyReply { xi_reply_type, sequence, length, type_, bytes_after, num_items, device_id, items };
9897        let _ = remaining;
9898        let remaining = initial_value.get(32 + length as usize * 4..)
9899            .ok_or(ParseError::InsufficientData)?;
9900        Ok((result, remaining))
9901    }
9902}
9903impl Serialize for GetDevicePropertyReply {
9904    type Bytes = Vec<u8>;
9905    fn serialize(&self) -> Vec<u8> {
9906        let mut result = Vec::new();
9907        self.serialize_into(&mut result);
9908        result
9909    }
9910    fn serialize_into(&self, bytes: &mut Vec<u8>) {
9911        bytes.reserve(32);
9912        let response_type_bytes = &[1];
9913        bytes.push(response_type_bytes[0]);
9914        self.xi_reply_type.serialize_into(bytes);
9915        self.sequence.serialize_into(bytes);
9916        self.length.serialize_into(bytes);
9917        self.type_.serialize_into(bytes);
9918        self.bytes_after.serialize_into(bytes);
9919        self.num_items.serialize_into(bytes);
9920        let format: u8 = self.items.switch_expr();
9921        format.serialize_into(bytes);
9922        self.device_id.serialize_into(bytes);
9923        bytes.extend_from_slice(&[0; 10]);
9924        self.items.serialize_into(bytes, u8::from(format), u32::from(self.num_items));
9925    }
9926}
9927
9928#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
9929#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9930pub struct Device(bool);
9931impl Device {
9932    pub const ALL: Self = Self(false);
9933    pub const ALL_MASTER: Self = Self(true);
9934}
9935impl From<Device> for bool {
9936    #[inline]
9937    fn from(input: Device) -> Self {
9938        input.0
9939    }
9940}
9941impl From<Device> for Option<bool> {
9942    #[inline]
9943    fn from(input: Device) -> Self {
9944        Some(input.0)
9945    }
9946}
9947impl From<Device> for u8 {
9948    #[inline]
9949    fn from(input: Device) -> Self {
9950        u8::from(input.0)
9951    }
9952}
9953impl From<Device> for Option<u8> {
9954    #[inline]
9955    fn from(input: Device) -> Self {
9956        Some(u8::from(input.0))
9957    }
9958}
9959impl From<Device> for u16 {
9960    #[inline]
9961    fn from(input: Device) -> Self {
9962        u16::from(input.0)
9963    }
9964}
9965impl From<Device> for Option<u16> {
9966    #[inline]
9967    fn from(input: Device) -> Self {
9968        Some(u16::from(input.0))
9969    }
9970}
9971impl From<Device> for u32 {
9972    #[inline]
9973    fn from(input: Device) -> Self {
9974        u32::from(input.0)
9975    }
9976}
9977impl From<Device> for Option<u32> {
9978    #[inline]
9979    fn from(input: Device) -> Self {
9980        Some(u32::from(input.0))
9981    }
9982}
9983impl From<bool> for Device {
9984    #[inline]
9985    fn from(value: bool) -> Self {
9986        Self(value)
9987    }
9988}
9989impl core::fmt::Debug for Device  {
9990    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
9991        let variants = [
9992            (Self::ALL.0.into(), "ALL", "All"),
9993            (Self::ALL_MASTER.0.into(), "ALL_MASTER", "AllMaster"),
9994        ];
9995        pretty_print_enum(fmt, self.0.into(), &variants)
9996    }
9997}
9998
9999#[derive(Clone, Copy, Default)]
10000#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10001#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10002pub struct GroupInfo {
10003    pub base: u8,
10004    pub latched: u8,
10005    pub locked: u8,
10006    pub effective: u8,
10007}
10008impl_debug_if_no_extra_traits!(GroupInfo, "GroupInfo");
10009impl TryParse for GroupInfo {
10010    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
10011        let (base, remaining) = u8::try_parse(remaining)?;
10012        let (latched, remaining) = u8::try_parse(remaining)?;
10013        let (locked, remaining) = u8::try_parse(remaining)?;
10014        let (effective, remaining) = u8::try_parse(remaining)?;
10015        let result = GroupInfo { base, latched, locked, effective };
10016        Ok((result, remaining))
10017    }
10018}
10019impl Serialize for GroupInfo {
10020    type Bytes = [u8; 4];
10021    fn serialize(&self) -> [u8; 4] {
10022        let base_bytes = self.base.serialize();
10023        let latched_bytes = self.latched.serialize();
10024        let locked_bytes = self.locked.serialize();
10025        let effective_bytes = self.effective.serialize();
10026        [
10027            base_bytes[0],
10028            latched_bytes[0],
10029            locked_bytes[0],
10030            effective_bytes[0],
10031        ]
10032    }
10033    fn serialize_into(&self, bytes: &mut Vec<u8>) {
10034        bytes.reserve(4);
10035        self.base.serialize_into(bytes);
10036        self.latched.serialize_into(bytes);
10037        self.locked.serialize_into(bytes);
10038        self.effective.serialize_into(bytes);
10039    }
10040}
10041
10042#[derive(Clone, Copy, Default)]
10043#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10044#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10045pub struct ModifierInfo {
10046    pub base: u32,
10047    pub latched: u32,
10048    pub locked: u32,
10049    pub effective: u32,
10050}
10051impl_debug_if_no_extra_traits!(ModifierInfo, "ModifierInfo");
10052impl TryParse for ModifierInfo {
10053    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
10054        let (base, remaining) = u32::try_parse(remaining)?;
10055        let (latched, remaining) = u32::try_parse(remaining)?;
10056        let (locked, remaining) = u32::try_parse(remaining)?;
10057        let (effective, remaining) = u32::try_parse(remaining)?;
10058        let result = ModifierInfo { base, latched, locked, effective };
10059        Ok((result, remaining))
10060    }
10061}
10062impl Serialize for ModifierInfo {
10063    type Bytes = [u8; 16];
10064    fn serialize(&self) -> [u8; 16] {
10065        let base_bytes = self.base.serialize();
10066        let latched_bytes = self.latched.serialize();
10067        let locked_bytes = self.locked.serialize();
10068        let effective_bytes = self.effective.serialize();
10069        [
10070            base_bytes[0],
10071            base_bytes[1],
10072            base_bytes[2],
10073            base_bytes[3],
10074            latched_bytes[0],
10075            latched_bytes[1],
10076            latched_bytes[2],
10077            latched_bytes[3],
10078            locked_bytes[0],
10079            locked_bytes[1],
10080            locked_bytes[2],
10081            locked_bytes[3],
10082            effective_bytes[0],
10083            effective_bytes[1],
10084            effective_bytes[2],
10085            effective_bytes[3],
10086        ]
10087    }
10088    fn serialize_into(&self, bytes: &mut Vec<u8>) {
10089        bytes.reserve(16);
10090        self.base.serialize_into(bytes);
10091        self.latched.serialize_into(bytes);
10092        self.locked.serialize_into(bytes);
10093        self.effective.serialize_into(bytes);
10094    }
10095}
10096
10097/// Opcode for the XIQueryPointer request
10098pub const XI_QUERY_POINTER_REQUEST: u8 = 40;
10099#[derive(Clone, Copy, Default)]
10100#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10101#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10102pub struct XIQueryPointerRequest {
10103    pub window: xproto::Window,
10104    pub deviceid: DeviceId,
10105}
10106impl_debug_if_no_extra_traits!(XIQueryPointerRequest, "XIQueryPointerRequest");
10107impl XIQueryPointerRequest {
10108    /// Serialize this request into bytes for the provided connection
10109    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
10110        let length_so_far = 0;
10111        let window_bytes = self.window.serialize();
10112        let deviceid_bytes = self.deviceid.serialize();
10113        let mut request0 = vec![
10114            major_opcode,
10115            XI_QUERY_POINTER_REQUEST,
10116            0,
10117            0,
10118            window_bytes[0],
10119            window_bytes[1],
10120            window_bytes[2],
10121            window_bytes[3],
10122            deviceid_bytes[0],
10123            deviceid_bytes[1],
10124            0,
10125            0,
10126        ];
10127        let length_so_far = length_so_far + request0.len();
10128        assert_eq!(length_so_far % 4, 0);
10129        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
10130        request0[2..4].copy_from_slice(&length.to_ne_bytes());
10131        ([request0.into()], vec![])
10132    }
10133    /// Parse this request given its header, its body, and any fds that go along with it
10134    #[cfg(feature = "request-parsing")]
10135    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
10136        if header.minor_opcode != XI_QUERY_POINTER_REQUEST {
10137            return Err(ParseError::InvalidValue);
10138        }
10139        let (window, remaining) = xproto::Window::try_parse(value)?;
10140        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
10141        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
10142        let _ = remaining;
10143        Ok(XIQueryPointerRequest {
10144            window,
10145            deviceid,
10146        })
10147    }
10148}
10149impl Request for XIQueryPointerRequest {
10150    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
10151
10152    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
10153        let (bufs, fds) = self.serialize(major_opcode);
10154        // Flatten the buffers into a single vector
10155        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
10156        (buf, fds)
10157    }
10158}
10159impl crate::x11_utils::ReplyRequest for XIQueryPointerRequest {
10160    type Reply = XIQueryPointerReply;
10161}
10162
10163#[derive(Clone, Default)]
10164#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10165#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10166pub struct XIQueryPointerReply {
10167    pub sequence: u16,
10168    pub length: u32,
10169    pub root: xproto::Window,
10170    pub child: xproto::Window,
10171    pub root_x: Fp1616,
10172    pub root_y: Fp1616,
10173    pub win_x: Fp1616,
10174    pub win_y: Fp1616,
10175    pub same_screen: bool,
10176    pub mods: ModifierInfo,
10177    pub group: GroupInfo,
10178    pub buttons: Vec<u32>,
10179}
10180impl_debug_if_no_extra_traits!(XIQueryPointerReply, "XIQueryPointerReply");
10181impl TryParse for XIQueryPointerReply {
10182    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
10183        let remaining = initial_value;
10184        let (response_type, remaining) = u8::try_parse(remaining)?;
10185        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
10186        let (sequence, remaining) = u16::try_parse(remaining)?;
10187        let (length, remaining) = u32::try_parse(remaining)?;
10188        let (root, remaining) = xproto::Window::try_parse(remaining)?;
10189        let (child, remaining) = xproto::Window::try_parse(remaining)?;
10190        let (root_x, remaining) = Fp1616::try_parse(remaining)?;
10191        let (root_y, remaining) = Fp1616::try_parse(remaining)?;
10192        let (win_x, remaining) = Fp1616::try_parse(remaining)?;
10193        let (win_y, remaining) = Fp1616::try_parse(remaining)?;
10194        let (same_screen, remaining) = bool::try_parse(remaining)?;
10195        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
10196        let (buttons_len, remaining) = u16::try_parse(remaining)?;
10197        let (mods, remaining) = ModifierInfo::try_parse(remaining)?;
10198        let (group, remaining) = GroupInfo::try_parse(remaining)?;
10199        let (buttons, remaining) = crate::x11_utils::parse_list::<u32>(remaining, buttons_len.try_to_usize()?)?;
10200        if response_type != 1 {
10201            return Err(ParseError::InvalidValue);
10202        }
10203        let result = XIQueryPointerReply { sequence, length, root, child, root_x, root_y, win_x, win_y, same_screen, mods, group, buttons };
10204        let _ = remaining;
10205        let remaining = initial_value.get(32 + length as usize * 4..)
10206            .ok_or(ParseError::InsufficientData)?;
10207        Ok((result, remaining))
10208    }
10209}
10210impl Serialize for XIQueryPointerReply {
10211    type Bytes = Vec<u8>;
10212    fn serialize(&self) -> Vec<u8> {
10213        let mut result = Vec::new();
10214        self.serialize_into(&mut result);
10215        result
10216    }
10217    fn serialize_into(&self, bytes: &mut Vec<u8>) {
10218        bytes.reserve(56);
10219        let response_type_bytes = &[1];
10220        bytes.push(response_type_bytes[0]);
10221        bytes.extend_from_slice(&[0; 1]);
10222        self.sequence.serialize_into(bytes);
10223        self.length.serialize_into(bytes);
10224        self.root.serialize_into(bytes);
10225        self.child.serialize_into(bytes);
10226        self.root_x.serialize_into(bytes);
10227        self.root_y.serialize_into(bytes);
10228        self.win_x.serialize_into(bytes);
10229        self.win_y.serialize_into(bytes);
10230        self.same_screen.serialize_into(bytes);
10231        bytes.extend_from_slice(&[0; 1]);
10232        let buttons_len = u16::try_from(self.buttons.len()).expect("`buttons` has too many elements");
10233        buttons_len.serialize_into(bytes);
10234        self.mods.serialize_into(bytes);
10235        self.group.serialize_into(bytes);
10236        self.buttons.serialize_into(bytes);
10237    }
10238}
10239impl XIQueryPointerReply {
10240    /// Get the value of the `buttons_len` field.
10241    ///
10242    /// The `buttons_len` field is used as the length field of the `buttons` field.
10243    /// This function computes the field's value again based on the length of the list.
10244    ///
10245    /// # Panics
10246    ///
10247    /// Panics if the value cannot be represented in the target type. This
10248    /// cannot happen with values of the struct received from the X11 server.
10249    pub fn buttons_len(&self) -> u16 {
10250        self.buttons.len()
10251            .try_into().unwrap()
10252    }
10253}
10254
10255/// Opcode for the XIWarpPointer request
10256pub const XI_WARP_POINTER_REQUEST: u8 = 41;
10257#[derive(Clone, Copy, Default)]
10258#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10259#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10260pub struct XIWarpPointerRequest {
10261    pub src_win: xproto::Window,
10262    pub dst_win: xproto::Window,
10263    pub src_x: Fp1616,
10264    pub src_y: Fp1616,
10265    pub src_width: u16,
10266    pub src_height: u16,
10267    pub dst_x: Fp1616,
10268    pub dst_y: Fp1616,
10269    pub deviceid: DeviceId,
10270}
10271impl_debug_if_no_extra_traits!(XIWarpPointerRequest, "XIWarpPointerRequest");
10272impl XIWarpPointerRequest {
10273    /// Serialize this request into bytes for the provided connection
10274    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
10275        let length_so_far = 0;
10276        let src_win_bytes = self.src_win.serialize();
10277        let dst_win_bytes = self.dst_win.serialize();
10278        let src_x_bytes = self.src_x.serialize();
10279        let src_y_bytes = self.src_y.serialize();
10280        let src_width_bytes = self.src_width.serialize();
10281        let src_height_bytes = self.src_height.serialize();
10282        let dst_x_bytes = self.dst_x.serialize();
10283        let dst_y_bytes = self.dst_y.serialize();
10284        let deviceid_bytes = self.deviceid.serialize();
10285        let mut request0 = vec![
10286            major_opcode,
10287            XI_WARP_POINTER_REQUEST,
10288            0,
10289            0,
10290            src_win_bytes[0],
10291            src_win_bytes[1],
10292            src_win_bytes[2],
10293            src_win_bytes[3],
10294            dst_win_bytes[0],
10295            dst_win_bytes[1],
10296            dst_win_bytes[2],
10297            dst_win_bytes[3],
10298            src_x_bytes[0],
10299            src_x_bytes[1],
10300            src_x_bytes[2],
10301            src_x_bytes[3],
10302            src_y_bytes[0],
10303            src_y_bytes[1],
10304            src_y_bytes[2],
10305            src_y_bytes[3],
10306            src_width_bytes[0],
10307            src_width_bytes[1],
10308            src_height_bytes[0],
10309            src_height_bytes[1],
10310            dst_x_bytes[0],
10311            dst_x_bytes[1],
10312            dst_x_bytes[2],
10313            dst_x_bytes[3],
10314            dst_y_bytes[0],
10315            dst_y_bytes[1],
10316            dst_y_bytes[2],
10317            dst_y_bytes[3],
10318            deviceid_bytes[0],
10319            deviceid_bytes[1],
10320            0,
10321            0,
10322        ];
10323        let length_so_far = length_so_far + request0.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()], 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: &[u8]) -> Result<Self, ParseError> {
10332        if header.minor_opcode != XI_WARP_POINTER_REQUEST {
10333            return Err(ParseError::InvalidValue);
10334        }
10335        let (src_win, remaining) = xproto::Window::try_parse(value)?;
10336        let (dst_win, remaining) = xproto::Window::try_parse(remaining)?;
10337        let (src_x, remaining) = Fp1616::try_parse(remaining)?;
10338        let (src_y, remaining) = Fp1616::try_parse(remaining)?;
10339        let (src_width, remaining) = u16::try_parse(remaining)?;
10340        let (src_height, remaining) = u16::try_parse(remaining)?;
10341        let (dst_x, remaining) = Fp1616::try_parse(remaining)?;
10342        let (dst_y, remaining) = Fp1616::try_parse(remaining)?;
10343        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
10344        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
10345        let _ = remaining;
10346        Ok(XIWarpPointerRequest {
10347            src_win,
10348            dst_win,
10349            src_x,
10350            src_y,
10351            src_width,
10352            src_height,
10353            dst_x,
10354            dst_y,
10355            deviceid,
10356        })
10357    }
10358}
10359impl Request for XIWarpPointerRequest {
10360    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
10361
10362    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
10363        let (bufs, fds) = self.serialize(major_opcode);
10364        // Flatten the buffers into a single vector
10365        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
10366        (buf, fds)
10367    }
10368}
10369impl crate::x11_utils::VoidRequest for XIWarpPointerRequest {
10370}
10371
10372/// Opcode for the XIChangeCursor request
10373pub const XI_CHANGE_CURSOR_REQUEST: u8 = 42;
10374#[derive(Clone, Copy, Default)]
10375#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10376#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10377pub struct XIChangeCursorRequest {
10378    pub window: xproto::Window,
10379    pub cursor: xproto::Cursor,
10380    pub deviceid: DeviceId,
10381}
10382impl_debug_if_no_extra_traits!(XIChangeCursorRequest, "XIChangeCursorRequest");
10383impl XIChangeCursorRequest {
10384    /// Serialize this request into bytes for the provided connection
10385    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
10386        let length_so_far = 0;
10387        let window_bytes = self.window.serialize();
10388        let cursor_bytes = self.cursor.serialize();
10389        let deviceid_bytes = self.deviceid.serialize();
10390        let mut request0 = vec![
10391            major_opcode,
10392            XI_CHANGE_CURSOR_REQUEST,
10393            0,
10394            0,
10395            window_bytes[0],
10396            window_bytes[1],
10397            window_bytes[2],
10398            window_bytes[3],
10399            cursor_bytes[0],
10400            cursor_bytes[1],
10401            cursor_bytes[2],
10402            cursor_bytes[3],
10403            deviceid_bytes[0],
10404            deviceid_bytes[1],
10405            0,
10406            0,
10407        ];
10408        let length_so_far = length_so_far + request0.len();
10409        assert_eq!(length_so_far % 4, 0);
10410        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
10411        request0[2..4].copy_from_slice(&length.to_ne_bytes());
10412        ([request0.into()], vec![])
10413    }
10414    /// Parse this request given its header, its body, and any fds that go along with it
10415    #[cfg(feature = "request-parsing")]
10416    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
10417        if header.minor_opcode != XI_CHANGE_CURSOR_REQUEST {
10418            return Err(ParseError::InvalidValue);
10419        }
10420        let (window, remaining) = xproto::Window::try_parse(value)?;
10421        let (cursor, remaining) = xproto::Cursor::try_parse(remaining)?;
10422        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
10423        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
10424        let _ = remaining;
10425        Ok(XIChangeCursorRequest {
10426            window,
10427            cursor,
10428            deviceid,
10429        })
10430    }
10431}
10432impl Request for XIChangeCursorRequest {
10433    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
10434
10435    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
10436        let (bufs, fds) = self.serialize(major_opcode);
10437        // Flatten the buffers into a single vector
10438        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
10439        (buf, fds)
10440    }
10441}
10442impl crate::x11_utils::VoidRequest for XIChangeCursorRequest {
10443}
10444
10445#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
10446#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10447pub struct HierarchyChangeType(u16);
10448impl HierarchyChangeType {
10449    pub const ADD_MASTER: Self = Self(1);
10450    pub const REMOVE_MASTER: Self = Self(2);
10451    pub const ATTACH_SLAVE: Self = Self(3);
10452    pub const DETACH_SLAVE: Self = Self(4);
10453}
10454impl From<HierarchyChangeType> for u16 {
10455    #[inline]
10456    fn from(input: HierarchyChangeType) -> Self {
10457        input.0
10458    }
10459}
10460impl From<HierarchyChangeType> for Option<u16> {
10461    #[inline]
10462    fn from(input: HierarchyChangeType) -> Self {
10463        Some(input.0)
10464    }
10465}
10466impl From<HierarchyChangeType> for u32 {
10467    #[inline]
10468    fn from(input: HierarchyChangeType) -> Self {
10469        u32::from(input.0)
10470    }
10471}
10472impl From<HierarchyChangeType> for Option<u32> {
10473    #[inline]
10474    fn from(input: HierarchyChangeType) -> Self {
10475        Some(u32::from(input.0))
10476    }
10477}
10478impl From<u8> for HierarchyChangeType {
10479    #[inline]
10480    fn from(value: u8) -> Self {
10481        Self(value.into())
10482    }
10483}
10484impl From<u16> for HierarchyChangeType {
10485    #[inline]
10486    fn from(value: u16) -> Self {
10487        Self(value)
10488    }
10489}
10490impl core::fmt::Debug for HierarchyChangeType  {
10491    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
10492        let variants = [
10493            (Self::ADD_MASTER.0.into(), "ADD_MASTER", "AddMaster"),
10494            (Self::REMOVE_MASTER.0.into(), "REMOVE_MASTER", "RemoveMaster"),
10495            (Self::ATTACH_SLAVE.0.into(), "ATTACH_SLAVE", "AttachSlave"),
10496            (Self::DETACH_SLAVE.0.into(), "DETACH_SLAVE", "DetachSlave"),
10497        ];
10498        pretty_print_enum(fmt, self.0.into(), &variants)
10499    }
10500}
10501
10502#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
10503#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10504pub struct ChangeMode(u8);
10505impl ChangeMode {
10506    pub const ATTACH: Self = Self(1);
10507    pub const FLOAT: Self = Self(2);
10508}
10509impl From<ChangeMode> for u8 {
10510    #[inline]
10511    fn from(input: ChangeMode) -> Self {
10512        input.0
10513    }
10514}
10515impl From<ChangeMode> for Option<u8> {
10516    #[inline]
10517    fn from(input: ChangeMode) -> Self {
10518        Some(input.0)
10519    }
10520}
10521impl From<ChangeMode> for u16 {
10522    #[inline]
10523    fn from(input: ChangeMode) -> Self {
10524        u16::from(input.0)
10525    }
10526}
10527impl From<ChangeMode> for Option<u16> {
10528    #[inline]
10529    fn from(input: ChangeMode) -> Self {
10530        Some(u16::from(input.0))
10531    }
10532}
10533impl From<ChangeMode> for u32 {
10534    #[inline]
10535    fn from(input: ChangeMode) -> Self {
10536        u32::from(input.0)
10537    }
10538}
10539impl From<ChangeMode> for Option<u32> {
10540    #[inline]
10541    fn from(input: ChangeMode) -> Self {
10542        Some(u32::from(input.0))
10543    }
10544}
10545impl From<u8> for ChangeMode {
10546    #[inline]
10547    fn from(value: u8) -> Self {
10548        Self(value)
10549    }
10550}
10551impl core::fmt::Debug for ChangeMode  {
10552    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
10553        let variants = [
10554            (Self::ATTACH.0.into(), "ATTACH", "Attach"),
10555            (Self::FLOAT.0.into(), "FLOAT", "Float"),
10556        ];
10557        pretty_print_enum(fmt, self.0.into(), &variants)
10558    }
10559}
10560
10561#[derive(Clone, Default)]
10562#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10563#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10564pub struct AddMaster {
10565    pub type_: HierarchyChangeType,
10566    pub len: u16,
10567    pub send_core: bool,
10568    pub enable: bool,
10569    pub name: Vec<u8>,
10570}
10571impl_debug_if_no_extra_traits!(AddMaster, "AddMaster");
10572impl TryParse for AddMaster {
10573    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
10574        let value = remaining;
10575        let (type_, remaining) = u16::try_parse(remaining)?;
10576        let (len, remaining) = u16::try_parse(remaining)?;
10577        let (name_len, remaining) = u16::try_parse(remaining)?;
10578        let (send_core, remaining) = bool::try_parse(remaining)?;
10579        let (enable, remaining) = bool::try_parse(remaining)?;
10580        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_len.try_to_usize()?)?;
10581        let name = name.to_vec();
10582        // Align offset to multiple of 4
10583        let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
10584        let misalignment = (4 - (offset % 4)) % 4;
10585        let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
10586        let type_ = type_.into();
10587        let result = AddMaster { type_, len, send_core, enable, name };
10588        Ok((result, remaining))
10589    }
10590}
10591impl Serialize for AddMaster {
10592    type Bytes = Vec<u8>;
10593    fn serialize(&self) -> Vec<u8> {
10594        let mut result = Vec::new();
10595        self.serialize_into(&mut result);
10596        result
10597    }
10598    fn serialize_into(&self, bytes: &mut Vec<u8>) {
10599        bytes.reserve(8);
10600        u16::from(self.type_).serialize_into(bytes);
10601        self.len.serialize_into(bytes);
10602        let name_len = u16::try_from(self.name.len()).expect("`name` has too many elements");
10603        name_len.serialize_into(bytes);
10604        self.send_core.serialize_into(bytes);
10605        self.enable.serialize_into(bytes);
10606        bytes.extend_from_slice(&self.name);
10607        bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
10608    }
10609}
10610impl AddMaster {
10611    /// Get the value of the `name_len` field.
10612    ///
10613    /// The `name_len` field is used as the length field of the `name` field.
10614    /// This function computes the field's value again based on the length of the list.
10615    ///
10616    /// # Panics
10617    ///
10618    /// Panics if the value cannot be represented in the target type. This
10619    /// cannot happen with values of the struct received from the X11 server.
10620    pub fn name_len(&self) -> u16 {
10621        self.name.len()
10622            .try_into().unwrap()
10623    }
10624}
10625
10626#[derive(Clone, Copy, Default)]
10627#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10628#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10629pub struct RemoveMaster {
10630    pub type_: HierarchyChangeType,
10631    pub len: u16,
10632    pub deviceid: DeviceId,
10633    pub return_mode: ChangeMode,
10634    pub return_pointer: DeviceId,
10635    pub return_keyboard: DeviceId,
10636}
10637impl_debug_if_no_extra_traits!(RemoveMaster, "RemoveMaster");
10638impl TryParse for RemoveMaster {
10639    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
10640        let (type_, remaining) = u16::try_parse(remaining)?;
10641        let (len, remaining) = u16::try_parse(remaining)?;
10642        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
10643        let (return_mode, remaining) = u8::try_parse(remaining)?;
10644        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
10645        let (return_pointer, remaining) = DeviceId::try_parse(remaining)?;
10646        let (return_keyboard, remaining) = DeviceId::try_parse(remaining)?;
10647        let type_ = type_.into();
10648        let return_mode = return_mode.into();
10649        let result = RemoveMaster { type_, len, deviceid, return_mode, return_pointer, return_keyboard };
10650        Ok((result, remaining))
10651    }
10652}
10653impl Serialize for RemoveMaster {
10654    type Bytes = [u8; 12];
10655    fn serialize(&self) -> [u8; 12] {
10656        let type_bytes = u16::from(self.type_).serialize();
10657        let len_bytes = self.len.serialize();
10658        let deviceid_bytes = self.deviceid.serialize();
10659        let return_mode_bytes = u8::from(self.return_mode).serialize();
10660        let return_pointer_bytes = self.return_pointer.serialize();
10661        let return_keyboard_bytes = self.return_keyboard.serialize();
10662        [
10663            type_bytes[0],
10664            type_bytes[1],
10665            len_bytes[0],
10666            len_bytes[1],
10667            deviceid_bytes[0],
10668            deviceid_bytes[1],
10669            return_mode_bytes[0],
10670            0,
10671            return_pointer_bytes[0],
10672            return_pointer_bytes[1],
10673            return_keyboard_bytes[0],
10674            return_keyboard_bytes[1],
10675        ]
10676    }
10677    fn serialize_into(&self, bytes: &mut Vec<u8>) {
10678        bytes.reserve(12);
10679        u16::from(self.type_).serialize_into(bytes);
10680        self.len.serialize_into(bytes);
10681        self.deviceid.serialize_into(bytes);
10682        u8::from(self.return_mode).serialize_into(bytes);
10683        bytes.extend_from_slice(&[0; 1]);
10684        self.return_pointer.serialize_into(bytes);
10685        self.return_keyboard.serialize_into(bytes);
10686    }
10687}
10688
10689#[derive(Clone, Copy, Default)]
10690#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10691#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10692pub struct AttachSlave {
10693    pub type_: HierarchyChangeType,
10694    pub len: u16,
10695    pub deviceid: DeviceId,
10696    pub master: DeviceId,
10697}
10698impl_debug_if_no_extra_traits!(AttachSlave, "AttachSlave");
10699impl TryParse for AttachSlave {
10700    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
10701        let (type_, remaining) = u16::try_parse(remaining)?;
10702        let (len, remaining) = u16::try_parse(remaining)?;
10703        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
10704        let (master, remaining) = DeviceId::try_parse(remaining)?;
10705        let type_ = type_.into();
10706        let result = AttachSlave { type_, len, deviceid, master };
10707        Ok((result, remaining))
10708    }
10709}
10710impl Serialize for AttachSlave {
10711    type Bytes = [u8; 8];
10712    fn serialize(&self) -> [u8; 8] {
10713        let type_bytes = u16::from(self.type_).serialize();
10714        let len_bytes = self.len.serialize();
10715        let deviceid_bytes = self.deviceid.serialize();
10716        let master_bytes = self.master.serialize();
10717        [
10718            type_bytes[0],
10719            type_bytes[1],
10720            len_bytes[0],
10721            len_bytes[1],
10722            deviceid_bytes[0],
10723            deviceid_bytes[1],
10724            master_bytes[0],
10725            master_bytes[1],
10726        ]
10727    }
10728    fn serialize_into(&self, bytes: &mut Vec<u8>) {
10729        bytes.reserve(8);
10730        u16::from(self.type_).serialize_into(bytes);
10731        self.len.serialize_into(bytes);
10732        self.deviceid.serialize_into(bytes);
10733        self.master.serialize_into(bytes);
10734    }
10735}
10736
10737#[derive(Clone, Copy, Default)]
10738#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10739#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10740pub struct DetachSlave {
10741    pub type_: HierarchyChangeType,
10742    pub len: u16,
10743    pub deviceid: DeviceId,
10744}
10745impl_debug_if_no_extra_traits!(DetachSlave, "DetachSlave");
10746impl TryParse for DetachSlave {
10747    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
10748        let (type_, remaining) = u16::try_parse(remaining)?;
10749        let (len, remaining) = u16::try_parse(remaining)?;
10750        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
10751        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
10752        let type_ = type_.into();
10753        let result = DetachSlave { type_, len, deviceid };
10754        Ok((result, remaining))
10755    }
10756}
10757impl Serialize for DetachSlave {
10758    type Bytes = [u8; 8];
10759    fn serialize(&self) -> [u8; 8] {
10760        let type_bytes = u16::from(self.type_).serialize();
10761        let len_bytes = self.len.serialize();
10762        let deviceid_bytes = self.deviceid.serialize();
10763        [
10764            type_bytes[0],
10765            type_bytes[1],
10766            len_bytes[0],
10767            len_bytes[1],
10768            deviceid_bytes[0],
10769            deviceid_bytes[1],
10770            0,
10771            0,
10772        ]
10773    }
10774    fn serialize_into(&self, bytes: &mut Vec<u8>) {
10775        bytes.reserve(8);
10776        u16::from(self.type_).serialize_into(bytes);
10777        self.len.serialize_into(bytes);
10778        self.deviceid.serialize_into(bytes);
10779        bytes.extend_from_slice(&[0; 2]);
10780    }
10781}
10782
10783#[derive(Clone)]
10784#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10785#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10786pub struct HierarchyChangeDataAddMaster {
10787    pub send_core: bool,
10788    pub enable: bool,
10789    pub name: Vec<u8>,
10790}
10791impl_debug_if_no_extra_traits!(HierarchyChangeDataAddMaster, "HierarchyChangeDataAddMaster");
10792impl TryParse for HierarchyChangeDataAddMaster {
10793    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
10794        let value = remaining;
10795        let (name_len, remaining) = u16::try_parse(remaining)?;
10796        let (send_core, remaining) = bool::try_parse(remaining)?;
10797        let (enable, remaining) = bool::try_parse(remaining)?;
10798        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_len.try_to_usize()?)?;
10799        let name = name.to_vec();
10800        // Align offset to multiple of 4
10801        let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
10802        let misalignment = (4 - (offset % 4)) % 4;
10803        let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
10804        let result = HierarchyChangeDataAddMaster { send_core, enable, name };
10805        Ok((result, remaining))
10806    }
10807}
10808impl Serialize for HierarchyChangeDataAddMaster {
10809    type Bytes = Vec<u8>;
10810    fn serialize(&self) -> Vec<u8> {
10811        let mut result = Vec::new();
10812        self.serialize_into(&mut result);
10813        result
10814    }
10815    fn serialize_into(&self, bytes: &mut Vec<u8>) {
10816        bytes.reserve(4);
10817        let name_len = u16::try_from(self.name.len()).expect("`name` has too many elements");
10818        name_len.serialize_into(bytes);
10819        self.send_core.serialize_into(bytes);
10820        self.enable.serialize_into(bytes);
10821        bytes.extend_from_slice(&self.name);
10822        bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
10823    }
10824}
10825impl HierarchyChangeDataAddMaster {
10826    /// Get the value of the `name_len` field.
10827    ///
10828    /// The `name_len` field is used as the length field of the `name` field.
10829    /// This function computes the field's value again based on the length of the list.
10830    ///
10831    /// # Panics
10832    ///
10833    /// Panics if the value cannot be represented in the target type. This
10834    /// cannot happen with values of the struct received from the X11 server.
10835    pub fn name_len(&self) -> u16 {
10836        self.name.len()
10837            .try_into().unwrap()
10838    }
10839}
10840#[derive(Clone, Copy)]
10841#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10842#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10843pub struct HierarchyChangeDataRemoveMaster {
10844    pub deviceid: DeviceId,
10845    pub return_mode: ChangeMode,
10846    pub return_pointer: DeviceId,
10847    pub return_keyboard: DeviceId,
10848}
10849impl_debug_if_no_extra_traits!(HierarchyChangeDataRemoveMaster, "HierarchyChangeDataRemoveMaster");
10850impl TryParse for HierarchyChangeDataRemoveMaster {
10851    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
10852        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
10853        let (return_mode, remaining) = u8::try_parse(remaining)?;
10854        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
10855        let (return_pointer, remaining) = DeviceId::try_parse(remaining)?;
10856        let (return_keyboard, remaining) = DeviceId::try_parse(remaining)?;
10857        let return_mode = return_mode.into();
10858        let result = HierarchyChangeDataRemoveMaster { deviceid, return_mode, return_pointer, return_keyboard };
10859        Ok((result, remaining))
10860    }
10861}
10862impl Serialize for HierarchyChangeDataRemoveMaster {
10863    type Bytes = [u8; 8];
10864    fn serialize(&self) -> [u8; 8] {
10865        let deviceid_bytes = self.deviceid.serialize();
10866        let return_mode_bytes = u8::from(self.return_mode).serialize();
10867        let return_pointer_bytes = self.return_pointer.serialize();
10868        let return_keyboard_bytes = self.return_keyboard.serialize();
10869        [
10870            deviceid_bytes[0],
10871            deviceid_bytes[1],
10872            return_mode_bytes[0],
10873            0,
10874            return_pointer_bytes[0],
10875            return_pointer_bytes[1],
10876            return_keyboard_bytes[0],
10877            return_keyboard_bytes[1],
10878        ]
10879    }
10880    fn serialize_into(&self, bytes: &mut Vec<u8>) {
10881        bytes.reserve(8);
10882        self.deviceid.serialize_into(bytes);
10883        u8::from(self.return_mode).serialize_into(bytes);
10884        bytes.extend_from_slice(&[0; 1]);
10885        self.return_pointer.serialize_into(bytes);
10886        self.return_keyboard.serialize_into(bytes);
10887    }
10888}
10889#[derive(Clone, Copy)]
10890#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10891#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10892pub struct HierarchyChangeDataAttachSlave {
10893    pub deviceid: DeviceId,
10894    pub master: DeviceId,
10895}
10896impl_debug_if_no_extra_traits!(HierarchyChangeDataAttachSlave, "HierarchyChangeDataAttachSlave");
10897impl TryParse for HierarchyChangeDataAttachSlave {
10898    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
10899        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
10900        let (master, remaining) = DeviceId::try_parse(remaining)?;
10901        let result = HierarchyChangeDataAttachSlave { deviceid, master };
10902        Ok((result, remaining))
10903    }
10904}
10905impl Serialize for HierarchyChangeDataAttachSlave {
10906    type Bytes = [u8; 4];
10907    fn serialize(&self) -> [u8; 4] {
10908        let deviceid_bytes = self.deviceid.serialize();
10909        let master_bytes = self.master.serialize();
10910        [
10911            deviceid_bytes[0],
10912            deviceid_bytes[1],
10913            master_bytes[0],
10914            master_bytes[1],
10915        ]
10916    }
10917    fn serialize_into(&self, bytes: &mut Vec<u8>) {
10918        bytes.reserve(4);
10919        self.deviceid.serialize_into(bytes);
10920        self.master.serialize_into(bytes);
10921    }
10922}
10923#[derive(Clone, Copy)]
10924#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10925#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10926pub struct HierarchyChangeDataDetachSlave {
10927    pub deviceid: DeviceId,
10928}
10929impl_debug_if_no_extra_traits!(HierarchyChangeDataDetachSlave, "HierarchyChangeDataDetachSlave");
10930impl TryParse for HierarchyChangeDataDetachSlave {
10931    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
10932        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
10933        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
10934        let result = HierarchyChangeDataDetachSlave { deviceid };
10935        Ok((result, remaining))
10936    }
10937}
10938impl Serialize for HierarchyChangeDataDetachSlave {
10939    type Bytes = [u8; 4];
10940    fn serialize(&self) -> [u8; 4] {
10941        let deviceid_bytes = self.deviceid.serialize();
10942        [
10943            deviceid_bytes[0],
10944            deviceid_bytes[1],
10945            0,
10946            0,
10947        ]
10948    }
10949    fn serialize_into(&self, bytes: &mut Vec<u8>) {
10950        bytes.reserve(4);
10951        self.deviceid.serialize_into(bytes);
10952        bytes.extend_from_slice(&[0; 2]);
10953    }
10954}
10955#[derive(Clone)]
10956#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
10957#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10958pub enum HierarchyChangeData {
10959    AddMaster(HierarchyChangeDataAddMaster),
10960    RemoveMaster(HierarchyChangeDataRemoveMaster),
10961    AttachSlave(HierarchyChangeDataAttachSlave),
10962    DetachSlave(HierarchyChangeDataDetachSlave),
10963    /// This variant is returned when the server sends a discriminant
10964    /// value that does not match any of the defined by the protocol.
10965    ///
10966    /// Usually, this should be considered a parsing error, but there
10967    /// are some cases where the server violates the protocol.
10968    ///
10969    /// Trying to use `serialize` or `serialize_into` with this variant
10970    /// will raise a panic.
10971    InvalidValue(u16),
10972}
10973impl_debug_if_no_extra_traits!(HierarchyChangeData, "HierarchyChangeData");
10974impl HierarchyChangeData {
10975    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
10976    fn try_parse(value: &[u8], type_: u16) -> Result<(Self, &[u8]), ParseError> {
10977        let switch_expr = u16::from(type_);
10978        let mut outer_remaining = value;
10979        let mut parse_result = None;
10980        if switch_expr == u16::from(HierarchyChangeType::ADD_MASTER) {
10981            let (add_master, new_remaining) = HierarchyChangeDataAddMaster::try_parse(outer_remaining)?;
10982            outer_remaining = new_remaining;
10983            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
10984            parse_result = Some(HierarchyChangeData::AddMaster(add_master));
10985        }
10986        if switch_expr == u16::from(HierarchyChangeType::REMOVE_MASTER) {
10987            let (remove_master, new_remaining) = HierarchyChangeDataRemoveMaster::try_parse(outer_remaining)?;
10988            outer_remaining = new_remaining;
10989            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
10990            parse_result = Some(HierarchyChangeData::RemoveMaster(remove_master));
10991        }
10992        if switch_expr == u16::from(HierarchyChangeType::ATTACH_SLAVE) {
10993            let (attach_slave, new_remaining) = HierarchyChangeDataAttachSlave::try_parse(outer_remaining)?;
10994            outer_remaining = new_remaining;
10995            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
10996            parse_result = Some(HierarchyChangeData::AttachSlave(attach_slave));
10997        }
10998        if switch_expr == u16::from(HierarchyChangeType::DETACH_SLAVE) {
10999            let (detach_slave, new_remaining) = HierarchyChangeDataDetachSlave::try_parse(outer_remaining)?;
11000            outer_remaining = new_remaining;
11001            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
11002            parse_result = Some(HierarchyChangeData::DetachSlave(detach_slave));
11003        }
11004        match parse_result {
11005            None => Ok((HierarchyChangeData::InvalidValue(switch_expr), &[])),
11006            Some(result) => Ok((result, outer_remaining)),
11007        }
11008    }
11009}
11010impl HierarchyChangeData {
11011    pub fn as_add_master(&self) -> Option<&HierarchyChangeDataAddMaster> {
11012        match self {
11013            HierarchyChangeData::AddMaster(value) => Some(value),
11014            _ => None,
11015        }
11016    }
11017    pub fn as_remove_master(&self) -> Option<&HierarchyChangeDataRemoveMaster> {
11018        match self {
11019            HierarchyChangeData::RemoveMaster(value) => Some(value),
11020            _ => None,
11021        }
11022    }
11023    pub fn as_attach_slave(&self) -> Option<&HierarchyChangeDataAttachSlave> {
11024        match self {
11025            HierarchyChangeData::AttachSlave(value) => Some(value),
11026            _ => None,
11027        }
11028    }
11029    pub fn as_detach_slave(&self) -> Option<&HierarchyChangeDataDetachSlave> {
11030        match self {
11031            HierarchyChangeData::DetachSlave(value) => Some(value),
11032            _ => None,
11033        }
11034    }
11035}
11036impl HierarchyChangeData {
11037    #[allow(dead_code)]
11038    fn serialize(&self, type_: u16) -> Vec<u8> {
11039        let mut result = Vec::new();
11040        self.serialize_into(&mut result, u16::from(type_));
11041        result
11042    }
11043    fn serialize_into(&self, bytes: &mut Vec<u8>, type_: u16) {
11044        assert_eq!(self.switch_expr(), u16::from(type_), "switch `data` has an inconsistent discriminant");
11045        match self {
11046            HierarchyChangeData::AddMaster(add_master) => add_master.serialize_into(bytes),
11047            HierarchyChangeData::RemoveMaster(remove_master) => remove_master.serialize_into(bytes),
11048            HierarchyChangeData::AttachSlave(attach_slave) => attach_slave.serialize_into(bytes),
11049            HierarchyChangeData::DetachSlave(detach_slave) => detach_slave.serialize_into(bytes),
11050            HierarchyChangeData::InvalidValue(_) => panic!("attempted to serialize invalid switch case"),
11051        }
11052    }
11053}
11054impl HierarchyChangeData {
11055    fn switch_expr(&self) -> u16 {
11056        match self {
11057            HierarchyChangeData::AddMaster(_) => u16::from(HierarchyChangeType::ADD_MASTER),
11058            HierarchyChangeData::RemoveMaster(_) => u16::from(HierarchyChangeType::REMOVE_MASTER),
11059            HierarchyChangeData::AttachSlave(_) => u16::from(HierarchyChangeType::ATTACH_SLAVE),
11060            HierarchyChangeData::DetachSlave(_) => u16::from(HierarchyChangeType::DETACH_SLAVE),
11061            HierarchyChangeData::InvalidValue(switch_expr) => *switch_expr,
11062        }
11063    }
11064}
11065
11066#[derive(Clone)]
11067#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11068#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11069pub struct HierarchyChange {
11070    pub len: u16,
11071    pub data: HierarchyChangeData,
11072}
11073impl_debug_if_no_extra_traits!(HierarchyChange, "HierarchyChange");
11074impl TryParse for HierarchyChange {
11075    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
11076        let (type_, remaining) = u16::try_parse(remaining)?;
11077        let (len, remaining) = u16::try_parse(remaining)?;
11078        let (data, remaining) = HierarchyChangeData::try_parse(remaining, u16::from(type_))?;
11079        let result = HierarchyChange { len, data };
11080        Ok((result, remaining))
11081    }
11082}
11083impl Serialize for HierarchyChange {
11084    type Bytes = Vec<u8>;
11085    fn serialize(&self) -> Vec<u8> {
11086        let mut result = Vec::new();
11087        self.serialize_into(&mut result);
11088        result
11089    }
11090    fn serialize_into(&self, bytes: &mut Vec<u8>) {
11091        bytes.reserve(4);
11092        let type_: u16 = self.data.switch_expr();
11093        type_.serialize_into(bytes);
11094        self.len.serialize_into(bytes);
11095        self.data.serialize_into(bytes, u16::from(type_));
11096    }
11097}
11098
11099/// Opcode for the XIChangeHierarchy request
11100pub const XI_CHANGE_HIERARCHY_REQUEST: u8 = 43;
11101#[derive(Clone)]
11102#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11103#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11104pub struct XIChangeHierarchyRequest<'input> {
11105    pub changes: Cow<'input, [HierarchyChange]>,
11106}
11107impl_debug_if_no_extra_traits!(XIChangeHierarchyRequest<'_>, "XIChangeHierarchyRequest");
11108impl<'input> XIChangeHierarchyRequest<'input> {
11109    /// Serialize this request into bytes for the provided connection
11110    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
11111        let length_so_far = 0;
11112        let num_changes = u8::try_from(self.changes.len()).expect("`changes` has too many elements");
11113        let num_changes_bytes = num_changes.serialize();
11114        let mut request0 = vec![
11115            major_opcode,
11116            XI_CHANGE_HIERARCHY_REQUEST,
11117            0,
11118            0,
11119            num_changes_bytes[0],
11120            0,
11121            0,
11122            0,
11123        ];
11124        let length_so_far = length_so_far + request0.len();
11125        let changes_bytes = self.changes.serialize();
11126        let length_so_far = length_so_far + changes_bytes.len();
11127        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
11128        let length_so_far = length_so_far + padding0.len();
11129        assert_eq!(length_so_far % 4, 0);
11130        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
11131        request0[2..4].copy_from_slice(&length.to_ne_bytes());
11132        ([request0.into(), changes_bytes.into(), padding0.into()], vec![])
11133    }
11134    /// Parse this request given its header, its body, and any fds that go along with it
11135    #[cfg(feature = "request-parsing")]
11136    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
11137        if header.minor_opcode != XI_CHANGE_HIERARCHY_REQUEST {
11138            return Err(ParseError::InvalidValue);
11139        }
11140        let (num_changes, remaining) = u8::try_parse(value)?;
11141        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
11142        let (changes, remaining) = crate::x11_utils::parse_list::<HierarchyChange>(remaining, num_changes.try_to_usize()?)?;
11143        let _ = remaining;
11144        Ok(XIChangeHierarchyRequest {
11145            changes: Cow::Owned(changes),
11146        })
11147    }
11148    /// Clone all borrowed data in this XIChangeHierarchyRequest.
11149    pub fn into_owned(self) -> XIChangeHierarchyRequest<'static> {
11150        XIChangeHierarchyRequest {
11151            changes: Cow::Owned(self.changes.into_owned()),
11152        }
11153    }
11154}
11155impl<'input> Request for XIChangeHierarchyRequest<'input> {
11156    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
11157
11158    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
11159        let (bufs, fds) = self.serialize(major_opcode);
11160        // Flatten the buffers into a single vector
11161        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
11162        (buf, fds)
11163    }
11164}
11165impl<'input> crate::x11_utils::VoidRequest for XIChangeHierarchyRequest<'input> {
11166}
11167
11168/// Opcode for the XISetClientPointer request
11169pub const XI_SET_CLIENT_POINTER_REQUEST: u8 = 44;
11170#[derive(Clone, Copy, Default)]
11171#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11172#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11173pub struct XISetClientPointerRequest {
11174    pub window: xproto::Window,
11175    pub deviceid: DeviceId,
11176}
11177impl_debug_if_no_extra_traits!(XISetClientPointerRequest, "XISetClientPointerRequest");
11178impl XISetClientPointerRequest {
11179    /// Serialize this request into bytes for the provided connection
11180    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
11181        let length_so_far = 0;
11182        let window_bytes = self.window.serialize();
11183        let deviceid_bytes = self.deviceid.serialize();
11184        let mut request0 = vec![
11185            major_opcode,
11186            XI_SET_CLIENT_POINTER_REQUEST,
11187            0,
11188            0,
11189            window_bytes[0],
11190            window_bytes[1],
11191            window_bytes[2],
11192            window_bytes[3],
11193            deviceid_bytes[0],
11194            deviceid_bytes[1],
11195            0,
11196            0,
11197        ];
11198        let length_so_far = length_so_far + request0.len();
11199        assert_eq!(length_so_far % 4, 0);
11200        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
11201        request0[2..4].copy_from_slice(&length.to_ne_bytes());
11202        ([request0.into()], vec![])
11203    }
11204    /// Parse this request given its header, its body, and any fds that go along with it
11205    #[cfg(feature = "request-parsing")]
11206    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
11207        if header.minor_opcode != XI_SET_CLIENT_POINTER_REQUEST {
11208            return Err(ParseError::InvalidValue);
11209        }
11210        let (window, remaining) = xproto::Window::try_parse(value)?;
11211        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
11212        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
11213        let _ = remaining;
11214        Ok(XISetClientPointerRequest {
11215            window,
11216            deviceid,
11217        })
11218    }
11219}
11220impl Request for XISetClientPointerRequest {
11221    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
11222
11223    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
11224        let (bufs, fds) = self.serialize(major_opcode);
11225        // Flatten the buffers into a single vector
11226        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
11227        (buf, fds)
11228    }
11229}
11230impl crate::x11_utils::VoidRequest for XISetClientPointerRequest {
11231}
11232
11233/// Opcode for the XIGetClientPointer request
11234pub const XI_GET_CLIENT_POINTER_REQUEST: u8 = 45;
11235#[derive(Clone, Copy, Default)]
11236#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11237#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11238pub struct XIGetClientPointerRequest {
11239    pub window: xproto::Window,
11240}
11241impl_debug_if_no_extra_traits!(XIGetClientPointerRequest, "XIGetClientPointerRequest");
11242impl XIGetClientPointerRequest {
11243    /// Serialize this request into bytes for the provided connection
11244    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
11245        let length_so_far = 0;
11246        let window_bytes = self.window.serialize();
11247        let mut request0 = vec![
11248            major_opcode,
11249            XI_GET_CLIENT_POINTER_REQUEST,
11250            0,
11251            0,
11252            window_bytes[0],
11253            window_bytes[1],
11254            window_bytes[2],
11255            window_bytes[3],
11256        ];
11257        let length_so_far = length_so_far + request0.len();
11258        assert_eq!(length_so_far % 4, 0);
11259        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
11260        request0[2..4].copy_from_slice(&length.to_ne_bytes());
11261        ([request0.into()], vec![])
11262    }
11263    /// Parse this request given its header, its body, and any fds that go along with it
11264    #[cfg(feature = "request-parsing")]
11265    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
11266        if header.minor_opcode != XI_GET_CLIENT_POINTER_REQUEST {
11267            return Err(ParseError::InvalidValue);
11268        }
11269        let (window, remaining) = xproto::Window::try_parse(value)?;
11270        let _ = remaining;
11271        Ok(XIGetClientPointerRequest {
11272            window,
11273        })
11274    }
11275}
11276impl Request for XIGetClientPointerRequest {
11277    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
11278
11279    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
11280        let (bufs, fds) = self.serialize(major_opcode);
11281        // Flatten the buffers into a single vector
11282        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
11283        (buf, fds)
11284    }
11285}
11286impl crate::x11_utils::ReplyRequest for XIGetClientPointerRequest {
11287    type Reply = XIGetClientPointerReply;
11288}
11289
11290#[derive(Clone, Copy, Default)]
11291#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11292#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11293pub struct XIGetClientPointerReply {
11294    pub sequence: u16,
11295    pub length: u32,
11296    pub set: bool,
11297    pub deviceid: DeviceId,
11298}
11299impl_debug_if_no_extra_traits!(XIGetClientPointerReply, "XIGetClientPointerReply");
11300impl TryParse for XIGetClientPointerReply {
11301    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
11302        let remaining = initial_value;
11303        let (response_type, remaining) = u8::try_parse(remaining)?;
11304        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
11305        let (sequence, remaining) = u16::try_parse(remaining)?;
11306        let (length, remaining) = u32::try_parse(remaining)?;
11307        let (set, remaining) = bool::try_parse(remaining)?;
11308        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
11309        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
11310        let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
11311        if response_type != 1 {
11312            return Err(ParseError::InvalidValue);
11313        }
11314        let result = XIGetClientPointerReply { sequence, length, set, deviceid };
11315        let _ = remaining;
11316        let remaining = initial_value.get(32 + length as usize * 4..)
11317            .ok_or(ParseError::InsufficientData)?;
11318        Ok((result, remaining))
11319    }
11320}
11321impl Serialize for XIGetClientPointerReply {
11322    type Bytes = [u8; 32];
11323    fn serialize(&self) -> [u8; 32] {
11324        let response_type_bytes = &[1];
11325        let sequence_bytes = self.sequence.serialize();
11326        let length_bytes = self.length.serialize();
11327        let set_bytes = self.set.serialize();
11328        let deviceid_bytes = self.deviceid.serialize();
11329        [
11330            response_type_bytes[0],
11331            0,
11332            sequence_bytes[0],
11333            sequence_bytes[1],
11334            length_bytes[0],
11335            length_bytes[1],
11336            length_bytes[2],
11337            length_bytes[3],
11338            set_bytes[0],
11339            0,
11340            deviceid_bytes[0],
11341            deviceid_bytes[1],
11342            0,
11343            0,
11344            0,
11345            0,
11346            0,
11347            0,
11348            0,
11349            0,
11350            0,
11351            0,
11352            0,
11353            0,
11354            0,
11355            0,
11356            0,
11357            0,
11358            0,
11359            0,
11360            0,
11361            0,
11362        ]
11363    }
11364    fn serialize_into(&self, bytes: &mut Vec<u8>) {
11365        bytes.reserve(32);
11366        let response_type_bytes = &[1];
11367        bytes.push(response_type_bytes[0]);
11368        bytes.extend_from_slice(&[0; 1]);
11369        self.sequence.serialize_into(bytes);
11370        self.length.serialize_into(bytes);
11371        self.set.serialize_into(bytes);
11372        bytes.extend_from_slice(&[0; 1]);
11373        self.deviceid.serialize_into(bytes);
11374        bytes.extend_from_slice(&[0; 20]);
11375    }
11376}
11377
11378#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
11379#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11380pub struct XIEventMask(u32);
11381impl XIEventMask {
11382    pub const DEVICE_CHANGED: Self = Self(1 << 1);
11383    pub const KEY_PRESS: Self = Self(1 << 2);
11384    pub const KEY_RELEASE: Self = Self(1 << 3);
11385    pub const BUTTON_PRESS: Self = Self(1 << 4);
11386    pub const BUTTON_RELEASE: Self = Self(1 << 5);
11387    pub const MOTION: Self = Self(1 << 6);
11388    pub const ENTER: Self = Self(1 << 7);
11389    pub const LEAVE: Self = Self(1 << 8);
11390    pub const FOCUS_IN: Self = Self(1 << 9);
11391    pub const FOCUS_OUT: Self = Self(1 << 10);
11392    pub const HIERARCHY: Self = Self(1 << 11);
11393    pub const PROPERTY: Self = Self(1 << 12);
11394    pub const RAW_KEY_PRESS: Self = Self(1 << 13);
11395    pub const RAW_KEY_RELEASE: Self = Self(1 << 14);
11396    pub const RAW_BUTTON_PRESS: Self = Self(1 << 15);
11397    pub const RAW_BUTTON_RELEASE: Self = Self(1 << 16);
11398    pub const RAW_MOTION: Self = Self(1 << 17);
11399    pub const TOUCH_BEGIN: Self = Self(1 << 18);
11400    pub const TOUCH_UPDATE: Self = Self(1 << 19);
11401    pub const TOUCH_END: Self = Self(1 << 20);
11402    pub const TOUCH_OWNERSHIP: Self = Self(1 << 21);
11403    pub const RAW_TOUCH_BEGIN: Self = Self(1 << 22);
11404    pub const RAW_TOUCH_UPDATE: Self = Self(1 << 23);
11405    pub const RAW_TOUCH_END: Self = Self(1 << 24);
11406    pub const BARRIER_HIT: Self = Self(1 << 25);
11407    pub const BARRIER_LEAVE: Self = Self(1 << 26);
11408}
11409impl From<XIEventMask> for u32 {
11410    #[inline]
11411    fn from(input: XIEventMask) -> Self {
11412        input.0
11413    }
11414}
11415impl From<XIEventMask> for Option<u32> {
11416    #[inline]
11417    fn from(input: XIEventMask) -> Self {
11418        Some(input.0)
11419    }
11420}
11421impl From<u8> for XIEventMask {
11422    #[inline]
11423    fn from(value: u8) -> Self {
11424        Self(value.into())
11425    }
11426}
11427impl From<u16> for XIEventMask {
11428    #[inline]
11429    fn from(value: u16) -> Self {
11430        Self(value.into())
11431    }
11432}
11433impl From<u32> for XIEventMask {
11434    #[inline]
11435    fn from(value: u32) -> Self {
11436        Self(value)
11437    }
11438}
11439impl core::fmt::Debug for XIEventMask  {
11440    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
11441        let variants = [
11442            (Self::DEVICE_CHANGED.0, "DEVICE_CHANGED", "DeviceChanged"),
11443            (Self::KEY_PRESS.0, "KEY_PRESS", "KeyPress"),
11444            (Self::KEY_RELEASE.0, "KEY_RELEASE", "KeyRelease"),
11445            (Self::BUTTON_PRESS.0, "BUTTON_PRESS", "ButtonPress"),
11446            (Self::BUTTON_RELEASE.0, "BUTTON_RELEASE", "ButtonRelease"),
11447            (Self::MOTION.0, "MOTION", "Motion"),
11448            (Self::ENTER.0, "ENTER", "Enter"),
11449            (Self::LEAVE.0, "LEAVE", "Leave"),
11450            (Self::FOCUS_IN.0, "FOCUS_IN", "FocusIn"),
11451            (Self::FOCUS_OUT.0, "FOCUS_OUT", "FocusOut"),
11452            (Self::HIERARCHY.0, "HIERARCHY", "Hierarchy"),
11453            (Self::PROPERTY.0, "PROPERTY", "Property"),
11454            (Self::RAW_KEY_PRESS.0, "RAW_KEY_PRESS", "RawKeyPress"),
11455            (Self::RAW_KEY_RELEASE.0, "RAW_KEY_RELEASE", "RawKeyRelease"),
11456            (Self::RAW_BUTTON_PRESS.0, "RAW_BUTTON_PRESS", "RawButtonPress"),
11457            (Self::RAW_BUTTON_RELEASE.0, "RAW_BUTTON_RELEASE", "RawButtonRelease"),
11458            (Self::RAW_MOTION.0, "RAW_MOTION", "RawMotion"),
11459            (Self::TOUCH_BEGIN.0, "TOUCH_BEGIN", "TouchBegin"),
11460            (Self::TOUCH_UPDATE.0, "TOUCH_UPDATE", "TouchUpdate"),
11461            (Self::TOUCH_END.0, "TOUCH_END", "TouchEnd"),
11462            (Self::TOUCH_OWNERSHIP.0, "TOUCH_OWNERSHIP", "TouchOwnership"),
11463            (Self::RAW_TOUCH_BEGIN.0, "RAW_TOUCH_BEGIN", "RawTouchBegin"),
11464            (Self::RAW_TOUCH_UPDATE.0, "RAW_TOUCH_UPDATE", "RawTouchUpdate"),
11465            (Self::RAW_TOUCH_END.0, "RAW_TOUCH_END", "RawTouchEnd"),
11466            (Self::BARRIER_HIT.0, "BARRIER_HIT", "BarrierHit"),
11467            (Self::BARRIER_LEAVE.0, "BARRIER_LEAVE", "BarrierLeave"),
11468        ];
11469        pretty_print_bitmask(fmt, self.0, &variants)
11470    }
11471}
11472bitmask_binop!(XIEventMask, u32);
11473
11474#[derive(Clone, Default)]
11475#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11476#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11477pub struct EventMask {
11478    pub deviceid: DeviceId,
11479    pub mask: Vec<XIEventMask>,
11480}
11481impl_debug_if_no_extra_traits!(EventMask, "EventMask");
11482impl TryParse for EventMask {
11483    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
11484        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
11485        let (mask_len, remaining) = u16::try_parse(remaining)?;
11486        let mut remaining = remaining;
11487        let list_length = mask_len.try_to_usize()?;
11488        let mut mask = Vec::with_capacity(list_length);
11489        for _ in 0..list_length {
11490            let (v, new_remaining) = u32::try_parse(remaining)?;
11491            let v = v.into();
11492            remaining = new_remaining;
11493            mask.push(v);
11494        }
11495        let result = EventMask { deviceid, mask };
11496        Ok((result, remaining))
11497    }
11498}
11499impl Serialize for EventMask {
11500    type Bytes = Vec<u8>;
11501    fn serialize(&self) -> Vec<u8> {
11502        let mut result = Vec::new();
11503        self.serialize_into(&mut result);
11504        result
11505    }
11506    fn serialize_into(&self, bytes: &mut Vec<u8>) {
11507        bytes.reserve(4);
11508        self.deviceid.serialize_into(bytes);
11509        let mask_len = u16::try_from(self.mask.len()).expect("`mask` has too many elements");
11510        mask_len.serialize_into(bytes);
11511        for element in self.mask.iter().copied() {
11512            u32::from(element).serialize_into(bytes);
11513        }
11514    }
11515}
11516impl EventMask {
11517    /// Get the value of the `mask_len` field.
11518    ///
11519    /// The `mask_len` field is used as the length field of the `mask` field.
11520    /// This function computes the field's value again based on the length of the list.
11521    ///
11522    /// # Panics
11523    ///
11524    /// Panics if the value cannot be represented in the target type. This
11525    /// cannot happen with values of the struct received from the X11 server.
11526    pub fn mask_len(&self) -> u16 {
11527        self.mask.len()
11528            .try_into().unwrap()
11529    }
11530}
11531
11532/// Opcode for the XISelectEvents request
11533pub const XI_SELECT_EVENTS_REQUEST: u8 = 46;
11534#[derive(Clone, Default)]
11535#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11536#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11537pub struct XISelectEventsRequest<'input> {
11538    pub window: xproto::Window,
11539    pub masks: Cow<'input, [EventMask]>,
11540}
11541impl_debug_if_no_extra_traits!(XISelectEventsRequest<'_>, "XISelectEventsRequest");
11542impl<'input> XISelectEventsRequest<'input> {
11543    /// Serialize this request into bytes for the provided connection
11544    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
11545        let length_so_far = 0;
11546        let window_bytes = self.window.serialize();
11547        let num_mask = u16::try_from(self.masks.len()).expect("`masks` has too many elements");
11548        let num_mask_bytes = num_mask.serialize();
11549        let mut request0 = vec![
11550            major_opcode,
11551            XI_SELECT_EVENTS_REQUEST,
11552            0,
11553            0,
11554            window_bytes[0],
11555            window_bytes[1],
11556            window_bytes[2],
11557            window_bytes[3],
11558            num_mask_bytes[0],
11559            num_mask_bytes[1],
11560            0,
11561            0,
11562        ];
11563        let length_so_far = length_so_far + request0.len();
11564        let masks_bytes = self.masks.serialize();
11565        let length_so_far = length_so_far + masks_bytes.len();
11566        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
11567        let length_so_far = length_so_far + padding0.len();
11568        assert_eq!(length_so_far % 4, 0);
11569        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
11570        request0[2..4].copy_from_slice(&length.to_ne_bytes());
11571        ([request0.into(), masks_bytes.into(), padding0.into()], vec![])
11572    }
11573    /// Parse this request given its header, its body, and any fds that go along with it
11574    #[cfg(feature = "request-parsing")]
11575    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
11576        if header.minor_opcode != XI_SELECT_EVENTS_REQUEST {
11577            return Err(ParseError::InvalidValue);
11578        }
11579        let (window, remaining) = xproto::Window::try_parse(value)?;
11580        let (num_mask, remaining) = u16::try_parse(remaining)?;
11581        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
11582        let (masks, remaining) = crate::x11_utils::parse_list::<EventMask>(remaining, num_mask.try_to_usize()?)?;
11583        let _ = remaining;
11584        Ok(XISelectEventsRequest {
11585            window,
11586            masks: Cow::Owned(masks),
11587        })
11588    }
11589    /// Clone all borrowed data in this XISelectEventsRequest.
11590    pub fn into_owned(self) -> XISelectEventsRequest<'static> {
11591        XISelectEventsRequest {
11592            window: self.window,
11593            masks: Cow::Owned(self.masks.into_owned()),
11594        }
11595    }
11596}
11597impl<'input> Request for XISelectEventsRequest<'input> {
11598    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
11599
11600    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
11601        let (bufs, fds) = self.serialize(major_opcode);
11602        // Flatten the buffers into a single vector
11603        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
11604        (buf, fds)
11605    }
11606}
11607impl<'input> crate::x11_utils::VoidRequest for XISelectEventsRequest<'input> {
11608}
11609
11610/// Opcode for the XIQueryVersion request
11611pub const XI_QUERY_VERSION_REQUEST: u8 = 47;
11612#[derive(Clone, Copy, Default)]
11613#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11614#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11615pub struct XIQueryVersionRequest {
11616    pub major_version: u16,
11617    pub minor_version: u16,
11618}
11619impl_debug_if_no_extra_traits!(XIQueryVersionRequest, "XIQueryVersionRequest");
11620impl XIQueryVersionRequest {
11621    /// Serialize this request into bytes for the provided connection
11622    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
11623        let length_so_far = 0;
11624        let major_version_bytes = self.major_version.serialize();
11625        let minor_version_bytes = self.minor_version.serialize();
11626        let mut request0 = vec![
11627            major_opcode,
11628            XI_QUERY_VERSION_REQUEST,
11629            0,
11630            0,
11631            major_version_bytes[0],
11632            major_version_bytes[1],
11633            minor_version_bytes[0],
11634            minor_version_bytes[1],
11635        ];
11636        let length_so_far = length_so_far + request0.len();
11637        assert_eq!(length_so_far % 4, 0);
11638        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
11639        request0[2..4].copy_from_slice(&length.to_ne_bytes());
11640        ([request0.into()], vec![])
11641    }
11642    /// Parse this request given its header, its body, and any fds that go along with it
11643    #[cfg(feature = "request-parsing")]
11644    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
11645        if header.minor_opcode != XI_QUERY_VERSION_REQUEST {
11646            return Err(ParseError::InvalidValue);
11647        }
11648        let (major_version, remaining) = u16::try_parse(value)?;
11649        let (minor_version, remaining) = u16::try_parse(remaining)?;
11650        let _ = remaining;
11651        Ok(XIQueryVersionRequest {
11652            major_version,
11653            minor_version,
11654        })
11655    }
11656}
11657impl Request for XIQueryVersionRequest {
11658    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
11659
11660    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
11661        let (bufs, fds) = self.serialize(major_opcode);
11662        // Flatten the buffers into a single vector
11663        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
11664        (buf, fds)
11665    }
11666}
11667impl crate::x11_utils::ReplyRequest for XIQueryVersionRequest {
11668    type Reply = XIQueryVersionReply;
11669}
11670
11671#[derive(Clone, Copy, Default)]
11672#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
11673#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11674pub struct XIQueryVersionReply {
11675    pub sequence: u16,
11676    pub length: u32,
11677    pub major_version: u16,
11678    pub minor_version: u16,
11679}
11680impl_debug_if_no_extra_traits!(XIQueryVersionReply, "XIQueryVersionReply");
11681impl TryParse for XIQueryVersionReply {
11682    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
11683        let remaining = initial_value;
11684        let (response_type, remaining) = u8::try_parse(remaining)?;
11685        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
11686        let (sequence, remaining) = u16::try_parse(remaining)?;
11687        let (length, remaining) = u32::try_parse(remaining)?;
11688        let (major_version, remaining) = u16::try_parse(remaining)?;
11689        let (minor_version, remaining) = u16::try_parse(remaining)?;
11690        let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
11691        if response_type != 1 {
11692            return Err(ParseError::InvalidValue);
11693        }
11694        let result = XIQueryVersionReply { sequence, length, major_version, minor_version };
11695        let _ = remaining;
11696        let remaining = initial_value.get(32 + length as usize * 4..)
11697            .ok_or(ParseError::InsufficientData)?;
11698        Ok((result, remaining))
11699    }
11700}
11701impl Serialize for XIQueryVersionReply {
11702    type Bytes = [u8; 32];
11703    fn serialize(&self) -> [u8; 32] {
11704        let response_type_bytes = &[1];
11705        let sequence_bytes = self.sequence.serialize();
11706        let length_bytes = self.length.serialize();
11707        let major_version_bytes = self.major_version.serialize();
11708        let minor_version_bytes = self.minor_version.serialize();
11709        [
11710            response_type_bytes[0],
11711            0,
11712            sequence_bytes[0],
11713            sequence_bytes[1],
11714            length_bytes[0],
11715            length_bytes[1],
11716            length_bytes[2],
11717            length_bytes[3],
11718            major_version_bytes[0],
11719            major_version_bytes[1],
11720            minor_version_bytes[0],
11721            minor_version_bytes[1],
11722            0,
11723            0,
11724            0,
11725            0,
11726            0,
11727            0,
11728            0,
11729            0,
11730            0,
11731            0,
11732            0,
11733            0,
11734            0,
11735            0,
11736            0,
11737            0,
11738            0,
11739            0,
11740            0,
11741            0,
11742        ]
11743    }
11744    fn serialize_into(&self, bytes: &mut Vec<u8>) {
11745        bytes.reserve(32);
11746        let response_type_bytes = &[1];
11747        bytes.push(response_type_bytes[0]);
11748        bytes.extend_from_slice(&[0; 1]);
11749        self.sequence.serialize_into(bytes);
11750        self.length.serialize_into(bytes);
11751        self.major_version.serialize_into(bytes);
11752        self.minor_version.serialize_into(bytes);
11753        bytes.extend_from_slice(&[0; 20]);
11754    }
11755}
11756
11757#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
11758#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11759pub struct DeviceClassType(u16);
11760impl DeviceClassType {
11761    pub const KEY: Self = Self(0);
11762    pub const BUTTON: Self = Self(1);
11763    pub const VALUATOR: Self = Self(2);
11764    pub const SCROLL: Self = Self(3);
11765    pub const TOUCH: Self = Self(8);
11766    pub const GESTURE: Self = Self(9);
11767}
11768impl From<DeviceClassType> for u16 {
11769    #[inline]
11770    fn from(input: DeviceClassType) -> Self {
11771        input.0
11772    }
11773}
11774impl From<DeviceClassType> for Option<u16> {
11775    #[inline]
11776    fn from(input: DeviceClassType) -> Self {
11777        Some(input.0)
11778    }
11779}
11780impl From<DeviceClassType> for u32 {
11781    #[inline]
11782    fn from(input: DeviceClassType) -> Self {
11783        u32::from(input.0)
11784    }
11785}
11786impl From<DeviceClassType> for Option<u32> {
11787    #[inline]
11788    fn from(input: DeviceClassType) -> Self {
11789        Some(u32::from(input.0))
11790    }
11791}
11792impl From<u8> for DeviceClassType {
11793    #[inline]
11794    fn from(value: u8) -> Self {
11795        Self(value.into())
11796    }
11797}
11798impl From<u16> for DeviceClassType {
11799    #[inline]
11800    fn from(value: u16) -> Self {
11801        Self(value)
11802    }
11803}
11804impl core::fmt::Debug for DeviceClassType  {
11805    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
11806        let variants = [
11807            (Self::KEY.0.into(), "KEY", "Key"),
11808            (Self::BUTTON.0.into(), "BUTTON", "Button"),
11809            (Self::VALUATOR.0.into(), "VALUATOR", "Valuator"),
11810            (Self::SCROLL.0.into(), "SCROLL", "Scroll"),
11811            (Self::TOUCH.0.into(), "TOUCH", "Touch"),
11812            (Self::GESTURE.0.into(), "GESTURE", "Gesture"),
11813        ];
11814        pretty_print_enum(fmt, self.0.into(), &variants)
11815    }
11816}
11817
11818#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
11819#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11820pub struct DeviceType(u16);
11821impl DeviceType {
11822    pub const MASTER_POINTER: Self = Self(1);
11823    pub const MASTER_KEYBOARD: Self = Self(2);
11824    pub const SLAVE_POINTER: Self = Self(3);
11825    pub const SLAVE_KEYBOARD: Self = Self(4);
11826    pub const FLOATING_SLAVE: Self = Self(5);
11827}
11828impl From<DeviceType> for u16 {
11829    #[inline]
11830    fn from(input: DeviceType) -> Self {
11831        input.0
11832    }
11833}
11834impl From<DeviceType> for Option<u16> {
11835    #[inline]
11836    fn from(input: DeviceType) -> Self {
11837        Some(input.0)
11838    }
11839}
11840impl From<DeviceType> for u32 {
11841    #[inline]
11842    fn from(input: DeviceType) -> Self {
11843        u32::from(input.0)
11844    }
11845}
11846impl From<DeviceType> for Option<u32> {
11847    #[inline]
11848    fn from(input: DeviceType) -> Self {
11849        Some(u32::from(input.0))
11850    }
11851}
11852impl From<u8> for DeviceType {
11853    #[inline]
11854    fn from(value: u8) -> Self {
11855        Self(value.into())
11856    }
11857}
11858impl From<u16> for DeviceType {
11859    #[inline]
11860    fn from(value: u16) -> Self {
11861        Self(value)
11862    }
11863}
11864impl core::fmt::Debug for DeviceType  {
11865    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
11866        let variants = [
11867            (Self::MASTER_POINTER.0.into(), "MASTER_POINTER", "MasterPointer"),
11868            (Self::MASTER_KEYBOARD.0.into(), "MASTER_KEYBOARD", "MasterKeyboard"),
11869            (Self::SLAVE_POINTER.0.into(), "SLAVE_POINTER", "SlavePointer"),
11870            (Self::SLAVE_KEYBOARD.0.into(), "SLAVE_KEYBOARD", "SlaveKeyboard"),
11871            (Self::FLOATING_SLAVE.0.into(), "FLOATING_SLAVE", "FloatingSlave"),
11872        ];
11873        pretty_print_enum(fmt, self.0.into(), &variants)
11874    }
11875}
11876
11877#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
11878#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11879pub struct ScrollFlags(u32);
11880impl ScrollFlags {
11881    pub const NO_EMULATION: Self = Self(1 << 0);
11882    pub const PREFERRED: Self = Self(1 << 1);
11883}
11884impl From<ScrollFlags> for u32 {
11885    #[inline]
11886    fn from(input: ScrollFlags) -> Self {
11887        input.0
11888    }
11889}
11890impl From<ScrollFlags> for Option<u32> {
11891    #[inline]
11892    fn from(input: ScrollFlags) -> Self {
11893        Some(input.0)
11894    }
11895}
11896impl From<u8> for ScrollFlags {
11897    #[inline]
11898    fn from(value: u8) -> Self {
11899        Self(value.into())
11900    }
11901}
11902impl From<u16> for ScrollFlags {
11903    #[inline]
11904    fn from(value: u16) -> Self {
11905        Self(value.into())
11906    }
11907}
11908impl From<u32> for ScrollFlags {
11909    #[inline]
11910    fn from(value: u32) -> Self {
11911        Self(value)
11912    }
11913}
11914impl core::fmt::Debug for ScrollFlags  {
11915    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
11916        let variants = [
11917            (Self::NO_EMULATION.0, "NO_EMULATION", "NoEmulation"),
11918            (Self::PREFERRED.0, "PREFERRED", "Preferred"),
11919        ];
11920        pretty_print_bitmask(fmt, self.0, &variants)
11921    }
11922}
11923bitmask_binop!(ScrollFlags, u32);
11924
11925#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
11926#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11927pub struct ScrollType(u16);
11928impl ScrollType {
11929    pub const VERTICAL: Self = Self(1);
11930    pub const HORIZONTAL: Self = Self(2);
11931}
11932impl From<ScrollType> for u16 {
11933    #[inline]
11934    fn from(input: ScrollType) -> Self {
11935        input.0
11936    }
11937}
11938impl From<ScrollType> for Option<u16> {
11939    #[inline]
11940    fn from(input: ScrollType) -> Self {
11941        Some(input.0)
11942    }
11943}
11944impl From<ScrollType> for u32 {
11945    #[inline]
11946    fn from(input: ScrollType) -> Self {
11947        u32::from(input.0)
11948    }
11949}
11950impl From<ScrollType> for Option<u32> {
11951    #[inline]
11952    fn from(input: ScrollType) -> Self {
11953        Some(u32::from(input.0))
11954    }
11955}
11956impl From<u8> for ScrollType {
11957    #[inline]
11958    fn from(value: u8) -> Self {
11959        Self(value.into())
11960    }
11961}
11962impl From<u16> for ScrollType {
11963    #[inline]
11964    fn from(value: u16) -> Self {
11965        Self(value)
11966    }
11967}
11968impl core::fmt::Debug for ScrollType  {
11969    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
11970        let variants = [
11971            (Self::VERTICAL.0.into(), "VERTICAL", "Vertical"),
11972            (Self::HORIZONTAL.0.into(), "HORIZONTAL", "Horizontal"),
11973        ];
11974        pretty_print_enum(fmt, self.0.into(), &variants)
11975    }
11976}
11977
11978#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
11979#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11980pub struct TouchMode(u8);
11981impl TouchMode {
11982    pub const DIRECT: Self = Self(1);
11983    pub const DEPENDENT: Self = Self(2);
11984}
11985impl From<TouchMode> for u8 {
11986    #[inline]
11987    fn from(input: TouchMode) -> Self {
11988        input.0
11989    }
11990}
11991impl From<TouchMode> for Option<u8> {
11992    #[inline]
11993    fn from(input: TouchMode) -> Self {
11994        Some(input.0)
11995    }
11996}
11997impl From<TouchMode> for u16 {
11998    #[inline]
11999    fn from(input: TouchMode) -> Self {
12000        u16::from(input.0)
12001    }
12002}
12003impl From<TouchMode> for Option<u16> {
12004    #[inline]
12005    fn from(input: TouchMode) -> Self {
12006        Some(u16::from(input.0))
12007    }
12008}
12009impl From<TouchMode> for u32 {
12010    #[inline]
12011    fn from(input: TouchMode) -> Self {
12012        u32::from(input.0)
12013    }
12014}
12015impl From<TouchMode> for Option<u32> {
12016    #[inline]
12017    fn from(input: TouchMode) -> Self {
12018        Some(u32::from(input.0))
12019    }
12020}
12021impl From<u8> for TouchMode {
12022    #[inline]
12023    fn from(value: u8) -> Self {
12024        Self(value)
12025    }
12026}
12027impl core::fmt::Debug for TouchMode  {
12028    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
12029        let variants = [
12030            (Self::DIRECT.0.into(), "DIRECT", "Direct"),
12031            (Self::DEPENDENT.0.into(), "DEPENDENT", "Dependent"),
12032        ];
12033        pretty_print_enum(fmt, self.0.into(), &variants)
12034    }
12035}
12036
12037#[derive(Clone, Default)]
12038#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12039#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12040pub struct ButtonClass {
12041    pub type_: DeviceClassType,
12042    pub len: u16,
12043    pub sourceid: DeviceId,
12044    pub state: Vec<u32>,
12045    pub labels: Vec<xproto::Atom>,
12046}
12047impl_debug_if_no_extra_traits!(ButtonClass, "ButtonClass");
12048impl TryParse for ButtonClass {
12049    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
12050        let (type_, remaining) = u16::try_parse(remaining)?;
12051        let (len, remaining) = u16::try_parse(remaining)?;
12052        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
12053        let (num_buttons, remaining) = u16::try_parse(remaining)?;
12054        let (state, remaining) = crate::x11_utils::parse_list::<u32>(remaining, u32::from(num_buttons).checked_add(31u32).ok_or(ParseError::InvalidExpression)?.checked_div(32u32).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
12055        let (labels, remaining) = crate::x11_utils::parse_list::<xproto::Atom>(remaining, num_buttons.try_to_usize()?)?;
12056        let type_ = type_.into();
12057        let result = ButtonClass { type_, len, sourceid, state, labels };
12058        Ok((result, remaining))
12059    }
12060}
12061impl Serialize for ButtonClass {
12062    type Bytes = Vec<u8>;
12063    fn serialize(&self) -> Vec<u8> {
12064        let mut result = Vec::new();
12065        self.serialize_into(&mut result);
12066        result
12067    }
12068    fn serialize_into(&self, bytes: &mut Vec<u8>) {
12069        bytes.reserve(8);
12070        u16::from(self.type_).serialize_into(bytes);
12071        self.len.serialize_into(bytes);
12072        self.sourceid.serialize_into(bytes);
12073        let num_buttons = u16::try_from(self.labels.len()).expect("`labels` has too many elements");
12074        num_buttons.serialize_into(bytes);
12075        assert_eq!(self.state.len(), usize::try_from(u32::from(num_buttons).checked_add(31u32).unwrap().checked_div(32u32).unwrap()).unwrap(), "`state` has an incorrect length");
12076        self.state.serialize_into(bytes);
12077        self.labels.serialize_into(bytes);
12078    }
12079}
12080impl ButtonClass {
12081    /// Get the value of the `num_buttons` field.
12082    ///
12083    /// The `num_buttons` field is used as the length field of the `labels` field.
12084    /// This function computes the field's value again based on the length of the list.
12085    ///
12086    /// # Panics
12087    ///
12088    /// Panics if the value cannot be represented in the target type. This
12089    /// cannot happen with values of the struct received from the X11 server.
12090    pub fn num_buttons(&self) -> u16 {
12091        self.labels.len()
12092            .try_into().unwrap()
12093    }
12094}
12095
12096#[derive(Clone, Default)]
12097#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12098#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12099pub struct KeyClass {
12100    pub type_: DeviceClassType,
12101    pub len: u16,
12102    pub sourceid: DeviceId,
12103    pub keys: Vec<u32>,
12104}
12105impl_debug_if_no_extra_traits!(KeyClass, "KeyClass");
12106impl TryParse for KeyClass {
12107    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
12108        let (type_, remaining) = u16::try_parse(remaining)?;
12109        let (len, remaining) = u16::try_parse(remaining)?;
12110        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
12111        let (num_keys, remaining) = u16::try_parse(remaining)?;
12112        let (keys, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_keys.try_to_usize()?)?;
12113        let type_ = type_.into();
12114        let result = KeyClass { type_, len, sourceid, keys };
12115        Ok((result, remaining))
12116    }
12117}
12118impl Serialize for KeyClass {
12119    type Bytes = Vec<u8>;
12120    fn serialize(&self) -> Vec<u8> {
12121        let mut result = Vec::new();
12122        self.serialize_into(&mut result);
12123        result
12124    }
12125    fn serialize_into(&self, bytes: &mut Vec<u8>) {
12126        bytes.reserve(8);
12127        u16::from(self.type_).serialize_into(bytes);
12128        self.len.serialize_into(bytes);
12129        self.sourceid.serialize_into(bytes);
12130        let num_keys = u16::try_from(self.keys.len()).expect("`keys` has too many elements");
12131        num_keys.serialize_into(bytes);
12132        self.keys.serialize_into(bytes);
12133    }
12134}
12135impl KeyClass {
12136    /// Get the value of the `num_keys` field.
12137    ///
12138    /// The `num_keys` field is used as the length field of the `keys` field.
12139    /// This function computes the field's value again based on the length of the list.
12140    ///
12141    /// # Panics
12142    ///
12143    /// Panics if the value cannot be represented in the target type. This
12144    /// cannot happen with values of the struct received from the X11 server.
12145    pub fn num_keys(&self) -> u16 {
12146        self.keys.len()
12147            .try_into().unwrap()
12148    }
12149}
12150
12151#[derive(Clone, Copy, Default)]
12152#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12153#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12154pub struct ScrollClass {
12155    pub type_: DeviceClassType,
12156    pub len: u16,
12157    pub sourceid: DeviceId,
12158    pub number: u16,
12159    pub scroll_type: ScrollType,
12160    pub flags: ScrollFlags,
12161    pub increment: Fp3232,
12162}
12163impl_debug_if_no_extra_traits!(ScrollClass, "ScrollClass");
12164impl TryParse for ScrollClass {
12165    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
12166        let (type_, remaining) = u16::try_parse(remaining)?;
12167        let (len, remaining) = u16::try_parse(remaining)?;
12168        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
12169        let (number, remaining) = u16::try_parse(remaining)?;
12170        let (scroll_type, remaining) = u16::try_parse(remaining)?;
12171        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
12172        let (flags, remaining) = u32::try_parse(remaining)?;
12173        let (increment, remaining) = Fp3232::try_parse(remaining)?;
12174        let type_ = type_.into();
12175        let scroll_type = scroll_type.into();
12176        let flags = flags.into();
12177        let result = ScrollClass { type_, len, sourceid, number, scroll_type, flags, increment };
12178        Ok((result, remaining))
12179    }
12180}
12181impl Serialize for ScrollClass {
12182    type Bytes = [u8; 24];
12183    fn serialize(&self) -> [u8; 24] {
12184        let type_bytes = u16::from(self.type_).serialize();
12185        let len_bytes = self.len.serialize();
12186        let sourceid_bytes = self.sourceid.serialize();
12187        let number_bytes = self.number.serialize();
12188        let scroll_type_bytes = u16::from(self.scroll_type).serialize();
12189        let flags_bytes = u32::from(self.flags).serialize();
12190        let increment_bytes = self.increment.serialize();
12191        [
12192            type_bytes[0],
12193            type_bytes[1],
12194            len_bytes[0],
12195            len_bytes[1],
12196            sourceid_bytes[0],
12197            sourceid_bytes[1],
12198            number_bytes[0],
12199            number_bytes[1],
12200            scroll_type_bytes[0],
12201            scroll_type_bytes[1],
12202            0,
12203            0,
12204            flags_bytes[0],
12205            flags_bytes[1],
12206            flags_bytes[2],
12207            flags_bytes[3],
12208            increment_bytes[0],
12209            increment_bytes[1],
12210            increment_bytes[2],
12211            increment_bytes[3],
12212            increment_bytes[4],
12213            increment_bytes[5],
12214            increment_bytes[6],
12215            increment_bytes[7],
12216        ]
12217    }
12218    fn serialize_into(&self, bytes: &mut Vec<u8>) {
12219        bytes.reserve(24);
12220        u16::from(self.type_).serialize_into(bytes);
12221        self.len.serialize_into(bytes);
12222        self.sourceid.serialize_into(bytes);
12223        self.number.serialize_into(bytes);
12224        u16::from(self.scroll_type).serialize_into(bytes);
12225        bytes.extend_from_slice(&[0; 2]);
12226        u32::from(self.flags).serialize_into(bytes);
12227        self.increment.serialize_into(bytes);
12228    }
12229}
12230
12231#[derive(Clone, Copy, Default)]
12232#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12233#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12234pub struct TouchClass {
12235    pub type_: DeviceClassType,
12236    pub len: u16,
12237    pub sourceid: DeviceId,
12238    pub mode: TouchMode,
12239    pub num_touches: u8,
12240}
12241impl_debug_if_no_extra_traits!(TouchClass, "TouchClass");
12242impl TryParse for TouchClass {
12243    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
12244        let (type_, remaining) = u16::try_parse(remaining)?;
12245        let (len, remaining) = u16::try_parse(remaining)?;
12246        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
12247        let (mode, remaining) = u8::try_parse(remaining)?;
12248        let (num_touches, remaining) = u8::try_parse(remaining)?;
12249        let type_ = type_.into();
12250        let mode = mode.into();
12251        let result = TouchClass { type_, len, sourceid, mode, num_touches };
12252        Ok((result, remaining))
12253    }
12254}
12255impl Serialize for TouchClass {
12256    type Bytes = [u8; 8];
12257    fn serialize(&self) -> [u8; 8] {
12258        let type_bytes = u16::from(self.type_).serialize();
12259        let len_bytes = self.len.serialize();
12260        let sourceid_bytes = self.sourceid.serialize();
12261        let mode_bytes = u8::from(self.mode).serialize();
12262        let num_touches_bytes = self.num_touches.serialize();
12263        [
12264            type_bytes[0],
12265            type_bytes[1],
12266            len_bytes[0],
12267            len_bytes[1],
12268            sourceid_bytes[0],
12269            sourceid_bytes[1],
12270            mode_bytes[0],
12271            num_touches_bytes[0],
12272        ]
12273    }
12274    fn serialize_into(&self, bytes: &mut Vec<u8>) {
12275        bytes.reserve(8);
12276        u16::from(self.type_).serialize_into(bytes);
12277        self.len.serialize_into(bytes);
12278        self.sourceid.serialize_into(bytes);
12279        u8::from(self.mode).serialize_into(bytes);
12280        self.num_touches.serialize_into(bytes);
12281    }
12282}
12283
12284#[derive(Clone, Copy, Default)]
12285#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12286#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12287pub struct GestureClass {
12288    pub type_: DeviceClassType,
12289    pub len: u16,
12290    pub sourceid: DeviceId,
12291    pub num_touches: u8,
12292}
12293impl_debug_if_no_extra_traits!(GestureClass, "GestureClass");
12294impl TryParse for GestureClass {
12295    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
12296        let (type_, remaining) = u16::try_parse(remaining)?;
12297        let (len, remaining) = u16::try_parse(remaining)?;
12298        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
12299        let (num_touches, remaining) = u8::try_parse(remaining)?;
12300        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
12301        let type_ = type_.into();
12302        let result = GestureClass { type_, len, sourceid, num_touches };
12303        Ok((result, remaining))
12304    }
12305}
12306impl Serialize for GestureClass {
12307    type Bytes = [u8; 8];
12308    fn serialize(&self) -> [u8; 8] {
12309        let type_bytes = u16::from(self.type_).serialize();
12310        let len_bytes = self.len.serialize();
12311        let sourceid_bytes = self.sourceid.serialize();
12312        let num_touches_bytes = self.num_touches.serialize();
12313        [
12314            type_bytes[0],
12315            type_bytes[1],
12316            len_bytes[0],
12317            len_bytes[1],
12318            sourceid_bytes[0],
12319            sourceid_bytes[1],
12320            num_touches_bytes[0],
12321            0,
12322        ]
12323    }
12324    fn serialize_into(&self, bytes: &mut Vec<u8>) {
12325        bytes.reserve(8);
12326        u16::from(self.type_).serialize_into(bytes);
12327        self.len.serialize_into(bytes);
12328        self.sourceid.serialize_into(bytes);
12329        self.num_touches.serialize_into(bytes);
12330        bytes.extend_from_slice(&[0; 1]);
12331    }
12332}
12333
12334#[derive(Clone, Copy, Default)]
12335#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12336#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12337pub struct ValuatorClass {
12338    pub type_: DeviceClassType,
12339    pub len: u16,
12340    pub sourceid: DeviceId,
12341    pub number: u16,
12342    pub label: xproto::Atom,
12343    pub min: Fp3232,
12344    pub max: Fp3232,
12345    pub value: Fp3232,
12346    pub resolution: u32,
12347    pub mode: ValuatorMode,
12348}
12349impl_debug_if_no_extra_traits!(ValuatorClass, "ValuatorClass");
12350impl TryParse for ValuatorClass {
12351    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
12352        let (type_, remaining) = u16::try_parse(remaining)?;
12353        let (len, remaining) = u16::try_parse(remaining)?;
12354        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
12355        let (number, remaining) = u16::try_parse(remaining)?;
12356        let (label, remaining) = xproto::Atom::try_parse(remaining)?;
12357        let (min, remaining) = Fp3232::try_parse(remaining)?;
12358        let (max, remaining) = Fp3232::try_parse(remaining)?;
12359        let (value, remaining) = Fp3232::try_parse(remaining)?;
12360        let (resolution, remaining) = u32::try_parse(remaining)?;
12361        let (mode, remaining) = u8::try_parse(remaining)?;
12362        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
12363        let type_ = type_.into();
12364        let mode = mode.into();
12365        let result = ValuatorClass { type_, len, sourceid, number, label, min, max, value, resolution, mode };
12366        Ok((result, remaining))
12367    }
12368}
12369impl Serialize for ValuatorClass {
12370    type Bytes = [u8; 44];
12371    fn serialize(&self) -> [u8; 44] {
12372        let type_bytes = u16::from(self.type_).serialize();
12373        let len_bytes = self.len.serialize();
12374        let sourceid_bytes = self.sourceid.serialize();
12375        let number_bytes = self.number.serialize();
12376        let label_bytes = self.label.serialize();
12377        let min_bytes = self.min.serialize();
12378        let max_bytes = self.max.serialize();
12379        let value_bytes = self.value.serialize();
12380        let resolution_bytes = self.resolution.serialize();
12381        let mode_bytes = u8::from(self.mode).serialize();
12382        [
12383            type_bytes[0],
12384            type_bytes[1],
12385            len_bytes[0],
12386            len_bytes[1],
12387            sourceid_bytes[0],
12388            sourceid_bytes[1],
12389            number_bytes[0],
12390            number_bytes[1],
12391            label_bytes[0],
12392            label_bytes[1],
12393            label_bytes[2],
12394            label_bytes[3],
12395            min_bytes[0],
12396            min_bytes[1],
12397            min_bytes[2],
12398            min_bytes[3],
12399            min_bytes[4],
12400            min_bytes[5],
12401            min_bytes[6],
12402            min_bytes[7],
12403            max_bytes[0],
12404            max_bytes[1],
12405            max_bytes[2],
12406            max_bytes[3],
12407            max_bytes[4],
12408            max_bytes[5],
12409            max_bytes[6],
12410            max_bytes[7],
12411            value_bytes[0],
12412            value_bytes[1],
12413            value_bytes[2],
12414            value_bytes[3],
12415            value_bytes[4],
12416            value_bytes[5],
12417            value_bytes[6],
12418            value_bytes[7],
12419            resolution_bytes[0],
12420            resolution_bytes[1],
12421            resolution_bytes[2],
12422            resolution_bytes[3],
12423            mode_bytes[0],
12424            0,
12425            0,
12426            0,
12427        ]
12428    }
12429    fn serialize_into(&self, bytes: &mut Vec<u8>) {
12430        bytes.reserve(44);
12431        u16::from(self.type_).serialize_into(bytes);
12432        self.len.serialize_into(bytes);
12433        self.sourceid.serialize_into(bytes);
12434        self.number.serialize_into(bytes);
12435        self.label.serialize_into(bytes);
12436        self.min.serialize_into(bytes);
12437        self.max.serialize_into(bytes);
12438        self.value.serialize_into(bytes);
12439        self.resolution.serialize_into(bytes);
12440        u8::from(self.mode).serialize_into(bytes);
12441        bytes.extend_from_slice(&[0; 3]);
12442    }
12443}
12444
12445#[derive(Clone)]
12446#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12447#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12448pub struct DeviceClassDataKey {
12449    pub keys: Vec<u32>,
12450}
12451impl_debug_if_no_extra_traits!(DeviceClassDataKey, "DeviceClassDataKey");
12452impl TryParse for DeviceClassDataKey {
12453    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
12454        let (num_keys, remaining) = u16::try_parse(remaining)?;
12455        let (keys, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_keys.try_to_usize()?)?;
12456        let result = DeviceClassDataKey { keys };
12457        Ok((result, remaining))
12458    }
12459}
12460impl Serialize for DeviceClassDataKey {
12461    type Bytes = Vec<u8>;
12462    fn serialize(&self) -> Vec<u8> {
12463        let mut result = Vec::new();
12464        self.serialize_into(&mut result);
12465        result
12466    }
12467    fn serialize_into(&self, bytes: &mut Vec<u8>) {
12468        let num_keys = u16::try_from(self.keys.len()).expect("`keys` has too many elements");
12469        num_keys.serialize_into(bytes);
12470        self.keys.serialize_into(bytes);
12471    }
12472}
12473impl DeviceClassDataKey {
12474    /// Get the value of the `num_keys` field.
12475    ///
12476    /// The `num_keys` field is used as the length field of the `keys` field.
12477    /// This function computes the field's value again based on the length of the list.
12478    ///
12479    /// # Panics
12480    ///
12481    /// Panics if the value cannot be represented in the target type. This
12482    /// cannot happen with values of the struct received from the X11 server.
12483    pub fn num_keys(&self) -> u16 {
12484        self.keys.len()
12485            .try_into().unwrap()
12486    }
12487}
12488#[derive(Clone)]
12489#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12490#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12491pub struct DeviceClassDataButton {
12492    pub state: Vec<u32>,
12493    pub labels: Vec<xproto::Atom>,
12494}
12495impl_debug_if_no_extra_traits!(DeviceClassDataButton, "DeviceClassDataButton");
12496impl TryParse for DeviceClassDataButton {
12497    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
12498        let (num_buttons, remaining) = u16::try_parse(remaining)?;
12499        let (state, remaining) = crate::x11_utils::parse_list::<u32>(remaining, u32::from(num_buttons).checked_add(31u32).ok_or(ParseError::InvalidExpression)?.checked_div(32u32).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
12500        let (labels, remaining) = crate::x11_utils::parse_list::<xproto::Atom>(remaining, num_buttons.try_to_usize()?)?;
12501        let result = DeviceClassDataButton { state, labels };
12502        Ok((result, remaining))
12503    }
12504}
12505impl Serialize for DeviceClassDataButton {
12506    type Bytes = Vec<u8>;
12507    fn serialize(&self) -> Vec<u8> {
12508        let mut result = Vec::new();
12509        self.serialize_into(&mut result);
12510        result
12511    }
12512    fn serialize_into(&self, bytes: &mut Vec<u8>) {
12513        let num_buttons = u16::try_from(self.labels.len()).expect("`labels` has too many elements");
12514        num_buttons.serialize_into(bytes);
12515        assert_eq!(self.state.len(), usize::try_from(u32::from(num_buttons).checked_add(31u32).unwrap().checked_div(32u32).unwrap()).unwrap(), "`state` has an incorrect length");
12516        self.state.serialize_into(bytes);
12517        self.labels.serialize_into(bytes);
12518    }
12519}
12520impl DeviceClassDataButton {
12521    /// Get the value of the `num_buttons` field.
12522    ///
12523    /// The `num_buttons` field is used as the length field of the `labels` field.
12524    /// This function computes the field's value again based on the length of the list.
12525    ///
12526    /// # Panics
12527    ///
12528    /// Panics if the value cannot be represented in the target type. This
12529    /// cannot happen with values of the struct received from the X11 server.
12530    pub fn num_buttons(&self) -> u16 {
12531        self.labels.len()
12532            .try_into().unwrap()
12533    }
12534}
12535#[derive(Clone, Copy)]
12536#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12537#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12538pub struct DeviceClassDataValuator {
12539    pub number: u16,
12540    pub label: xproto::Atom,
12541    pub min: Fp3232,
12542    pub max: Fp3232,
12543    pub value: Fp3232,
12544    pub resolution: u32,
12545    pub mode: ValuatorMode,
12546}
12547impl_debug_if_no_extra_traits!(DeviceClassDataValuator, "DeviceClassDataValuator");
12548impl TryParse for DeviceClassDataValuator {
12549    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
12550        let (number, remaining) = u16::try_parse(remaining)?;
12551        let (label, remaining) = xproto::Atom::try_parse(remaining)?;
12552        let (min, remaining) = Fp3232::try_parse(remaining)?;
12553        let (max, remaining) = Fp3232::try_parse(remaining)?;
12554        let (value, remaining) = Fp3232::try_parse(remaining)?;
12555        let (resolution, remaining) = u32::try_parse(remaining)?;
12556        let (mode, remaining) = u8::try_parse(remaining)?;
12557        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
12558        let mode = mode.into();
12559        let result = DeviceClassDataValuator { number, label, min, max, value, resolution, mode };
12560        Ok((result, remaining))
12561    }
12562}
12563impl Serialize for DeviceClassDataValuator {
12564    type Bytes = [u8; 38];
12565    fn serialize(&self) -> [u8; 38] {
12566        let number_bytes = self.number.serialize();
12567        let label_bytes = self.label.serialize();
12568        let min_bytes = self.min.serialize();
12569        let max_bytes = self.max.serialize();
12570        let value_bytes = self.value.serialize();
12571        let resolution_bytes = self.resolution.serialize();
12572        let mode_bytes = u8::from(self.mode).serialize();
12573        [
12574            number_bytes[0],
12575            number_bytes[1],
12576            label_bytes[0],
12577            label_bytes[1],
12578            label_bytes[2],
12579            label_bytes[3],
12580            min_bytes[0],
12581            min_bytes[1],
12582            min_bytes[2],
12583            min_bytes[3],
12584            min_bytes[4],
12585            min_bytes[5],
12586            min_bytes[6],
12587            min_bytes[7],
12588            max_bytes[0],
12589            max_bytes[1],
12590            max_bytes[2],
12591            max_bytes[3],
12592            max_bytes[4],
12593            max_bytes[5],
12594            max_bytes[6],
12595            max_bytes[7],
12596            value_bytes[0],
12597            value_bytes[1],
12598            value_bytes[2],
12599            value_bytes[3],
12600            value_bytes[4],
12601            value_bytes[5],
12602            value_bytes[6],
12603            value_bytes[7],
12604            resolution_bytes[0],
12605            resolution_bytes[1],
12606            resolution_bytes[2],
12607            resolution_bytes[3],
12608            mode_bytes[0],
12609            0,
12610            0,
12611            0,
12612        ]
12613    }
12614    fn serialize_into(&self, bytes: &mut Vec<u8>) {
12615        bytes.reserve(38);
12616        self.number.serialize_into(bytes);
12617        self.label.serialize_into(bytes);
12618        self.min.serialize_into(bytes);
12619        self.max.serialize_into(bytes);
12620        self.value.serialize_into(bytes);
12621        self.resolution.serialize_into(bytes);
12622        u8::from(self.mode).serialize_into(bytes);
12623        bytes.extend_from_slice(&[0; 3]);
12624    }
12625}
12626#[derive(Clone, Copy)]
12627#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12628#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12629pub struct DeviceClassDataScroll {
12630    pub number: u16,
12631    pub scroll_type: ScrollType,
12632    pub flags: ScrollFlags,
12633    pub increment: Fp3232,
12634}
12635impl_debug_if_no_extra_traits!(DeviceClassDataScroll, "DeviceClassDataScroll");
12636impl TryParse for DeviceClassDataScroll {
12637    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
12638        let (number, remaining) = u16::try_parse(remaining)?;
12639        let (scroll_type, remaining) = u16::try_parse(remaining)?;
12640        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
12641        let (flags, remaining) = u32::try_parse(remaining)?;
12642        let (increment, remaining) = Fp3232::try_parse(remaining)?;
12643        let scroll_type = scroll_type.into();
12644        let flags = flags.into();
12645        let result = DeviceClassDataScroll { number, scroll_type, flags, increment };
12646        Ok((result, remaining))
12647    }
12648}
12649impl Serialize for DeviceClassDataScroll {
12650    type Bytes = [u8; 18];
12651    fn serialize(&self) -> [u8; 18] {
12652        let number_bytes = self.number.serialize();
12653        let scroll_type_bytes = u16::from(self.scroll_type).serialize();
12654        let flags_bytes = u32::from(self.flags).serialize();
12655        let increment_bytes = self.increment.serialize();
12656        [
12657            number_bytes[0],
12658            number_bytes[1],
12659            scroll_type_bytes[0],
12660            scroll_type_bytes[1],
12661            0,
12662            0,
12663            flags_bytes[0],
12664            flags_bytes[1],
12665            flags_bytes[2],
12666            flags_bytes[3],
12667            increment_bytes[0],
12668            increment_bytes[1],
12669            increment_bytes[2],
12670            increment_bytes[3],
12671            increment_bytes[4],
12672            increment_bytes[5],
12673            increment_bytes[6],
12674            increment_bytes[7],
12675        ]
12676    }
12677    fn serialize_into(&self, bytes: &mut Vec<u8>) {
12678        bytes.reserve(18);
12679        self.number.serialize_into(bytes);
12680        u16::from(self.scroll_type).serialize_into(bytes);
12681        bytes.extend_from_slice(&[0; 2]);
12682        u32::from(self.flags).serialize_into(bytes);
12683        self.increment.serialize_into(bytes);
12684    }
12685}
12686#[derive(Clone, Copy)]
12687#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12688#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12689pub struct DeviceClassDataTouch {
12690    pub mode: TouchMode,
12691    pub num_touches: u8,
12692}
12693impl_debug_if_no_extra_traits!(DeviceClassDataTouch, "DeviceClassDataTouch");
12694impl TryParse for DeviceClassDataTouch {
12695    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
12696        let (mode, remaining) = u8::try_parse(remaining)?;
12697        let (num_touches, remaining) = u8::try_parse(remaining)?;
12698        let mode = mode.into();
12699        let result = DeviceClassDataTouch { mode, num_touches };
12700        Ok((result, remaining))
12701    }
12702}
12703impl Serialize for DeviceClassDataTouch {
12704    type Bytes = [u8; 2];
12705    fn serialize(&self) -> [u8; 2] {
12706        let mode_bytes = u8::from(self.mode).serialize();
12707        let num_touches_bytes = self.num_touches.serialize();
12708        [
12709            mode_bytes[0],
12710            num_touches_bytes[0],
12711        ]
12712    }
12713    fn serialize_into(&self, bytes: &mut Vec<u8>) {
12714        bytes.reserve(2);
12715        u8::from(self.mode).serialize_into(bytes);
12716        self.num_touches.serialize_into(bytes);
12717    }
12718}
12719#[derive(Clone, Copy)]
12720#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12721#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12722pub struct DeviceClassDataGesture {
12723    pub num_touches: u8,
12724}
12725impl_debug_if_no_extra_traits!(DeviceClassDataGesture, "DeviceClassDataGesture");
12726impl TryParse for DeviceClassDataGesture {
12727    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
12728        let (num_touches, remaining) = u8::try_parse(remaining)?;
12729        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
12730        let result = DeviceClassDataGesture { num_touches };
12731        Ok((result, remaining))
12732    }
12733}
12734impl Serialize for DeviceClassDataGesture {
12735    type Bytes = [u8; 2];
12736    fn serialize(&self) -> [u8; 2] {
12737        let num_touches_bytes = self.num_touches.serialize();
12738        [
12739            num_touches_bytes[0],
12740            0,
12741        ]
12742    }
12743    fn serialize_into(&self, bytes: &mut Vec<u8>) {
12744        bytes.reserve(2);
12745        self.num_touches.serialize_into(bytes);
12746        bytes.extend_from_slice(&[0; 1]);
12747    }
12748}
12749#[derive(Clone)]
12750#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12751#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12752pub enum DeviceClassData {
12753    Key(DeviceClassDataKey),
12754    Button(DeviceClassDataButton),
12755    Valuator(DeviceClassDataValuator),
12756    Scroll(DeviceClassDataScroll),
12757    Touch(DeviceClassDataTouch),
12758    Gesture(DeviceClassDataGesture),
12759    /// This variant is returned when the server sends a discriminant
12760    /// value that does not match any of the defined by the protocol.
12761    ///
12762    /// Usually, this should be considered a parsing error, but there
12763    /// are some cases where the server violates the protocol.
12764    ///
12765    /// Trying to use `serialize` or `serialize_into` with this variant
12766    /// will raise a panic.
12767    InvalidValue(u16),
12768}
12769impl_debug_if_no_extra_traits!(DeviceClassData, "DeviceClassData");
12770impl DeviceClassData {
12771    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
12772    fn try_parse(value: &[u8], type_: u16) -> Result<(Self, &[u8]), ParseError> {
12773        let switch_expr = u16::from(type_);
12774        let mut outer_remaining = value;
12775        let mut parse_result = None;
12776        if switch_expr == u16::from(DeviceClassType::KEY) {
12777            let (key, new_remaining) = DeviceClassDataKey::try_parse(outer_remaining)?;
12778            outer_remaining = new_remaining;
12779            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
12780            parse_result = Some(DeviceClassData::Key(key));
12781        }
12782        if switch_expr == u16::from(DeviceClassType::BUTTON) {
12783            let (button, new_remaining) = DeviceClassDataButton::try_parse(outer_remaining)?;
12784            outer_remaining = new_remaining;
12785            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
12786            parse_result = Some(DeviceClassData::Button(button));
12787        }
12788        if switch_expr == u16::from(DeviceClassType::VALUATOR) {
12789            let (valuator, new_remaining) = DeviceClassDataValuator::try_parse(outer_remaining)?;
12790            outer_remaining = new_remaining;
12791            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
12792            parse_result = Some(DeviceClassData::Valuator(valuator));
12793        }
12794        if switch_expr == u16::from(DeviceClassType::SCROLL) {
12795            let (scroll, new_remaining) = DeviceClassDataScroll::try_parse(outer_remaining)?;
12796            outer_remaining = new_remaining;
12797            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
12798            parse_result = Some(DeviceClassData::Scroll(scroll));
12799        }
12800        if switch_expr == u16::from(DeviceClassType::TOUCH) {
12801            let (touch, new_remaining) = DeviceClassDataTouch::try_parse(outer_remaining)?;
12802            outer_remaining = new_remaining;
12803            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
12804            parse_result = Some(DeviceClassData::Touch(touch));
12805        }
12806        if switch_expr == u16::from(DeviceClassType::GESTURE) {
12807            let (gesture, new_remaining) = DeviceClassDataGesture::try_parse(outer_remaining)?;
12808            outer_remaining = new_remaining;
12809            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
12810            parse_result = Some(DeviceClassData::Gesture(gesture));
12811        }
12812        match parse_result {
12813            None => Ok((DeviceClassData::InvalidValue(switch_expr), &[])),
12814            Some(result) => Ok((result, outer_remaining)),
12815        }
12816    }
12817}
12818impl DeviceClassData {
12819    pub fn as_key(&self) -> Option<&DeviceClassDataKey> {
12820        match self {
12821            DeviceClassData::Key(value) => Some(value),
12822            _ => None,
12823        }
12824    }
12825    pub fn as_button(&self) -> Option<&DeviceClassDataButton> {
12826        match self {
12827            DeviceClassData::Button(value) => Some(value),
12828            _ => None,
12829        }
12830    }
12831    pub fn as_valuator(&self) -> Option<&DeviceClassDataValuator> {
12832        match self {
12833            DeviceClassData::Valuator(value) => Some(value),
12834            _ => None,
12835        }
12836    }
12837    pub fn as_scroll(&self) -> Option<&DeviceClassDataScroll> {
12838        match self {
12839            DeviceClassData::Scroll(value) => Some(value),
12840            _ => None,
12841        }
12842    }
12843    pub fn as_touch(&self) -> Option<&DeviceClassDataTouch> {
12844        match self {
12845            DeviceClassData::Touch(value) => Some(value),
12846            _ => None,
12847        }
12848    }
12849    pub fn as_gesture(&self) -> Option<&DeviceClassDataGesture> {
12850        match self {
12851            DeviceClassData::Gesture(value) => Some(value),
12852            _ => None,
12853        }
12854    }
12855}
12856impl DeviceClassData {
12857    #[allow(dead_code)]
12858    fn serialize(&self, type_: u16) -> Vec<u8> {
12859        let mut result = Vec::new();
12860        self.serialize_into(&mut result, u16::from(type_));
12861        result
12862    }
12863    fn serialize_into(&self, bytes: &mut Vec<u8>, type_: u16) {
12864        assert_eq!(self.switch_expr(), u16::from(type_), "switch `data` has an inconsistent discriminant");
12865        match self {
12866            DeviceClassData::Key(key) => key.serialize_into(bytes),
12867            DeviceClassData::Button(button) => button.serialize_into(bytes),
12868            DeviceClassData::Valuator(valuator) => valuator.serialize_into(bytes),
12869            DeviceClassData::Scroll(scroll) => scroll.serialize_into(bytes),
12870            DeviceClassData::Touch(touch) => touch.serialize_into(bytes),
12871            DeviceClassData::Gesture(gesture) => gesture.serialize_into(bytes),
12872            DeviceClassData::InvalidValue(_) => panic!("attempted to serialize invalid switch case"),
12873        }
12874    }
12875}
12876impl DeviceClassData {
12877    fn switch_expr(&self) -> u16 {
12878        match self {
12879            DeviceClassData::Key(_) => u16::from(DeviceClassType::KEY),
12880            DeviceClassData::Button(_) => u16::from(DeviceClassType::BUTTON),
12881            DeviceClassData::Valuator(_) => u16::from(DeviceClassType::VALUATOR),
12882            DeviceClassData::Scroll(_) => u16::from(DeviceClassType::SCROLL),
12883            DeviceClassData::Touch(_) => u16::from(DeviceClassType::TOUCH),
12884            DeviceClassData::Gesture(_) => u16::from(DeviceClassType::GESTURE),
12885            DeviceClassData::InvalidValue(switch_expr) => *switch_expr,
12886        }
12887    }
12888}
12889
12890#[derive(Clone)]
12891#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12892#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12893pub struct DeviceClass {
12894    pub len: u16,
12895    pub sourceid: DeviceId,
12896    pub data: DeviceClassData,
12897}
12898impl_debug_if_no_extra_traits!(DeviceClass, "DeviceClass");
12899impl TryParse for DeviceClass {
12900    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
12901        let remaining = initial_value;
12902        let (type_, remaining) = u16::try_parse(remaining)?;
12903        let (len, remaining) = u16::try_parse(remaining)?;
12904        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
12905        let (data, remaining) = DeviceClassData::try_parse(remaining, u16::from(type_))?;
12906        let result = DeviceClass { len, sourceid, data };
12907        let length = u32::from(len).checked_mul(4u32).ok_or(ParseError::InvalidExpression)?.try_to_usize()?;
12908        let _ = remaining;
12909        let remaining = initial_value.get(length..)
12910            .ok_or(ParseError::InsufficientData)?;
12911        Ok((result, remaining))
12912    }
12913}
12914impl Serialize for DeviceClass {
12915    type Bytes = Vec<u8>;
12916    fn serialize(&self) -> Vec<u8> {
12917        let mut result = Vec::new();
12918        self.serialize_into(&mut result);
12919        result
12920    }
12921    fn serialize_into(&self, bytes: &mut Vec<u8>) {
12922        bytes.reserve(6);
12923        let type_: u16 = self.data.switch_expr();
12924        type_.serialize_into(bytes);
12925        self.len.serialize_into(bytes);
12926        self.sourceid.serialize_into(bytes);
12927        self.data.serialize_into(bytes, u16::from(type_));
12928    }
12929}
12930
12931#[derive(Clone)]
12932#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
12933#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12934pub struct XIDeviceInfo {
12935    pub deviceid: DeviceId,
12936    pub type_: DeviceType,
12937    pub attachment: DeviceId,
12938    pub enabled: bool,
12939    pub name: Vec<u8>,
12940    pub classes: Vec<DeviceClass>,
12941}
12942impl_debug_if_no_extra_traits!(XIDeviceInfo, "XIDeviceInfo");
12943impl TryParse for XIDeviceInfo {
12944    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
12945        let value = remaining;
12946        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
12947        let (type_, remaining) = u16::try_parse(remaining)?;
12948        let (attachment, remaining) = DeviceId::try_parse(remaining)?;
12949        let (num_classes, remaining) = u16::try_parse(remaining)?;
12950        let (name_len, remaining) = u16::try_parse(remaining)?;
12951        let (enabled, remaining) = bool::try_parse(remaining)?;
12952        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
12953        let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_len.try_to_usize()?)?;
12954        let name = name.to_vec();
12955        // Align offset to multiple of 4
12956        let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
12957        let misalignment = (4 - (offset % 4)) % 4;
12958        let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
12959        let (classes, remaining) = crate::x11_utils::parse_list::<DeviceClass>(remaining, num_classes.try_to_usize()?)?;
12960        let type_ = type_.into();
12961        let result = XIDeviceInfo { deviceid, type_, attachment, enabled, name, classes };
12962        Ok((result, remaining))
12963    }
12964}
12965impl Serialize for XIDeviceInfo {
12966    type Bytes = Vec<u8>;
12967    fn serialize(&self) -> Vec<u8> {
12968        let mut result = Vec::new();
12969        self.serialize_into(&mut result);
12970        result
12971    }
12972    fn serialize_into(&self, bytes: &mut Vec<u8>) {
12973        bytes.reserve(12);
12974        self.deviceid.serialize_into(bytes);
12975        u16::from(self.type_).serialize_into(bytes);
12976        self.attachment.serialize_into(bytes);
12977        let num_classes = u16::try_from(self.classes.len()).expect("`classes` has too many elements");
12978        num_classes.serialize_into(bytes);
12979        let name_len = u16::try_from(self.name.len()).expect("`name` has too many elements");
12980        name_len.serialize_into(bytes);
12981        self.enabled.serialize_into(bytes);
12982        bytes.extend_from_slice(&[0; 1]);
12983        bytes.extend_from_slice(&self.name);
12984        bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
12985        self.classes.serialize_into(bytes);
12986    }
12987}
12988impl XIDeviceInfo {
12989    /// Get the value of the `num_classes` field.
12990    ///
12991    /// The `num_classes` field is used as the length field of the `classes` field.
12992    /// This function computes the field's value again based on the length of the list.
12993    ///
12994    /// # Panics
12995    ///
12996    /// Panics if the value cannot be represented in the target type. This
12997    /// cannot happen with values of the struct received from the X11 server.
12998    pub fn num_classes(&self) -> u16 {
12999        self.classes.len()
13000            .try_into().unwrap()
13001    }
13002    /// Get the value of the `name_len` field.
13003    ///
13004    /// The `name_len` field is used as the length field of the `name` field.
13005    /// This function computes the field's value again based on the length of the list.
13006    ///
13007    /// # Panics
13008    ///
13009    /// Panics if the value cannot be represented in the target type. This
13010    /// cannot happen with values of the struct received from the X11 server.
13011    pub fn name_len(&self) -> u16 {
13012        self.name.len()
13013            .try_into().unwrap()
13014    }
13015}
13016
13017/// Opcode for the XIQueryDevice request
13018pub const XI_QUERY_DEVICE_REQUEST: u8 = 48;
13019#[derive(Clone, Copy, Default)]
13020#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13021#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13022pub struct XIQueryDeviceRequest {
13023    pub deviceid: DeviceId,
13024}
13025impl_debug_if_no_extra_traits!(XIQueryDeviceRequest, "XIQueryDeviceRequest");
13026impl XIQueryDeviceRequest {
13027    /// Serialize this request into bytes for the provided connection
13028    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
13029        let length_so_far = 0;
13030        let deviceid_bytes = self.deviceid.serialize();
13031        let mut request0 = vec![
13032            major_opcode,
13033            XI_QUERY_DEVICE_REQUEST,
13034            0,
13035            0,
13036            deviceid_bytes[0],
13037            deviceid_bytes[1],
13038            0,
13039            0,
13040        ];
13041        let length_so_far = length_so_far + request0.len();
13042        assert_eq!(length_so_far % 4, 0);
13043        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
13044        request0[2..4].copy_from_slice(&length.to_ne_bytes());
13045        ([request0.into()], vec![])
13046    }
13047    /// Parse this request given its header, its body, and any fds that go along with it
13048    #[cfg(feature = "request-parsing")]
13049    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
13050        if header.minor_opcode != XI_QUERY_DEVICE_REQUEST {
13051            return Err(ParseError::InvalidValue);
13052        }
13053        let (deviceid, remaining) = DeviceId::try_parse(value)?;
13054        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
13055        let _ = remaining;
13056        Ok(XIQueryDeviceRequest {
13057            deviceid,
13058        })
13059    }
13060}
13061impl Request for XIQueryDeviceRequest {
13062    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
13063
13064    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
13065        let (bufs, fds) = self.serialize(major_opcode);
13066        // Flatten the buffers into a single vector
13067        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
13068        (buf, fds)
13069    }
13070}
13071impl crate::x11_utils::ReplyRequest for XIQueryDeviceRequest {
13072    type Reply = XIQueryDeviceReply;
13073}
13074
13075#[derive(Clone)]
13076#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13077#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13078pub struct XIQueryDeviceReply {
13079    pub sequence: u16,
13080    pub length: u32,
13081    pub infos: Vec<XIDeviceInfo>,
13082}
13083impl_debug_if_no_extra_traits!(XIQueryDeviceReply, "XIQueryDeviceReply");
13084impl TryParse for XIQueryDeviceReply {
13085    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
13086        let remaining = initial_value;
13087        let (response_type, remaining) = u8::try_parse(remaining)?;
13088        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
13089        let (sequence, remaining) = u16::try_parse(remaining)?;
13090        let (length, remaining) = u32::try_parse(remaining)?;
13091        let (num_infos, remaining) = u16::try_parse(remaining)?;
13092        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
13093        let (infos, remaining) = crate::x11_utils::parse_list::<XIDeviceInfo>(remaining, num_infos.try_to_usize()?)?;
13094        if response_type != 1 {
13095            return Err(ParseError::InvalidValue);
13096        }
13097        let result = XIQueryDeviceReply { sequence, length, infos };
13098        let _ = remaining;
13099        let remaining = initial_value.get(32 + length as usize * 4..)
13100            .ok_or(ParseError::InsufficientData)?;
13101        Ok((result, remaining))
13102    }
13103}
13104impl Serialize for XIQueryDeviceReply {
13105    type Bytes = Vec<u8>;
13106    fn serialize(&self) -> Vec<u8> {
13107        let mut result = Vec::new();
13108        self.serialize_into(&mut result);
13109        result
13110    }
13111    fn serialize_into(&self, bytes: &mut Vec<u8>) {
13112        bytes.reserve(32);
13113        let response_type_bytes = &[1];
13114        bytes.push(response_type_bytes[0]);
13115        bytes.extend_from_slice(&[0; 1]);
13116        self.sequence.serialize_into(bytes);
13117        self.length.serialize_into(bytes);
13118        let num_infos = u16::try_from(self.infos.len()).expect("`infos` has too many elements");
13119        num_infos.serialize_into(bytes);
13120        bytes.extend_from_slice(&[0; 22]);
13121        self.infos.serialize_into(bytes);
13122    }
13123}
13124impl XIQueryDeviceReply {
13125    /// Get the value of the `num_infos` field.
13126    ///
13127    /// The `num_infos` field is used as the length field of the `infos` field.
13128    /// This function computes the field's value again based on the length of the list.
13129    ///
13130    /// # Panics
13131    ///
13132    /// Panics if the value cannot be represented in the target type. This
13133    /// cannot happen with values of the struct received from the X11 server.
13134    pub fn num_infos(&self) -> u16 {
13135        self.infos.len()
13136            .try_into().unwrap()
13137    }
13138}
13139
13140/// Opcode for the XISetFocus request
13141pub const XI_SET_FOCUS_REQUEST: u8 = 49;
13142#[derive(Clone, Copy, Default)]
13143#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13144#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13145pub struct XISetFocusRequest {
13146    pub window: xproto::Window,
13147    pub time: xproto::Timestamp,
13148    pub deviceid: DeviceId,
13149}
13150impl_debug_if_no_extra_traits!(XISetFocusRequest, "XISetFocusRequest");
13151impl XISetFocusRequest {
13152    /// Serialize this request into bytes for the provided connection
13153    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
13154        let length_so_far = 0;
13155        let window_bytes = self.window.serialize();
13156        let time_bytes = self.time.serialize();
13157        let deviceid_bytes = self.deviceid.serialize();
13158        let mut request0 = vec![
13159            major_opcode,
13160            XI_SET_FOCUS_REQUEST,
13161            0,
13162            0,
13163            window_bytes[0],
13164            window_bytes[1],
13165            window_bytes[2],
13166            window_bytes[3],
13167            time_bytes[0],
13168            time_bytes[1],
13169            time_bytes[2],
13170            time_bytes[3],
13171            deviceid_bytes[0],
13172            deviceid_bytes[1],
13173            0,
13174            0,
13175        ];
13176        let length_so_far = length_so_far + request0.len();
13177        assert_eq!(length_so_far % 4, 0);
13178        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
13179        request0[2..4].copy_from_slice(&length.to_ne_bytes());
13180        ([request0.into()], vec![])
13181    }
13182    /// Parse this request given its header, its body, and any fds that go along with it
13183    #[cfg(feature = "request-parsing")]
13184    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
13185        if header.minor_opcode != XI_SET_FOCUS_REQUEST {
13186            return Err(ParseError::InvalidValue);
13187        }
13188        let (window, remaining) = xproto::Window::try_parse(value)?;
13189        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
13190        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
13191        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
13192        let _ = remaining;
13193        Ok(XISetFocusRequest {
13194            window,
13195            time,
13196            deviceid,
13197        })
13198    }
13199}
13200impl Request for XISetFocusRequest {
13201    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
13202
13203    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
13204        let (bufs, fds) = self.serialize(major_opcode);
13205        // Flatten the buffers into a single vector
13206        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
13207        (buf, fds)
13208    }
13209}
13210impl crate::x11_utils::VoidRequest for XISetFocusRequest {
13211}
13212
13213/// Opcode for the XIGetFocus request
13214pub const XI_GET_FOCUS_REQUEST: u8 = 50;
13215#[derive(Clone, Copy, Default)]
13216#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13217#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13218pub struct XIGetFocusRequest {
13219    pub deviceid: DeviceId,
13220}
13221impl_debug_if_no_extra_traits!(XIGetFocusRequest, "XIGetFocusRequest");
13222impl XIGetFocusRequest {
13223    /// Serialize this request into bytes for the provided connection
13224    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
13225        let length_so_far = 0;
13226        let deviceid_bytes = self.deviceid.serialize();
13227        let mut request0 = vec![
13228            major_opcode,
13229            XI_GET_FOCUS_REQUEST,
13230            0,
13231            0,
13232            deviceid_bytes[0],
13233            deviceid_bytes[1],
13234            0,
13235            0,
13236        ];
13237        let length_so_far = length_so_far + request0.len();
13238        assert_eq!(length_so_far % 4, 0);
13239        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
13240        request0[2..4].copy_from_slice(&length.to_ne_bytes());
13241        ([request0.into()], vec![])
13242    }
13243    /// Parse this request given its header, its body, and any fds that go along with it
13244    #[cfg(feature = "request-parsing")]
13245    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
13246        if header.minor_opcode != XI_GET_FOCUS_REQUEST {
13247            return Err(ParseError::InvalidValue);
13248        }
13249        let (deviceid, remaining) = DeviceId::try_parse(value)?;
13250        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
13251        let _ = remaining;
13252        Ok(XIGetFocusRequest {
13253            deviceid,
13254        })
13255    }
13256}
13257impl Request for XIGetFocusRequest {
13258    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
13259
13260    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
13261        let (bufs, fds) = self.serialize(major_opcode);
13262        // Flatten the buffers into a single vector
13263        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
13264        (buf, fds)
13265    }
13266}
13267impl crate::x11_utils::ReplyRequest for XIGetFocusRequest {
13268    type Reply = XIGetFocusReply;
13269}
13270
13271#[derive(Clone, Copy, Default)]
13272#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13273#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13274pub struct XIGetFocusReply {
13275    pub sequence: u16,
13276    pub length: u32,
13277    pub focus: xproto::Window,
13278}
13279impl_debug_if_no_extra_traits!(XIGetFocusReply, "XIGetFocusReply");
13280impl TryParse for XIGetFocusReply {
13281    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
13282        let remaining = initial_value;
13283        let (response_type, remaining) = u8::try_parse(remaining)?;
13284        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
13285        let (sequence, remaining) = u16::try_parse(remaining)?;
13286        let (length, remaining) = u32::try_parse(remaining)?;
13287        let (focus, remaining) = xproto::Window::try_parse(remaining)?;
13288        let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
13289        if response_type != 1 {
13290            return Err(ParseError::InvalidValue);
13291        }
13292        let result = XIGetFocusReply { sequence, length, focus };
13293        let _ = remaining;
13294        let remaining = initial_value.get(32 + length as usize * 4..)
13295            .ok_or(ParseError::InsufficientData)?;
13296        Ok((result, remaining))
13297    }
13298}
13299impl Serialize for XIGetFocusReply {
13300    type Bytes = [u8; 32];
13301    fn serialize(&self) -> [u8; 32] {
13302        let response_type_bytes = &[1];
13303        let sequence_bytes = self.sequence.serialize();
13304        let length_bytes = self.length.serialize();
13305        let focus_bytes = self.focus.serialize();
13306        [
13307            response_type_bytes[0],
13308            0,
13309            sequence_bytes[0],
13310            sequence_bytes[1],
13311            length_bytes[0],
13312            length_bytes[1],
13313            length_bytes[2],
13314            length_bytes[3],
13315            focus_bytes[0],
13316            focus_bytes[1],
13317            focus_bytes[2],
13318            focus_bytes[3],
13319            0,
13320            0,
13321            0,
13322            0,
13323            0,
13324            0,
13325            0,
13326            0,
13327            0,
13328            0,
13329            0,
13330            0,
13331            0,
13332            0,
13333            0,
13334            0,
13335            0,
13336            0,
13337            0,
13338            0,
13339        ]
13340    }
13341    fn serialize_into(&self, bytes: &mut Vec<u8>) {
13342        bytes.reserve(32);
13343        let response_type_bytes = &[1];
13344        bytes.push(response_type_bytes[0]);
13345        bytes.extend_from_slice(&[0; 1]);
13346        self.sequence.serialize_into(bytes);
13347        self.length.serialize_into(bytes);
13348        self.focus.serialize_into(bytes);
13349        bytes.extend_from_slice(&[0; 20]);
13350    }
13351}
13352
13353#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
13354#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13355pub struct GrabOwner(bool);
13356impl GrabOwner {
13357    pub const NO_OWNER: Self = Self(false);
13358    pub const OWNER: Self = Self(true);
13359}
13360impl From<GrabOwner> for bool {
13361    #[inline]
13362    fn from(input: GrabOwner) -> Self {
13363        input.0
13364    }
13365}
13366impl From<GrabOwner> for Option<bool> {
13367    #[inline]
13368    fn from(input: GrabOwner) -> Self {
13369        Some(input.0)
13370    }
13371}
13372impl From<GrabOwner> for u8 {
13373    #[inline]
13374    fn from(input: GrabOwner) -> Self {
13375        u8::from(input.0)
13376    }
13377}
13378impl From<GrabOwner> for Option<u8> {
13379    #[inline]
13380    fn from(input: GrabOwner) -> Self {
13381        Some(u8::from(input.0))
13382    }
13383}
13384impl From<GrabOwner> for u16 {
13385    #[inline]
13386    fn from(input: GrabOwner) -> Self {
13387        u16::from(input.0)
13388    }
13389}
13390impl From<GrabOwner> for Option<u16> {
13391    #[inline]
13392    fn from(input: GrabOwner) -> Self {
13393        Some(u16::from(input.0))
13394    }
13395}
13396impl From<GrabOwner> for u32 {
13397    #[inline]
13398    fn from(input: GrabOwner) -> Self {
13399        u32::from(input.0)
13400    }
13401}
13402impl From<GrabOwner> for Option<u32> {
13403    #[inline]
13404    fn from(input: GrabOwner) -> Self {
13405        Some(u32::from(input.0))
13406    }
13407}
13408impl From<bool> for GrabOwner {
13409    #[inline]
13410    fn from(value: bool) -> Self {
13411        Self(value)
13412    }
13413}
13414impl core::fmt::Debug for GrabOwner  {
13415    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
13416        let variants = [
13417            (Self::NO_OWNER.0.into(), "NO_OWNER", "NoOwner"),
13418            (Self::OWNER.0.into(), "OWNER", "Owner"),
13419        ];
13420        pretty_print_enum(fmt, self.0.into(), &variants)
13421    }
13422}
13423
13424/// Opcode for the XIGrabDevice request
13425pub const XI_GRAB_DEVICE_REQUEST: u8 = 51;
13426#[derive(Clone, Default)]
13427#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13428#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13429pub struct XIGrabDeviceRequest<'input> {
13430    pub window: xproto::Window,
13431    pub time: xproto::Timestamp,
13432    pub cursor: xproto::Cursor,
13433    pub deviceid: DeviceId,
13434    pub mode: xproto::GrabMode,
13435    pub paired_device_mode: xproto::GrabMode,
13436    pub owner_events: GrabOwner,
13437    pub mask: Cow<'input, [u32]>,
13438}
13439impl_debug_if_no_extra_traits!(XIGrabDeviceRequest<'_>, "XIGrabDeviceRequest");
13440impl<'input> XIGrabDeviceRequest<'input> {
13441    /// Serialize this request into bytes for the provided connection
13442    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
13443        let length_so_far = 0;
13444        let window_bytes = self.window.serialize();
13445        let time_bytes = self.time.serialize();
13446        let cursor_bytes = self.cursor.serialize();
13447        let deviceid_bytes = self.deviceid.serialize();
13448        let mode_bytes = u8::from(self.mode).serialize();
13449        let paired_device_mode_bytes = u8::from(self.paired_device_mode).serialize();
13450        let owner_events_bytes = bool::from(self.owner_events).serialize();
13451        let mask_len = u16::try_from(self.mask.len()).expect("`mask` has too many elements");
13452        let mask_len_bytes = mask_len.serialize();
13453        let mut request0 = vec![
13454            major_opcode,
13455            XI_GRAB_DEVICE_REQUEST,
13456            0,
13457            0,
13458            window_bytes[0],
13459            window_bytes[1],
13460            window_bytes[2],
13461            window_bytes[3],
13462            time_bytes[0],
13463            time_bytes[1],
13464            time_bytes[2],
13465            time_bytes[3],
13466            cursor_bytes[0],
13467            cursor_bytes[1],
13468            cursor_bytes[2],
13469            cursor_bytes[3],
13470            deviceid_bytes[0],
13471            deviceid_bytes[1],
13472            mode_bytes[0],
13473            paired_device_mode_bytes[0],
13474            owner_events_bytes[0],
13475            0,
13476            mask_len_bytes[0],
13477            mask_len_bytes[1],
13478        ];
13479        let length_so_far = length_so_far + request0.len();
13480        let mask_bytes = self.mask.serialize();
13481        let length_so_far = length_so_far + mask_bytes.len();
13482        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
13483        let length_so_far = length_so_far + padding0.len();
13484        assert_eq!(length_so_far % 4, 0);
13485        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
13486        request0[2..4].copy_from_slice(&length.to_ne_bytes());
13487        ([request0.into(), mask_bytes.into(), padding0.into()], vec![])
13488    }
13489    /// Parse this request given its header, its body, and any fds that go along with it
13490    #[cfg(feature = "request-parsing")]
13491    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
13492        if header.minor_opcode != XI_GRAB_DEVICE_REQUEST {
13493            return Err(ParseError::InvalidValue);
13494        }
13495        let (window, remaining) = xproto::Window::try_parse(value)?;
13496        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
13497        let (cursor, remaining) = xproto::Cursor::try_parse(remaining)?;
13498        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
13499        let (mode, remaining) = u8::try_parse(remaining)?;
13500        let mode = mode.into();
13501        let (paired_device_mode, remaining) = u8::try_parse(remaining)?;
13502        let paired_device_mode = paired_device_mode.into();
13503        let (owner_events, remaining) = bool::try_parse(remaining)?;
13504        let owner_events = owner_events.into();
13505        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
13506        let (mask_len, remaining) = u16::try_parse(remaining)?;
13507        let (mask, remaining) = crate::x11_utils::parse_list::<u32>(remaining, mask_len.try_to_usize()?)?;
13508        let _ = remaining;
13509        Ok(XIGrabDeviceRequest {
13510            window,
13511            time,
13512            cursor,
13513            deviceid,
13514            mode,
13515            paired_device_mode,
13516            owner_events,
13517            mask: Cow::Owned(mask),
13518        })
13519    }
13520    /// Clone all borrowed data in this XIGrabDeviceRequest.
13521    pub fn into_owned(self) -> XIGrabDeviceRequest<'static> {
13522        XIGrabDeviceRequest {
13523            window: self.window,
13524            time: self.time,
13525            cursor: self.cursor,
13526            deviceid: self.deviceid,
13527            mode: self.mode,
13528            paired_device_mode: self.paired_device_mode,
13529            owner_events: self.owner_events,
13530            mask: Cow::Owned(self.mask.into_owned()),
13531        }
13532    }
13533}
13534impl<'input> Request for XIGrabDeviceRequest<'input> {
13535    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
13536
13537    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
13538        let (bufs, fds) = self.serialize(major_opcode);
13539        // Flatten the buffers into a single vector
13540        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
13541        (buf, fds)
13542    }
13543}
13544impl<'input> crate::x11_utils::ReplyRequest for XIGrabDeviceRequest<'input> {
13545    type Reply = XIGrabDeviceReply;
13546}
13547
13548#[derive(Clone, Copy, Default)]
13549#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13550#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13551pub struct XIGrabDeviceReply {
13552    pub sequence: u16,
13553    pub length: u32,
13554    pub status: xproto::GrabStatus,
13555}
13556impl_debug_if_no_extra_traits!(XIGrabDeviceReply, "XIGrabDeviceReply");
13557impl TryParse for XIGrabDeviceReply {
13558    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
13559        let remaining = initial_value;
13560        let (response_type, remaining) = u8::try_parse(remaining)?;
13561        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
13562        let (sequence, remaining) = u16::try_parse(remaining)?;
13563        let (length, remaining) = u32::try_parse(remaining)?;
13564        let (status, remaining) = u8::try_parse(remaining)?;
13565        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
13566        if response_type != 1 {
13567            return Err(ParseError::InvalidValue);
13568        }
13569        let status = status.into();
13570        let result = XIGrabDeviceReply { sequence, length, status };
13571        let _ = remaining;
13572        let remaining = initial_value.get(32 + length as usize * 4..)
13573            .ok_or(ParseError::InsufficientData)?;
13574        Ok((result, remaining))
13575    }
13576}
13577impl Serialize for XIGrabDeviceReply {
13578    type Bytes = [u8; 32];
13579    fn serialize(&self) -> [u8; 32] {
13580        let response_type_bytes = &[1];
13581        let sequence_bytes = self.sequence.serialize();
13582        let length_bytes = self.length.serialize();
13583        let status_bytes = u8::from(self.status).serialize();
13584        [
13585            response_type_bytes[0],
13586            0,
13587            sequence_bytes[0],
13588            sequence_bytes[1],
13589            length_bytes[0],
13590            length_bytes[1],
13591            length_bytes[2],
13592            length_bytes[3],
13593            status_bytes[0],
13594            0,
13595            0,
13596            0,
13597            0,
13598            0,
13599            0,
13600            0,
13601            0,
13602            0,
13603            0,
13604            0,
13605            0,
13606            0,
13607            0,
13608            0,
13609            0,
13610            0,
13611            0,
13612            0,
13613            0,
13614            0,
13615            0,
13616            0,
13617        ]
13618    }
13619    fn serialize_into(&self, bytes: &mut Vec<u8>) {
13620        bytes.reserve(32);
13621        let response_type_bytes = &[1];
13622        bytes.push(response_type_bytes[0]);
13623        bytes.extend_from_slice(&[0; 1]);
13624        self.sequence.serialize_into(bytes);
13625        self.length.serialize_into(bytes);
13626        u8::from(self.status).serialize_into(bytes);
13627        bytes.extend_from_slice(&[0; 23]);
13628    }
13629}
13630
13631/// Opcode for the XIUngrabDevice request
13632pub const XI_UNGRAB_DEVICE_REQUEST: u8 = 52;
13633#[derive(Clone, Copy, Default)]
13634#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13635#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13636pub struct XIUngrabDeviceRequest {
13637    pub time: xproto::Timestamp,
13638    pub deviceid: DeviceId,
13639}
13640impl_debug_if_no_extra_traits!(XIUngrabDeviceRequest, "XIUngrabDeviceRequest");
13641impl XIUngrabDeviceRequest {
13642    /// Serialize this request into bytes for the provided connection
13643    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
13644        let length_so_far = 0;
13645        let time_bytes = self.time.serialize();
13646        let deviceid_bytes = self.deviceid.serialize();
13647        let mut request0 = vec![
13648            major_opcode,
13649            XI_UNGRAB_DEVICE_REQUEST,
13650            0,
13651            0,
13652            time_bytes[0],
13653            time_bytes[1],
13654            time_bytes[2],
13655            time_bytes[3],
13656            deviceid_bytes[0],
13657            deviceid_bytes[1],
13658            0,
13659            0,
13660        ];
13661        let length_so_far = length_so_far + request0.len();
13662        assert_eq!(length_so_far % 4, 0);
13663        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
13664        request0[2..4].copy_from_slice(&length.to_ne_bytes());
13665        ([request0.into()], vec![])
13666    }
13667    /// Parse this request given its header, its body, and any fds that go along with it
13668    #[cfg(feature = "request-parsing")]
13669    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
13670        if header.minor_opcode != XI_UNGRAB_DEVICE_REQUEST {
13671            return Err(ParseError::InvalidValue);
13672        }
13673        let (time, remaining) = xproto::Timestamp::try_parse(value)?;
13674        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
13675        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
13676        let _ = remaining;
13677        Ok(XIUngrabDeviceRequest {
13678            time,
13679            deviceid,
13680        })
13681    }
13682}
13683impl Request for XIUngrabDeviceRequest {
13684    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
13685
13686    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
13687        let (bufs, fds) = self.serialize(major_opcode);
13688        // Flatten the buffers into a single vector
13689        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
13690        (buf, fds)
13691    }
13692}
13693impl crate::x11_utils::VoidRequest for XIUngrabDeviceRequest {
13694}
13695
13696#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
13697#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13698pub struct EventMode(u8);
13699impl EventMode {
13700    pub const ASYNC_DEVICE: Self = Self(0);
13701    pub const SYNC_DEVICE: Self = Self(1);
13702    pub const REPLAY_DEVICE: Self = Self(2);
13703    pub const ASYNC_PAIRED_DEVICE: Self = Self(3);
13704    pub const ASYNC_PAIR: Self = Self(4);
13705    pub const SYNC_PAIR: Self = Self(5);
13706    pub const ACCEPT_TOUCH: Self = Self(6);
13707    pub const REJECT_TOUCH: Self = Self(7);
13708}
13709impl From<EventMode> for u8 {
13710    #[inline]
13711    fn from(input: EventMode) -> Self {
13712        input.0
13713    }
13714}
13715impl From<EventMode> for Option<u8> {
13716    #[inline]
13717    fn from(input: EventMode) -> Self {
13718        Some(input.0)
13719    }
13720}
13721impl From<EventMode> for u16 {
13722    #[inline]
13723    fn from(input: EventMode) -> Self {
13724        u16::from(input.0)
13725    }
13726}
13727impl From<EventMode> for Option<u16> {
13728    #[inline]
13729    fn from(input: EventMode) -> Self {
13730        Some(u16::from(input.0))
13731    }
13732}
13733impl From<EventMode> for u32 {
13734    #[inline]
13735    fn from(input: EventMode) -> Self {
13736        u32::from(input.0)
13737    }
13738}
13739impl From<EventMode> for Option<u32> {
13740    #[inline]
13741    fn from(input: EventMode) -> Self {
13742        Some(u32::from(input.0))
13743    }
13744}
13745impl From<u8> for EventMode {
13746    #[inline]
13747    fn from(value: u8) -> Self {
13748        Self(value)
13749    }
13750}
13751impl core::fmt::Debug for EventMode  {
13752    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
13753        let variants = [
13754            (Self::ASYNC_DEVICE.0.into(), "ASYNC_DEVICE", "AsyncDevice"),
13755            (Self::SYNC_DEVICE.0.into(), "SYNC_DEVICE", "SyncDevice"),
13756            (Self::REPLAY_DEVICE.0.into(), "REPLAY_DEVICE", "ReplayDevice"),
13757            (Self::ASYNC_PAIRED_DEVICE.0.into(), "ASYNC_PAIRED_DEVICE", "AsyncPairedDevice"),
13758            (Self::ASYNC_PAIR.0.into(), "ASYNC_PAIR", "AsyncPair"),
13759            (Self::SYNC_PAIR.0.into(), "SYNC_PAIR", "SyncPair"),
13760            (Self::ACCEPT_TOUCH.0.into(), "ACCEPT_TOUCH", "AcceptTouch"),
13761            (Self::REJECT_TOUCH.0.into(), "REJECT_TOUCH", "RejectTouch"),
13762        ];
13763        pretty_print_enum(fmt, self.0.into(), &variants)
13764    }
13765}
13766
13767/// Opcode for the XIAllowEvents request
13768pub const XI_ALLOW_EVENTS_REQUEST: u8 = 53;
13769#[derive(Clone, Copy, Default)]
13770#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
13771#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13772pub struct XIAllowEventsRequest {
13773    pub time: xproto::Timestamp,
13774    pub deviceid: DeviceId,
13775    pub event_mode: EventMode,
13776    pub touchid: u32,
13777    pub grab_window: xproto::Window,
13778}
13779impl_debug_if_no_extra_traits!(XIAllowEventsRequest, "XIAllowEventsRequest");
13780impl XIAllowEventsRequest {
13781    /// Serialize this request into bytes for the provided connection
13782    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
13783        let length_so_far = 0;
13784        let time_bytes = self.time.serialize();
13785        let deviceid_bytes = self.deviceid.serialize();
13786        let event_mode_bytes = u8::from(self.event_mode).serialize();
13787        let touchid_bytes = self.touchid.serialize();
13788        let grab_window_bytes = self.grab_window.serialize();
13789        let mut request0 = vec![
13790            major_opcode,
13791            XI_ALLOW_EVENTS_REQUEST,
13792            0,
13793            0,
13794            time_bytes[0],
13795            time_bytes[1],
13796            time_bytes[2],
13797            time_bytes[3],
13798            deviceid_bytes[0],
13799            deviceid_bytes[1],
13800            event_mode_bytes[0],
13801            0,
13802            touchid_bytes[0],
13803            touchid_bytes[1],
13804            touchid_bytes[2],
13805            touchid_bytes[3],
13806            grab_window_bytes[0],
13807            grab_window_bytes[1],
13808            grab_window_bytes[2],
13809            grab_window_bytes[3],
13810        ];
13811        let length_so_far = length_so_far + request0.len();
13812        assert_eq!(length_so_far % 4, 0);
13813        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
13814        request0[2..4].copy_from_slice(&length.to_ne_bytes());
13815        ([request0.into()], vec![])
13816    }
13817    /// Parse this request given its header, its body, and any fds that go along with it
13818    #[cfg(feature = "request-parsing")]
13819    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
13820        if header.minor_opcode != XI_ALLOW_EVENTS_REQUEST {
13821            return Err(ParseError::InvalidValue);
13822        }
13823        let (time, remaining) = xproto::Timestamp::try_parse(value)?;
13824        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
13825        let (event_mode, remaining) = u8::try_parse(remaining)?;
13826        let event_mode = event_mode.into();
13827        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
13828        let (touchid, remaining) = u32::try_parse(remaining)?;
13829        let (grab_window, remaining) = xproto::Window::try_parse(remaining)?;
13830        let _ = remaining;
13831        Ok(XIAllowEventsRequest {
13832            time,
13833            deviceid,
13834            event_mode,
13835            touchid,
13836            grab_window,
13837        })
13838    }
13839}
13840impl Request for XIAllowEventsRequest {
13841    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
13842
13843    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
13844        let (bufs, fds) = self.serialize(major_opcode);
13845        // Flatten the buffers into a single vector
13846        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
13847        (buf, fds)
13848    }
13849}
13850impl crate::x11_utils::VoidRequest for XIAllowEventsRequest {
13851}
13852
13853#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
13854#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13855pub struct GrabMode22(u8);
13856impl GrabMode22 {
13857    pub const SYNC: Self = Self(0);
13858    pub const ASYNC: Self = Self(1);
13859    pub const TOUCH: Self = Self(2);
13860}
13861impl From<GrabMode22> for u8 {
13862    #[inline]
13863    fn from(input: GrabMode22) -> Self {
13864        input.0
13865    }
13866}
13867impl From<GrabMode22> for Option<u8> {
13868    #[inline]
13869    fn from(input: GrabMode22) -> Self {
13870        Some(input.0)
13871    }
13872}
13873impl From<GrabMode22> for u16 {
13874    #[inline]
13875    fn from(input: GrabMode22) -> Self {
13876        u16::from(input.0)
13877    }
13878}
13879impl From<GrabMode22> for Option<u16> {
13880    #[inline]
13881    fn from(input: GrabMode22) -> Self {
13882        Some(u16::from(input.0))
13883    }
13884}
13885impl From<GrabMode22> for u32 {
13886    #[inline]
13887    fn from(input: GrabMode22) -> Self {
13888        u32::from(input.0)
13889    }
13890}
13891impl From<GrabMode22> for Option<u32> {
13892    #[inline]
13893    fn from(input: GrabMode22) -> Self {
13894        Some(u32::from(input.0))
13895    }
13896}
13897impl From<u8> for GrabMode22 {
13898    #[inline]
13899    fn from(value: u8) -> Self {
13900        Self(value)
13901    }
13902}
13903impl core::fmt::Debug for GrabMode22  {
13904    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
13905        let variants = [
13906            (Self::SYNC.0.into(), "SYNC", "Sync"),
13907            (Self::ASYNC.0.into(), "ASYNC", "Async"),
13908            (Self::TOUCH.0.into(), "TOUCH", "Touch"),
13909        ];
13910        pretty_print_enum(fmt, self.0.into(), &variants)
13911    }
13912}
13913
13914#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
13915#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13916pub struct GrabType(u8);
13917impl GrabType {
13918    pub const BUTTON: Self = Self(0);
13919    pub const KEYCODE: Self = Self(1);
13920    pub const ENTER: Self = Self(2);
13921    pub const FOCUS_IN: Self = Self(3);
13922    pub const TOUCH_BEGIN: Self = Self(4);
13923    pub const GESTURE_PINCH_BEGIN: Self = Self(5);
13924    pub const GESTURE_SWIPE_BEGIN: Self = Self(6);
13925}
13926impl From<GrabType> for u8 {
13927    #[inline]
13928    fn from(input: GrabType) -> Self {
13929        input.0
13930    }
13931}
13932impl From<GrabType> for Option<u8> {
13933    #[inline]
13934    fn from(input: GrabType) -> Self {
13935        Some(input.0)
13936    }
13937}
13938impl From<GrabType> for u16 {
13939    #[inline]
13940    fn from(input: GrabType) -> Self {
13941        u16::from(input.0)
13942    }
13943}
13944impl From<GrabType> for Option<u16> {
13945    #[inline]
13946    fn from(input: GrabType) -> Self {
13947        Some(u16::from(input.0))
13948    }
13949}
13950impl From<GrabType> for u32 {
13951    #[inline]
13952    fn from(input: GrabType) -> Self {
13953        u32::from(input.0)
13954    }
13955}
13956impl From<GrabType> for Option<u32> {
13957    #[inline]
13958    fn from(input: GrabType) -> Self {
13959        Some(u32::from(input.0))
13960    }
13961}
13962impl From<u8> for GrabType {
13963    #[inline]
13964    fn from(value: u8) -> Self {
13965        Self(value)
13966    }
13967}
13968impl core::fmt::Debug for GrabType  {
13969    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
13970        let variants = [
13971            (Self::BUTTON.0.into(), "BUTTON", "Button"),
13972            (Self::KEYCODE.0.into(), "KEYCODE", "Keycode"),
13973            (Self::ENTER.0.into(), "ENTER", "Enter"),
13974            (Self::FOCUS_IN.0.into(), "FOCUS_IN", "FocusIn"),
13975            (Self::TOUCH_BEGIN.0.into(), "TOUCH_BEGIN", "TouchBegin"),
13976            (Self::GESTURE_PINCH_BEGIN.0.into(), "GESTURE_PINCH_BEGIN", "GesturePinchBegin"),
13977            (Self::GESTURE_SWIPE_BEGIN.0.into(), "GESTURE_SWIPE_BEGIN", "GestureSwipeBegin"),
13978        ];
13979        pretty_print_enum(fmt, self.0.into(), &variants)
13980    }
13981}
13982
13983#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
13984#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13985pub struct ModifierMask(u32);
13986impl ModifierMask {
13987    pub const ANY: Self = Self(1 << 31);
13988}
13989impl From<ModifierMask> for u32 {
13990    #[inline]
13991    fn from(input: ModifierMask) -> Self {
13992        input.0
13993    }
13994}
13995impl From<ModifierMask> for Option<u32> {
13996    #[inline]
13997    fn from(input: ModifierMask) -> Self {
13998        Some(input.0)
13999    }
14000}
14001impl From<u8> for ModifierMask {
14002    #[inline]
14003    fn from(value: u8) -> Self {
14004        Self(value.into())
14005    }
14006}
14007impl From<u16> for ModifierMask {
14008    #[inline]
14009    fn from(value: u16) -> Self {
14010        Self(value.into())
14011    }
14012}
14013impl From<u32> for ModifierMask {
14014    #[inline]
14015    fn from(value: u32) -> Self {
14016        Self(value)
14017    }
14018}
14019impl core::fmt::Debug for ModifierMask  {
14020    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
14021        let variants = [
14022            (Self::ANY.0, "ANY", "Any"),
14023        ];
14024        pretty_print_bitmask(fmt, self.0, &variants)
14025    }
14026}
14027bitmask_binop!(ModifierMask, u32);
14028
14029#[derive(Clone, Copy, Default)]
14030#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14031#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14032pub struct GrabModifierInfo {
14033    pub modifiers: u32,
14034    pub status: xproto::GrabStatus,
14035}
14036impl_debug_if_no_extra_traits!(GrabModifierInfo, "GrabModifierInfo");
14037impl TryParse for GrabModifierInfo {
14038    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
14039        let (modifiers, remaining) = u32::try_parse(remaining)?;
14040        let (status, remaining) = u8::try_parse(remaining)?;
14041        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
14042        let status = status.into();
14043        let result = GrabModifierInfo { modifiers, status };
14044        Ok((result, remaining))
14045    }
14046}
14047impl Serialize for GrabModifierInfo {
14048    type Bytes = [u8; 8];
14049    fn serialize(&self) -> [u8; 8] {
14050        let modifiers_bytes = self.modifiers.serialize();
14051        let status_bytes = u8::from(self.status).serialize();
14052        [
14053            modifiers_bytes[0],
14054            modifiers_bytes[1],
14055            modifiers_bytes[2],
14056            modifiers_bytes[3],
14057            status_bytes[0],
14058            0,
14059            0,
14060            0,
14061        ]
14062    }
14063    fn serialize_into(&self, bytes: &mut Vec<u8>) {
14064        bytes.reserve(8);
14065        self.modifiers.serialize_into(bytes);
14066        u8::from(self.status).serialize_into(bytes);
14067        bytes.extend_from_slice(&[0; 3]);
14068    }
14069}
14070
14071/// Opcode for the XIPassiveGrabDevice request
14072pub const XI_PASSIVE_GRAB_DEVICE_REQUEST: u8 = 54;
14073#[derive(Clone, Default)]
14074#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14075#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14076pub struct XIPassiveGrabDeviceRequest<'input> {
14077    pub time: xproto::Timestamp,
14078    pub grab_window: xproto::Window,
14079    pub cursor: xproto::Cursor,
14080    pub detail: u32,
14081    pub deviceid: DeviceId,
14082    pub grab_type: GrabType,
14083    pub grab_mode: GrabMode22,
14084    pub paired_device_mode: xproto::GrabMode,
14085    pub owner_events: GrabOwner,
14086    pub mask: Cow<'input, [u32]>,
14087    pub modifiers: Cow<'input, [u32]>,
14088}
14089impl_debug_if_no_extra_traits!(XIPassiveGrabDeviceRequest<'_>, "XIPassiveGrabDeviceRequest");
14090impl<'input> XIPassiveGrabDeviceRequest<'input> {
14091    /// Serialize this request into bytes for the provided connection
14092    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 4]> {
14093        let length_so_far = 0;
14094        let time_bytes = self.time.serialize();
14095        let grab_window_bytes = self.grab_window.serialize();
14096        let cursor_bytes = self.cursor.serialize();
14097        let detail_bytes = self.detail.serialize();
14098        let deviceid_bytes = self.deviceid.serialize();
14099        let num_modifiers = u16::try_from(self.modifiers.len()).expect("`modifiers` has too many elements");
14100        let num_modifiers_bytes = num_modifiers.serialize();
14101        let mask_len = u16::try_from(self.mask.len()).expect("`mask` has too many elements");
14102        let mask_len_bytes = mask_len.serialize();
14103        let grab_type_bytes = u8::from(self.grab_type).serialize();
14104        let grab_mode_bytes = u8::from(self.grab_mode).serialize();
14105        let paired_device_mode_bytes = u8::from(self.paired_device_mode).serialize();
14106        let owner_events_bytes = bool::from(self.owner_events).serialize();
14107        let mut request0 = vec![
14108            major_opcode,
14109            XI_PASSIVE_GRAB_DEVICE_REQUEST,
14110            0,
14111            0,
14112            time_bytes[0],
14113            time_bytes[1],
14114            time_bytes[2],
14115            time_bytes[3],
14116            grab_window_bytes[0],
14117            grab_window_bytes[1],
14118            grab_window_bytes[2],
14119            grab_window_bytes[3],
14120            cursor_bytes[0],
14121            cursor_bytes[1],
14122            cursor_bytes[2],
14123            cursor_bytes[3],
14124            detail_bytes[0],
14125            detail_bytes[1],
14126            detail_bytes[2],
14127            detail_bytes[3],
14128            deviceid_bytes[0],
14129            deviceid_bytes[1],
14130            num_modifiers_bytes[0],
14131            num_modifiers_bytes[1],
14132            mask_len_bytes[0],
14133            mask_len_bytes[1],
14134            grab_type_bytes[0],
14135            grab_mode_bytes[0],
14136            paired_device_mode_bytes[0],
14137            owner_events_bytes[0],
14138            0,
14139            0,
14140        ];
14141        let length_so_far = length_so_far + request0.len();
14142        let mask_bytes = self.mask.serialize();
14143        let length_so_far = length_so_far + mask_bytes.len();
14144        let modifiers_bytes = self.modifiers.serialize();
14145        let length_so_far = length_so_far + modifiers_bytes.len();
14146        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
14147        let length_so_far = length_so_far + padding0.len();
14148        assert_eq!(length_so_far % 4, 0);
14149        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
14150        request0[2..4].copy_from_slice(&length.to_ne_bytes());
14151        ([request0.into(), mask_bytes.into(), modifiers_bytes.into(), padding0.into()], vec![])
14152    }
14153    /// Parse this request given its header, its body, and any fds that go along with it
14154    #[cfg(feature = "request-parsing")]
14155    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
14156        if header.minor_opcode != XI_PASSIVE_GRAB_DEVICE_REQUEST {
14157            return Err(ParseError::InvalidValue);
14158        }
14159        let (time, remaining) = xproto::Timestamp::try_parse(value)?;
14160        let (grab_window, remaining) = xproto::Window::try_parse(remaining)?;
14161        let (cursor, remaining) = xproto::Cursor::try_parse(remaining)?;
14162        let (detail, remaining) = u32::try_parse(remaining)?;
14163        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
14164        let (num_modifiers, remaining) = u16::try_parse(remaining)?;
14165        let (mask_len, remaining) = u16::try_parse(remaining)?;
14166        let (grab_type, remaining) = u8::try_parse(remaining)?;
14167        let grab_type = grab_type.into();
14168        let (grab_mode, remaining) = u8::try_parse(remaining)?;
14169        let grab_mode = grab_mode.into();
14170        let (paired_device_mode, remaining) = u8::try_parse(remaining)?;
14171        let paired_device_mode = paired_device_mode.into();
14172        let (owner_events, remaining) = bool::try_parse(remaining)?;
14173        let owner_events = owner_events.into();
14174        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
14175        let (mask, remaining) = crate::x11_utils::parse_list::<u32>(remaining, mask_len.try_to_usize()?)?;
14176        let (modifiers, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_modifiers.try_to_usize()?)?;
14177        let _ = remaining;
14178        Ok(XIPassiveGrabDeviceRequest {
14179            time,
14180            grab_window,
14181            cursor,
14182            detail,
14183            deviceid,
14184            grab_type,
14185            grab_mode,
14186            paired_device_mode,
14187            owner_events,
14188            mask: Cow::Owned(mask),
14189            modifiers: Cow::Owned(modifiers),
14190        })
14191    }
14192    /// Clone all borrowed data in this XIPassiveGrabDeviceRequest.
14193    pub fn into_owned(self) -> XIPassiveGrabDeviceRequest<'static> {
14194        XIPassiveGrabDeviceRequest {
14195            time: self.time,
14196            grab_window: self.grab_window,
14197            cursor: self.cursor,
14198            detail: self.detail,
14199            deviceid: self.deviceid,
14200            grab_type: self.grab_type,
14201            grab_mode: self.grab_mode,
14202            paired_device_mode: self.paired_device_mode,
14203            owner_events: self.owner_events,
14204            mask: Cow::Owned(self.mask.into_owned()),
14205            modifiers: Cow::Owned(self.modifiers.into_owned()),
14206        }
14207    }
14208}
14209impl<'input> Request for XIPassiveGrabDeviceRequest<'input> {
14210    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
14211
14212    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
14213        let (bufs, fds) = self.serialize(major_opcode);
14214        // Flatten the buffers into a single vector
14215        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
14216        (buf, fds)
14217    }
14218}
14219impl<'input> crate::x11_utils::ReplyRequest for XIPassiveGrabDeviceRequest<'input> {
14220    type Reply = XIPassiveGrabDeviceReply;
14221}
14222
14223#[derive(Clone, Default)]
14224#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14225#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14226pub struct XIPassiveGrabDeviceReply {
14227    pub sequence: u16,
14228    pub length: u32,
14229    pub modifiers: Vec<GrabModifierInfo>,
14230}
14231impl_debug_if_no_extra_traits!(XIPassiveGrabDeviceReply, "XIPassiveGrabDeviceReply");
14232impl TryParse for XIPassiveGrabDeviceReply {
14233    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
14234        let remaining = initial_value;
14235        let (response_type, remaining) = u8::try_parse(remaining)?;
14236        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
14237        let (sequence, remaining) = u16::try_parse(remaining)?;
14238        let (length, remaining) = u32::try_parse(remaining)?;
14239        let (num_modifiers, remaining) = u16::try_parse(remaining)?;
14240        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
14241        let (modifiers, remaining) = crate::x11_utils::parse_list::<GrabModifierInfo>(remaining, num_modifiers.try_to_usize()?)?;
14242        if response_type != 1 {
14243            return Err(ParseError::InvalidValue);
14244        }
14245        let result = XIPassiveGrabDeviceReply { sequence, length, modifiers };
14246        let _ = remaining;
14247        let remaining = initial_value.get(32 + length as usize * 4..)
14248            .ok_or(ParseError::InsufficientData)?;
14249        Ok((result, remaining))
14250    }
14251}
14252impl Serialize for XIPassiveGrabDeviceReply {
14253    type Bytes = Vec<u8>;
14254    fn serialize(&self) -> Vec<u8> {
14255        let mut result = Vec::new();
14256        self.serialize_into(&mut result);
14257        result
14258    }
14259    fn serialize_into(&self, bytes: &mut Vec<u8>) {
14260        bytes.reserve(32);
14261        let response_type_bytes = &[1];
14262        bytes.push(response_type_bytes[0]);
14263        bytes.extend_from_slice(&[0; 1]);
14264        self.sequence.serialize_into(bytes);
14265        self.length.serialize_into(bytes);
14266        let num_modifiers = u16::try_from(self.modifiers.len()).expect("`modifiers` has too many elements");
14267        num_modifiers.serialize_into(bytes);
14268        bytes.extend_from_slice(&[0; 22]);
14269        self.modifiers.serialize_into(bytes);
14270    }
14271}
14272impl XIPassiveGrabDeviceReply {
14273    /// Get the value of the `num_modifiers` field.
14274    ///
14275    /// The `num_modifiers` field is used as the length field of the `modifiers` field.
14276    /// This function computes the field's value again based on the length of the list.
14277    ///
14278    /// # Panics
14279    ///
14280    /// Panics if the value cannot be represented in the target type. This
14281    /// cannot happen with values of the struct received from the X11 server.
14282    pub fn num_modifiers(&self) -> u16 {
14283        self.modifiers.len()
14284            .try_into().unwrap()
14285    }
14286}
14287
14288/// Opcode for the XIPassiveUngrabDevice request
14289pub const XI_PASSIVE_UNGRAB_DEVICE_REQUEST: u8 = 55;
14290#[derive(Clone, Default)]
14291#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14292#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14293pub struct XIPassiveUngrabDeviceRequest<'input> {
14294    pub grab_window: xproto::Window,
14295    pub detail: u32,
14296    pub deviceid: DeviceId,
14297    pub grab_type: GrabType,
14298    pub modifiers: Cow<'input, [u32]>,
14299}
14300impl_debug_if_no_extra_traits!(XIPassiveUngrabDeviceRequest<'_>, "XIPassiveUngrabDeviceRequest");
14301impl<'input> XIPassiveUngrabDeviceRequest<'input> {
14302    /// Serialize this request into bytes for the provided connection
14303    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
14304        let length_so_far = 0;
14305        let grab_window_bytes = self.grab_window.serialize();
14306        let detail_bytes = self.detail.serialize();
14307        let deviceid_bytes = self.deviceid.serialize();
14308        let num_modifiers = u16::try_from(self.modifiers.len()).expect("`modifiers` has too many elements");
14309        let num_modifiers_bytes = num_modifiers.serialize();
14310        let grab_type_bytes = u8::from(self.grab_type).serialize();
14311        let mut request0 = vec![
14312            major_opcode,
14313            XI_PASSIVE_UNGRAB_DEVICE_REQUEST,
14314            0,
14315            0,
14316            grab_window_bytes[0],
14317            grab_window_bytes[1],
14318            grab_window_bytes[2],
14319            grab_window_bytes[3],
14320            detail_bytes[0],
14321            detail_bytes[1],
14322            detail_bytes[2],
14323            detail_bytes[3],
14324            deviceid_bytes[0],
14325            deviceid_bytes[1],
14326            num_modifiers_bytes[0],
14327            num_modifiers_bytes[1],
14328            grab_type_bytes[0],
14329            0,
14330            0,
14331            0,
14332        ];
14333        let length_so_far = length_so_far + request0.len();
14334        let modifiers_bytes = self.modifiers.serialize();
14335        let length_so_far = length_so_far + modifiers_bytes.len();
14336        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
14337        let length_so_far = length_so_far + padding0.len();
14338        assert_eq!(length_so_far % 4, 0);
14339        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
14340        request0[2..4].copy_from_slice(&length.to_ne_bytes());
14341        ([request0.into(), modifiers_bytes.into(), padding0.into()], vec![])
14342    }
14343    /// Parse this request given its header, its body, and any fds that go along with it
14344    #[cfg(feature = "request-parsing")]
14345    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
14346        if header.minor_opcode != XI_PASSIVE_UNGRAB_DEVICE_REQUEST {
14347            return Err(ParseError::InvalidValue);
14348        }
14349        let (grab_window, remaining) = xproto::Window::try_parse(value)?;
14350        let (detail, remaining) = u32::try_parse(remaining)?;
14351        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
14352        let (num_modifiers, remaining) = u16::try_parse(remaining)?;
14353        let (grab_type, remaining) = u8::try_parse(remaining)?;
14354        let grab_type = grab_type.into();
14355        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
14356        let (modifiers, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_modifiers.try_to_usize()?)?;
14357        let _ = remaining;
14358        Ok(XIPassiveUngrabDeviceRequest {
14359            grab_window,
14360            detail,
14361            deviceid,
14362            grab_type,
14363            modifiers: Cow::Owned(modifiers),
14364        })
14365    }
14366    /// Clone all borrowed data in this XIPassiveUngrabDeviceRequest.
14367    pub fn into_owned(self) -> XIPassiveUngrabDeviceRequest<'static> {
14368        XIPassiveUngrabDeviceRequest {
14369            grab_window: self.grab_window,
14370            detail: self.detail,
14371            deviceid: self.deviceid,
14372            grab_type: self.grab_type,
14373            modifiers: Cow::Owned(self.modifiers.into_owned()),
14374        }
14375    }
14376}
14377impl<'input> Request for XIPassiveUngrabDeviceRequest<'input> {
14378    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
14379
14380    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
14381        let (bufs, fds) = self.serialize(major_opcode);
14382        // Flatten the buffers into a single vector
14383        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
14384        (buf, fds)
14385    }
14386}
14387impl<'input> crate::x11_utils::VoidRequest for XIPassiveUngrabDeviceRequest<'input> {
14388}
14389
14390/// Opcode for the XIListProperties request
14391pub const XI_LIST_PROPERTIES_REQUEST: u8 = 56;
14392#[derive(Clone, Copy, Default)]
14393#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14394#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14395pub struct XIListPropertiesRequest {
14396    pub deviceid: DeviceId,
14397}
14398impl_debug_if_no_extra_traits!(XIListPropertiesRequest, "XIListPropertiesRequest");
14399impl XIListPropertiesRequest {
14400    /// Serialize this request into bytes for the provided connection
14401    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
14402        let length_so_far = 0;
14403        let deviceid_bytes = self.deviceid.serialize();
14404        let mut request0 = vec![
14405            major_opcode,
14406            XI_LIST_PROPERTIES_REQUEST,
14407            0,
14408            0,
14409            deviceid_bytes[0],
14410            deviceid_bytes[1],
14411            0,
14412            0,
14413        ];
14414        let length_so_far = length_so_far + request0.len();
14415        assert_eq!(length_so_far % 4, 0);
14416        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
14417        request0[2..4].copy_from_slice(&length.to_ne_bytes());
14418        ([request0.into()], vec![])
14419    }
14420    /// Parse this request given its header, its body, and any fds that go along with it
14421    #[cfg(feature = "request-parsing")]
14422    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
14423        if header.minor_opcode != XI_LIST_PROPERTIES_REQUEST {
14424            return Err(ParseError::InvalidValue);
14425        }
14426        let (deviceid, remaining) = DeviceId::try_parse(value)?;
14427        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
14428        let _ = remaining;
14429        Ok(XIListPropertiesRequest {
14430            deviceid,
14431        })
14432    }
14433}
14434impl Request for XIListPropertiesRequest {
14435    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
14436
14437    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
14438        let (bufs, fds) = self.serialize(major_opcode);
14439        // Flatten the buffers into a single vector
14440        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
14441        (buf, fds)
14442    }
14443}
14444impl crate::x11_utils::ReplyRequest for XIListPropertiesRequest {
14445    type Reply = XIListPropertiesReply;
14446}
14447
14448#[derive(Clone, Default)]
14449#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14450#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14451pub struct XIListPropertiesReply {
14452    pub sequence: u16,
14453    pub length: u32,
14454    pub properties: Vec<xproto::Atom>,
14455}
14456impl_debug_if_no_extra_traits!(XIListPropertiesReply, "XIListPropertiesReply");
14457impl TryParse for XIListPropertiesReply {
14458    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
14459        let remaining = initial_value;
14460        let (response_type, remaining) = u8::try_parse(remaining)?;
14461        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
14462        let (sequence, remaining) = u16::try_parse(remaining)?;
14463        let (length, remaining) = u32::try_parse(remaining)?;
14464        let (num_properties, remaining) = u16::try_parse(remaining)?;
14465        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
14466        let (properties, remaining) = crate::x11_utils::parse_list::<xproto::Atom>(remaining, num_properties.try_to_usize()?)?;
14467        if response_type != 1 {
14468            return Err(ParseError::InvalidValue);
14469        }
14470        let result = XIListPropertiesReply { sequence, length, properties };
14471        let _ = remaining;
14472        let remaining = initial_value.get(32 + length as usize * 4..)
14473            .ok_or(ParseError::InsufficientData)?;
14474        Ok((result, remaining))
14475    }
14476}
14477impl Serialize for XIListPropertiesReply {
14478    type Bytes = Vec<u8>;
14479    fn serialize(&self) -> Vec<u8> {
14480        let mut result = Vec::new();
14481        self.serialize_into(&mut result);
14482        result
14483    }
14484    fn serialize_into(&self, bytes: &mut Vec<u8>) {
14485        bytes.reserve(32);
14486        let response_type_bytes = &[1];
14487        bytes.push(response_type_bytes[0]);
14488        bytes.extend_from_slice(&[0; 1]);
14489        self.sequence.serialize_into(bytes);
14490        self.length.serialize_into(bytes);
14491        let num_properties = u16::try_from(self.properties.len()).expect("`properties` has too many elements");
14492        num_properties.serialize_into(bytes);
14493        bytes.extend_from_slice(&[0; 22]);
14494        self.properties.serialize_into(bytes);
14495    }
14496}
14497impl XIListPropertiesReply {
14498    /// Get the value of the `num_properties` field.
14499    ///
14500    /// The `num_properties` field is used as the length field of the `properties` field.
14501    /// This function computes the field's value again based on the length of the list.
14502    ///
14503    /// # Panics
14504    ///
14505    /// Panics if the value cannot be represented in the target type. This
14506    /// cannot happen with values of the struct received from the X11 server.
14507    pub fn num_properties(&self) -> u16 {
14508        self.properties.len()
14509            .try_into().unwrap()
14510    }
14511}
14512
14513#[derive(Clone)]
14514#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14515#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14516pub enum XIChangePropertyAux {
14517    Data8(Vec<u8>),
14518    Data16(Vec<u16>),
14519    Data32(Vec<u32>),
14520    /// This variant is returned when the server sends a discriminant
14521    /// value that does not match any of the defined by the protocol.
14522    ///
14523    /// Usually, this should be considered a parsing error, but there
14524    /// are some cases where the server violates the protocol.
14525    ///
14526    /// Trying to use `serialize` or `serialize_into` with this variant
14527    /// will raise a panic.
14528    InvalidValue(u8),
14529}
14530impl_debug_if_no_extra_traits!(XIChangePropertyAux, "XIChangePropertyAux");
14531impl XIChangePropertyAux {
14532    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
14533    fn try_parse(value: &[u8], format: u8, num_items: u32) -> Result<(Self, &[u8]), ParseError> {
14534        let switch_expr = u8::from(format);
14535        let mut outer_remaining = value;
14536        let mut parse_result = None;
14537        if switch_expr == u8::from(PropertyFormat::M8_BITS) {
14538            let remaining = outer_remaining;
14539            let value = remaining;
14540            let (data8, remaining) = crate::x11_utils::parse_u8_list(remaining, num_items.try_to_usize()?)?;
14541            let data8 = data8.to_vec();
14542            // Align offset to multiple of 4
14543            let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
14544            let misalignment = (4 - (offset % 4)) % 4;
14545            let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
14546            outer_remaining = remaining;
14547            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
14548            parse_result = Some(XIChangePropertyAux::Data8(data8));
14549        }
14550        if switch_expr == u8::from(PropertyFormat::M16_BITS) {
14551            let remaining = outer_remaining;
14552            let value = remaining;
14553            let (data16, remaining) = crate::x11_utils::parse_list::<u16>(remaining, num_items.try_to_usize()?)?;
14554            // Align offset to multiple of 4
14555            let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
14556            let misalignment = (4 - (offset % 4)) % 4;
14557            let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
14558            outer_remaining = remaining;
14559            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
14560            parse_result = Some(XIChangePropertyAux::Data16(data16));
14561        }
14562        if switch_expr == u8::from(PropertyFormat::M32_BITS) {
14563            let remaining = outer_remaining;
14564            let (data32, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_items.try_to_usize()?)?;
14565            outer_remaining = remaining;
14566            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
14567            parse_result = Some(XIChangePropertyAux::Data32(data32));
14568        }
14569        match parse_result {
14570            None => Ok((XIChangePropertyAux::InvalidValue(switch_expr), &[])),
14571            Some(result) => Ok((result, outer_remaining)),
14572        }
14573    }
14574}
14575impl XIChangePropertyAux {
14576    pub fn as_data8(&self) -> Option<&Vec<u8>> {
14577        match self {
14578            XIChangePropertyAux::Data8(value) => Some(value),
14579            _ => None,
14580        }
14581    }
14582    pub fn as_data16(&self) -> Option<&Vec<u16>> {
14583        match self {
14584            XIChangePropertyAux::Data16(value) => Some(value),
14585            _ => None,
14586        }
14587    }
14588    pub fn as_data32(&self) -> Option<&Vec<u32>> {
14589        match self {
14590            XIChangePropertyAux::Data32(value) => Some(value),
14591            _ => None,
14592        }
14593    }
14594}
14595impl XIChangePropertyAux {
14596    #[allow(dead_code)]
14597    fn serialize(&self, format: u8, num_items: u32) -> Vec<u8> {
14598        let mut result = Vec::new();
14599        self.serialize_into(&mut result, u8::from(format), u32::from(num_items));
14600        result
14601    }
14602    fn serialize_into(&self, bytes: &mut Vec<u8>, format: u8, num_items: u32) {
14603        assert_eq!(self.switch_expr(), u8::from(format), "switch `items` has an inconsistent discriminant");
14604        match self {
14605            XIChangePropertyAux::Data8(data8) => {
14606                assert_eq!(data8.len(), usize::try_from(num_items).unwrap(), "`data8` has an incorrect length");
14607                bytes.extend_from_slice(&data8);
14608                bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
14609            }
14610            XIChangePropertyAux::Data16(data16) => {
14611                assert_eq!(data16.len(), usize::try_from(num_items).unwrap(), "`data16` has an incorrect length");
14612                data16.serialize_into(bytes);
14613                bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
14614            }
14615            XIChangePropertyAux::Data32(data32) => {
14616                assert_eq!(data32.len(), usize::try_from(num_items).unwrap(), "`data32` has an incorrect length");
14617                data32.serialize_into(bytes);
14618            }
14619            XIChangePropertyAux::InvalidValue(_) => panic!("attempted to serialize invalid switch case"),
14620        }
14621    }
14622}
14623impl XIChangePropertyAux {
14624    fn switch_expr(&self) -> u8 {
14625        match self {
14626            XIChangePropertyAux::Data8(_) => u8::from(PropertyFormat::M8_BITS),
14627            XIChangePropertyAux::Data16(_) => u8::from(PropertyFormat::M16_BITS),
14628            XIChangePropertyAux::Data32(_) => u8::from(PropertyFormat::M32_BITS),
14629            XIChangePropertyAux::InvalidValue(switch_expr) => *switch_expr,
14630        }
14631    }
14632}
14633
14634/// Opcode for the XIChangeProperty request
14635pub const XI_CHANGE_PROPERTY_REQUEST: u8 = 57;
14636#[derive(Clone)]
14637#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14638#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14639pub struct XIChangePropertyRequest<'input> {
14640    pub deviceid: DeviceId,
14641    pub mode: xproto::PropMode,
14642    pub property: xproto::Atom,
14643    pub type_: xproto::Atom,
14644    pub num_items: u32,
14645    pub items: Cow<'input, XIChangePropertyAux>,
14646}
14647impl_debug_if_no_extra_traits!(XIChangePropertyRequest<'_>, "XIChangePropertyRequest");
14648impl<'input> XIChangePropertyRequest<'input> {
14649    /// Serialize this request into bytes for the provided connection
14650    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
14651        let length_so_far = 0;
14652        let deviceid_bytes = self.deviceid.serialize();
14653        let mode_bytes = u8::from(self.mode).serialize();
14654        let format: u8 = self.items.switch_expr();
14655        let format_bytes = format.serialize();
14656        let property_bytes = self.property.serialize();
14657        let type_bytes = self.type_.serialize();
14658        let num_items_bytes = self.num_items.serialize();
14659        let mut request0 = vec![
14660            major_opcode,
14661            XI_CHANGE_PROPERTY_REQUEST,
14662            0,
14663            0,
14664            deviceid_bytes[0],
14665            deviceid_bytes[1],
14666            mode_bytes[0],
14667            format_bytes[0],
14668            property_bytes[0],
14669            property_bytes[1],
14670            property_bytes[2],
14671            property_bytes[3],
14672            type_bytes[0],
14673            type_bytes[1],
14674            type_bytes[2],
14675            type_bytes[3],
14676            num_items_bytes[0],
14677            num_items_bytes[1],
14678            num_items_bytes[2],
14679            num_items_bytes[3],
14680        ];
14681        let length_so_far = length_so_far + request0.len();
14682        let items_bytes = self.items.serialize(u8::from(format), u32::from(self.num_items));
14683        let length_so_far = length_so_far + items_bytes.len();
14684        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
14685        let length_so_far = length_so_far + padding0.len();
14686        assert_eq!(length_so_far % 4, 0);
14687        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
14688        request0[2..4].copy_from_slice(&length.to_ne_bytes());
14689        ([request0.into(), items_bytes.into(), padding0.into()], vec![])
14690    }
14691    /// Parse this request given its header, its body, and any fds that go along with it
14692    #[cfg(feature = "request-parsing")]
14693    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
14694        if header.minor_opcode != XI_CHANGE_PROPERTY_REQUEST {
14695            return Err(ParseError::InvalidValue);
14696        }
14697        let (deviceid, remaining) = DeviceId::try_parse(value)?;
14698        let (mode, remaining) = u8::try_parse(remaining)?;
14699        let mode = mode.into();
14700        let (format, remaining) = u8::try_parse(remaining)?;
14701        let (property, remaining) = xproto::Atom::try_parse(remaining)?;
14702        let (type_, remaining) = xproto::Atom::try_parse(remaining)?;
14703        let (num_items, remaining) = u32::try_parse(remaining)?;
14704        let (items, remaining) = XIChangePropertyAux::try_parse(remaining, u8::from(format), u32::from(num_items))?;
14705        let _ = remaining;
14706        Ok(XIChangePropertyRequest {
14707            deviceid,
14708            mode,
14709            property,
14710            type_,
14711            num_items,
14712            items: Cow::Owned(items),
14713        })
14714    }
14715    /// Clone all borrowed data in this XIChangePropertyRequest.
14716    pub fn into_owned(self) -> XIChangePropertyRequest<'static> {
14717        XIChangePropertyRequest {
14718            deviceid: self.deviceid,
14719            mode: self.mode,
14720            property: self.property,
14721            type_: self.type_,
14722            num_items: self.num_items,
14723            items: Cow::Owned(self.items.into_owned()),
14724        }
14725    }
14726}
14727impl<'input> Request for XIChangePropertyRequest<'input> {
14728    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
14729
14730    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
14731        let (bufs, fds) = self.serialize(major_opcode);
14732        // Flatten the buffers into a single vector
14733        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
14734        (buf, fds)
14735    }
14736}
14737impl<'input> crate::x11_utils::VoidRequest for XIChangePropertyRequest<'input> {
14738}
14739
14740/// Opcode for the XIDeleteProperty request
14741pub const XI_DELETE_PROPERTY_REQUEST: u8 = 58;
14742#[derive(Clone, Copy, Default)]
14743#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14744#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14745pub struct XIDeletePropertyRequest {
14746    pub deviceid: DeviceId,
14747    pub property: xproto::Atom,
14748}
14749impl_debug_if_no_extra_traits!(XIDeletePropertyRequest, "XIDeletePropertyRequest");
14750impl XIDeletePropertyRequest {
14751    /// Serialize this request into bytes for the provided connection
14752    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
14753        let length_so_far = 0;
14754        let deviceid_bytes = self.deviceid.serialize();
14755        let property_bytes = self.property.serialize();
14756        let mut request0 = vec![
14757            major_opcode,
14758            XI_DELETE_PROPERTY_REQUEST,
14759            0,
14760            0,
14761            deviceid_bytes[0],
14762            deviceid_bytes[1],
14763            0,
14764            0,
14765            property_bytes[0],
14766            property_bytes[1],
14767            property_bytes[2],
14768            property_bytes[3],
14769        ];
14770        let length_so_far = length_so_far + request0.len();
14771        assert_eq!(length_so_far % 4, 0);
14772        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
14773        request0[2..4].copy_from_slice(&length.to_ne_bytes());
14774        ([request0.into()], vec![])
14775    }
14776    /// Parse this request given its header, its body, and any fds that go along with it
14777    #[cfg(feature = "request-parsing")]
14778    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
14779        if header.minor_opcode != XI_DELETE_PROPERTY_REQUEST {
14780            return Err(ParseError::InvalidValue);
14781        }
14782        let (deviceid, remaining) = DeviceId::try_parse(value)?;
14783        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
14784        let (property, remaining) = xproto::Atom::try_parse(remaining)?;
14785        let _ = remaining;
14786        Ok(XIDeletePropertyRequest {
14787            deviceid,
14788            property,
14789        })
14790    }
14791}
14792impl Request for XIDeletePropertyRequest {
14793    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
14794
14795    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
14796        let (bufs, fds) = self.serialize(major_opcode);
14797        // Flatten the buffers into a single vector
14798        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
14799        (buf, fds)
14800    }
14801}
14802impl crate::x11_utils::VoidRequest for XIDeletePropertyRequest {
14803}
14804
14805/// Opcode for the XIGetProperty request
14806pub const XI_GET_PROPERTY_REQUEST: u8 = 59;
14807#[derive(Clone, Copy, Default)]
14808#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14809#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14810pub struct XIGetPropertyRequest {
14811    pub deviceid: DeviceId,
14812    pub delete: bool,
14813    pub property: xproto::Atom,
14814    pub type_: xproto::Atom,
14815    pub offset: u32,
14816    pub len: u32,
14817}
14818impl_debug_if_no_extra_traits!(XIGetPropertyRequest, "XIGetPropertyRequest");
14819impl XIGetPropertyRequest {
14820    /// Serialize this request into bytes for the provided connection
14821    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
14822        let length_so_far = 0;
14823        let deviceid_bytes = self.deviceid.serialize();
14824        let delete_bytes = self.delete.serialize();
14825        let property_bytes = self.property.serialize();
14826        let type_bytes = self.type_.serialize();
14827        let offset_bytes = self.offset.serialize();
14828        let len_bytes = self.len.serialize();
14829        let mut request0 = vec![
14830            major_opcode,
14831            XI_GET_PROPERTY_REQUEST,
14832            0,
14833            0,
14834            deviceid_bytes[0],
14835            deviceid_bytes[1],
14836            delete_bytes[0],
14837            0,
14838            property_bytes[0],
14839            property_bytes[1],
14840            property_bytes[2],
14841            property_bytes[3],
14842            type_bytes[0],
14843            type_bytes[1],
14844            type_bytes[2],
14845            type_bytes[3],
14846            offset_bytes[0],
14847            offset_bytes[1],
14848            offset_bytes[2],
14849            offset_bytes[3],
14850            len_bytes[0],
14851            len_bytes[1],
14852            len_bytes[2],
14853            len_bytes[3],
14854        ];
14855        let length_so_far = length_so_far + request0.len();
14856        assert_eq!(length_so_far % 4, 0);
14857        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
14858        request0[2..4].copy_from_slice(&length.to_ne_bytes());
14859        ([request0.into()], vec![])
14860    }
14861    /// Parse this request given its header, its body, and any fds that go along with it
14862    #[cfg(feature = "request-parsing")]
14863    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
14864        if header.minor_opcode != XI_GET_PROPERTY_REQUEST {
14865            return Err(ParseError::InvalidValue);
14866        }
14867        let (deviceid, remaining) = DeviceId::try_parse(value)?;
14868        let (delete, remaining) = bool::try_parse(remaining)?;
14869        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
14870        let (property, remaining) = xproto::Atom::try_parse(remaining)?;
14871        let (type_, remaining) = xproto::Atom::try_parse(remaining)?;
14872        let (offset, remaining) = u32::try_parse(remaining)?;
14873        let (len, remaining) = u32::try_parse(remaining)?;
14874        let _ = remaining;
14875        Ok(XIGetPropertyRequest {
14876            deviceid,
14877            delete,
14878            property,
14879            type_,
14880            offset,
14881            len,
14882        })
14883    }
14884}
14885impl Request for XIGetPropertyRequest {
14886    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
14887
14888    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
14889        let (bufs, fds) = self.serialize(major_opcode);
14890        // Flatten the buffers into a single vector
14891        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
14892        (buf, fds)
14893    }
14894}
14895impl crate::x11_utils::ReplyRequest for XIGetPropertyRequest {
14896    type Reply = XIGetPropertyReply;
14897}
14898
14899#[derive(Clone)]
14900#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
14901#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14902pub enum XIGetPropertyItems {
14903    Data8(Vec<u8>),
14904    Data16(Vec<u16>),
14905    Data32(Vec<u32>),
14906    /// This variant is returned when the server sends a discriminant
14907    /// value that does not match any of the defined by the protocol.
14908    ///
14909    /// Usually, this should be considered a parsing error, but there
14910    /// are some cases where the server violates the protocol.
14911    ///
14912    /// Trying to use `serialize` or `serialize_into` with this variant
14913    /// will raise a panic.
14914    InvalidValue(u8),
14915}
14916impl_debug_if_no_extra_traits!(XIGetPropertyItems, "XIGetPropertyItems");
14917impl XIGetPropertyItems {
14918    #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
14919    fn try_parse(value: &[u8], format: u8, num_items: u32) -> Result<(Self, &[u8]), ParseError> {
14920        let switch_expr = u8::from(format);
14921        let mut outer_remaining = value;
14922        let mut parse_result = None;
14923        if switch_expr == u8::from(PropertyFormat::M8_BITS) {
14924            let remaining = outer_remaining;
14925            let value = remaining;
14926            let (data8, remaining) = crate::x11_utils::parse_u8_list(remaining, num_items.try_to_usize()?)?;
14927            let data8 = data8.to_vec();
14928            // Align offset to multiple of 4
14929            let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
14930            let misalignment = (4 - (offset % 4)) % 4;
14931            let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
14932            outer_remaining = remaining;
14933            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
14934            parse_result = Some(XIGetPropertyItems::Data8(data8));
14935        }
14936        if switch_expr == u8::from(PropertyFormat::M16_BITS) {
14937            let remaining = outer_remaining;
14938            let value = remaining;
14939            let (data16, remaining) = crate::x11_utils::parse_list::<u16>(remaining, num_items.try_to_usize()?)?;
14940            // Align offset to multiple of 4
14941            let offset = remaining.as_ptr() as usize - value.as_ptr() as usize;
14942            let misalignment = (4 - (offset % 4)) % 4;
14943            let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?;
14944            outer_remaining = remaining;
14945            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
14946            parse_result = Some(XIGetPropertyItems::Data16(data16));
14947        }
14948        if switch_expr == u8::from(PropertyFormat::M32_BITS) {
14949            let remaining = outer_remaining;
14950            let (data32, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_items.try_to_usize()?)?;
14951            outer_remaining = remaining;
14952            assert!(parse_result.is_none(), "The XML should prevent more than one 'if' from matching");
14953            parse_result = Some(XIGetPropertyItems::Data32(data32));
14954        }
14955        match parse_result {
14956            None => Ok((XIGetPropertyItems::InvalidValue(switch_expr), &[])),
14957            Some(result) => Ok((result, outer_remaining)),
14958        }
14959    }
14960}
14961impl XIGetPropertyItems {
14962    pub fn as_data8(&self) -> Option<&Vec<u8>> {
14963        match self {
14964            XIGetPropertyItems::Data8(value) => Some(value),
14965            _ => None,
14966        }
14967    }
14968    pub fn as_data16(&self) -> Option<&Vec<u16>> {
14969        match self {
14970            XIGetPropertyItems::Data16(value) => Some(value),
14971            _ => None,
14972        }
14973    }
14974    pub fn as_data32(&self) -> Option<&Vec<u32>> {
14975        match self {
14976            XIGetPropertyItems::Data32(value) => Some(value),
14977            _ => None,
14978        }
14979    }
14980}
14981impl XIGetPropertyItems {
14982    #[allow(dead_code)]
14983    fn serialize(&self, format: u8, num_items: u32) -> Vec<u8> {
14984        let mut result = Vec::new();
14985        self.serialize_into(&mut result, u8::from(format), u32::from(num_items));
14986        result
14987    }
14988    fn serialize_into(&self, bytes: &mut Vec<u8>, format: u8, num_items: u32) {
14989        assert_eq!(self.switch_expr(), u8::from(format), "switch `items` has an inconsistent discriminant");
14990        match self {
14991            XIGetPropertyItems::Data8(data8) => {
14992                assert_eq!(data8.len(), usize::try_from(num_items).unwrap(), "`data8` has an incorrect length");
14993                bytes.extend_from_slice(&data8);
14994                bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
14995            }
14996            XIGetPropertyItems::Data16(data16) => {
14997                assert_eq!(data16.len(), usize::try_from(num_items).unwrap(), "`data16` has an incorrect length");
14998                data16.serialize_into(bytes);
14999                bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]);
15000            }
15001            XIGetPropertyItems::Data32(data32) => {
15002                assert_eq!(data32.len(), usize::try_from(num_items).unwrap(), "`data32` has an incorrect length");
15003                data32.serialize_into(bytes);
15004            }
15005            XIGetPropertyItems::InvalidValue(_) => panic!("attempted to serialize invalid switch case"),
15006        }
15007    }
15008}
15009impl XIGetPropertyItems {
15010    fn switch_expr(&self) -> u8 {
15011        match self {
15012            XIGetPropertyItems::Data8(_) => u8::from(PropertyFormat::M8_BITS),
15013            XIGetPropertyItems::Data16(_) => u8::from(PropertyFormat::M16_BITS),
15014            XIGetPropertyItems::Data32(_) => u8::from(PropertyFormat::M32_BITS),
15015            XIGetPropertyItems::InvalidValue(switch_expr) => *switch_expr,
15016        }
15017    }
15018}
15019
15020#[derive(Clone)]
15021#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15022#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15023pub struct XIGetPropertyReply {
15024    pub sequence: u16,
15025    pub length: u32,
15026    pub type_: xproto::Atom,
15027    pub bytes_after: u32,
15028    pub num_items: u32,
15029    pub items: XIGetPropertyItems,
15030}
15031impl_debug_if_no_extra_traits!(XIGetPropertyReply, "XIGetPropertyReply");
15032impl TryParse for XIGetPropertyReply {
15033    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
15034        let remaining = initial_value;
15035        let (response_type, remaining) = u8::try_parse(remaining)?;
15036        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
15037        let (sequence, remaining) = u16::try_parse(remaining)?;
15038        let (length, remaining) = u32::try_parse(remaining)?;
15039        let (type_, remaining) = xproto::Atom::try_parse(remaining)?;
15040        let (bytes_after, remaining) = u32::try_parse(remaining)?;
15041        let (num_items, remaining) = u32::try_parse(remaining)?;
15042        let (format, remaining) = u8::try_parse(remaining)?;
15043        let remaining = remaining.get(11..).ok_or(ParseError::InsufficientData)?;
15044        let (items, remaining) = XIGetPropertyItems::try_parse(remaining, u8::from(format), u32::from(num_items))?;
15045        if response_type != 1 {
15046            return Err(ParseError::InvalidValue);
15047        }
15048        let result = XIGetPropertyReply { sequence, length, type_, bytes_after, num_items, items };
15049        let _ = remaining;
15050        let remaining = initial_value.get(32 + length as usize * 4..)
15051            .ok_or(ParseError::InsufficientData)?;
15052        Ok((result, remaining))
15053    }
15054}
15055impl Serialize for XIGetPropertyReply {
15056    type Bytes = Vec<u8>;
15057    fn serialize(&self) -> Vec<u8> {
15058        let mut result = Vec::new();
15059        self.serialize_into(&mut result);
15060        result
15061    }
15062    fn serialize_into(&self, bytes: &mut Vec<u8>) {
15063        bytes.reserve(32);
15064        let response_type_bytes = &[1];
15065        bytes.push(response_type_bytes[0]);
15066        bytes.extend_from_slice(&[0; 1]);
15067        self.sequence.serialize_into(bytes);
15068        self.length.serialize_into(bytes);
15069        self.type_.serialize_into(bytes);
15070        self.bytes_after.serialize_into(bytes);
15071        self.num_items.serialize_into(bytes);
15072        let format: u8 = self.items.switch_expr();
15073        format.serialize_into(bytes);
15074        bytes.extend_from_slice(&[0; 11]);
15075        self.items.serialize_into(bytes, u8::from(format), u32::from(self.num_items));
15076    }
15077}
15078
15079/// Opcode for the XIGetSelectedEvents request
15080pub const XI_GET_SELECTED_EVENTS_REQUEST: u8 = 60;
15081#[derive(Clone, Copy, Default)]
15082#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15083#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15084pub struct XIGetSelectedEventsRequest {
15085    pub window: xproto::Window,
15086}
15087impl_debug_if_no_extra_traits!(XIGetSelectedEventsRequest, "XIGetSelectedEventsRequest");
15088impl XIGetSelectedEventsRequest {
15089    /// Serialize this request into bytes for the provided connection
15090    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
15091        let length_so_far = 0;
15092        let window_bytes = self.window.serialize();
15093        let mut request0 = vec![
15094            major_opcode,
15095            XI_GET_SELECTED_EVENTS_REQUEST,
15096            0,
15097            0,
15098            window_bytes[0],
15099            window_bytes[1],
15100            window_bytes[2],
15101            window_bytes[3],
15102        ];
15103        let length_so_far = length_so_far + request0.len();
15104        assert_eq!(length_so_far % 4, 0);
15105        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
15106        request0[2..4].copy_from_slice(&length.to_ne_bytes());
15107        ([request0.into()], vec![])
15108    }
15109    /// Parse this request given its header, its body, and any fds that go along with it
15110    #[cfg(feature = "request-parsing")]
15111    pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
15112        if header.minor_opcode != XI_GET_SELECTED_EVENTS_REQUEST {
15113            return Err(ParseError::InvalidValue);
15114        }
15115        let (window, remaining) = xproto::Window::try_parse(value)?;
15116        let _ = remaining;
15117        Ok(XIGetSelectedEventsRequest {
15118            window,
15119        })
15120    }
15121}
15122impl Request for XIGetSelectedEventsRequest {
15123    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
15124
15125    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
15126        let (bufs, fds) = self.serialize(major_opcode);
15127        // Flatten the buffers into a single vector
15128        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
15129        (buf, fds)
15130    }
15131}
15132impl crate::x11_utils::ReplyRequest for XIGetSelectedEventsRequest {
15133    type Reply = XIGetSelectedEventsReply;
15134}
15135
15136#[derive(Clone, Default)]
15137#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15138#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15139pub struct XIGetSelectedEventsReply {
15140    pub sequence: u16,
15141    pub length: u32,
15142    pub masks: Vec<EventMask>,
15143}
15144impl_debug_if_no_extra_traits!(XIGetSelectedEventsReply, "XIGetSelectedEventsReply");
15145impl TryParse for XIGetSelectedEventsReply {
15146    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
15147        let remaining = initial_value;
15148        let (response_type, remaining) = u8::try_parse(remaining)?;
15149        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
15150        let (sequence, remaining) = u16::try_parse(remaining)?;
15151        let (length, remaining) = u32::try_parse(remaining)?;
15152        let (num_masks, remaining) = u16::try_parse(remaining)?;
15153        let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
15154        let (masks, remaining) = crate::x11_utils::parse_list::<EventMask>(remaining, num_masks.try_to_usize()?)?;
15155        if response_type != 1 {
15156            return Err(ParseError::InvalidValue);
15157        }
15158        let result = XIGetSelectedEventsReply { sequence, length, masks };
15159        let _ = remaining;
15160        let remaining = initial_value.get(32 + length as usize * 4..)
15161            .ok_or(ParseError::InsufficientData)?;
15162        Ok((result, remaining))
15163    }
15164}
15165impl Serialize for XIGetSelectedEventsReply {
15166    type Bytes = Vec<u8>;
15167    fn serialize(&self) -> Vec<u8> {
15168        let mut result = Vec::new();
15169        self.serialize_into(&mut result);
15170        result
15171    }
15172    fn serialize_into(&self, bytes: &mut Vec<u8>) {
15173        bytes.reserve(32);
15174        let response_type_bytes = &[1];
15175        bytes.push(response_type_bytes[0]);
15176        bytes.extend_from_slice(&[0; 1]);
15177        self.sequence.serialize_into(bytes);
15178        self.length.serialize_into(bytes);
15179        let num_masks = u16::try_from(self.masks.len()).expect("`masks` has too many elements");
15180        num_masks.serialize_into(bytes);
15181        bytes.extend_from_slice(&[0; 22]);
15182        self.masks.serialize_into(bytes);
15183    }
15184}
15185impl XIGetSelectedEventsReply {
15186    /// Get the value of the `num_masks` field.
15187    ///
15188    /// The `num_masks` field is used as the length field of the `masks` field.
15189    /// This function computes the field's value again based on the length of the list.
15190    ///
15191    /// # Panics
15192    ///
15193    /// Panics if the value cannot be represented in the target type. This
15194    /// cannot happen with values of the struct received from the X11 server.
15195    pub fn num_masks(&self) -> u16 {
15196        self.masks.len()
15197            .try_into().unwrap()
15198    }
15199}
15200
15201#[derive(Clone, Copy, Default)]
15202#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15203#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15204pub struct BarrierReleasePointerInfo {
15205    pub deviceid: DeviceId,
15206    pub barrier: xfixes::Barrier,
15207    pub eventid: u32,
15208}
15209impl_debug_if_no_extra_traits!(BarrierReleasePointerInfo, "BarrierReleasePointerInfo");
15210impl TryParse for BarrierReleasePointerInfo {
15211    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
15212        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
15213        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
15214        let (barrier, remaining) = xfixes::Barrier::try_parse(remaining)?;
15215        let (eventid, remaining) = u32::try_parse(remaining)?;
15216        let result = BarrierReleasePointerInfo { deviceid, barrier, eventid };
15217        Ok((result, remaining))
15218    }
15219}
15220impl Serialize for BarrierReleasePointerInfo {
15221    type Bytes = [u8; 12];
15222    fn serialize(&self) -> [u8; 12] {
15223        let deviceid_bytes = self.deviceid.serialize();
15224        let barrier_bytes = self.barrier.serialize();
15225        let eventid_bytes = self.eventid.serialize();
15226        [
15227            deviceid_bytes[0],
15228            deviceid_bytes[1],
15229            0,
15230            0,
15231            barrier_bytes[0],
15232            barrier_bytes[1],
15233            barrier_bytes[2],
15234            barrier_bytes[3],
15235            eventid_bytes[0],
15236            eventid_bytes[1],
15237            eventid_bytes[2],
15238            eventid_bytes[3],
15239        ]
15240    }
15241    fn serialize_into(&self, bytes: &mut Vec<u8>) {
15242        bytes.reserve(12);
15243        self.deviceid.serialize_into(bytes);
15244        bytes.extend_from_slice(&[0; 2]);
15245        self.barrier.serialize_into(bytes);
15246        self.eventid.serialize_into(bytes);
15247    }
15248}
15249
15250/// Opcode for the XIBarrierReleasePointer request
15251pub const XI_BARRIER_RELEASE_POINTER_REQUEST: u8 = 61;
15252#[derive(Clone, Default)]
15253#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15254#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15255pub struct XIBarrierReleasePointerRequest<'input> {
15256    pub barriers: Cow<'input, [BarrierReleasePointerInfo]>,
15257}
15258impl_debug_if_no_extra_traits!(XIBarrierReleasePointerRequest<'_>, "XIBarrierReleasePointerRequest");
15259impl<'input> XIBarrierReleasePointerRequest<'input> {
15260    /// Serialize this request into bytes for the provided connection
15261    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
15262        let length_so_far = 0;
15263        let num_barriers = u32::try_from(self.barriers.len()).expect("`barriers` has too many elements");
15264        let num_barriers_bytes = num_barriers.serialize();
15265        let mut request0 = vec![
15266            major_opcode,
15267            XI_BARRIER_RELEASE_POINTER_REQUEST,
15268            0,
15269            0,
15270            num_barriers_bytes[0],
15271            num_barriers_bytes[1],
15272            num_barriers_bytes[2],
15273            num_barriers_bytes[3],
15274        ];
15275        let length_so_far = length_so_far + request0.len();
15276        let barriers_bytes = self.barriers.serialize();
15277        let length_so_far = length_so_far + barriers_bytes.len();
15278        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
15279        let length_so_far = length_so_far + padding0.len();
15280        assert_eq!(length_so_far % 4, 0);
15281        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
15282        request0[2..4].copy_from_slice(&length.to_ne_bytes());
15283        ([request0.into(), barriers_bytes.into(), padding0.into()], vec![])
15284    }
15285    /// Parse this request given its header, its body, and any fds that go along with it
15286    #[cfg(feature = "request-parsing")]
15287    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
15288        if header.minor_opcode != XI_BARRIER_RELEASE_POINTER_REQUEST {
15289            return Err(ParseError::InvalidValue);
15290        }
15291        let (num_barriers, remaining) = u32::try_parse(value)?;
15292        let (barriers, remaining) = crate::x11_utils::parse_list::<BarrierReleasePointerInfo>(remaining, num_barriers.try_to_usize()?)?;
15293        let _ = remaining;
15294        Ok(XIBarrierReleasePointerRequest {
15295            barriers: Cow::Owned(barriers),
15296        })
15297    }
15298    /// Clone all borrowed data in this XIBarrierReleasePointerRequest.
15299    pub fn into_owned(self) -> XIBarrierReleasePointerRequest<'static> {
15300        XIBarrierReleasePointerRequest {
15301            barriers: Cow::Owned(self.barriers.into_owned()),
15302        }
15303    }
15304}
15305impl<'input> Request for XIBarrierReleasePointerRequest<'input> {
15306    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
15307
15308    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
15309        let (bufs, fds) = self.serialize(major_opcode);
15310        // Flatten the buffers into a single vector
15311        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
15312        (buf, fds)
15313    }
15314}
15315impl<'input> crate::x11_utils::VoidRequest for XIBarrierReleasePointerRequest<'input> {
15316}
15317
15318/// Opcode for the DeviceValuator event
15319pub const DEVICE_VALUATOR_EVENT: u8 = 0;
15320#[derive(Clone, Copy, Default)]
15321#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15322#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15323pub struct DeviceValuatorEvent {
15324    pub response_type: u8,
15325    pub device_id: u8,
15326    pub sequence: u16,
15327    pub device_state: u16,
15328    pub num_valuators: u8,
15329    pub first_valuator: u8,
15330    pub valuators: [i32; 6],
15331}
15332impl_debug_if_no_extra_traits!(DeviceValuatorEvent, "DeviceValuatorEvent");
15333impl TryParse for DeviceValuatorEvent {
15334    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
15335        let remaining = initial_value;
15336        let (response_type, remaining) = u8::try_parse(remaining)?;
15337        let (device_id, remaining) = u8::try_parse(remaining)?;
15338        let (sequence, remaining) = u16::try_parse(remaining)?;
15339        let (device_state, remaining) = u16::try_parse(remaining)?;
15340        let (num_valuators, remaining) = u8::try_parse(remaining)?;
15341        let (first_valuator, remaining) = u8::try_parse(remaining)?;
15342        let (valuators_0, remaining) = i32::try_parse(remaining)?;
15343        let (valuators_1, remaining) = i32::try_parse(remaining)?;
15344        let (valuators_2, remaining) = i32::try_parse(remaining)?;
15345        let (valuators_3, remaining) = i32::try_parse(remaining)?;
15346        let (valuators_4, remaining) = i32::try_parse(remaining)?;
15347        let (valuators_5, remaining) = i32::try_parse(remaining)?;
15348        let valuators = [
15349            valuators_0,
15350            valuators_1,
15351            valuators_2,
15352            valuators_3,
15353            valuators_4,
15354            valuators_5,
15355        ];
15356        let result = DeviceValuatorEvent { response_type, device_id, sequence, device_state, num_valuators, first_valuator, valuators };
15357        let _ = remaining;
15358        let remaining = initial_value.get(32..)
15359            .ok_or(ParseError::InsufficientData)?;
15360        Ok((result, remaining))
15361    }
15362}
15363impl Serialize for DeviceValuatorEvent {
15364    type Bytes = [u8; 32];
15365    fn serialize(&self) -> [u8; 32] {
15366        let response_type_bytes = self.response_type.serialize();
15367        let device_id_bytes = self.device_id.serialize();
15368        let sequence_bytes = self.sequence.serialize();
15369        let device_state_bytes = self.device_state.serialize();
15370        let num_valuators_bytes = self.num_valuators.serialize();
15371        let first_valuator_bytes = self.first_valuator.serialize();
15372        let valuators_0_bytes = self.valuators[0].serialize();
15373        let valuators_1_bytes = self.valuators[1].serialize();
15374        let valuators_2_bytes = self.valuators[2].serialize();
15375        let valuators_3_bytes = self.valuators[3].serialize();
15376        let valuators_4_bytes = self.valuators[4].serialize();
15377        let valuators_5_bytes = self.valuators[5].serialize();
15378        [
15379            response_type_bytes[0],
15380            device_id_bytes[0],
15381            sequence_bytes[0],
15382            sequence_bytes[1],
15383            device_state_bytes[0],
15384            device_state_bytes[1],
15385            num_valuators_bytes[0],
15386            first_valuator_bytes[0],
15387            valuators_0_bytes[0],
15388            valuators_0_bytes[1],
15389            valuators_0_bytes[2],
15390            valuators_0_bytes[3],
15391            valuators_1_bytes[0],
15392            valuators_1_bytes[1],
15393            valuators_1_bytes[2],
15394            valuators_1_bytes[3],
15395            valuators_2_bytes[0],
15396            valuators_2_bytes[1],
15397            valuators_2_bytes[2],
15398            valuators_2_bytes[3],
15399            valuators_3_bytes[0],
15400            valuators_3_bytes[1],
15401            valuators_3_bytes[2],
15402            valuators_3_bytes[3],
15403            valuators_4_bytes[0],
15404            valuators_4_bytes[1],
15405            valuators_4_bytes[2],
15406            valuators_4_bytes[3],
15407            valuators_5_bytes[0],
15408            valuators_5_bytes[1],
15409            valuators_5_bytes[2],
15410            valuators_5_bytes[3],
15411        ]
15412    }
15413    fn serialize_into(&self, bytes: &mut Vec<u8>) {
15414        bytes.reserve(32);
15415        self.response_type.serialize_into(bytes);
15416        self.device_id.serialize_into(bytes);
15417        self.sequence.serialize_into(bytes);
15418        self.device_state.serialize_into(bytes);
15419        self.num_valuators.serialize_into(bytes);
15420        self.first_valuator.serialize_into(bytes);
15421        self.valuators.serialize_into(bytes);
15422    }
15423}
15424impl From<&DeviceValuatorEvent> for [u8; 32] {
15425    fn from(input: &DeviceValuatorEvent) -> Self {
15426        let response_type_bytes = input.response_type.serialize();
15427        let device_id_bytes = input.device_id.serialize();
15428        let sequence_bytes = input.sequence.serialize();
15429        let device_state_bytes = input.device_state.serialize();
15430        let num_valuators_bytes = input.num_valuators.serialize();
15431        let first_valuator_bytes = input.first_valuator.serialize();
15432        let valuators_0_bytes = input.valuators[0].serialize();
15433        let valuators_1_bytes = input.valuators[1].serialize();
15434        let valuators_2_bytes = input.valuators[2].serialize();
15435        let valuators_3_bytes = input.valuators[3].serialize();
15436        let valuators_4_bytes = input.valuators[4].serialize();
15437        let valuators_5_bytes = input.valuators[5].serialize();
15438        [
15439            response_type_bytes[0],
15440            device_id_bytes[0],
15441            sequence_bytes[0],
15442            sequence_bytes[1],
15443            device_state_bytes[0],
15444            device_state_bytes[1],
15445            num_valuators_bytes[0],
15446            first_valuator_bytes[0],
15447            valuators_0_bytes[0],
15448            valuators_0_bytes[1],
15449            valuators_0_bytes[2],
15450            valuators_0_bytes[3],
15451            valuators_1_bytes[0],
15452            valuators_1_bytes[1],
15453            valuators_1_bytes[2],
15454            valuators_1_bytes[3],
15455            valuators_2_bytes[0],
15456            valuators_2_bytes[1],
15457            valuators_2_bytes[2],
15458            valuators_2_bytes[3],
15459            valuators_3_bytes[0],
15460            valuators_3_bytes[1],
15461            valuators_3_bytes[2],
15462            valuators_3_bytes[3],
15463            valuators_4_bytes[0],
15464            valuators_4_bytes[1],
15465            valuators_4_bytes[2],
15466            valuators_4_bytes[3],
15467            valuators_5_bytes[0],
15468            valuators_5_bytes[1],
15469            valuators_5_bytes[2],
15470            valuators_5_bytes[3],
15471        ]
15472    }
15473}
15474impl From<DeviceValuatorEvent> for [u8; 32] {
15475    fn from(input: DeviceValuatorEvent) -> Self {
15476        Self::from(&input)
15477    }
15478}
15479
15480#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
15481#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15482pub struct MoreEventsMask(u8);
15483impl MoreEventsMask {
15484    pub const MORE_EVENTS: Self = Self(1 << 7);
15485}
15486impl From<MoreEventsMask> for u8 {
15487    #[inline]
15488    fn from(input: MoreEventsMask) -> Self {
15489        input.0
15490    }
15491}
15492impl From<MoreEventsMask> for Option<u8> {
15493    #[inline]
15494    fn from(input: MoreEventsMask) -> Self {
15495        Some(input.0)
15496    }
15497}
15498impl From<MoreEventsMask> for u16 {
15499    #[inline]
15500    fn from(input: MoreEventsMask) -> Self {
15501        u16::from(input.0)
15502    }
15503}
15504impl From<MoreEventsMask> for Option<u16> {
15505    #[inline]
15506    fn from(input: MoreEventsMask) -> Self {
15507        Some(u16::from(input.0))
15508    }
15509}
15510impl From<MoreEventsMask> for u32 {
15511    #[inline]
15512    fn from(input: MoreEventsMask) -> Self {
15513        u32::from(input.0)
15514    }
15515}
15516impl From<MoreEventsMask> for Option<u32> {
15517    #[inline]
15518    fn from(input: MoreEventsMask) -> Self {
15519        Some(u32::from(input.0))
15520    }
15521}
15522impl From<u8> for MoreEventsMask {
15523    #[inline]
15524    fn from(value: u8) -> Self {
15525        Self(value)
15526    }
15527}
15528impl core::fmt::Debug for MoreEventsMask  {
15529    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
15530        let variants = [
15531            (Self::MORE_EVENTS.0.into(), "MORE_EVENTS", "MoreEvents"),
15532        ];
15533        pretty_print_bitmask(fmt, self.0.into(), &variants)
15534    }
15535}
15536bitmask_binop!(MoreEventsMask, u8);
15537
15538/// Opcode for the DeviceKeyPress event
15539pub const DEVICE_KEY_PRESS_EVENT: u8 = 1;
15540#[derive(Clone, Copy, Default)]
15541#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15542#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15543pub struct DeviceKeyPressEvent {
15544    pub response_type: u8,
15545    pub detail: u8,
15546    pub sequence: u16,
15547    pub time: xproto::Timestamp,
15548    pub root: xproto::Window,
15549    pub event: xproto::Window,
15550    pub child: xproto::Window,
15551    pub root_x: i16,
15552    pub root_y: i16,
15553    pub event_x: i16,
15554    pub event_y: i16,
15555    pub state: xproto::KeyButMask,
15556    pub same_screen: bool,
15557    pub device_id: u8,
15558}
15559impl_debug_if_no_extra_traits!(DeviceKeyPressEvent, "DeviceKeyPressEvent");
15560impl TryParse for DeviceKeyPressEvent {
15561    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
15562        let remaining = initial_value;
15563        let (response_type, remaining) = u8::try_parse(remaining)?;
15564        let (detail, remaining) = u8::try_parse(remaining)?;
15565        let (sequence, remaining) = u16::try_parse(remaining)?;
15566        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
15567        let (root, remaining) = xproto::Window::try_parse(remaining)?;
15568        let (event, remaining) = xproto::Window::try_parse(remaining)?;
15569        let (child, remaining) = xproto::Window::try_parse(remaining)?;
15570        let (root_x, remaining) = i16::try_parse(remaining)?;
15571        let (root_y, remaining) = i16::try_parse(remaining)?;
15572        let (event_x, remaining) = i16::try_parse(remaining)?;
15573        let (event_y, remaining) = i16::try_parse(remaining)?;
15574        let (state, remaining) = u16::try_parse(remaining)?;
15575        let (same_screen, remaining) = bool::try_parse(remaining)?;
15576        let (device_id, remaining) = u8::try_parse(remaining)?;
15577        let state = state.into();
15578        let result = DeviceKeyPressEvent { response_type, detail, sequence, time, root, event, child, root_x, root_y, event_x, event_y, state, same_screen, device_id };
15579        let _ = remaining;
15580        let remaining = initial_value.get(32..)
15581            .ok_or(ParseError::InsufficientData)?;
15582        Ok((result, remaining))
15583    }
15584}
15585impl Serialize for DeviceKeyPressEvent {
15586    type Bytes = [u8; 32];
15587    fn serialize(&self) -> [u8; 32] {
15588        let response_type_bytes = self.response_type.serialize();
15589        let detail_bytes = self.detail.serialize();
15590        let sequence_bytes = self.sequence.serialize();
15591        let time_bytes = self.time.serialize();
15592        let root_bytes = self.root.serialize();
15593        let event_bytes = self.event.serialize();
15594        let child_bytes = self.child.serialize();
15595        let root_x_bytes = self.root_x.serialize();
15596        let root_y_bytes = self.root_y.serialize();
15597        let event_x_bytes = self.event_x.serialize();
15598        let event_y_bytes = self.event_y.serialize();
15599        let state_bytes = u16::from(self.state).serialize();
15600        let same_screen_bytes = self.same_screen.serialize();
15601        let device_id_bytes = self.device_id.serialize();
15602        [
15603            response_type_bytes[0],
15604            detail_bytes[0],
15605            sequence_bytes[0],
15606            sequence_bytes[1],
15607            time_bytes[0],
15608            time_bytes[1],
15609            time_bytes[2],
15610            time_bytes[3],
15611            root_bytes[0],
15612            root_bytes[1],
15613            root_bytes[2],
15614            root_bytes[3],
15615            event_bytes[0],
15616            event_bytes[1],
15617            event_bytes[2],
15618            event_bytes[3],
15619            child_bytes[0],
15620            child_bytes[1],
15621            child_bytes[2],
15622            child_bytes[3],
15623            root_x_bytes[0],
15624            root_x_bytes[1],
15625            root_y_bytes[0],
15626            root_y_bytes[1],
15627            event_x_bytes[0],
15628            event_x_bytes[1],
15629            event_y_bytes[0],
15630            event_y_bytes[1],
15631            state_bytes[0],
15632            state_bytes[1],
15633            same_screen_bytes[0],
15634            device_id_bytes[0],
15635        ]
15636    }
15637    fn serialize_into(&self, bytes: &mut Vec<u8>) {
15638        bytes.reserve(32);
15639        self.response_type.serialize_into(bytes);
15640        self.detail.serialize_into(bytes);
15641        self.sequence.serialize_into(bytes);
15642        self.time.serialize_into(bytes);
15643        self.root.serialize_into(bytes);
15644        self.event.serialize_into(bytes);
15645        self.child.serialize_into(bytes);
15646        self.root_x.serialize_into(bytes);
15647        self.root_y.serialize_into(bytes);
15648        self.event_x.serialize_into(bytes);
15649        self.event_y.serialize_into(bytes);
15650        u16::from(self.state).serialize_into(bytes);
15651        self.same_screen.serialize_into(bytes);
15652        self.device_id.serialize_into(bytes);
15653    }
15654}
15655impl From<&DeviceKeyPressEvent> for [u8; 32] {
15656    fn from(input: &DeviceKeyPressEvent) -> Self {
15657        let response_type_bytes = input.response_type.serialize();
15658        let detail_bytes = input.detail.serialize();
15659        let sequence_bytes = input.sequence.serialize();
15660        let time_bytes = input.time.serialize();
15661        let root_bytes = input.root.serialize();
15662        let event_bytes = input.event.serialize();
15663        let child_bytes = input.child.serialize();
15664        let root_x_bytes = input.root_x.serialize();
15665        let root_y_bytes = input.root_y.serialize();
15666        let event_x_bytes = input.event_x.serialize();
15667        let event_y_bytes = input.event_y.serialize();
15668        let state_bytes = u16::from(input.state).serialize();
15669        let same_screen_bytes = input.same_screen.serialize();
15670        let device_id_bytes = input.device_id.serialize();
15671        [
15672            response_type_bytes[0],
15673            detail_bytes[0],
15674            sequence_bytes[0],
15675            sequence_bytes[1],
15676            time_bytes[0],
15677            time_bytes[1],
15678            time_bytes[2],
15679            time_bytes[3],
15680            root_bytes[0],
15681            root_bytes[1],
15682            root_bytes[2],
15683            root_bytes[3],
15684            event_bytes[0],
15685            event_bytes[1],
15686            event_bytes[2],
15687            event_bytes[3],
15688            child_bytes[0],
15689            child_bytes[1],
15690            child_bytes[2],
15691            child_bytes[3],
15692            root_x_bytes[0],
15693            root_x_bytes[1],
15694            root_y_bytes[0],
15695            root_y_bytes[1],
15696            event_x_bytes[0],
15697            event_x_bytes[1],
15698            event_y_bytes[0],
15699            event_y_bytes[1],
15700            state_bytes[0],
15701            state_bytes[1],
15702            same_screen_bytes[0],
15703            device_id_bytes[0],
15704        ]
15705    }
15706}
15707impl From<DeviceKeyPressEvent> for [u8; 32] {
15708    fn from(input: DeviceKeyPressEvent) -> Self {
15709        Self::from(&input)
15710    }
15711}
15712
15713/// Opcode for the DeviceKeyRelease event
15714pub const DEVICE_KEY_RELEASE_EVENT: u8 = 2;
15715pub type DeviceKeyReleaseEvent = DeviceKeyPressEvent;
15716
15717/// Opcode for the DeviceButtonPress event
15718pub const DEVICE_BUTTON_PRESS_EVENT: u8 = 3;
15719pub type DeviceButtonPressEvent = DeviceKeyPressEvent;
15720
15721/// Opcode for the DeviceButtonRelease event
15722pub const DEVICE_BUTTON_RELEASE_EVENT: u8 = 4;
15723pub type DeviceButtonReleaseEvent = DeviceKeyPressEvent;
15724
15725/// Opcode for the DeviceMotionNotify event
15726pub const DEVICE_MOTION_NOTIFY_EVENT: u8 = 5;
15727pub type DeviceMotionNotifyEvent = DeviceKeyPressEvent;
15728
15729/// Opcode for the DeviceFocusIn event
15730pub const DEVICE_FOCUS_IN_EVENT: u8 = 6;
15731#[derive(Clone, Copy, Default)]
15732#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15733#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15734pub struct DeviceFocusInEvent {
15735    pub response_type: u8,
15736    pub detail: xproto::NotifyDetail,
15737    pub sequence: u16,
15738    pub time: xproto::Timestamp,
15739    pub window: xproto::Window,
15740    pub mode: xproto::NotifyMode,
15741    pub device_id: u8,
15742}
15743impl_debug_if_no_extra_traits!(DeviceFocusInEvent, "DeviceFocusInEvent");
15744impl TryParse for DeviceFocusInEvent {
15745    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
15746        let remaining = initial_value;
15747        let (response_type, remaining) = u8::try_parse(remaining)?;
15748        let (detail, remaining) = u8::try_parse(remaining)?;
15749        let (sequence, remaining) = u16::try_parse(remaining)?;
15750        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
15751        let (window, remaining) = xproto::Window::try_parse(remaining)?;
15752        let (mode, remaining) = u8::try_parse(remaining)?;
15753        let (device_id, remaining) = u8::try_parse(remaining)?;
15754        let remaining = remaining.get(18..).ok_or(ParseError::InsufficientData)?;
15755        let detail = detail.into();
15756        let mode = mode.into();
15757        let result = DeviceFocusInEvent { response_type, detail, sequence, time, window, mode, device_id };
15758        let _ = remaining;
15759        let remaining = initial_value.get(32..)
15760            .ok_or(ParseError::InsufficientData)?;
15761        Ok((result, remaining))
15762    }
15763}
15764impl Serialize for DeviceFocusInEvent {
15765    type Bytes = [u8; 32];
15766    fn serialize(&self) -> [u8; 32] {
15767        let response_type_bytes = self.response_type.serialize();
15768        let detail_bytes = u8::from(self.detail).serialize();
15769        let sequence_bytes = self.sequence.serialize();
15770        let time_bytes = self.time.serialize();
15771        let window_bytes = self.window.serialize();
15772        let mode_bytes = u8::from(self.mode).serialize();
15773        let device_id_bytes = self.device_id.serialize();
15774        [
15775            response_type_bytes[0],
15776            detail_bytes[0],
15777            sequence_bytes[0],
15778            sequence_bytes[1],
15779            time_bytes[0],
15780            time_bytes[1],
15781            time_bytes[2],
15782            time_bytes[3],
15783            window_bytes[0],
15784            window_bytes[1],
15785            window_bytes[2],
15786            window_bytes[3],
15787            mode_bytes[0],
15788            device_id_bytes[0],
15789            0,
15790            0,
15791            0,
15792            0,
15793            0,
15794            0,
15795            0,
15796            0,
15797            0,
15798            0,
15799            0,
15800            0,
15801            0,
15802            0,
15803            0,
15804            0,
15805            0,
15806            0,
15807        ]
15808    }
15809    fn serialize_into(&self, bytes: &mut Vec<u8>) {
15810        bytes.reserve(32);
15811        self.response_type.serialize_into(bytes);
15812        u8::from(self.detail).serialize_into(bytes);
15813        self.sequence.serialize_into(bytes);
15814        self.time.serialize_into(bytes);
15815        self.window.serialize_into(bytes);
15816        u8::from(self.mode).serialize_into(bytes);
15817        self.device_id.serialize_into(bytes);
15818        bytes.extend_from_slice(&[0; 18]);
15819    }
15820}
15821impl From<&DeviceFocusInEvent> for [u8; 32] {
15822    fn from(input: &DeviceFocusInEvent) -> Self {
15823        let response_type_bytes = input.response_type.serialize();
15824        let detail_bytes = u8::from(input.detail).serialize();
15825        let sequence_bytes = input.sequence.serialize();
15826        let time_bytes = input.time.serialize();
15827        let window_bytes = input.window.serialize();
15828        let mode_bytes = u8::from(input.mode).serialize();
15829        let device_id_bytes = input.device_id.serialize();
15830        [
15831            response_type_bytes[0],
15832            detail_bytes[0],
15833            sequence_bytes[0],
15834            sequence_bytes[1],
15835            time_bytes[0],
15836            time_bytes[1],
15837            time_bytes[2],
15838            time_bytes[3],
15839            window_bytes[0],
15840            window_bytes[1],
15841            window_bytes[2],
15842            window_bytes[3],
15843            mode_bytes[0],
15844            device_id_bytes[0],
15845            0,
15846            0,
15847            0,
15848            0,
15849            0,
15850            0,
15851            0,
15852            0,
15853            0,
15854            0,
15855            0,
15856            0,
15857            0,
15858            0,
15859            0,
15860            0,
15861            0,
15862            0,
15863        ]
15864    }
15865}
15866impl From<DeviceFocusInEvent> for [u8; 32] {
15867    fn from(input: DeviceFocusInEvent) -> Self {
15868        Self::from(&input)
15869    }
15870}
15871
15872/// Opcode for the DeviceFocusOut event
15873pub const DEVICE_FOCUS_OUT_EVENT: u8 = 7;
15874pub type DeviceFocusOutEvent = DeviceFocusInEvent;
15875
15876/// Opcode for the ProximityIn event
15877pub const PROXIMITY_IN_EVENT: u8 = 8;
15878pub type ProximityInEvent = DeviceKeyPressEvent;
15879
15880/// Opcode for the ProximityOut event
15881pub const PROXIMITY_OUT_EVENT: u8 = 9;
15882pub type ProximityOutEvent = DeviceKeyPressEvent;
15883
15884#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
15885#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15886pub struct ClassesReportedMask(u8);
15887impl ClassesReportedMask {
15888    pub const OUT_OF_PROXIMITY: Self = Self(1 << 7);
15889    pub const DEVICE_MODE_ABSOLUTE: Self = Self(1 << 6);
15890    pub const REPORTING_VALUATORS: Self = Self(1 << 2);
15891    pub const REPORTING_BUTTONS: Self = Self(1 << 1);
15892    pub const REPORTING_KEYS: Self = Self(1 << 0);
15893}
15894impl From<ClassesReportedMask> for u8 {
15895    #[inline]
15896    fn from(input: ClassesReportedMask) -> Self {
15897        input.0
15898    }
15899}
15900impl From<ClassesReportedMask> for Option<u8> {
15901    #[inline]
15902    fn from(input: ClassesReportedMask) -> Self {
15903        Some(input.0)
15904    }
15905}
15906impl From<ClassesReportedMask> for u16 {
15907    #[inline]
15908    fn from(input: ClassesReportedMask) -> Self {
15909        u16::from(input.0)
15910    }
15911}
15912impl From<ClassesReportedMask> for Option<u16> {
15913    #[inline]
15914    fn from(input: ClassesReportedMask) -> Self {
15915        Some(u16::from(input.0))
15916    }
15917}
15918impl From<ClassesReportedMask> for u32 {
15919    #[inline]
15920    fn from(input: ClassesReportedMask) -> Self {
15921        u32::from(input.0)
15922    }
15923}
15924impl From<ClassesReportedMask> for Option<u32> {
15925    #[inline]
15926    fn from(input: ClassesReportedMask) -> Self {
15927        Some(u32::from(input.0))
15928    }
15929}
15930impl From<u8> for ClassesReportedMask {
15931    #[inline]
15932    fn from(value: u8) -> Self {
15933        Self(value)
15934    }
15935}
15936impl core::fmt::Debug for ClassesReportedMask  {
15937    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
15938        let variants = [
15939            (Self::OUT_OF_PROXIMITY.0.into(), "OUT_OF_PROXIMITY", "OutOfProximity"),
15940            (Self::DEVICE_MODE_ABSOLUTE.0.into(), "DEVICE_MODE_ABSOLUTE", "DeviceModeAbsolute"),
15941            (Self::REPORTING_VALUATORS.0.into(), "REPORTING_VALUATORS", "ReportingValuators"),
15942            (Self::REPORTING_BUTTONS.0.into(), "REPORTING_BUTTONS", "ReportingButtons"),
15943            (Self::REPORTING_KEYS.0.into(), "REPORTING_KEYS", "ReportingKeys"),
15944        ];
15945        pretty_print_bitmask(fmt, self.0.into(), &variants)
15946    }
15947}
15948bitmask_binop!(ClassesReportedMask, u8);
15949
15950/// Opcode for the DeviceStateNotify event
15951pub const DEVICE_STATE_NOTIFY_EVENT: u8 = 10;
15952#[derive(Clone, Copy, Default)]
15953#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
15954#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15955pub struct DeviceStateNotifyEvent {
15956    pub response_type: u8,
15957    pub device_id: u8,
15958    pub sequence: u16,
15959    pub time: xproto::Timestamp,
15960    pub num_keys: u8,
15961    pub num_buttons: u8,
15962    pub num_valuators: u8,
15963    pub classes_reported: ClassesReportedMask,
15964    pub buttons: [u8; 4],
15965    pub keys: [u8; 4],
15966    pub valuators: [u32; 3],
15967}
15968impl_debug_if_no_extra_traits!(DeviceStateNotifyEvent, "DeviceStateNotifyEvent");
15969impl TryParse for DeviceStateNotifyEvent {
15970    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
15971        let remaining = initial_value;
15972        let (response_type, remaining) = u8::try_parse(remaining)?;
15973        let (device_id, remaining) = u8::try_parse(remaining)?;
15974        let (sequence, remaining) = u16::try_parse(remaining)?;
15975        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
15976        let (num_keys, remaining) = u8::try_parse(remaining)?;
15977        let (num_buttons, remaining) = u8::try_parse(remaining)?;
15978        let (num_valuators, remaining) = u8::try_parse(remaining)?;
15979        let (classes_reported, remaining) = u8::try_parse(remaining)?;
15980        let (buttons, remaining) = crate::x11_utils::parse_u8_array::<4>(remaining)?;
15981        let (keys, remaining) = crate::x11_utils::parse_u8_array::<4>(remaining)?;
15982        let (valuators_0, remaining) = u32::try_parse(remaining)?;
15983        let (valuators_1, remaining) = u32::try_parse(remaining)?;
15984        let (valuators_2, remaining) = u32::try_parse(remaining)?;
15985        let valuators = [
15986            valuators_0,
15987            valuators_1,
15988            valuators_2,
15989        ];
15990        let classes_reported = classes_reported.into();
15991        let result = DeviceStateNotifyEvent { response_type, device_id, sequence, time, num_keys, num_buttons, num_valuators, classes_reported, buttons, keys, valuators };
15992        let _ = remaining;
15993        let remaining = initial_value.get(32..)
15994            .ok_or(ParseError::InsufficientData)?;
15995        Ok((result, remaining))
15996    }
15997}
15998impl Serialize for DeviceStateNotifyEvent {
15999    type Bytes = [u8; 32];
16000    fn serialize(&self) -> [u8; 32] {
16001        let response_type_bytes = self.response_type.serialize();
16002        let device_id_bytes = self.device_id.serialize();
16003        let sequence_bytes = self.sequence.serialize();
16004        let time_bytes = self.time.serialize();
16005        let num_keys_bytes = self.num_keys.serialize();
16006        let num_buttons_bytes = self.num_buttons.serialize();
16007        let num_valuators_bytes = self.num_valuators.serialize();
16008        let classes_reported_bytes = u8::from(self.classes_reported).serialize();
16009        let valuators_0_bytes = self.valuators[0].serialize();
16010        let valuators_1_bytes = self.valuators[1].serialize();
16011        let valuators_2_bytes = self.valuators[2].serialize();
16012        [
16013            response_type_bytes[0],
16014            device_id_bytes[0],
16015            sequence_bytes[0],
16016            sequence_bytes[1],
16017            time_bytes[0],
16018            time_bytes[1],
16019            time_bytes[2],
16020            time_bytes[3],
16021            num_keys_bytes[0],
16022            num_buttons_bytes[0],
16023            num_valuators_bytes[0],
16024            classes_reported_bytes[0],
16025            self.buttons[0],
16026            self.buttons[1],
16027            self.buttons[2],
16028            self.buttons[3],
16029            self.keys[0],
16030            self.keys[1],
16031            self.keys[2],
16032            self.keys[3],
16033            valuators_0_bytes[0],
16034            valuators_0_bytes[1],
16035            valuators_0_bytes[2],
16036            valuators_0_bytes[3],
16037            valuators_1_bytes[0],
16038            valuators_1_bytes[1],
16039            valuators_1_bytes[2],
16040            valuators_1_bytes[3],
16041            valuators_2_bytes[0],
16042            valuators_2_bytes[1],
16043            valuators_2_bytes[2],
16044            valuators_2_bytes[3],
16045        ]
16046    }
16047    fn serialize_into(&self, bytes: &mut Vec<u8>) {
16048        bytes.reserve(32);
16049        self.response_type.serialize_into(bytes);
16050        self.device_id.serialize_into(bytes);
16051        self.sequence.serialize_into(bytes);
16052        self.time.serialize_into(bytes);
16053        self.num_keys.serialize_into(bytes);
16054        self.num_buttons.serialize_into(bytes);
16055        self.num_valuators.serialize_into(bytes);
16056        u8::from(self.classes_reported).serialize_into(bytes);
16057        bytes.extend_from_slice(&self.buttons);
16058        bytes.extend_from_slice(&self.keys);
16059        self.valuators.serialize_into(bytes);
16060    }
16061}
16062impl From<&DeviceStateNotifyEvent> for [u8; 32] {
16063    fn from(input: &DeviceStateNotifyEvent) -> Self {
16064        let response_type_bytes = input.response_type.serialize();
16065        let device_id_bytes = input.device_id.serialize();
16066        let sequence_bytes = input.sequence.serialize();
16067        let time_bytes = input.time.serialize();
16068        let num_keys_bytes = input.num_keys.serialize();
16069        let num_buttons_bytes = input.num_buttons.serialize();
16070        let num_valuators_bytes = input.num_valuators.serialize();
16071        let classes_reported_bytes = u8::from(input.classes_reported).serialize();
16072        let valuators_0_bytes = input.valuators[0].serialize();
16073        let valuators_1_bytes = input.valuators[1].serialize();
16074        let valuators_2_bytes = input.valuators[2].serialize();
16075        [
16076            response_type_bytes[0],
16077            device_id_bytes[0],
16078            sequence_bytes[0],
16079            sequence_bytes[1],
16080            time_bytes[0],
16081            time_bytes[1],
16082            time_bytes[2],
16083            time_bytes[3],
16084            num_keys_bytes[0],
16085            num_buttons_bytes[0],
16086            num_valuators_bytes[0],
16087            classes_reported_bytes[0],
16088            input.buttons[0],
16089            input.buttons[1],
16090            input.buttons[2],
16091            input.buttons[3],
16092            input.keys[0],
16093            input.keys[1],
16094            input.keys[2],
16095            input.keys[3],
16096            valuators_0_bytes[0],
16097            valuators_0_bytes[1],
16098            valuators_0_bytes[2],
16099            valuators_0_bytes[3],
16100            valuators_1_bytes[0],
16101            valuators_1_bytes[1],
16102            valuators_1_bytes[2],
16103            valuators_1_bytes[3],
16104            valuators_2_bytes[0],
16105            valuators_2_bytes[1],
16106            valuators_2_bytes[2],
16107            valuators_2_bytes[3],
16108        ]
16109    }
16110}
16111impl From<DeviceStateNotifyEvent> for [u8; 32] {
16112    fn from(input: DeviceStateNotifyEvent) -> Self {
16113        Self::from(&input)
16114    }
16115}
16116
16117/// Opcode for the DeviceMappingNotify event
16118pub const DEVICE_MAPPING_NOTIFY_EVENT: u8 = 11;
16119#[derive(Clone, Copy, Default)]
16120#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
16121#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16122pub struct DeviceMappingNotifyEvent {
16123    pub response_type: u8,
16124    pub device_id: u8,
16125    pub sequence: u16,
16126    pub request: xproto::Mapping,
16127    pub first_keycode: KeyCode,
16128    pub count: u8,
16129    pub time: xproto::Timestamp,
16130}
16131impl_debug_if_no_extra_traits!(DeviceMappingNotifyEvent, "DeviceMappingNotifyEvent");
16132impl TryParse for DeviceMappingNotifyEvent {
16133    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
16134        let remaining = initial_value;
16135        let (response_type, remaining) = u8::try_parse(remaining)?;
16136        let (device_id, remaining) = u8::try_parse(remaining)?;
16137        let (sequence, remaining) = u16::try_parse(remaining)?;
16138        let (request, remaining) = u8::try_parse(remaining)?;
16139        let (first_keycode, remaining) = KeyCode::try_parse(remaining)?;
16140        let (count, remaining) = u8::try_parse(remaining)?;
16141        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
16142        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
16143        let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
16144        let request = request.into();
16145        let result = DeviceMappingNotifyEvent { response_type, device_id, sequence, request, first_keycode, count, time };
16146        let _ = remaining;
16147        let remaining = initial_value.get(32..)
16148            .ok_or(ParseError::InsufficientData)?;
16149        Ok((result, remaining))
16150    }
16151}
16152impl Serialize for DeviceMappingNotifyEvent {
16153    type Bytes = [u8; 32];
16154    fn serialize(&self) -> [u8; 32] {
16155        let response_type_bytes = self.response_type.serialize();
16156        let device_id_bytes = self.device_id.serialize();
16157        let sequence_bytes = self.sequence.serialize();
16158        let request_bytes = u8::from(self.request).serialize();
16159        let first_keycode_bytes = self.first_keycode.serialize();
16160        let count_bytes = self.count.serialize();
16161        let time_bytes = self.time.serialize();
16162        [
16163            response_type_bytes[0],
16164            device_id_bytes[0],
16165            sequence_bytes[0],
16166            sequence_bytes[1],
16167            request_bytes[0],
16168            first_keycode_bytes[0],
16169            count_bytes[0],
16170            0,
16171            time_bytes[0],
16172            time_bytes[1],
16173            time_bytes[2],
16174            time_bytes[3],
16175            0,
16176            0,
16177            0,
16178            0,
16179            0,
16180            0,
16181            0,
16182            0,
16183            0,
16184            0,
16185            0,
16186            0,
16187            0,
16188            0,
16189            0,
16190            0,
16191            0,
16192            0,
16193            0,
16194            0,
16195        ]
16196    }
16197    fn serialize_into(&self, bytes: &mut Vec<u8>) {
16198        bytes.reserve(32);
16199        self.response_type.serialize_into(bytes);
16200        self.device_id.serialize_into(bytes);
16201        self.sequence.serialize_into(bytes);
16202        u8::from(self.request).serialize_into(bytes);
16203        self.first_keycode.serialize_into(bytes);
16204        self.count.serialize_into(bytes);
16205        bytes.extend_from_slice(&[0; 1]);
16206        self.time.serialize_into(bytes);
16207        bytes.extend_from_slice(&[0; 20]);
16208    }
16209}
16210impl From<&DeviceMappingNotifyEvent> for [u8; 32] {
16211    fn from(input: &DeviceMappingNotifyEvent) -> Self {
16212        let response_type_bytes = input.response_type.serialize();
16213        let device_id_bytes = input.device_id.serialize();
16214        let sequence_bytes = input.sequence.serialize();
16215        let request_bytes = u8::from(input.request).serialize();
16216        let first_keycode_bytes = input.first_keycode.serialize();
16217        let count_bytes = input.count.serialize();
16218        let time_bytes = input.time.serialize();
16219        [
16220            response_type_bytes[0],
16221            device_id_bytes[0],
16222            sequence_bytes[0],
16223            sequence_bytes[1],
16224            request_bytes[0],
16225            first_keycode_bytes[0],
16226            count_bytes[0],
16227            0,
16228            time_bytes[0],
16229            time_bytes[1],
16230            time_bytes[2],
16231            time_bytes[3],
16232            0,
16233            0,
16234            0,
16235            0,
16236            0,
16237            0,
16238            0,
16239            0,
16240            0,
16241            0,
16242            0,
16243            0,
16244            0,
16245            0,
16246            0,
16247            0,
16248            0,
16249            0,
16250            0,
16251            0,
16252        ]
16253    }
16254}
16255impl From<DeviceMappingNotifyEvent> for [u8; 32] {
16256    fn from(input: DeviceMappingNotifyEvent) -> Self {
16257        Self::from(&input)
16258    }
16259}
16260
16261#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
16262#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16263pub struct ChangeDevice(u8);
16264impl ChangeDevice {
16265    pub const NEW_POINTER: Self = Self(0);
16266    pub const NEW_KEYBOARD: Self = Self(1);
16267}
16268impl From<ChangeDevice> for u8 {
16269    #[inline]
16270    fn from(input: ChangeDevice) -> Self {
16271        input.0
16272    }
16273}
16274impl From<ChangeDevice> for Option<u8> {
16275    #[inline]
16276    fn from(input: ChangeDevice) -> Self {
16277        Some(input.0)
16278    }
16279}
16280impl From<ChangeDevice> for u16 {
16281    #[inline]
16282    fn from(input: ChangeDevice) -> Self {
16283        u16::from(input.0)
16284    }
16285}
16286impl From<ChangeDevice> for Option<u16> {
16287    #[inline]
16288    fn from(input: ChangeDevice) -> Self {
16289        Some(u16::from(input.0))
16290    }
16291}
16292impl From<ChangeDevice> for u32 {
16293    #[inline]
16294    fn from(input: ChangeDevice) -> Self {
16295        u32::from(input.0)
16296    }
16297}
16298impl From<ChangeDevice> for Option<u32> {
16299    #[inline]
16300    fn from(input: ChangeDevice) -> Self {
16301        Some(u32::from(input.0))
16302    }
16303}
16304impl From<u8> for ChangeDevice {
16305    #[inline]
16306    fn from(value: u8) -> Self {
16307        Self(value)
16308    }
16309}
16310impl core::fmt::Debug for ChangeDevice  {
16311    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
16312        let variants = [
16313            (Self::NEW_POINTER.0.into(), "NEW_POINTER", "NewPointer"),
16314            (Self::NEW_KEYBOARD.0.into(), "NEW_KEYBOARD", "NewKeyboard"),
16315        ];
16316        pretty_print_enum(fmt, self.0.into(), &variants)
16317    }
16318}
16319
16320/// Opcode for the ChangeDeviceNotify event
16321pub const CHANGE_DEVICE_NOTIFY_EVENT: u8 = 12;
16322#[derive(Clone, Copy, Default)]
16323#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
16324#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16325pub struct ChangeDeviceNotifyEvent {
16326    pub response_type: u8,
16327    pub device_id: u8,
16328    pub sequence: u16,
16329    pub time: xproto::Timestamp,
16330    pub request: ChangeDevice,
16331}
16332impl_debug_if_no_extra_traits!(ChangeDeviceNotifyEvent, "ChangeDeviceNotifyEvent");
16333impl TryParse for ChangeDeviceNotifyEvent {
16334    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
16335        let remaining = initial_value;
16336        let (response_type, remaining) = u8::try_parse(remaining)?;
16337        let (device_id, remaining) = u8::try_parse(remaining)?;
16338        let (sequence, remaining) = u16::try_parse(remaining)?;
16339        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
16340        let (request, remaining) = u8::try_parse(remaining)?;
16341        let remaining = remaining.get(23..).ok_or(ParseError::InsufficientData)?;
16342        let request = request.into();
16343        let result = ChangeDeviceNotifyEvent { response_type, device_id, sequence, time, request };
16344        let _ = remaining;
16345        let remaining = initial_value.get(32..)
16346            .ok_or(ParseError::InsufficientData)?;
16347        Ok((result, remaining))
16348    }
16349}
16350impl Serialize for ChangeDeviceNotifyEvent {
16351    type Bytes = [u8; 32];
16352    fn serialize(&self) -> [u8; 32] {
16353        let response_type_bytes = self.response_type.serialize();
16354        let device_id_bytes = self.device_id.serialize();
16355        let sequence_bytes = self.sequence.serialize();
16356        let time_bytes = self.time.serialize();
16357        let request_bytes = u8::from(self.request).serialize();
16358        [
16359            response_type_bytes[0],
16360            device_id_bytes[0],
16361            sequence_bytes[0],
16362            sequence_bytes[1],
16363            time_bytes[0],
16364            time_bytes[1],
16365            time_bytes[2],
16366            time_bytes[3],
16367            request_bytes[0],
16368            0,
16369            0,
16370            0,
16371            0,
16372            0,
16373            0,
16374            0,
16375            0,
16376            0,
16377            0,
16378            0,
16379            0,
16380            0,
16381            0,
16382            0,
16383            0,
16384            0,
16385            0,
16386            0,
16387            0,
16388            0,
16389            0,
16390            0,
16391        ]
16392    }
16393    fn serialize_into(&self, bytes: &mut Vec<u8>) {
16394        bytes.reserve(32);
16395        self.response_type.serialize_into(bytes);
16396        self.device_id.serialize_into(bytes);
16397        self.sequence.serialize_into(bytes);
16398        self.time.serialize_into(bytes);
16399        u8::from(self.request).serialize_into(bytes);
16400        bytes.extend_from_slice(&[0; 23]);
16401    }
16402}
16403impl From<&ChangeDeviceNotifyEvent> for [u8; 32] {
16404    fn from(input: &ChangeDeviceNotifyEvent) -> Self {
16405        let response_type_bytes = input.response_type.serialize();
16406        let device_id_bytes = input.device_id.serialize();
16407        let sequence_bytes = input.sequence.serialize();
16408        let time_bytes = input.time.serialize();
16409        let request_bytes = u8::from(input.request).serialize();
16410        [
16411            response_type_bytes[0],
16412            device_id_bytes[0],
16413            sequence_bytes[0],
16414            sequence_bytes[1],
16415            time_bytes[0],
16416            time_bytes[1],
16417            time_bytes[2],
16418            time_bytes[3],
16419            request_bytes[0],
16420            0,
16421            0,
16422            0,
16423            0,
16424            0,
16425            0,
16426            0,
16427            0,
16428            0,
16429            0,
16430            0,
16431            0,
16432            0,
16433            0,
16434            0,
16435            0,
16436            0,
16437            0,
16438            0,
16439            0,
16440            0,
16441            0,
16442            0,
16443        ]
16444    }
16445}
16446impl From<ChangeDeviceNotifyEvent> for [u8; 32] {
16447    fn from(input: ChangeDeviceNotifyEvent) -> Self {
16448        Self::from(&input)
16449    }
16450}
16451
16452/// Opcode for the DeviceKeyStateNotify event
16453pub const DEVICE_KEY_STATE_NOTIFY_EVENT: u8 = 13;
16454#[derive(Clone, Copy, Default)]
16455#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
16456#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16457pub struct DeviceKeyStateNotifyEvent {
16458    pub response_type: u8,
16459    pub device_id: u8,
16460    pub sequence: u16,
16461    pub keys: [u8; 28],
16462}
16463impl_debug_if_no_extra_traits!(DeviceKeyStateNotifyEvent, "DeviceKeyStateNotifyEvent");
16464impl TryParse for DeviceKeyStateNotifyEvent {
16465    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
16466        let remaining = initial_value;
16467        let (response_type, remaining) = u8::try_parse(remaining)?;
16468        let (device_id, remaining) = u8::try_parse(remaining)?;
16469        let (sequence, remaining) = u16::try_parse(remaining)?;
16470        let (keys, remaining) = crate::x11_utils::parse_u8_array::<28>(remaining)?;
16471        let result = DeviceKeyStateNotifyEvent { response_type, device_id, sequence, keys };
16472        let _ = remaining;
16473        let remaining = initial_value.get(32..)
16474            .ok_or(ParseError::InsufficientData)?;
16475        Ok((result, remaining))
16476    }
16477}
16478impl Serialize for DeviceKeyStateNotifyEvent {
16479    type Bytes = [u8; 32];
16480    fn serialize(&self) -> [u8; 32] {
16481        let response_type_bytes = self.response_type.serialize();
16482        let device_id_bytes = self.device_id.serialize();
16483        let sequence_bytes = self.sequence.serialize();
16484        [
16485            response_type_bytes[0],
16486            device_id_bytes[0],
16487            sequence_bytes[0],
16488            sequence_bytes[1],
16489            self.keys[0],
16490            self.keys[1],
16491            self.keys[2],
16492            self.keys[3],
16493            self.keys[4],
16494            self.keys[5],
16495            self.keys[6],
16496            self.keys[7],
16497            self.keys[8],
16498            self.keys[9],
16499            self.keys[10],
16500            self.keys[11],
16501            self.keys[12],
16502            self.keys[13],
16503            self.keys[14],
16504            self.keys[15],
16505            self.keys[16],
16506            self.keys[17],
16507            self.keys[18],
16508            self.keys[19],
16509            self.keys[20],
16510            self.keys[21],
16511            self.keys[22],
16512            self.keys[23],
16513            self.keys[24],
16514            self.keys[25],
16515            self.keys[26],
16516            self.keys[27],
16517        ]
16518    }
16519    fn serialize_into(&self, bytes: &mut Vec<u8>) {
16520        bytes.reserve(32);
16521        self.response_type.serialize_into(bytes);
16522        self.device_id.serialize_into(bytes);
16523        self.sequence.serialize_into(bytes);
16524        bytes.extend_from_slice(&self.keys);
16525    }
16526}
16527impl From<&DeviceKeyStateNotifyEvent> for [u8; 32] {
16528    fn from(input: &DeviceKeyStateNotifyEvent) -> Self {
16529        let response_type_bytes = input.response_type.serialize();
16530        let device_id_bytes = input.device_id.serialize();
16531        let sequence_bytes = input.sequence.serialize();
16532        [
16533            response_type_bytes[0],
16534            device_id_bytes[0],
16535            sequence_bytes[0],
16536            sequence_bytes[1],
16537            input.keys[0],
16538            input.keys[1],
16539            input.keys[2],
16540            input.keys[3],
16541            input.keys[4],
16542            input.keys[5],
16543            input.keys[6],
16544            input.keys[7],
16545            input.keys[8],
16546            input.keys[9],
16547            input.keys[10],
16548            input.keys[11],
16549            input.keys[12],
16550            input.keys[13],
16551            input.keys[14],
16552            input.keys[15],
16553            input.keys[16],
16554            input.keys[17],
16555            input.keys[18],
16556            input.keys[19],
16557            input.keys[20],
16558            input.keys[21],
16559            input.keys[22],
16560            input.keys[23],
16561            input.keys[24],
16562            input.keys[25],
16563            input.keys[26],
16564            input.keys[27],
16565        ]
16566    }
16567}
16568impl From<DeviceKeyStateNotifyEvent> for [u8; 32] {
16569    fn from(input: DeviceKeyStateNotifyEvent) -> Self {
16570        Self::from(&input)
16571    }
16572}
16573
16574/// Opcode for the DeviceButtonStateNotify event
16575pub const DEVICE_BUTTON_STATE_NOTIFY_EVENT: u8 = 14;
16576#[derive(Clone, Copy, Default)]
16577#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
16578#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16579pub struct DeviceButtonStateNotifyEvent {
16580    pub response_type: u8,
16581    pub device_id: u8,
16582    pub sequence: u16,
16583    pub buttons: [u8; 28],
16584}
16585impl_debug_if_no_extra_traits!(DeviceButtonStateNotifyEvent, "DeviceButtonStateNotifyEvent");
16586impl TryParse for DeviceButtonStateNotifyEvent {
16587    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
16588        let remaining = initial_value;
16589        let (response_type, remaining) = u8::try_parse(remaining)?;
16590        let (device_id, remaining) = u8::try_parse(remaining)?;
16591        let (sequence, remaining) = u16::try_parse(remaining)?;
16592        let (buttons, remaining) = crate::x11_utils::parse_u8_array::<28>(remaining)?;
16593        let result = DeviceButtonStateNotifyEvent { response_type, device_id, sequence, buttons };
16594        let _ = remaining;
16595        let remaining = initial_value.get(32..)
16596            .ok_or(ParseError::InsufficientData)?;
16597        Ok((result, remaining))
16598    }
16599}
16600impl Serialize for DeviceButtonStateNotifyEvent {
16601    type Bytes = [u8; 32];
16602    fn serialize(&self) -> [u8; 32] {
16603        let response_type_bytes = self.response_type.serialize();
16604        let device_id_bytes = self.device_id.serialize();
16605        let sequence_bytes = self.sequence.serialize();
16606        [
16607            response_type_bytes[0],
16608            device_id_bytes[0],
16609            sequence_bytes[0],
16610            sequence_bytes[1],
16611            self.buttons[0],
16612            self.buttons[1],
16613            self.buttons[2],
16614            self.buttons[3],
16615            self.buttons[4],
16616            self.buttons[5],
16617            self.buttons[6],
16618            self.buttons[7],
16619            self.buttons[8],
16620            self.buttons[9],
16621            self.buttons[10],
16622            self.buttons[11],
16623            self.buttons[12],
16624            self.buttons[13],
16625            self.buttons[14],
16626            self.buttons[15],
16627            self.buttons[16],
16628            self.buttons[17],
16629            self.buttons[18],
16630            self.buttons[19],
16631            self.buttons[20],
16632            self.buttons[21],
16633            self.buttons[22],
16634            self.buttons[23],
16635            self.buttons[24],
16636            self.buttons[25],
16637            self.buttons[26],
16638            self.buttons[27],
16639        ]
16640    }
16641    fn serialize_into(&self, bytes: &mut Vec<u8>) {
16642        bytes.reserve(32);
16643        self.response_type.serialize_into(bytes);
16644        self.device_id.serialize_into(bytes);
16645        self.sequence.serialize_into(bytes);
16646        bytes.extend_from_slice(&self.buttons);
16647    }
16648}
16649impl From<&DeviceButtonStateNotifyEvent> for [u8; 32] {
16650    fn from(input: &DeviceButtonStateNotifyEvent) -> Self {
16651        let response_type_bytes = input.response_type.serialize();
16652        let device_id_bytes = input.device_id.serialize();
16653        let sequence_bytes = input.sequence.serialize();
16654        [
16655            response_type_bytes[0],
16656            device_id_bytes[0],
16657            sequence_bytes[0],
16658            sequence_bytes[1],
16659            input.buttons[0],
16660            input.buttons[1],
16661            input.buttons[2],
16662            input.buttons[3],
16663            input.buttons[4],
16664            input.buttons[5],
16665            input.buttons[6],
16666            input.buttons[7],
16667            input.buttons[8],
16668            input.buttons[9],
16669            input.buttons[10],
16670            input.buttons[11],
16671            input.buttons[12],
16672            input.buttons[13],
16673            input.buttons[14],
16674            input.buttons[15],
16675            input.buttons[16],
16676            input.buttons[17],
16677            input.buttons[18],
16678            input.buttons[19],
16679            input.buttons[20],
16680            input.buttons[21],
16681            input.buttons[22],
16682            input.buttons[23],
16683            input.buttons[24],
16684            input.buttons[25],
16685            input.buttons[26],
16686            input.buttons[27],
16687        ]
16688    }
16689}
16690impl From<DeviceButtonStateNotifyEvent> for [u8; 32] {
16691    fn from(input: DeviceButtonStateNotifyEvent) -> Self {
16692        Self::from(&input)
16693    }
16694}
16695
16696#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
16697#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16698pub struct DeviceChange(u8);
16699impl DeviceChange {
16700    pub const ADDED: Self = Self(0);
16701    pub const REMOVED: Self = Self(1);
16702    pub const ENABLED: Self = Self(2);
16703    pub const DISABLED: Self = Self(3);
16704    pub const UNRECOVERABLE: Self = Self(4);
16705    pub const CONTROL_CHANGED: Self = Self(5);
16706}
16707impl From<DeviceChange> for u8 {
16708    #[inline]
16709    fn from(input: DeviceChange) -> Self {
16710        input.0
16711    }
16712}
16713impl From<DeviceChange> for Option<u8> {
16714    #[inline]
16715    fn from(input: DeviceChange) -> Self {
16716        Some(input.0)
16717    }
16718}
16719impl From<DeviceChange> for u16 {
16720    #[inline]
16721    fn from(input: DeviceChange) -> Self {
16722        u16::from(input.0)
16723    }
16724}
16725impl From<DeviceChange> for Option<u16> {
16726    #[inline]
16727    fn from(input: DeviceChange) -> Self {
16728        Some(u16::from(input.0))
16729    }
16730}
16731impl From<DeviceChange> for u32 {
16732    #[inline]
16733    fn from(input: DeviceChange) -> Self {
16734        u32::from(input.0)
16735    }
16736}
16737impl From<DeviceChange> for Option<u32> {
16738    #[inline]
16739    fn from(input: DeviceChange) -> Self {
16740        Some(u32::from(input.0))
16741    }
16742}
16743impl From<u8> for DeviceChange {
16744    #[inline]
16745    fn from(value: u8) -> Self {
16746        Self(value)
16747    }
16748}
16749impl core::fmt::Debug for DeviceChange  {
16750    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
16751        let variants = [
16752            (Self::ADDED.0.into(), "ADDED", "Added"),
16753            (Self::REMOVED.0.into(), "REMOVED", "Removed"),
16754            (Self::ENABLED.0.into(), "ENABLED", "Enabled"),
16755            (Self::DISABLED.0.into(), "DISABLED", "Disabled"),
16756            (Self::UNRECOVERABLE.0.into(), "UNRECOVERABLE", "Unrecoverable"),
16757            (Self::CONTROL_CHANGED.0.into(), "CONTROL_CHANGED", "ControlChanged"),
16758        ];
16759        pretty_print_enum(fmt, self.0.into(), &variants)
16760    }
16761}
16762
16763/// Opcode for the DevicePresenceNotify event
16764pub const DEVICE_PRESENCE_NOTIFY_EVENT: u8 = 15;
16765#[derive(Clone, Copy, Default)]
16766#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
16767#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16768pub struct DevicePresenceNotifyEvent {
16769    pub response_type: u8,
16770    pub sequence: u16,
16771    pub time: xproto::Timestamp,
16772    pub devchange: DeviceChange,
16773    pub device_id: u8,
16774    pub control: u16,
16775}
16776impl_debug_if_no_extra_traits!(DevicePresenceNotifyEvent, "DevicePresenceNotifyEvent");
16777impl TryParse for DevicePresenceNotifyEvent {
16778    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
16779        let remaining = initial_value;
16780        let (response_type, remaining) = u8::try_parse(remaining)?;
16781        let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
16782        let (sequence, remaining) = u16::try_parse(remaining)?;
16783        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
16784        let (devchange, remaining) = u8::try_parse(remaining)?;
16785        let (device_id, remaining) = u8::try_parse(remaining)?;
16786        let (control, remaining) = u16::try_parse(remaining)?;
16787        let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
16788        let devchange = devchange.into();
16789        let result = DevicePresenceNotifyEvent { response_type, sequence, time, devchange, device_id, control };
16790        let _ = remaining;
16791        let remaining = initial_value.get(32..)
16792            .ok_or(ParseError::InsufficientData)?;
16793        Ok((result, remaining))
16794    }
16795}
16796impl Serialize for DevicePresenceNotifyEvent {
16797    type Bytes = [u8; 32];
16798    fn serialize(&self) -> [u8; 32] {
16799        let response_type_bytes = self.response_type.serialize();
16800        let sequence_bytes = self.sequence.serialize();
16801        let time_bytes = self.time.serialize();
16802        let devchange_bytes = u8::from(self.devchange).serialize();
16803        let device_id_bytes = self.device_id.serialize();
16804        let control_bytes = self.control.serialize();
16805        [
16806            response_type_bytes[0],
16807            0,
16808            sequence_bytes[0],
16809            sequence_bytes[1],
16810            time_bytes[0],
16811            time_bytes[1],
16812            time_bytes[2],
16813            time_bytes[3],
16814            devchange_bytes[0],
16815            device_id_bytes[0],
16816            control_bytes[0],
16817            control_bytes[1],
16818            0,
16819            0,
16820            0,
16821            0,
16822            0,
16823            0,
16824            0,
16825            0,
16826            0,
16827            0,
16828            0,
16829            0,
16830            0,
16831            0,
16832            0,
16833            0,
16834            0,
16835            0,
16836            0,
16837            0,
16838        ]
16839    }
16840    fn serialize_into(&self, bytes: &mut Vec<u8>) {
16841        bytes.reserve(32);
16842        self.response_type.serialize_into(bytes);
16843        bytes.extend_from_slice(&[0; 1]);
16844        self.sequence.serialize_into(bytes);
16845        self.time.serialize_into(bytes);
16846        u8::from(self.devchange).serialize_into(bytes);
16847        self.device_id.serialize_into(bytes);
16848        self.control.serialize_into(bytes);
16849        bytes.extend_from_slice(&[0; 20]);
16850    }
16851}
16852impl From<&DevicePresenceNotifyEvent> for [u8; 32] {
16853    fn from(input: &DevicePresenceNotifyEvent) -> Self {
16854        let response_type_bytes = input.response_type.serialize();
16855        let sequence_bytes = input.sequence.serialize();
16856        let time_bytes = input.time.serialize();
16857        let devchange_bytes = u8::from(input.devchange).serialize();
16858        let device_id_bytes = input.device_id.serialize();
16859        let control_bytes = input.control.serialize();
16860        [
16861            response_type_bytes[0],
16862            0,
16863            sequence_bytes[0],
16864            sequence_bytes[1],
16865            time_bytes[0],
16866            time_bytes[1],
16867            time_bytes[2],
16868            time_bytes[3],
16869            devchange_bytes[0],
16870            device_id_bytes[0],
16871            control_bytes[0],
16872            control_bytes[1],
16873            0,
16874            0,
16875            0,
16876            0,
16877            0,
16878            0,
16879            0,
16880            0,
16881            0,
16882            0,
16883            0,
16884            0,
16885            0,
16886            0,
16887            0,
16888            0,
16889            0,
16890            0,
16891            0,
16892            0,
16893        ]
16894    }
16895}
16896impl From<DevicePresenceNotifyEvent> for [u8; 32] {
16897    fn from(input: DevicePresenceNotifyEvent) -> Self {
16898        Self::from(&input)
16899    }
16900}
16901
16902/// Opcode for the DevicePropertyNotify event
16903pub const DEVICE_PROPERTY_NOTIFY_EVENT: u8 = 16;
16904#[derive(Clone, Copy, Default)]
16905#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
16906#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16907pub struct DevicePropertyNotifyEvent {
16908    pub response_type: u8,
16909    pub state: xproto::Property,
16910    pub sequence: u16,
16911    pub time: xproto::Timestamp,
16912    pub property: xproto::Atom,
16913    pub device_id: u8,
16914}
16915impl_debug_if_no_extra_traits!(DevicePropertyNotifyEvent, "DevicePropertyNotifyEvent");
16916impl TryParse for DevicePropertyNotifyEvent {
16917    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
16918        let remaining = initial_value;
16919        let (response_type, remaining) = u8::try_parse(remaining)?;
16920        let (state, remaining) = u8::try_parse(remaining)?;
16921        let (sequence, remaining) = u16::try_parse(remaining)?;
16922        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
16923        let (property, remaining) = xproto::Atom::try_parse(remaining)?;
16924        let remaining = remaining.get(19..).ok_or(ParseError::InsufficientData)?;
16925        let (device_id, remaining) = u8::try_parse(remaining)?;
16926        let state = state.into();
16927        let result = DevicePropertyNotifyEvent { response_type, state, sequence, time, property, device_id };
16928        let _ = remaining;
16929        let remaining = initial_value.get(32..)
16930            .ok_or(ParseError::InsufficientData)?;
16931        Ok((result, remaining))
16932    }
16933}
16934impl Serialize for DevicePropertyNotifyEvent {
16935    type Bytes = [u8; 32];
16936    fn serialize(&self) -> [u8; 32] {
16937        let response_type_bytes = self.response_type.serialize();
16938        let state_bytes = u8::from(self.state).serialize();
16939        let sequence_bytes = self.sequence.serialize();
16940        let time_bytes = self.time.serialize();
16941        let property_bytes = self.property.serialize();
16942        let device_id_bytes = self.device_id.serialize();
16943        [
16944            response_type_bytes[0],
16945            state_bytes[0],
16946            sequence_bytes[0],
16947            sequence_bytes[1],
16948            time_bytes[0],
16949            time_bytes[1],
16950            time_bytes[2],
16951            time_bytes[3],
16952            property_bytes[0],
16953            property_bytes[1],
16954            property_bytes[2],
16955            property_bytes[3],
16956            0,
16957            0,
16958            0,
16959            0,
16960            0,
16961            0,
16962            0,
16963            0,
16964            0,
16965            0,
16966            0,
16967            0,
16968            0,
16969            0,
16970            0,
16971            0,
16972            0,
16973            0,
16974            0,
16975            device_id_bytes[0],
16976        ]
16977    }
16978    fn serialize_into(&self, bytes: &mut Vec<u8>) {
16979        bytes.reserve(32);
16980        self.response_type.serialize_into(bytes);
16981        u8::from(self.state).serialize_into(bytes);
16982        self.sequence.serialize_into(bytes);
16983        self.time.serialize_into(bytes);
16984        self.property.serialize_into(bytes);
16985        bytes.extend_from_slice(&[0; 19]);
16986        self.device_id.serialize_into(bytes);
16987    }
16988}
16989impl From<&DevicePropertyNotifyEvent> for [u8; 32] {
16990    fn from(input: &DevicePropertyNotifyEvent) -> Self {
16991        let response_type_bytes = input.response_type.serialize();
16992        let state_bytes = u8::from(input.state).serialize();
16993        let sequence_bytes = input.sequence.serialize();
16994        let time_bytes = input.time.serialize();
16995        let property_bytes = input.property.serialize();
16996        let device_id_bytes = input.device_id.serialize();
16997        [
16998            response_type_bytes[0],
16999            state_bytes[0],
17000            sequence_bytes[0],
17001            sequence_bytes[1],
17002            time_bytes[0],
17003            time_bytes[1],
17004            time_bytes[2],
17005            time_bytes[3],
17006            property_bytes[0],
17007            property_bytes[1],
17008            property_bytes[2],
17009            property_bytes[3],
17010            0,
17011            0,
17012            0,
17013            0,
17014            0,
17015            0,
17016            0,
17017            0,
17018            0,
17019            0,
17020            0,
17021            0,
17022            0,
17023            0,
17024            0,
17025            0,
17026            0,
17027            0,
17028            0,
17029            device_id_bytes[0],
17030        ]
17031    }
17032}
17033impl From<DevicePropertyNotifyEvent> for [u8; 32] {
17034    fn from(input: DevicePropertyNotifyEvent) -> Self {
17035        Self::from(&input)
17036    }
17037}
17038
17039#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
17040#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17041pub struct ChangeReason(u8);
17042impl ChangeReason {
17043    pub const SLAVE_SWITCH: Self = Self(1);
17044    pub const DEVICE_CHANGE: Self = Self(2);
17045}
17046impl From<ChangeReason> for u8 {
17047    #[inline]
17048    fn from(input: ChangeReason) -> Self {
17049        input.0
17050    }
17051}
17052impl From<ChangeReason> for Option<u8> {
17053    #[inline]
17054    fn from(input: ChangeReason) -> Self {
17055        Some(input.0)
17056    }
17057}
17058impl From<ChangeReason> for u16 {
17059    #[inline]
17060    fn from(input: ChangeReason) -> Self {
17061        u16::from(input.0)
17062    }
17063}
17064impl From<ChangeReason> for Option<u16> {
17065    #[inline]
17066    fn from(input: ChangeReason) -> Self {
17067        Some(u16::from(input.0))
17068    }
17069}
17070impl From<ChangeReason> for u32 {
17071    #[inline]
17072    fn from(input: ChangeReason) -> Self {
17073        u32::from(input.0)
17074    }
17075}
17076impl From<ChangeReason> for Option<u32> {
17077    #[inline]
17078    fn from(input: ChangeReason) -> Self {
17079        Some(u32::from(input.0))
17080    }
17081}
17082impl From<u8> for ChangeReason {
17083    #[inline]
17084    fn from(value: u8) -> Self {
17085        Self(value)
17086    }
17087}
17088impl core::fmt::Debug for ChangeReason  {
17089    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
17090        let variants = [
17091            (Self::SLAVE_SWITCH.0.into(), "SLAVE_SWITCH", "SlaveSwitch"),
17092            (Self::DEVICE_CHANGE.0.into(), "DEVICE_CHANGE", "DeviceChange"),
17093        ];
17094        pretty_print_enum(fmt, self.0.into(), &variants)
17095    }
17096}
17097
17098/// Opcode for the DeviceChanged event
17099pub const DEVICE_CHANGED_EVENT: u16 = 1;
17100#[derive(Clone)]
17101#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
17102#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17103pub struct DeviceChangedEvent {
17104    pub response_type: u8,
17105    pub extension: u8,
17106    pub sequence: u16,
17107    pub length: u32,
17108    pub event_type: u16,
17109    pub deviceid: DeviceId,
17110    pub time: xproto::Timestamp,
17111    pub sourceid: DeviceId,
17112    pub reason: ChangeReason,
17113    pub classes: Vec<DeviceClass>,
17114}
17115impl_debug_if_no_extra_traits!(DeviceChangedEvent, "DeviceChangedEvent");
17116impl TryParse for DeviceChangedEvent {
17117    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
17118        let remaining = initial_value;
17119        let (response_type, remaining) = u8::try_parse(remaining)?;
17120        let (extension, remaining) = u8::try_parse(remaining)?;
17121        let (sequence, remaining) = u16::try_parse(remaining)?;
17122        let (length, remaining) = u32::try_parse(remaining)?;
17123        let (event_type, remaining) = u16::try_parse(remaining)?;
17124        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
17125        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
17126        let (num_classes, remaining) = u16::try_parse(remaining)?;
17127        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
17128        let (reason, remaining) = u8::try_parse(remaining)?;
17129        let remaining = remaining.get(11..).ok_or(ParseError::InsufficientData)?;
17130        let (classes, remaining) = crate::x11_utils::parse_list::<DeviceClass>(remaining, num_classes.try_to_usize()?)?;
17131        let reason = reason.into();
17132        let result = DeviceChangedEvent { response_type, extension, sequence, length, event_type, deviceid, time, sourceid, reason, classes };
17133        let _ = remaining;
17134        let remaining = initial_value.get(32 + length as usize * 4..)
17135            .ok_or(ParseError::InsufficientData)?;
17136        Ok((result, remaining))
17137    }
17138}
17139impl Serialize for DeviceChangedEvent {
17140    type Bytes = Vec<u8>;
17141    fn serialize(&self) -> Vec<u8> {
17142        let mut result = Vec::new();
17143        self.serialize_into(&mut result);
17144        result
17145    }
17146    fn serialize_into(&self, bytes: &mut Vec<u8>) {
17147        bytes.reserve(32);
17148        self.response_type.serialize_into(bytes);
17149        self.extension.serialize_into(bytes);
17150        self.sequence.serialize_into(bytes);
17151        self.length.serialize_into(bytes);
17152        self.event_type.serialize_into(bytes);
17153        self.deviceid.serialize_into(bytes);
17154        self.time.serialize_into(bytes);
17155        let num_classes = u16::try_from(self.classes.len()).expect("`classes` has too many elements");
17156        num_classes.serialize_into(bytes);
17157        self.sourceid.serialize_into(bytes);
17158        u8::from(self.reason).serialize_into(bytes);
17159        bytes.extend_from_slice(&[0; 11]);
17160        self.classes.serialize_into(bytes);
17161    }
17162}
17163impl DeviceChangedEvent {
17164    /// Get the value of the `num_classes` field.
17165    ///
17166    /// The `num_classes` field is used as the length field of the `classes` field.
17167    /// This function computes the field's value again based on the length of the list.
17168    ///
17169    /// # Panics
17170    ///
17171    /// Panics if the value cannot be represented in the target type. This
17172    /// cannot happen with values of the struct received from the X11 server.
17173    pub fn num_classes(&self) -> u16 {
17174        self.classes.len()
17175            .try_into().unwrap()
17176    }
17177}
17178
17179#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
17180#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17181pub struct KeyEventFlags(u32);
17182impl KeyEventFlags {
17183    pub const KEY_REPEAT: Self = Self(1 << 16);
17184}
17185impl From<KeyEventFlags> for u32 {
17186    #[inline]
17187    fn from(input: KeyEventFlags) -> Self {
17188        input.0
17189    }
17190}
17191impl From<KeyEventFlags> for Option<u32> {
17192    #[inline]
17193    fn from(input: KeyEventFlags) -> Self {
17194        Some(input.0)
17195    }
17196}
17197impl From<u8> for KeyEventFlags {
17198    #[inline]
17199    fn from(value: u8) -> Self {
17200        Self(value.into())
17201    }
17202}
17203impl From<u16> for KeyEventFlags {
17204    #[inline]
17205    fn from(value: u16) -> Self {
17206        Self(value.into())
17207    }
17208}
17209impl From<u32> for KeyEventFlags {
17210    #[inline]
17211    fn from(value: u32) -> Self {
17212        Self(value)
17213    }
17214}
17215impl core::fmt::Debug for KeyEventFlags  {
17216    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
17217        let variants = [
17218            (Self::KEY_REPEAT.0, "KEY_REPEAT", "KeyRepeat"),
17219        ];
17220        pretty_print_bitmask(fmt, self.0, &variants)
17221    }
17222}
17223bitmask_binop!(KeyEventFlags, u32);
17224
17225/// Opcode for the KeyPress event
17226pub const KEY_PRESS_EVENT: u16 = 2;
17227#[derive(Clone, Default)]
17228#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
17229#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17230pub struct KeyPressEvent {
17231    pub response_type: u8,
17232    pub extension: u8,
17233    pub sequence: u16,
17234    pub length: u32,
17235    pub event_type: u16,
17236    pub deviceid: DeviceId,
17237    pub time: xproto::Timestamp,
17238    pub detail: u32,
17239    pub root: xproto::Window,
17240    pub event: xproto::Window,
17241    pub child: xproto::Window,
17242    pub root_x: Fp1616,
17243    pub root_y: Fp1616,
17244    pub event_x: Fp1616,
17245    pub event_y: Fp1616,
17246    pub sourceid: DeviceId,
17247    pub flags: KeyEventFlags,
17248    pub mods: ModifierInfo,
17249    pub group: GroupInfo,
17250    pub button_mask: Vec<u32>,
17251    pub valuator_mask: Vec<u32>,
17252    pub axisvalues: Vec<Fp3232>,
17253}
17254impl_debug_if_no_extra_traits!(KeyPressEvent, "KeyPressEvent");
17255impl TryParse for KeyPressEvent {
17256    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
17257        let remaining = initial_value;
17258        let (response_type, remaining) = u8::try_parse(remaining)?;
17259        let (extension, remaining) = u8::try_parse(remaining)?;
17260        let (sequence, remaining) = u16::try_parse(remaining)?;
17261        let (length, remaining) = u32::try_parse(remaining)?;
17262        let (event_type, remaining) = u16::try_parse(remaining)?;
17263        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
17264        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
17265        let (detail, remaining) = u32::try_parse(remaining)?;
17266        let (root, remaining) = xproto::Window::try_parse(remaining)?;
17267        let (event, remaining) = xproto::Window::try_parse(remaining)?;
17268        let (child, remaining) = xproto::Window::try_parse(remaining)?;
17269        let (root_x, remaining) = Fp1616::try_parse(remaining)?;
17270        let (root_y, remaining) = Fp1616::try_parse(remaining)?;
17271        let (event_x, remaining) = Fp1616::try_parse(remaining)?;
17272        let (event_y, remaining) = Fp1616::try_parse(remaining)?;
17273        let (buttons_len, remaining) = u16::try_parse(remaining)?;
17274        let (valuators_len, remaining) = u16::try_parse(remaining)?;
17275        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
17276        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
17277        let (flags, remaining) = u32::try_parse(remaining)?;
17278        let (mods, remaining) = ModifierInfo::try_parse(remaining)?;
17279        let (group, remaining) = GroupInfo::try_parse(remaining)?;
17280        let (button_mask, remaining) = crate::x11_utils::parse_list::<u32>(remaining, buttons_len.try_to_usize()?)?;
17281        let (valuator_mask, remaining) = crate::x11_utils::parse_list::<u32>(remaining, valuators_len.try_to_usize()?)?;
17282        let (axisvalues, remaining) = crate::x11_utils::parse_list::<Fp3232>(remaining, valuator_mask.iter().try_fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).ok_or(ParseError::InvalidExpression))?.try_to_usize()?)?;
17283        let flags = flags.into();
17284        let result = KeyPressEvent { response_type, extension, sequence, length, event_type, deviceid, time, detail, root, event, child, root_x, root_y, event_x, event_y, sourceid, flags, mods, group, button_mask, valuator_mask, axisvalues };
17285        let _ = remaining;
17286        let remaining = initial_value.get(32 + length as usize * 4..)
17287            .ok_or(ParseError::InsufficientData)?;
17288        Ok((result, remaining))
17289    }
17290}
17291impl Serialize for KeyPressEvent {
17292    type Bytes = Vec<u8>;
17293    fn serialize(&self) -> Vec<u8> {
17294        let mut result = Vec::new();
17295        self.serialize_into(&mut result);
17296        result
17297    }
17298    fn serialize_into(&self, bytes: &mut Vec<u8>) {
17299        bytes.reserve(80);
17300        self.response_type.serialize_into(bytes);
17301        self.extension.serialize_into(bytes);
17302        self.sequence.serialize_into(bytes);
17303        self.length.serialize_into(bytes);
17304        self.event_type.serialize_into(bytes);
17305        self.deviceid.serialize_into(bytes);
17306        self.time.serialize_into(bytes);
17307        self.detail.serialize_into(bytes);
17308        self.root.serialize_into(bytes);
17309        self.event.serialize_into(bytes);
17310        self.child.serialize_into(bytes);
17311        self.root_x.serialize_into(bytes);
17312        self.root_y.serialize_into(bytes);
17313        self.event_x.serialize_into(bytes);
17314        self.event_y.serialize_into(bytes);
17315        let buttons_len = u16::try_from(self.button_mask.len()).expect("`button_mask` has too many elements");
17316        buttons_len.serialize_into(bytes);
17317        let valuators_len = u16::try_from(self.valuator_mask.len()).expect("`valuator_mask` has too many elements");
17318        valuators_len.serialize_into(bytes);
17319        self.sourceid.serialize_into(bytes);
17320        bytes.extend_from_slice(&[0; 2]);
17321        u32::from(self.flags).serialize_into(bytes);
17322        self.mods.serialize_into(bytes);
17323        self.group.serialize_into(bytes);
17324        self.button_mask.serialize_into(bytes);
17325        self.valuator_mask.serialize_into(bytes);
17326        assert_eq!(self.axisvalues.len(), usize::try_from(self.valuator_mask.iter().fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).unwrap())).unwrap(), "`axisvalues` has an incorrect length");
17327        self.axisvalues.serialize_into(bytes);
17328    }
17329}
17330impl KeyPressEvent {
17331    /// Get the value of the `buttons_len` field.
17332    ///
17333    /// The `buttons_len` field is used as the length field of the `button_mask` field.
17334    /// This function computes the field's value again based on the length of the list.
17335    ///
17336    /// # Panics
17337    ///
17338    /// Panics if the value cannot be represented in the target type. This
17339    /// cannot happen with values of the struct received from the X11 server.
17340    pub fn buttons_len(&self) -> u16 {
17341        self.button_mask.len()
17342            .try_into().unwrap()
17343    }
17344    /// Get the value of the `valuators_len` field.
17345    ///
17346    /// The `valuators_len` field is used as the length field of the `valuator_mask` field.
17347    /// This function computes the field's value again based on the length of the list.
17348    ///
17349    /// # Panics
17350    ///
17351    /// Panics if the value cannot be represented in the target type. This
17352    /// cannot happen with values of the struct received from the X11 server.
17353    pub fn valuators_len(&self) -> u16 {
17354        self.valuator_mask.len()
17355            .try_into().unwrap()
17356    }
17357}
17358
17359/// Opcode for the KeyRelease event
17360pub const KEY_RELEASE_EVENT: u16 = 3;
17361pub type KeyReleaseEvent = KeyPressEvent;
17362
17363#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
17364#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17365pub struct PointerEventFlags(u32);
17366impl PointerEventFlags {
17367    pub const POINTER_EMULATED: Self = Self(1 << 16);
17368}
17369impl From<PointerEventFlags> for u32 {
17370    #[inline]
17371    fn from(input: PointerEventFlags) -> Self {
17372        input.0
17373    }
17374}
17375impl From<PointerEventFlags> for Option<u32> {
17376    #[inline]
17377    fn from(input: PointerEventFlags) -> Self {
17378        Some(input.0)
17379    }
17380}
17381impl From<u8> for PointerEventFlags {
17382    #[inline]
17383    fn from(value: u8) -> Self {
17384        Self(value.into())
17385    }
17386}
17387impl From<u16> for PointerEventFlags {
17388    #[inline]
17389    fn from(value: u16) -> Self {
17390        Self(value.into())
17391    }
17392}
17393impl From<u32> for PointerEventFlags {
17394    #[inline]
17395    fn from(value: u32) -> Self {
17396        Self(value)
17397    }
17398}
17399impl core::fmt::Debug for PointerEventFlags  {
17400    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
17401        let variants = [
17402            (Self::POINTER_EMULATED.0, "POINTER_EMULATED", "PointerEmulated"),
17403        ];
17404        pretty_print_bitmask(fmt, self.0, &variants)
17405    }
17406}
17407bitmask_binop!(PointerEventFlags, u32);
17408
17409/// Opcode for the ButtonPress event
17410pub const BUTTON_PRESS_EVENT: u16 = 4;
17411#[derive(Clone, Default)]
17412#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
17413#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17414pub struct ButtonPressEvent {
17415    pub response_type: u8,
17416    pub extension: u8,
17417    pub sequence: u16,
17418    pub length: u32,
17419    pub event_type: u16,
17420    pub deviceid: DeviceId,
17421    pub time: xproto::Timestamp,
17422    pub detail: u32,
17423    pub root: xproto::Window,
17424    pub event: xproto::Window,
17425    pub child: xproto::Window,
17426    pub root_x: Fp1616,
17427    pub root_y: Fp1616,
17428    pub event_x: Fp1616,
17429    pub event_y: Fp1616,
17430    pub sourceid: DeviceId,
17431    pub flags: PointerEventFlags,
17432    pub mods: ModifierInfo,
17433    pub group: GroupInfo,
17434    pub button_mask: Vec<u32>,
17435    pub valuator_mask: Vec<u32>,
17436    pub axisvalues: Vec<Fp3232>,
17437}
17438impl_debug_if_no_extra_traits!(ButtonPressEvent, "ButtonPressEvent");
17439impl TryParse for ButtonPressEvent {
17440    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
17441        let remaining = initial_value;
17442        let (response_type, remaining) = u8::try_parse(remaining)?;
17443        let (extension, remaining) = u8::try_parse(remaining)?;
17444        let (sequence, remaining) = u16::try_parse(remaining)?;
17445        let (length, remaining) = u32::try_parse(remaining)?;
17446        let (event_type, remaining) = u16::try_parse(remaining)?;
17447        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
17448        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
17449        let (detail, remaining) = u32::try_parse(remaining)?;
17450        let (root, remaining) = xproto::Window::try_parse(remaining)?;
17451        let (event, remaining) = xproto::Window::try_parse(remaining)?;
17452        let (child, remaining) = xproto::Window::try_parse(remaining)?;
17453        let (root_x, remaining) = Fp1616::try_parse(remaining)?;
17454        let (root_y, remaining) = Fp1616::try_parse(remaining)?;
17455        let (event_x, remaining) = Fp1616::try_parse(remaining)?;
17456        let (event_y, remaining) = Fp1616::try_parse(remaining)?;
17457        let (buttons_len, remaining) = u16::try_parse(remaining)?;
17458        let (valuators_len, remaining) = u16::try_parse(remaining)?;
17459        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
17460        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
17461        let (flags, remaining) = u32::try_parse(remaining)?;
17462        let (mods, remaining) = ModifierInfo::try_parse(remaining)?;
17463        let (group, remaining) = GroupInfo::try_parse(remaining)?;
17464        let (button_mask, remaining) = crate::x11_utils::parse_list::<u32>(remaining, buttons_len.try_to_usize()?)?;
17465        let (valuator_mask, remaining) = crate::x11_utils::parse_list::<u32>(remaining, valuators_len.try_to_usize()?)?;
17466        let (axisvalues, remaining) = crate::x11_utils::parse_list::<Fp3232>(remaining, valuator_mask.iter().try_fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).ok_or(ParseError::InvalidExpression))?.try_to_usize()?)?;
17467        let flags = flags.into();
17468        let result = ButtonPressEvent { response_type, extension, sequence, length, event_type, deviceid, time, detail, root, event, child, root_x, root_y, event_x, event_y, sourceid, flags, mods, group, button_mask, valuator_mask, axisvalues };
17469        let _ = remaining;
17470        let remaining = initial_value.get(32 + length as usize * 4..)
17471            .ok_or(ParseError::InsufficientData)?;
17472        Ok((result, remaining))
17473    }
17474}
17475impl Serialize for ButtonPressEvent {
17476    type Bytes = Vec<u8>;
17477    fn serialize(&self) -> Vec<u8> {
17478        let mut result = Vec::new();
17479        self.serialize_into(&mut result);
17480        result
17481    }
17482    fn serialize_into(&self, bytes: &mut Vec<u8>) {
17483        bytes.reserve(80);
17484        self.response_type.serialize_into(bytes);
17485        self.extension.serialize_into(bytes);
17486        self.sequence.serialize_into(bytes);
17487        self.length.serialize_into(bytes);
17488        self.event_type.serialize_into(bytes);
17489        self.deviceid.serialize_into(bytes);
17490        self.time.serialize_into(bytes);
17491        self.detail.serialize_into(bytes);
17492        self.root.serialize_into(bytes);
17493        self.event.serialize_into(bytes);
17494        self.child.serialize_into(bytes);
17495        self.root_x.serialize_into(bytes);
17496        self.root_y.serialize_into(bytes);
17497        self.event_x.serialize_into(bytes);
17498        self.event_y.serialize_into(bytes);
17499        let buttons_len = u16::try_from(self.button_mask.len()).expect("`button_mask` has too many elements");
17500        buttons_len.serialize_into(bytes);
17501        let valuators_len = u16::try_from(self.valuator_mask.len()).expect("`valuator_mask` has too many elements");
17502        valuators_len.serialize_into(bytes);
17503        self.sourceid.serialize_into(bytes);
17504        bytes.extend_from_slice(&[0; 2]);
17505        u32::from(self.flags).serialize_into(bytes);
17506        self.mods.serialize_into(bytes);
17507        self.group.serialize_into(bytes);
17508        self.button_mask.serialize_into(bytes);
17509        self.valuator_mask.serialize_into(bytes);
17510        assert_eq!(self.axisvalues.len(), usize::try_from(self.valuator_mask.iter().fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).unwrap())).unwrap(), "`axisvalues` has an incorrect length");
17511        self.axisvalues.serialize_into(bytes);
17512    }
17513}
17514impl ButtonPressEvent {
17515    /// Get the value of the `buttons_len` field.
17516    ///
17517    /// The `buttons_len` field is used as the length field of the `button_mask` field.
17518    /// This function computes the field's value again based on the length of the list.
17519    ///
17520    /// # Panics
17521    ///
17522    /// Panics if the value cannot be represented in the target type. This
17523    /// cannot happen with values of the struct received from the X11 server.
17524    pub fn buttons_len(&self) -> u16 {
17525        self.button_mask.len()
17526            .try_into().unwrap()
17527    }
17528    /// Get the value of the `valuators_len` field.
17529    ///
17530    /// The `valuators_len` field is used as the length field of the `valuator_mask` field.
17531    /// This function computes the field's value again based on the length of the list.
17532    ///
17533    /// # Panics
17534    ///
17535    /// Panics if the value cannot be represented in the target type. This
17536    /// cannot happen with values of the struct received from the X11 server.
17537    pub fn valuators_len(&self) -> u16 {
17538        self.valuator_mask.len()
17539            .try_into().unwrap()
17540    }
17541}
17542
17543/// Opcode for the ButtonRelease event
17544pub const BUTTON_RELEASE_EVENT: u16 = 5;
17545pub type ButtonReleaseEvent = ButtonPressEvent;
17546
17547/// Opcode for the Motion event
17548pub const MOTION_EVENT: u16 = 6;
17549pub type MotionEvent = ButtonPressEvent;
17550
17551#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
17552#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17553pub struct NotifyMode(u8);
17554impl NotifyMode {
17555    pub const NORMAL: Self = Self(0);
17556    pub const GRAB: Self = Self(1);
17557    pub const UNGRAB: Self = Self(2);
17558    pub const WHILE_GRABBED: Self = Self(3);
17559    pub const PASSIVE_GRAB: Self = Self(4);
17560    pub const PASSIVE_UNGRAB: Self = Self(5);
17561}
17562impl From<NotifyMode> for u8 {
17563    #[inline]
17564    fn from(input: NotifyMode) -> Self {
17565        input.0
17566    }
17567}
17568impl From<NotifyMode> for Option<u8> {
17569    #[inline]
17570    fn from(input: NotifyMode) -> Self {
17571        Some(input.0)
17572    }
17573}
17574impl From<NotifyMode> for u16 {
17575    #[inline]
17576    fn from(input: NotifyMode) -> Self {
17577        u16::from(input.0)
17578    }
17579}
17580impl From<NotifyMode> for Option<u16> {
17581    #[inline]
17582    fn from(input: NotifyMode) -> Self {
17583        Some(u16::from(input.0))
17584    }
17585}
17586impl From<NotifyMode> for u32 {
17587    #[inline]
17588    fn from(input: NotifyMode) -> Self {
17589        u32::from(input.0)
17590    }
17591}
17592impl From<NotifyMode> for Option<u32> {
17593    #[inline]
17594    fn from(input: NotifyMode) -> Self {
17595        Some(u32::from(input.0))
17596    }
17597}
17598impl From<u8> for NotifyMode {
17599    #[inline]
17600    fn from(value: u8) -> Self {
17601        Self(value)
17602    }
17603}
17604impl core::fmt::Debug for NotifyMode  {
17605    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
17606        let variants = [
17607            (Self::NORMAL.0.into(), "NORMAL", "Normal"),
17608            (Self::GRAB.0.into(), "GRAB", "Grab"),
17609            (Self::UNGRAB.0.into(), "UNGRAB", "Ungrab"),
17610            (Self::WHILE_GRABBED.0.into(), "WHILE_GRABBED", "WhileGrabbed"),
17611            (Self::PASSIVE_GRAB.0.into(), "PASSIVE_GRAB", "PassiveGrab"),
17612            (Self::PASSIVE_UNGRAB.0.into(), "PASSIVE_UNGRAB", "PassiveUngrab"),
17613        ];
17614        pretty_print_enum(fmt, self.0.into(), &variants)
17615    }
17616}
17617
17618#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
17619#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17620pub struct NotifyDetail(u8);
17621impl NotifyDetail {
17622    pub const ANCESTOR: Self = Self(0);
17623    pub const VIRTUAL: Self = Self(1);
17624    pub const INFERIOR: Self = Self(2);
17625    pub const NONLINEAR: Self = Self(3);
17626    pub const NONLINEAR_VIRTUAL: Self = Self(4);
17627    pub const POINTER: Self = Self(5);
17628    pub const POINTER_ROOT: Self = Self(6);
17629    pub const NONE: Self = Self(7);
17630}
17631impl From<NotifyDetail> for u8 {
17632    #[inline]
17633    fn from(input: NotifyDetail) -> Self {
17634        input.0
17635    }
17636}
17637impl From<NotifyDetail> for Option<u8> {
17638    #[inline]
17639    fn from(input: NotifyDetail) -> Self {
17640        Some(input.0)
17641    }
17642}
17643impl From<NotifyDetail> for u16 {
17644    #[inline]
17645    fn from(input: NotifyDetail) -> Self {
17646        u16::from(input.0)
17647    }
17648}
17649impl From<NotifyDetail> for Option<u16> {
17650    #[inline]
17651    fn from(input: NotifyDetail) -> Self {
17652        Some(u16::from(input.0))
17653    }
17654}
17655impl From<NotifyDetail> for u32 {
17656    #[inline]
17657    fn from(input: NotifyDetail) -> Self {
17658        u32::from(input.0)
17659    }
17660}
17661impl From<NotifyDetail> for Option<u32> {
17662    #[inline]
17663    fn from(input: NotifyDetail) -> Self {
17664        Some(u32::from(input.0))
17665    }
17666}
17667impl From<u8> for NotifyDetail {
17668    #[inline]
17669    fn from(value: u8) -> Self {
17670        Self(value)
17671    }
17672}
17673impl core::fmt::Debug for NotifyDetail  {
17674    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
17675        let variants = [
17676            (Self::ANCESTOR.0.into(), "ANCESTOR", "Ancestor"),
17677            (Self::VIRTUAL.0.into(), "VIRTUAL", "Virtual"),
17678            (Self::INFERIOR.0.into(), "INFERIOR", "Inferior"),
17679            (Self::NONLINEAR.0.into(), "NONLINEAR", "Nonlinear"),
17680            (Self::NONLINEAR_VIRTUAL.0.into(), "NONLINEAR_VIRTUAL", "NonlinearVirtual"),
17681            (Self::POINTER.0.into(), "POINTER", "Pointer"),
17682            (Self::POINTER_ROOT.0.into(), "POINTER_ROOT", "PointerRoot"),
17683            (Self::NONE.0.into(), "NONE", "None"),
17684        ];
17685        pretty_print_enum(fmt, self.0.into(), &variants)
17686    }
17687}
17688
17689/// Opcode for the Enter event
17690pub const ENTER_EVENT: u16 = 7;
17691#[derive(Clone, Default)]
17692#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
17693#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17694pub struct EnterEvent {
17695    pub response_type: u8,
17696    pub extension: u8,
17697    pub sequence: u16,
17698    pub length: u32,
17699    pub event_type: u16,
17700    pub deviceid: DeviceId,
17701    pub time: xproto::Timestamp,
17702    pub sourceid: DeviceId,
17703    pub mode: NotifyMode,
17704    pub detail: NotifyDetail,
17705    pub root: xproto::Window,
17706    pub event: xproto::Window,
17707    pub child: xproto::Window,
17708    pub root_x: Fp1616,
17709    pub root_y: Fp1616,
17710    pub event_x: Fp1616,
17711    pub event_y: Fp1616,
17712    pub same_screen: bool,
17713    pub focus: bool,
17714    pub mods: ModifierInfo,
17715    pub group: GroupInfo,
17716    pub buttons: Vec<u32>,
17717}
17718impl_debug_if_no_extra_traits!(EnterEvent, "EnterEvent");
17719impl TryParse for EnterEvent {
17720    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
17721        let remaining = initial_value;
17722        let (response_type, remaining) = u8::try_parse(remaining)?;
17723        let (extension, remaining) = u8::try_parse(remaining)?;
17724        let (sequence, remaining) = u16::try_parse(remaining)?;
17725        let (length, remaining) = u32::try_parse(remaining)?;
17726        let (event_type, remaining) = u16::try_parse(remaining)?;
17727        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
17728        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
17729        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
17730        let (mode, remaining) = u8::try_parse(remaining)?;
17731        let (detail, remaining) = u8::try_parse(remaining)?;
17732        let (root, remaining) = xproto::Window::try_parse(remaining)?;
17733        let (event, remaining) = xproto::Window::try_parse(remaining)?;
17734        let (child, remaining) = xproto::Window::try_parse(remaining)?;
17735        let (root_x, remaining) = Fp1616::try_parse(remaining)?;
17736        let (root_y, remaining) = Fp1616::try_parse(remaining)?;
17737        let (event_x, remaining) = Fp1616::try_parse(remaining)?;
17738        let (event_y, remaining) = Fp1616::try_parse(remaining)?;
17739        let (same_screen, remaining) = bool::try_parse(remaining)?;
17740        let (focus, remaining) = bool::try_parse(remaining)?;
17741        let (buttons_len, remaining) = u16::try_parse(remaining)?;
17742        let (mods, remaining) = ModifierInfo::try_parse(remaining)?;
17743        let (group, remaining) = GroupInfo::try_parse(remaining)?;
17744        let (buttons, remaining) = crate::x11_utils::parse_list::<u32>(remaining, buttons_len.try_to_usize()?)?;
17745        let mode = mode.into();
17746        let detail = detail.into();
17747        let result = EnterEvent { response_type, extension, sequence, length, event_type, deviceid, time, sourceid, mode, detail, root, event, child, root_x, root_y, event_x, event_y, same_screen, focus, mods, group, buttons };
17748        let _ = remaining;
17749        let remaining = initial_value.get(32 + length as usize * 4..)
17750            .ok_or(ParseError::InsufficientData)?;
17751        Ok((result, remaining))
17752    }
17753}
17754impl Serialize for EnterEvent {
17755    type Bytes = Vec<u8>;
17756    fn serialize(&self) -> Vec<u8> {
17757        let mut result = Vec::new();
17758        self.serialize_into(&mut result);
17759        result
17760    }
17761    fn serialize_into(&self, bytes: &mut Vec<u8>) {
17762        bytes.reserve(72);
17763        self.response_type.serialize_into(bytes);
17764        self.extension.serialize_into(bytes);
17765        self.sequence.serialize_into(bytes);
17766        self.length.serialize_into(bytes);
17767        self.event_type.serialize_into(bytes);
17768        self.deviceid.serialize_into(bytes);
17769        self.time.serialize_into(bytes);
17770        self.sourceid.serialize_into(bytes);
17771        u8::from(self.mode).serialize_into(bytes);
17772        u8::from(self.detail).serialize_into(bytes);
17773        self.root.serialize_into(bytes);
17774        self.event.serialize_into(bytes);
17775        self.child.serialize_into(bytes);
17776        self.root_x.serialize_into(bytes);
17777        self.root_y.serialize_into(bytes);
17778        self.event_x.serialize_into(bytes);
17779        self.event_y.serialize_into(bytes);
17780        self.same_screen.serialize_into(bytes);
17781        self.focus.serialize_into(bytes);
17782        let buttons_len = u16::try_from(self.buttons.len()).expect("`buttons` has too many elements");
17783        buttons_len.serialize_into(bytes);
17784        self.mods.serialize_into(bytes);
17785        self.group.serialize_into(bytes);
17786        self.buttons.serialize_into(bytes);
17787    }
17788}
17789impl EnterEvent {
17790    /// Get the value of the `buttons_len` field.
17791    ///
17792    /// The `buttons_len` field is used as the length field of the `buttons` field.
17793    /// This function computes the field's value again based on the length of the list.
17794    ///
17795    /// # Panics
17796    ///
17797    /// Panics if the value cannot be represented in the target type. This
17798    /// cannot happen with values of the struct received from the X11 server.
17799    pub fn buttons_len(&self) -> u16 {
17800        self.buttons.len()
17801            .try_into().unwrap()
17802    }
17803}
17804
17805/// Opcode for the Leave event
17806pub const LEAVE_EVENT: u16 = 8;
17807pub type LeaveEvent = EnterEvent;
17808
17809/// Opcode for the FocusIn event
17810pub const FOCUS_IN_EVENT: u16 = 9;
17811pub type FocusInEvent = EnterEvent;
17812
17813/// Opcode for the FocusOut event
17814pub const FOCUS_OUT_EVENT: u16 = 10;
17815pub type FocusOutEvent = EnterEvent;
17816
17817#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
17818#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17819pub struct HierarchyMask(u32);
17820impl HierarchyMask {
17821    pub const MASTER_ADDED: Self = Self(1 << 0);
17822    pub const MASTER_REMOVED: Self = Self(1 << 1);
17823    pub const SLAVE_ADDED: Self = Self(1 << 2);
17824    pub const SLAVE_REMOVED: Self = Self(1 << 3);
17825    pub const SLAVE_ATTACHED: Self = Self(1 << 4);
17826    pub const SLAVE_DETACHED: Self = Self(1 << 5);
17827    pub const DEVICE_ENABLED: Self = Self(1 << 6);
17828    pub const DEVICE_DISABLED: Self = Self(1 << 7);
17829}
17830impl From<HierarchyMask> for u32 {
17831    #[inline]
17832    fn from(input: HierarchyMask) -> Self {
17833        input.0
17834    }
17835}
17836impl From<HierarchyMask> for Option<u32> {
17837    #[inline]
17838    fn from(input: HierarchyMask) -> Self {
17839        Some(input.0)
17840    }
17841}
17842impl From<u8> for HierarchyMask {
17843    #[inline]
17844    fn from(value: u8) -> Self {
17845        Self(value.into())
17846    }
17847}
17848impl From<u16> for HierarchyMask {
17849    #[inline]
17850    fn from(value: u16) -> Self {
17851        Self(value.into())
17852    }
17853}
17854impl From<u32> for HierarchyMask {
17855    #[inline]
17856    fn from(value: u32) -> Self {
17857        Self(value)
17858    }
17859}
17860impl core::fmt::Debug for HierarchyMask  {
17861    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
17862        let variants = [
17863            (Self::MASTER_ADDED.0, "MASTER_ADDED", "MasterAdded"),
17864            (Self::MASTER_REMOVED.0, "MASTER_REMOVED", "MasterRemoved"),
17865            (Self::SLAVE_ADDED.0, "SLAVE_ADDED", "SlaveAdded"),
17866            (Self::SLAVE_REMOVED.0, "SLAVE_REMOVED", "SlaveRemoved"),
17867            (Self::SLAVE_ATTACHED.0, "SLAVE_ATTACHED", "SlaveAttached"),
17868            (Self::SLAVE_DETACHED.0, "SLAVE_DETACHED", "SlaveDetached"),
17869            (Self::DEVICE_ENABLED.0, "DEVICE_ENABLED", "DeviceEnabled"),
17870            (Self::DEVICE_DISABLED.0, "DEVICE_DISABLED", "DeviceDisabled"),
17871        ];
17872        pretty_print_bitmask(fmt, self.0, &variants)
17873    }
17874}
17875bitmask_binop!(HierarchyMask, u32);
17876
17877#[derive(Clone, Copy, Default)]
17878#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
17879#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17880pub struct HierarchyInfo {
17881    pub deviceid: DeviceId,
17882    pub attachment: DeviceId,
17883    pub type_: DeviceType,
17884    pub enabled: bool,
17885    pub flags: HierarchyMask,
17886}
17887impl_debug_if_no_extra_traits!(HierarchyInfo, "HierarchyInfo");
17888impl TryParse for HierarchyInfo {
17889    fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
17890        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
17891        let (attachment, remaining) = DeviceId::try_parse(remaining)?;
17892        let (type_, remaining) = u8::try_parse(remaining)?;
17893        let (enabled, remaining) = bool::try_parse(remaining)?;
17894        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
17895        let (flags, remaining) = u32::try_parse(remaining)?;
17896        let type_ = type_.into();
17897        let flags = flags.into();
17898        let result = HierarchyInfo { deviceid, attachment, type_, enabled, flags };
17899        Ok((result, remaining))
17900    }
17901}
17902impl Serialize for HierarchyInfo {
17903    type Bytes = [u8; 12];
17904    fn serialize(&self) -> [u8; 12] {
17905        let deviceid_bytes = self.deviceid.serialize();
17906        let attachment_bytes = self.attachment.serialize();
17907        let type_bytes = (u16::from(self.type_) as u8).serialize();
17908        let enabled_bytes = self.enabled.serialize();
17909        let flags_bytes = u32::from(self.flags).serialize();
17910        [
17911            deviceid_bytes[0],
17912            deviceid_bytes[1],
17913            attachment_bytes[0],
17914            attachment_bytes[1],
17915            type_bytes[0],
17916            enabled_bytes[0],
17917            0,
17918            0,
17919            flags_bytes[0],
17920            flags_bytes[1],
17921            flags_bytes[2],
17922            flags_bytes[3],
17923        ]
17924    }
17925    fn serialize_into(&self, bytes: &mut Vec<u8>) {
17926        bytes.reserve(12);
17927        self.deviceid.serialize_into(bytes);
17928        self.attachment.serialize_into(bytes);
17929        (u16::from(self.type_) as u8).serialize_into(bytes);
17930        self.enabled.serialize_into(bytes);
17931        bytes.extend_from_slice(&[0; 2]);
17932        u32::from(self.flags).serialize_into(bytes);
17933    }
17934}
17935
17936/// Opcode for the Hierarchy event
17937pub const HIERARCHY_EVENT: u16 = 11;
17938#[derive(Clone, Default)]
17939#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
17940#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17941pub struct HierarchyEvent {
17942    pub response_type: u8,
17943    pub extension: u8,
17944    pub sequence: u16,
17945    pub length: u32,
17946    pub event_type: u16,
17947    pub deviceid: DeviceId,
17948    pub time: xproto::Timestamp,
17949    pub flags: HierarchyMask,
17950    pub infos: Vec<HierarchyInfo>,
17951}
17952impl_debug_if_no_extra_traits!(HierarchyEvent, "HierarchyEvent");
17953impl TryParse for HierarchyEvent {
17954    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
17955        let remaining = initial_value;
17956        let (response_type, remaining) = u8::try_parse(remaining)?;
17957        let (extension, remaining) = u8::try_parse(remaining)?;
17958        let (sequence, remaining) = u16::try_parse(remaining)?;
17959        let (length, remaining) = u32::try_parse(remaining)?;
17960        let (event_type, remaining) = u16::try_parse(remaining)?;
17961        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
17962        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
17963        let (flags, remaining) = u32::try_parse(remaining)?;
17964        let (num_infos, remaining) = u16::try_parse(remaining)?;
17965        let remaining = remaining.get(10..).ok_or(ParseError::InsufficientData)?;
17966        let (infos, remaining) = crate::x11_utils::parse_list::<HierarchyInfo>(remaining, num_infos.try_to_usize()?)?;
17967        let flags = flags.into();
17968        let result = HierarchyEvent { response_type, extension, sequence, length, event_type, deviceid, time, flags, infos };
17969        let _ = remaining;
17970        let remaining = initial_value.get(32 + length as usize * 4..)
17971            .ok_or(ParseError::InsufficientData)?;
17972        Ok((result, remaining))
17973    }
17974}
17975impl Serialize for HierarchyEvent {
17976    type Bytes = Vec<u8>;
17977    fn serialize(&self) -> Vec<u8> {
17978        let mut result = Vec::new();
17979        self.serialize_into(&mut result);
17980        result
17981    }
17982    fn serialize_into(&self, bytes: &mut Vec<u8>) {
17983        bytes.reserve(32);
17984        self.response_type.serialize_into(bytes);
17985        self.extension.serialize_into(bytes);
17986        self.sequence.serialize_into(bytes);
17987        self.length.serialize_into(bytes);
17988        self.event_type.serialize_into(bytes);
17989        self.deviceid.serialize_into(bytes);
17990        self.time.serialize_into(bytes);
17991        u32::from(self.flags).serialize_into(bytes);
17992        let num_infos = u16::try_from(self.infos.len()).expect("`infos` has too many elements");
17993        num_infos.serialize_into(bytes);
17994        bytes.extend_from_slice(&[0; 10]);
17995        self.infos.serialize_into(bytes);
17996    }
17997}
17998impl HierarchyEvent {
17999    /// Get the value of the `num_infos` field.
18000    ///
18001    /// The `num_infos` field is used as the length field of the `infos` field.
18002    /// This function computes the field's value again based on the length of the list.
18003    ///
18004    /// # Panics
18005    ///
18006    /// Panics if the value cannot be represented in the target type. This
18007    /// cannot happen with values of the struct received from the X11 server.
18008    pub fn num_infos(&self) -> u16 {
18009        self.infos.len()
18010            .try_into().unwrap()
18011    }
18012}
18013
18014#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
18015#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18016pub struct PropertyFlag(u8);
18017impl PropertyFlag {
18018    pub const DELETED: Self = Self(0);
18019    pub const CREATED: Self = Self(1);
18020    pub const MODIFIED: Self = Self(2);
18021}
18022impl From<PropertyFlag> for u8 {
18023    #[inline]
18024    fn from(input: PropertyFlag) -> Self {
18025        input.0
18026    }
18027}
18028impl From<PropertyFlag> for Option<u8> {
18029    #[inline]
18030    fn from(input: PropertyFlag) -> Self {
18031        Some(input.0)
18032    }
18033}
18034impl From<PropertyFlag> for u16 {
18035    #[inline]
18036    fn from(input: PropertyFlag) -> Self {
18037        u16::from(input.0)
18038    }
18039}
18040impl From<PropertyFlag> for Option<u16> {
18041    #[inline]
18042    fn from(input: PropertyFlag) -> Self {
18043        Some(u16::from(input.0))
18044    }
18045}
18046impl From<PropertyFlag> for u32 {
18047    #[inline]
18048    fn from(input: PropertyFlag) -> Self {
18049        u32::from(input.0)
18050    }
18051}
18052impl From<PropertyFlag> for Option<u32> {
18053    #[inline]
18054    fn from(input: PropertyFlag) -> Self {
18055        Some(u32::from(input.0))
18056    }
18057}
18058impl From<u8> for PropertyFlag {
18059    #[inline]
18060    fn from(value: u8) -> Self {
18061        Self(value)
18062    }
18063}
18064impl core::fmt::Debug for PropertyFlag  {
18065    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
18066        let variants = [
18067            (Self::DELETED.0.into(), "DELETED", "Deleted"),
18068            (Self::CREATED.0.into(), "CREATED", "Created"),
18069            (Self::MODIFIED.0.into(), "MODIFIED", "Modified"),
18070        ];
18071        pretty_print_enum(fmt, self.0.into(), &variants)
18072    }
18073}
18074
18075/// Opcode for the Property event
18076pub const PROPERTY_EVENT: u16 = 12;
18077#[derive(Clone, Copy, Default)]
18078#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18079#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18080pub struct PropertyEvent {
18081    pub response_type: u8,
18082    pub extension: u8,
18083    pub sequence: u16,
18084    pub length: u32,
18085    pub event_type: u16,
18086    pub deviceid: DeviceId,
18087    pub time: xproto::Timestamp,
18088    pub property: xproto::Atom,
18089    pub what: PropertyFlag,
18090}
18091impl_debug_if_no_extra_traits!(PropertyEvent, "PropertyEvent");
18092impl TryParse for PropertyEvent {
18093    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
18094        let remaining = initial_value;
18095        let (response_type, remaining) = u8::try_parse(remaining)?;
18096        let (extension, remaining) = u8::try_parse(remaining)?;
18097        let (sequence, remaining) = u16::try_parse(remaining)?;
18098        let (length, remaining) = u32::try_parse(remaining)?;
18099        let (event_type, remaining) = u16::try_parse(remaining)?;
18100        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
18101        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
18102        let (property, remaining) = xproto::Atom::try_parse(remaining)?;
18103        let (what, remaining) = u8::try_parse(remaining)?;
18104        let remaining = remaining.get(11..).ok_or(ParseError::InsufficientData)?;
18105        let what = what.into();
18106        let result = PropertyEvent { response_type, extension, sequence, length, event_type, deviceid, time, property, what };
18107        let _ = remaining;
18108        let remaining = initial_value.get(32 + length as usize * 4..)
18109            .ok_or(ParseError::InsufficientData)?;
18110        Ok((result, remaining))
18111    }
18112}
18113impl Serialize for PropertyEvent {
18114    type Bytes = [u8; 32];
18115    fn serialize(&self) -> [u8; 32] {
18116        let response_type_bytes = self.response_type.serialize();
18117        let extension_bytes = self.extension.serialize();
18118        let sequence_bytes = self.sequence.serialize();
18119        let length_bytes = self.length.serialize();
18120        let event_type_bytes = self.event_type.serialize();
18121        let deviceid_bytes = self.deviceid.serialize();
18122        let time_bytes = self.time.serialize();
18123        let property_bytes = self.property.serialize();
18124        let what_bytes = u8::from(self.what).serialize();
18125        [
18126            response_type_bytes[0],
18127            extension_bytes[0],
18128            sequence_bytes[0],
18129            sequence_bytes[1],
18130            length_bytes[0],
18131            length_bytes[1],
18132            length_bytes[2],
18133            length_bytes[3],
18134            event_type_bytes[0],
18135            event_type_bytes[1],
18136            deviceid_bytes[0],
18137            deviceid_bytes[1],
18138            time_bytes[0],
18139            time_bytes[1],
18140            time_bytes[2],
18141            time_bytes[3],
18142            property_bytes[0],
18143            property_bytes[1],
18144            property_bytes[2],
18145            property_bytes[3],
18146            what_bytes[0],
18147            0,
18148            0,
18149            0,
18150            0,
18151            0,
18152            0,
18153            0,
18154            0,
18155            0,
18156            0,
18157            0,
18158        ]
18159    }
18160    fn serialize_into(&self, bytes: &mut Vec<u8>) {
18161        bytes.reserve(32);
18162        self.response_type.serialize_into(bytes);
18163        self.extension.serialize_into(bytes);
18164        self.sequence.serialize_into(bytes);
18165        self.length.serialize_into(bytes);
18166        self.event_type.serialize_into(bytes);
18167        self.deviceid.serialize_into(bytes);
18168        self.time.serialize_into(bytes);
18169        self.property.serialize_into(bytes);
18170        u8::from(self.what).serialize_into(bytes);
18171        bytes.extend_from_slice(&[0; 11]);
18172    }
18173}
18174
18175/// Opcode for the RawKeyPress event
18176pub const RAW_KEY_PRESS_EVENT: u16 = 13;
18177#[derive(Clone, Default)]
18178#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18179#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18180pub struct RawKeyPressEvent {
18181    pub response_type: u8,
18182    pub extension: u8,
18183    pub sequence: u16,
18184    pub length: u32,
18185    pub event_type: u16,
18186    pub deviceid: DeviceId,
18187    pub time: xproto::Timestamp,
18188    pub detail: u32,
18189    pub sourceid: DeviceId,
18190    pub flags: KeyEventFlags,
18191    pub valuator_mask: Vec<u32>,
18192    pub axisvalues: Vec<Fp3232>,
18193    pub axisvalues_raw: Vec<Fp3232>,
18194}
18195impl_debug_if_no_extra_traits!(RawKeyPressEvent, "RawKeyPressEvent");
18196impl TryParse for RawKeyPressEvent {
18197    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
18198        let remaining = initial_value;
18199        let (response_type, remaining) = u8::try_parse(remaining)?;
18200        let (extension, remaining) = u8::try_parse(remaining)?;
18201        let (sequence, remaining) = u16::try_parse(remaining)?;
18202        let (length, remaining) = u32::try_parse(remaining)?;
18203        let (event_type, remaining) = u16::try_parse(remaining)?;
18204        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
18205        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
18206        let (detail, remaining) = u32::try_parse(remaining)?;
18207        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
18208        let (valuators_len, remaining) = u16::try_parse(remaining)?;
18209        let (flags, remaining) = u32::try_parse(remaining)?;
18210        let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
18211        let (valuator_mask, remaining) = crate::x11_utils::parse_list::<u32>(remaining, valuators_len.try_to_usize()?)?;
18212        let (axisvalues, remaining) = crate::x11_utils::parse_list::<Fp3232>(remaining, valuator_mask.iter().try_fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).ok_or(ParseError::InvalidExpression))?.try_to_usize()?)?;
18213        let (axisvalues_raw, remaining) = crate::x11_utils::parse_list::<Fp3232>(remaining, valuator_mask.iter().try_fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).ok_or(ParseError::InvalidExpression))?.try_to_usize()?)?;
18214        let flags = flags.into();
18215        let result = RawKeyPressEvent { response_type, extension, sequence, length, event_type, deviceid, time, detail, sourceid, flags, valuator_mask, axisvalues, axisvalues_raw };
18216        let _ = remaining;
18217        let remaining = initial_value.get(32 + length as usize * 4..)
18218            .ok_or(ParseError::InsufficientData)?;
18219        Ok((result, remaining))
18220    }
18221}
18222impl Serialize for RawKeyPressEvent {
18223    type Bytes = Vec<u8>;
18224    fn serialize(&self) -> Vec<u8> {
18225        let mut result = Vec::new();
18226        self.serialize_into(&mut result);
18227        result
18228    }
18229    fn serialize_into(&self, bytes: &mut Vec<u8>) {
18230        bytes.reserve(32);
18231        self.response_type.serialize_into(bytes);
18232        self.extension.serialize_into(bytes);
18233        self.sequence.serialize_into(bytes);
18234        self.length.serialize_into(bytes);
18235        self.event_type.serialize_into(bytes);
18236        self.deviceid.serialize_into(bytes);
18237        self.time.serialize_into(bytes);
18238        self.detail.serialize_into(bytes);
18239        self.sourceid.serialize_into(bytes);
18240        let valuators_len = u16::try_from(self.valuator_mask.len()).expect("`valuator_mask` has too many elements");
18241        valuators_len.serialize_into(bytes);
18242        u32::from(self.flags).serialize_into(bytes);
18243        bytes.extend_from_slice(&[0; 4]);
18244        self.valuator_mask.serialize_into(bytes);
18245        assert_eq!(self.axisvalues.len(), usize::try_from(self.valuator_mask.iter().fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).unwrap())).unwrap(), "`axisvalues` has an incorrect length");
18246        self.axisvalues.serialize_into(bytes);
18247        assert_eq!(self.axisvalues_raw.len(), usize::try_from(self.valuator_mask.iter().fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).unwrap())).unwrap(), "`axisvalues_raw` has an incorrect length");
18248        self.axisvalues_raw.serialize_into(bytes);
18249    }
18250}
18251impl RawKeyPressEvent {
18252    /// Get the value of the `valuators_len` field.
18253    ///
18254    /// The `valuators_len` field is used as the length field of the `valuator_mask` field.
18255    /// This function computes the field's value again based on the length of the list.
18256    ///
18257    /// # Panics
18258    ///
18259    /// Panics if the value cannot be represented in the target type. This
18260    /// cannot happen with values of the struct received from the X11 server.
18261    pub fn valuators_len(&self) -> u16 {
18262        self.valuator_mask.len()
18263            .try_into().unwrap()
18264    }
18265}
18266
18267/// Opcode for the RawKeyRelease event
18268pub const RAW_KEY_RELEASE_EVENT: u16 = 14;
18269pub type RawKeyReleaseEvent = RawKeyPressEvent;
18270
18271/// Opcode for the RawButtonPress event
18272pub const RAW_BUTTON_PRESS_EVENT: u16 = 15;
18273#[derive(Clone, Default)]
18274#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18275#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18276pub struct RawButtonPressEvent {
18277    pub response_type: u8,
18278    pub extension: u8,
18279    pub sequence: u16,
18280    pub length: u32,
18281    pub event_type: u16,
18282    pub deviceid: DeviceId,
18283    pub time: xproto::Timestamp,
18284    pub detail: u32,
18285    pub sourceid: DeviceId,
18286    pub flags: PointerEventFlags,
18287    pub valuator_mask: Vec<u32>,
18288    pub axisvalues: Vec<Fp3232>,
18289    pub axisvalues_raw: Vec<Fp3232>,
18290}
18291impl_debug_if_no_extra_traits!(RawButtonPressEvent, "RawButtonPressEvent");
18292impl TryParse for RawButtonPressEvent {
18293    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
18294        let remaining = initial_value;
18295        let (response_type, remaining) = u8::try_parse(remaining)?;
18296        let (extension, remaining) = u8::try_parse(remaining)?;
18297        let (sequence, remaining) = u16::try_parse(remaining)?;
18298        let (length, remaining) = u32::try_parse(remaining)?;
18299        let (event_type, remaining) = u16::try_parse(remaining)?;
18300        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
18301        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
18302        let (detail, remaining) = u32::try_parse(remaining)?;
18303        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
18304        let (valuators_len, remaining) = u16::try_parse(remaining)?;
18305        let (flags, remaining) = u32::try_parse(remaining)?;
18306        let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
18307        let (valuator_mask, remaining) = crate::x11_utils::parse_list::<u32>(remaining, valuators_len.try_to_usize()?)?;
18308        let (axisvalues, remaining) = crate::x11_utils::parse_list::<Fp3232>(remaining, valuator_mask.iter().try_fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).ok_or(ParseError::InvalidExpression))?.try_to_usize()?)?;
18309        let (axisvalues_raw, remaining) = crate::x11_utils::parse_list::<Fp3232>(remaining, valuator_mask.iter().try_fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).ok_or(ParseError::InvalidExpression))?.try_to_usize()?)?;
18310        let flags = flags.into();
18311        let result = RawButtonPressEvent { response_type, extension, sequence, length, event_type, deviceid, time, detail, sourceid, flags, valuator_mask, axisvalues, axisvalues_raw };
18312        let _ = remaining;
18313        let remaining = initial_value.get(32 + length as usize * 4..)
18314            .ok_or(ParseError::InsufficientData)?;
18315        Ok((result, remaining))
18316    }
18317}
18318impl Serialize for RawButtonPressEvent {
18319    type Bytes = Vec<u8>;
18320    fn serialize(&self) -> Vec<u8> {
18321        let mut result = Vec::new();
18322        self.serialize_into(&mut result);
18323        result
18324    }
18325    fn serialize_into(&self, bytes: &mut Vec<u8>) {
18326        bytes.reserve(32);
18327        self.response_type.serialize_into(bytes);
18328        self.extension.serialize_into(bytes);
18329        self.sequence.serialize_into(bytes);
18330        self.length.serialize_into(bytes);
18331        self.event_type.serialize_into(bytes);
18332        self.deviceid.serialize_into(bytes);
18333        self.time.serialize_into(bytes);
18334        self.detail.serialize_into(bytes);
18335        self.sourceid.serialize_into(bytes);
18336        let valuators_len = u16::try_from(self.valuator_mask.len()).expect("`valuator_mask` has too many elements");
18337        valuators_len.serialize_into(bytes);
18338        u32::from(self.flags).serialize_into(bytes);
18339        bytes.extend_from_slice(&[0; 4]);
18340        self.valuator_mask.serialize_into(bytes);
18341        assert_eq!(self.axisvalues.len(), usize::try_from(self.valuator_mask.iter().fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).unwrap())).unwrap(), "`axisvalues` has an incorrect length");
18342        self.axisvalues.serialize_into(bytes);
18343        assert_eq!(self.axisvalues_raw.len(), usize::try_from(self.valuator_mask.iter().fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).unwrap())).unwrap(), "`axisvalues_raw` has an incorrect length");
18344        self.axisvalues_raw.serialize_into(bytes);
18345    }
18346}
18347impl RawButtonPressEvent {
18348    /// Get the value of the `valuators_len` field.
18349    ///
18350    /// The `valuators_len` field is used as the length field of the `valuator_mask` field.
18351    /// This function computes the field's value again based on the length of the list.
18352    ///
18353    /// # Panics
18354    ///
18355    /// Panics if the value cannot be represented in the target type. This
18356    /// cannot happen with values of the struct received from the X11 server.
18357    pub fn valuators_len(&self) -> u16 {
18358        self.valuator_mask.len()
18359            .try_into().unwrap()
18360    }
18361}
18362
18363/// Opcode for the RawButtonRelease event
18364pub const RAW_BUTTON_RELEASE_EVENT: u16 = 16;
18365pub type RawButtonReleaseEvent = RawButtonPressEvent;
18366
18367/// Opcode for the RawMotion event
18368pub const RAW_MOTION_EVENT: u16 = 17;
18369pub type RawMotionEvent = RawButtonPressEvent;
18370
18371#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
18372#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18373pub struct TouchEventFlags(u32);
18374impl TouchEventFlags {
18375    pub const TOUCH_PENDING_END: Self = Self(1 << 16);
18376    pub const TOUCH_EMULATING_POINTER: Self = Self(1 << 17);
18377}
18378impl From<TouchEventFlags> for u32 {
18379    #[inline]
18380    fn from(input: TouchEventFlags) -> Self {
18381        input.0
18382    }
18383}
18384impl From<TouchEventFlags> for Option<u32> {
18385    #[inline]
18386    fn from(input: TouchEventFlags) -> Self {
18387        Some(input.0)
18388    }
18389}
18390impl From<u8> for TouchEventFlags {
18391    #[inline]
18392    fn from(value: u8) -> Self {
18393        Self(value.into())
18394    }
18395}
18396impl From<u16> for TouchEventFlags {
18397    #[inline]
18398    fn from(value: u16) -> Self {
18399        Self(value.into())
18400    }
18401}
18402impl From<u32> for TouchEventFlags {
18403    #[inline]
18404    fn from(value: u32) -> Self {
18405        Self(value)
18406    }
18407}
18408impl core::fmt::Debug for TouchEventFlags  {
18409    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
18410        let variants = [
18411            (Self::TOUCH_PENDING_END.0, "TOUCH_PENDING_END", "TouchPendingEnd"),
18412            (Self::TOUCH_EMULATING_POINTER.0, "TOUCH_EMULATING_POINTER", "TouchEmulatingPointer"),
18413        ];
18414        pretty_print_bitmask(fmt, self.0, &variants)
18415    }
18416}
18417bitmask_binop!(TouchEventFlags, u32);
18418
18419/// Opcode for the TouchBegin event
18420pub const TOUCH_BEGIN_EVENT: u16 = 18;
18421#[derive(Clone, Default)]
18422#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18423#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18424pub struct TouchBeginEvent {
18425    pub response_type: u8,
18426    pub extension: u8,
18427    pub sequence: u16,
18428    pub length: u32,
18429    pub event_type: u16,
18430    pub deviceid: DeviceId,
18431    pub time: xproto::Timestamp,
18432    pub detail: u32,
18433    pub root: xproto::Window,
18434    pub event: xproto::Window,
18435    pub child: xproto::Window,
18436    pub root_x: Fp1616,
18437    pub root_y: Fp1616,
18438    pub event_x: Fp1616,
18439    pub event_y: Fp1616,
18440    pub sourceid: DeviceId,
18441    pub flags: TouchEventFlags,
18442    pub mods: ModifierInfo,
18443    pub group: GroupInfo,
18444    pub button_mask: Vec<u32>,
18445    pub valuator_mask: Vec<u32>,
18446    pub axisvalues: Vec<Fp3232>,
18447}
18448impl_debug_if_no_extra_traits!(TouchBeginEvent, "TouchBeginEvent");
18449impl TryParse for TouchBeginEvent {
18450    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
18451        let remaining = initial_value;
18452        let (response_type, remaining) = u8::try_parse(remaining)?;
18453        let (extension, remaining) = u8::try_parse(remaining)?;
18454        let (sequence, remaining) = u16::try_parse(remaining)?;
18455        let (length, remaining) = u32::try_parse(remaining)?;
18456        let (event_type, remaining) = u16::try_parse(remaining)?;
18457        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
18458        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
18459        let (detail, remaining) = u32::try_parse(remaining)?;
18460        let (root, remaining) = xproto::Window::try_parse(remaining)?;
18461        let (event, remaining) = xproto::Window::try_parse(remaining)?;
18462        let (child, remaining) = xproto::Window::try_parse(remaining)?;
18463        let (root_x, remaining) = Fp1616::try_parse(remaining)?;
18464        let (root_y, remaining) = Fp1616::try_parse(remaining)?;
18465        let (event_x, remaining) = Fp1616::try_parse(remaining)?;
18466        let (event_y, remaining) = Fp1616::try_parse(remaining)?;
18467        let (buttons_len, remaining) = u16::try_parse(remaining)?;
18468        let (valuators_len, remaining) = u16::try_parse(remaining)?;
18469        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
18470        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
18471        let (flags, remaining) = u32::try_parse(remaining)?;
18472        let (mods, remaining) = ModifierInfo::try_parse(remaining)?;
18473        let (group, remaining) = GroupInfo::try_parse(remaining)?;
18474        let (button_mask, remaining) = crate::x11_utils::parse_list::<u32>(remaining, buttons_len.try_to_usize()?)?;
18475        let (valuator_mask, remaining) = crate::x11_utils::parse_list::<u32>(remaining, valuators_len.try_to_usize()?)?;
18476        let (axisvalues, remaining) = crate::x11_utils::parse_list::<Fp3232>(remaining, valuator_mask.iter().try_fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).ok_or(ParseError::InvalidExpression))?.try_to_usize()?)?;
18477        let flags = flags.into();
18478        let result = TouchBeginEvent { response_type, extension, sequence, length, event_type, deviceid, time, detail, root, event, child, root_x, root_y, event_x, event_y, sourceid, flags, mods, group, button_mask, valuator_mask, axisvalues };
18479        let _ = remaining;
18480        let remaining = initial_value.get(32 + length as usize * 4..)
18481            .ok_or(ParseError::InsufficientData)?;
18482        Ok((result, remaining))
18483    }
18484}
18485impl Serialize for TouchBeginEvent {
18486    type Bytes = Vec<u8>;
18487    fn serialize(&self) -> Vec<u8> {
18488        let mut result = Vec::new();
18489        self.serialize_into(&mut result);
18490        result
18491    }
18492    fn serialize_into(&self, bytes: &mut Vec<u8>) {
18493        bytes.reserve(80);
18494        self.response_type.serialize_into(bytes);
18495        self.extension.serialize_into(bytes);
18496        self.sequence.serialize_into(bytes);
18497        self.length.serialize_into(bytes);
18498        self.event_type.serialize_into(bytes);
18499        self.deviceid.serialize_into(bytes);
18500        self.time.serialize_into(bytes);
18501        self.detail.serialize_into(bytes);
18502        self.root.serialize_into(bytes);
18503        self.event.serialize_into(bytes);
18504        self.child.serialize_into(bytes);
18505        self.root_x.serialize_into(bytes);
18506        self.root_y.serialize_into(bytes);
18507        self.event_x.serialize_into(bytes);
18508        self.event_y.serialize_into(bytes);
18509        let buttons_len = u16::try_from(self.button_mask.len()).expect("`button_mask` has too many elements");
18510        buttons_len.serialize_into(bytes);
18511        let valuators_len = u16::try_from(self.valuator_mask.len()).expect("`valuator_mask` has too many elements");
18512        valuators_len.serialize_into(bytes);
18513        self.sourceid.serialize_into(bytes);
18514        bytes.extend_from_slice(&[0; 2]);
18515        u32::from(self.flags).serialize_into(bytes);
18516        self.mods.serialize_into(bytes);
18517        self.group.serialize_into(bytes);
18518        self.button_mask.serialize_into(bytes);
18519        self.valuator_mask.serialize_into(bytes);
18520        assert_eq!(self.axisvalues.len(), usize::try_from(self.valuator_mask.iter().fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).unwrap())).unwrap(), "`axisvalues` has an incorrect length");
18521        self.axisvalues.serialize_into(bytes);
18522    }
18523}
18524impl TouchBeginEvent {
18525    /// Get the value of the `buttons_len` field.
18526    ///
18527    /// The `buttons_len` field is used as the length field of the `button_mask` field.
18528    /// This function computes the field's value again based on the length of the list.
18529    ///
18530    /// # Panics
18531    ///
18532    /// Panics if the value cannot be represented in the target type. This
18533    /// cannot happen with values of the struct received from the X11 server.
18534    pub fn buttons_len(&self) -> u16 {
18535        self.button_mask.len()
18536            .try_into().unwrap()
18537    }
18538    /// Get the value of the `valuators_len` field.
18539    ///
18540    /// The `valuators_len` field is used as the length field of the `valuator_mask` field.
18541    /// This function computes the field's value again based on the length of the list.
18542    ///
18543    /// # Panics
18544    ///
18545    /// Panics if the value cannot be represented in the target type. This
18546    /// cannot happen with values of the struct received from the X11 server.
18547    pub fn valuators_len(&self) -> u16 {
18548        self.valuator_mask.len()
18549            .try_into().unwrap()
18550    }
18551}
18552
18553/// Opcode for the TouchUpdate event
18554pub const TOUCH_UPDATE_EVENT: u16 = 19;
18555pub type TouchUpdateEvent = TouchBeginEvent;
18556
18557/// Opcode for the TouchEnd event
18558pub const TOUCH_END_EVENT: u16 = 20;
18559pub type TouchEndEvent = TouchBeginEvent;
18560
18561#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
18562#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18563pub struct TouchOwnershipFlags(u32);
18564impl TouchOwnershipFlags {
18565    pub const NONE: Self = Self(0);
18566}
18567impl From<TouchOwnershipFlags> for u32 {
18568    #[inline]
18569    fn from(input: TouchOwnershipFlags) -> Self {
18570        input.0
18571    }
18572}
18573impl From<TouchOwnershipFlags> for Option<u32> {
18574    #[inline]
18575    fn from(input: TouchOwnershipFlags) -> Self {
18576        Some(input.0)
18577    }
18578}
18579impl From<u8> for TouchOwnershipFlags {
18580    #[inline]
18581    fn from(value: u8) -> Self {
18582        Self(value.into())
18583    }
18584}
18585impl From<u16> for TouchOwnershipFlags {
18586    #[inline]
18587    fn from(value: u16) -> Self {
18588        Self(value.into())
18589    }
18590}
18591impl From<u32> for TouchOwnershipFlags {
18592    #[inline]
18593    fn from(value: u32) -> Self {
18594        Self(value)
18595    }
18596}
18597impl core::fmt::Debug for TouchOwnershipFlags  {
18598    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
18599        let variants = [
18600            (Self::NONE.0, "NONE", "None"),
18601        ];
18602        pretty_print_enum(fmt, self.0, &variants)
18603    }
18604}
18605
18606/// Opcode for the TouchOwnership event
18607pub const TOUCH_OWNERSHIP_EVENT: u16 = 21;
18608#[derive(Clone, Copy, Default)]
18609#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18610#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18611pub struct TouchOwnershipEvent {
18612    pub response_type: u8,
18613    pub extension: u8,
18614    pub sequence: u16,
18615    pub length: u32,
18616    pub event_type: u16,
18617    pub deviceid: DeviceId,
18618    pub time: xproto::Timestamp,
18619    pub touchid: u32,
18620    pub root: xproto::Window,
18621    pub event: xproto::Window,
18622    pub child: xproto::Window,
18623    pub sourceid: DeviceId,
18624    pub flags: TouchOwnershipFlags,
18625}
18626impl_debug_if_no_extra_traits!(TouchOwnershipEvent, "TouchOwnershipEvent");
18627impl TryParse for TouchOwnershipEvent {
18628    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
18629        let remaining = initial_value;
18630        let (response_type, remaining) = u8::try_parse(remaining)?;
18631        let (extension, remaining) = u8::try_parse(remaining)?;
18632        let (sequence, remaining) = u16::try_parse(remaining)?;
18633        let (length, remaining) = u32::try_parse(remaining)?;
18634        let (event_type, remaining) = u16::try_parse(remaining)?;
18635        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
18636        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
18637        let (touchid, remaining) = u32::try_parse(remaining)?;
18638        let (root, remaining) = xproto::Window::try_parse(remaining)?;
18639        let (event, remaining) = xproto::Window::try_parse(remaining)?;
18640        let (child, remaining) = xproto::Window::try_parse(remaining)?;
18641        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
18642        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
18643        let (flags, remaining) = u32::try_parse(remaining)?;
18644        let remaining = remaining.get(8..).ok_or(ParseError::InsufficientData)?;
18645        let flags = flags.into();
18646        let result = TouchOwnershipEvent { response_type, extension, sequence, length, event_type, deviceid, time, touchid, root, event, child, sourceid, flags };
18647        let _ = remaining;
18648        let remaining = initial_value.get(32 + length as usize * 4..)
18649            .ok_or(ParseError::InsufficientData)?;
18650        Ok((result, remaining))
18651    }
18652}
18653impl Serialize for TouchOwnershipEvent {
18654    type Bytes = [u8; 48];
18655    fn serialize(&self) -> [u8; 48] {
18656        let response_type_bytes = self.response_type.serialize();
18657        let extension_bytes = self.extension.serialize();
18658        let sequence_bytes = self.sequence.serialize();
18659        let length_bytes = self.length.serialize();
18660        let event_type_bytes = self.event_type.serialize();
18661        let deviceid_bytes = self.deviceid.serialize();
18662        let time_bytes = self.time.serialize();
18663        let touchid_bytes = self.touchid.serialize();
18664        let root_bytes = self.root.serialize();
18665        let event_bytes = self.event.serialize();
18666        let child_bytes = self.child.serialize();
18667        let sourceid_bytes = self.sourceid.serialize();
18668        let flags_bytes = u32::from(self.flags).serialize();
18669        [
18670            response_type_bytes[0],
18671            extension_bytes[0],
18672            sequence_bytes[0],
18673            sequence_bytes[1],
18674            length_bytes[0],
18675            length_bytes[1],
18676            length_bytes[2],
18677            length_bytes[3],
18678            event_type_bytes[0],
18679            event_type_bytes[1],
18680            deviceid_bytes[0],
18681            deviceid_bytes[1],
18682            time_bytes[0],
18683            time_bytes[1],
18684            time_bytes[2],
18685            time_bytes[3],
18686            touchid_bytes[0],
18687            touchid_bytes[1],
18688            touchid_bytes[2],
18689            touchid_bytes[3],
18690            root_bytes[0],
18691            root_bytes[1],
18692            root_bytes[2],
18693            root_bytes[3],
18694            event_bytes[0],
18695            event_bytes[1],
18696            event_bytes[2],
18697            event_bytes[3],
18698            child_bytes[0],
18699            child_bytes[1],
18700            child_bytes[2],
18701            child_bytes[3],
18702            sourceid_bytes[0],
18703            sourceid_bytes[1],
18704            0,
18705            0,
18706            flags_bytes[0],
18707            flags_bytes[1],
18708            flags_bytes[2],
18709            flags_bytes[3],
18710            0,
18711            0,
18712            0,
18713            0,
18714            0,
18715            0,
18716            0,
18717            0,
18718        ]
18719    }
18720    fn serialize_into(&self, bytes: &mut Vec<u8>) {
18721        bytes.reserve(48);
18722        self.response_type.serialize_into(bytes);
18723        self.extension.serialize_into(bytes);
18724        self.sequence.serialize_into(bytes);
18725        self.length.serialize_into(bytes);
18726        self.event_type.serialize_into(bytes);
18727        self.deviceid.serialize_into(bytes);
18728        self.time.serialize_into(bytes);
18729        self.touchid.serialize_into(bytes);
18730        self.root.serialize_into(bytes);
18731        self.event.serialize_into(bytes);
18732        self.child.serialize_into(bytes);
18733        self.sourceid.serialize_into(bytes);
18734        bytes.extend_from_slice(&[0; 2]);
18735        u32::from(self.flags).serialize_into(bytes);
18736        bytes.extend_from_slice(&[0; 8]);
18737    }
18738}
18739
18740/// Opcode for the RawTouchBegin event
18741pub const RAW_TOUCH_BEGIN_EVENT: u16 = 22;
18742#[derive(Clone, Default)]
18743#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18744#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18745pub struct RawTouchBeginEvent {
18746    pub response_type: u8,
18747    pub extension: u8,
18748    pub sequence: u16,
18749    pub length: u32,
18750    pub event_type: u16,
18751    pub deviceid: DeviceId,
18752    pub time: xproto::Timestamp,
18753    pub detail: u32,
18754    pub sourceid: DeviceId,
18755    pub flags: TouchEventFlags,
18756    pub valuator_mask: Vec<u32>,
18757    pub axisvalues: Vec<Fp3232>,
18758    pub axisvalues_raw: Vec<Fp3232>,
18759}
18760impl_debug_if_no_extra_traits!(RawTouchBeginEvent, "RawTouchBeginEvent");
18761impl TryParse for RawTouchBeginEvent {
18762    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
18763        let remaining = initial_value;
18764        let (response_type, remaining) = u8::try_parse(remaining)?;
18765        let (extension, remaining) = u8::try_parse(remaining)?;
18766        let (sequence, remaining) = u16::try_parse(remaining)?;
18767        let (length, remaining) = u32::try_parse(remaining)?;
18768        let (event_type, remaining) = u16::try_parse(remaining)?;
18769        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
18770        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
18771        let (detail, remaining) = u32::try_parse(remaining)?;
18772        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
18773        let (valuators_len, remaining) = u16::try_parse(remaining)?;
18774        let (flags, remaining) = u32::try_parse(remaining)?;
18775        let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
18776        let (valuator_mask, remaining) = crate::x11_utils::parse_list::<u32>(remaining, valuators_len.try_to_usize()?)?;
18777        let (axisvalues, remaining) = crate::x11_utils::parse_list::<Fp3232>(remaining, valuator_mask.iter().try_fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).ok_or(ParseError::InvalidExpression))?.try_to_usize()?)?;
18778        let (axisvalues_raw, remaining) = crate::x11_utils::parse_list::<Fp3232>(remaining, valuator_mask.iter().try_fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).ok_or(ParseError::InvalidExpression))?.try_to_usize()?)?;
18779        let flags = flags.into();
18780        let result = RawTouchBeginEvent { response_type, extension, sequence, length, event_type, deviceid, time, detail, sourceid, flags, valuator_mask, axisvalues, axisvalues_raw };
18781        let _ = remaining;
18782        let remaining = initial_value.get(32 + length as usize * 4..)
18783            .ok_or(ParseError::InsufficientData)?;
18784        Ok((result, remaining))
18785    }
18786}
18787impl Serialize for RawTouchBeginEvent {
18788    type Bytes = Vec<u8>;
18789    fn serialize(&self) -> Vec<u8> {
18790        let mut result = Vec::new();
18791        self.serialize_into(&mut result);
18792        result
18793    }
18794    fn serialize_into(&self, bytes: &mut Vec<u8>) {
18795        bytes.reserve(32);
18796        self.response_type.serialize_into(bytes);
18797        self.extension.serialize_into(bytes);
18798        self.sequence.serialize_into(bytes);
18799        self.length.serialize_into(bytes);
18800        self.event_type.serialize_into(bytes);
18801        self.deviceid.serialize_into(bytes);
18802        self.time.serialize_into(bytes);
18803        self.detail.serialize_into(bytes);
18804        self.sourceid.serialize_into(bytes);
18805        let valuators_len = u16::try_from(self.valuator_mask.len()).expect("`valuator_mask` has too many elements");
18806        valuators_len.serialize_into(bytes);
18807        u32::from(self.flags).serialize_into(bytes);
18808        bytes.extend_from_slice(&[0; 4]);
18809        self.valuator_mask.serialize_into(bytes);
18810        assert_eq!(self.axisvalues.len(), usize::try_from(self.valuator_mask.iter().fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).unwrap())).unwrap(), "`axisvalues` has an incorrect length");
18811        self.axisvalues.serialize_into(bytes);
18812        assert_eq!(self.axisvalues_raw.len(), usize::try_from(self.valuator_mask.iter().fold(0u32, |acc, x| acc.checked_add(u32::from(*x).count_ones()).unwrap())).unwrap(), "`axisvalues_raw` has an incorrect length");
18813        self.axisvalues_raw.serialize_into(bytes);
18814    }
18815}
18816impl RawTouchBeginEvent {
18817    /// Get the value of the `valuators_len` field.
18818    ///
18819    /// The `valuators_len` field is used as the length field of the `valuator_mask` field.
18820    /// This function computes the field's value again based on the length of the list.
18821    ///
18822    /// # Panics
18823    ///
18824    /// Panics if the value cannot be represented in the target type. This
18825    /// cannot happen with values of the struct received from the X11 server.
18826    pub fn valuators_len(&self) -> u16 {
18827        self.valuator_mask.len()
18828            .try_into().unwrap()
18829    }
18830}
18831
18832/// Opcode for the RawTouchUpdate event
18833pub const RAW_TOUCH_UPDATE_EVENT: u16 = 23;
18834pub type RawTouchUpdateEvent = RawTouchBeginEvent;
18835
18836/// Opcode for the RawTouchEnd event
18837pub const RAW_TOUCH_END_EVENT: u16 = 24;
18838pub type RawTouchEndEvent = RawTouchBeginEvent;
18839
18840#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
18841#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18842pub struct BarrierFlags(u32);
18843impl BarrierFlags {
18844    pub const POINTER_RELEASED: Self = Self(1 << 0);
18845    pub const DEVICE_IS_GRABBED: Self = Self(1 << 1);
18846}
18847impl From<BarrierFlags> for u32 {
18848    #[inline]
18849    fn from(input: BarrierFlags) -> Self {
18850        input.0
18851    }
18852}
18853impl From<BarrierFlags> for Option<u32> {
18854    #[inline]
18855    fn from(input: BarrierFlags) -> Self {
18856        Some(input.0)
18857    }
18858}
18859impl From<u8> for BarrierFlags {
18860    #[inline]
18861    fn from(value: u8) -> Self {
18862        Self(value.into())
18863    }
18864}
18865impl From<u16> for BarrierFlags {
18866    #[inline]
18867    fn from(value: u16) -> Self {
18868        Self(value.into())
18869    }
18870}
18871impl From<u32> for BarrierFlags {
18872    #[inline]
18873    fn from(value: u32) -> Self {
18874        Self(value)
18875    }
18876}
18877impl core::fmt::Debug for BarrierFlags  {
18878    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
18879        let variants = [
18880            (Self::POINTER_RELEASED.0, "POINTER_RELEASED", "PointerReleased"),
18881            (Self::DEVICE_IS_GRABBED.0, "DEVICE_IS_GRABBED", "DeviceIsGrabbed"),
18882        ];
18883        pretty_print_bitmask(fmt, self.0, &variants)
18884    }
18885}
18886bitmask_binop!(BarrierFlags, u32);
18887
18888/// Opcode for the BarrierHit event
18889pub const BARRIER_HIT_EVENT: u16 = 25;
18890#[derive(Clone, Copy, Default)]
18891#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
18892#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18893pub struct BarrierHitEvent {
18894    pub response_type: u8,
18895    pub extension: u8,
18896    pub sequence: u16,
18897    pub length: u32,
18898    pub event_type: u16,
18899    pub deviceid: DeviceId,
18900    pub time: xproto::Timestamp,
18901    pub eventid: u32,
18902    pub root: xproto::Window,
18903    pub event: xproto::Window,
18904    pub barrier: xfixes::Barrier,
18905    pub dtime: u32,
18906    pub flags: BarrierFlags,
18907    pub sourceid: DeviceId,
18908    pub root_x: Fp1616,
18909    pub root_y: Fp1616,
18910    pub dx: Fp3232,
18911    pub dy: Fp3232,
18912}
18913impl_debug_if_no_extra_traits!(BarrierHitEvent, "BarrierHitEvent");
18914impl TryParse for BarrierHitEvent {
18915    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
18916        let remaining = initial_value;
18917        let (response_type, remaining) = u8::try_parse(remaining)?;
18918        let (extension, remaining) = u8::try_parse(remaining)?;
18919        let (sequence, remaining) = u16::try_parse(remaining)?;
18920        let (length, remaining) = u32::try_parse(remaining)?;
18921        let (event_type, remaining) = u16::try_parse(remaining)?;
18922        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
18923        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
18924        let (eventid, remaining) = u32::try_parse(remaining)?;
18925        let (root, remaining) = xproto::Window::try_parse(remaining)?;
18926        let (event, remaining) = xproto::Window::try_parse(remaining)?;
18927        let (barrier, remaining) = xfixes::Barrier::try_parse(remaining)?;
18928        let (dtime, remaining) = u32::try_parse(remaining)?;
18929        let (flags, remaining) = u32::try_parse(remaining)?;
18930        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
18931        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
18932        let (root_x, remaining) = Fp1616::try_parse(remaining)?;
18933        let (root_y, remaining) = Fp1616::try_parse(remaining)?;
18934        let (dx, remaining) = Fp3232::try_parse(remaining)?;
18935        let (dy, remaining) = Fp3232::try_parse(remaining)?;
18936        let flags = flags.into();
18937        let result = BarrierHitEvent { response_type, extension, sequence, length, event_type, deviceid, time, eventid, root, event, barrier, dtime, flags, sourceid, root_x, root_y, dx, dy };
18938        let _ = remaining;
18939        let remaining = initial_value.get(32 + length as usize * 4..)
18940            .ok_or(ParseError::InsufficientData)?;
18941        Ok((result, remaining))
18942    }
18943}
18944impl Serialize for BarrierHitEvent {
18945    type Bytes = [u8; 68];
18946    fn serialize(&self) -> [u8; 68] {
18947        let response_type_bytes = self.response_type.serialize();
18948        let extension_bytes = self.extension.serialize();
18949        let sequence_bytes = self.sequence.serialize();
18950        let length_bytes = self.length.serialize();
18951        let event_type_bytes = self.event_type.serialize();
18952        let deviceid_bytes = self.deviceid.serialize();
18953        let time_bytes = self.time.serialize();
18954        let eventid_bytes = self.eventid.serialize();
18955        let root_bytes = self.root.serialize();
18956        let event_bytes = self.event.serialize();
18957        let barrier_bytes = self.barrier.serialize();
18958        let dtime_bytes = self.dtime.serialize();
18959        let flags_bytes = u32::from(self.flags).serialize();
18960        let sourceid_bytes = self.sourceid.serialize();
18961        let root_x_bytes = self.root_x.serialize();
18962        let root_y_bytes = self.root_y.serialize();
18963        let dx_bytes = self.dx.serialize();
18964        let dy_bytes = self.dy.serialize();
18965        [
18966            response_type_bytes[0],
18967            extension_bytes[0],
18968            sequence_bytes[0],
18969            sequence_bytes[1],
18970            length_bytes[0],
18971            length_bytes[1],
18972            length_bytes[2],
18973            length_bytes[3],
18974            event_type_bytes[0],
18975            event_type_bytes[1],
18976            deviceid_bytes[0],
18977            deviceid_bytes[1],
18978            time_bytes[0],
18979            time_bytes[1],
18980            time_bytes[2],
18981            time_bytes[3],
18982            eventid_bytes[0],
18983            eventid_bytes[1],
18984            eventid_bytes[2],
18985            eventid_bytes[3],
18986            root_bytes[0],
18987            root_bytes[1],
18988            root_bytes[2],
18989            root_bytes[3],
18990            event_bytes[0],
18991            event_bytes[1],
18992            event_bytes[2],
18993            event_bytes[3],
18994            barrier_bytes[0],
18995            barrier_bytes[1],
18996            barrier_bytes[2],
18997            barrier_bytes[3],
18998            dtime_bytes[0],
18999            dtime_bytes[1],
19000            dtime_bytes[2],
19001            dtime_bytes[3],
19002            flags_bytes[0],
19003            flags_bytes[1],
19004            flags_bytes[2],
19005            flags_bytes[3],
19006            sourceid_bytes[0],
19007            sourceid_bytes[1],
19008            0,
19009            0,
19010            root_x_bytes[0],
19011            root_x_bytes[1],
19012            root_x_bytes[2],
19013            root_x_bytes[3],
19014            root_y_bytes[0],
19015            root_y_bytes[1],
19016            root_y_bytes[2],
19017            root_y_bytes[3],
19018            dx_bytes[0],
19019            dx_bytes[1],
19020            dx_bytes[2],
19021            dx_bytes[3],
19022            dx_bytes[4],
19023            dx_bytes[5],
19024            dx_bytes[6],
19025            dx_bytes[7],
19026            dy_bytes[0],
19027            dy_bytes[1],
19028            dy_bytes[2],
19029            dy_bytes[3],
19030            dy_bytes[4],
19031            dy_bytes[5],
19032            dy_bytes[6],
19033            dy_bytes[7],
19034        ]
19035    }
19036    fn serialize_into(&self, bytes: &mut Vec<u8>) {
19037        bytes.reserve(68);
19038        self.response_type.serialize_into(bytes);
19039        self.extension.serialize_into(bytes);
19040        self.sequence.serialize_into(bytes);
19041        self.length.serialize_into(bytes);
19042        self.event_type.serialize_into(bytes);
19043        self.deviceid.serialize_into(bytes);
19044        self.time.serialize_into(bytes);
19045        self.eventid.serialize_into(bytes);
19046        self.root.serialize_into(bytes);
19047        self.event.serialize_into(bytes);
19048        self.barrier.serialize_into(bytes);
19049        self.dtime.serialize_into(bytes);
19050        u32::from(self.flags).serialize_into(bytes);
19051        self.sourceid.serialize_into(bytes);
19052        bytes.extend_from_slice(&[0; 2]);
19053        self.root_x.serialize_into(bytes);
19054        self.root_y.serialize_into(bytes);
19055        self.dx.serialize_into(bytes);
19056        self.dy.serialize_into(bytes);
19057    }
19058}
19059
19060/// Opcode for the BarrierLeave event
19061pub const BARRIER_LEAVE_EVENT: u16 = 26;
19062pub type BarrierLeaveEvent = BarrierHitEvent;
19063
19064#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
19065#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19066pub struct GesturePinchEventFlags(u32);
19067impl GesturePinchEventFlags {
19068    pub const GESTURE_PINCH_CANCELLED: Self = Self(1 << 0);
19069}
19070impl From<GesturePinchEventFlags> for u32 {
19071    #[inline]
19072    fn from(input: GesturePinchEventFlags) -> Self {
19073        input.0
19074    }
19075}
19076impl From<GesturePinchEventFlags> for Option<u32> {
19077    #[inline]
19078    fn from(input: GesturePinchEventFlags) -> Self {
19079        Some(input.0)
19080    }
19081}
19082impl From<u8> for GesturePinchEventFlags {
19083    #[inline]
19084    fn from(value: u8) -> Self {
19085        Self(value.into())
19086    }
19087}
19088impl From<u16> for GesturePinchEventFlags {
19089    #[inline]
19090    fn from(value: u16) -> Self {
19091        Self(value.into())
19092    }
19093}
19094impl From<u32> for GesturePinchEventFlags {
19095    #[inline]
19096    fn from(value: u32) -> Self {
19097        Self(value)
19098    }
19099}
19100impl core::fmt::Debug for GesturePinchEventFlags  {
19101    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
19102        let variants = [
19103            (Self::GESTURE_PINCH_CANCELLED.0, "GESTURE_PINCH_CANCELLED", "GesturePinchCancelled"),
19104        ];
19105        pretty_print_bitmask(fmt, self.0, &variants)
19106    }
19107}
19108bitmask_binop!(GesturePinchEventFlags, u32);
19109
19110/// Opcode for the GesturePinchBegin event
19111pub const GESTURE_PINCH_BEGIN_EVENT: u16 = 27;
19112#[derive(Clone, Copy, Default)]
19113#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
19114#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19115pub struct GesturePinchBeginEvent {
19116    pub response_type: u8,
19117    pub extension: u8,
19118    pub sequence: u16,
19119    pub length: u32,
19120    pub event_type: u16,
19121    pub deviceid: DeviceId,
19122    pub time: xproto::Timestamp,
19123    pub detail: u32,
19124    pub root: xproto::Window,
19125    pub event: xproto::Window,
19126    pub child: xproto::Window,
19127    pub root_x: Fp1616,
19128    pub root_y: Fp1616,
19129    pub event_x: Fp1616,
19130    pub event_y: Fp1616,
19131    pub delta_x: Fp1616,
19132    pub delta_y: Fp1616,
19133    pub delta_unaccel_x: Fp1616,
19134    pub delta_unaccel_y: Fp1616,
19135    pub scale: Fp1616,
19136    pub delta_angle: Fp1616,
19137    pub sourceid: DeviceId,
19138    pub mods: ModifierInfo,
19139    pub group: GroupInfo,
19140    pub flags: GesturePinchEventFlags,
19141}
19142impl_debug_if_no_extra_traits!(GesturePinchBeginEvent, "GesturePinchBeginEvent");
19143impl TryParse for GesturePinchBeginEvent {
19144    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
19145        let remaining = initial_value;
19146        let (response_type, remaining) = u8::try_parse(remaining)?;
19147        let (extension, remaining) = u8::try_parse(remaining)?;
19148        let (sequence, remaining) = u16::try_parse(remaining)?;
19149        let (length, remaining) = u32::try_parse(remaining)?;
19150        let (event_type, remaining) = u16::try_parse(remaining)?;
19151        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
19152        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
19153        let (detail, remaining) = u32::try_parse(remaining)?;
19154        let (root, remaining) = xproto::Window::try_parse(remaining)?;
19155        let (event, remaining) = xproto::Window::try_parse(remaining)?;
19156        let (child, remaining) = xproto::Window::try_parse(remaining)?;
19157        let (root_x, remaining) = Fp1616::try_parse(remaining)?;
19158        let (root_y, remaining) = Fp1616::try_parse(remaining)?;
19159        let (event_x, remaining) = Fp1616::try_parse(remaining)?;
19160        let (event_y, remaining) = Fp1616::try_parse(remaining)?;
19161        let (delta_x, remaining) = Fp1616::try_parse(remaining)?;
19162        let (delta_y, remaining) = Fp1616::try_parse(remaining)?;
19163        let (delta_unaccel_x, remaining) = Fp1616::try_parse(remaining)?;
19164        let (delta_unaccel_y, remaining) = Fp1616::try_parse(remaining)?;
19165        let (scale, remaining) = Fp1616::try_parse(remaining)?;
19166        let (delta_angle, remaining) = Fp1616::try_parse(remaining)?;
19167        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
19168        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
19169        let (mods, remaining) = ModifierInfo::try_parse(remaining)?;
19170        let (group, remaining) = GroupInfo::try_parse(remaining)?;
19171        let (flags, remaining) = u32::try_parse(remaining)?;
19172        let flags = flags.into();
19173        let result = GesturePinchBeginEvent { response_type, extension, sequence, length, event_type, deviceid, time, detail, root, event, child, root_x, root_y, event_x, event_y, delta_x, delta_y, delta_unaccel_x, delta_unaccel_y, scale, delta_angle, sourceid, mods, group, flags };
19174        let _ = remaining;
19175        let remaining = initial_value.get(32 + length as usize * 4..)
19176            .ok_or(ParseError::InsufficientData)?;
19177        Ok((result, remaining))
19178    }
19179}
19180impl Serialize for GesturePinchBeginEvent {
19181    type Bytes = [u8; 100];
19182    fn serialize(&self) -> [u8; 100] {
19183        let response_type_bytes = self.response_type.serialize();
19184        let extension_bytes = self.extension.serialize();
19185        let sequence_bytes = self.sequence.serialize();
19186        let length_bytes = self.length.serialize();
19187        let event_type_bytes = self.event_type.serialize();
19188        let deviceid_bytes = self.deviceid.serialize();
19189        let time_bytes = self.time.serialize();
19190        let detail_bytes = self.detail.serialize();
19191        let root_bytes = self.root.serialize();
19192        let event_bytes = self.event.serialize();
19193        let child_bytes = self.child.serialize();
19194        let root_x_bytes = self.root_x.serialize();
19195        let root_y_bytes = self.root_y.serialize();
19196        let event_x_bytes = self.event_x.serialize();
19197        let event_y_bytes = self.event_y.serialize();
19198        let delta_x_bytes = self.delta_x.serialize();
19199        let delta_y_bytes = self.delta_y.serialize();
19200        let delta_unaccel_x_bytes = self.delta_unaccel_x.serialize();
19201        let delta_unaccel_y_bytes = self.delta_unaccel_y.serialize();
19202        let scale_bytes = self.scale.serialize();
19203        let delta_angle_bytes = self.delta_angle.serialize();
19204        let sourceid_bytes = self.sourceid.serialize();
19205        let mods_bytes = self.mods.serialize();
19206        let group_bytes = self.group.serialize();
19207        let flags_bytes = u32::from(self.flags).serialize();
19208        [
19209            response_type_bytes[0],
19210            extension_bytes[0],
19211            sequence_bytes[0],
19212            sequence_bytes[1],
19213            length_bytes[0],
19214            length_bytes[1],
19215            length_bytes[2],
19216            length_bytes[3],
19217            event_type_bytes[0],
19218            event_type_bytes[1],
19219            deviceid_bytes[0],
19220            deviceid_bytes[1],
19221            time_bytes[0],
19222            time_bytes[1],
19223            time_bytes[2],
19224            time_bytes[3],
19225            detail_bytes[0],
19226            detail_bytes[1],
19227            detail_bytes[2],
19228            detail_bytes[3],
19229            root_bytes[0],
19230            root_bytes[1],
19231            root_bytes[2],
19232            root_bytes[3],
19233            event_bytes[0],
19234            event_bytes[1],
19235            event_bytes[2],
19236            event_bytes[3],
19237            child_bytes[0],
19238            child_bytes[1],
19239            child_bytes[2],
19240            child_bytes[3],
19241            root_x_bytes[0],
19242            root_x_bytes[1],
19243            root_x_bytes[2],
19244            root_x_bytes[3],
19245            root_y_bytes[0],
19246            root_y_bytes[1],
19247            root_y_bytes[2],
19248            root_y_bytes[3],
19249            event_x_bytes[0],
19250            event_x_bytes[1],
19251            event_x_bytes[2],
19252            event_x_bytes[3],
19253            event_y_bytes[0],
19254            event_y_bytes[1],
19255            event_y_bytes[2],
19256            event_y_bytes[3],
19257            delta_x_bytes[0],
19258            delta_x_bytes[1],
19259            delta_x_bytes[2],
19260            delta_x_bytes[3],
19261            delta_y_bytes[0],
19262            delta_y_bytes[1],
19263            delta_y_bytes[2],
19264            delta_y_bytes[3],
19265            delta_unaccel_x_bytes[0],
19266            delta_unaccel_x_bytes[1],
19267            delta_unaccel_x_bytes[2],
19268            delta_unaccel_x_bytes[3],
19269            delta_unaccel_y_bytes[0],
19270            delta_unaccel_y_bytes[1],
19271            delta_unaccel_y_bytes[2],
19272            delta_unaccel_y_bytes[3],
19273            scale_bytes[0],
19274            scale_bytes[1],
19275            scale_bytes[2],
19276            scale_bytes[3],
19277            delta_angle_bytes[0],
19278            delta_angle_bytes[1],
19279            delta_angle_bytes[2],
19280            delta_angle_bytes[3],
19281            sourceid_bytes[0],
19282            sourceid_bytes[1],
19283            0,
19284            0,
19285            mods_bytes[0],
19286            mods_bytes[1],
19287            mods_bytes[2],
19288            mods_bytes[3],
19289            mods_bytes[4],
19290            mods_bytes[5],
19291            mods_bytes[6],
19292            mods_bytes[7],
19293            mods_bytes[8],
19294            mods_bytes[9],
19295            mods_bytes[10],
19296            mods_bytes[11],
19297            mods_bytes[12],
19298            mods_bytes[13],
19299            mods_bytes[14],
19300            mods_bytes[15],
19301            group_bytes[0],
19302            group_bytes[1],
19303            group_bytes[2],
19304            group_bytes[3],
19305            flags_bytes[0],
19306            flags_bytes[1],
19307            flags_bytes[2],
19308            flags_bytes[3],
19309        ]
19310    }
19311    fn serialize_into(&self, bytes: &mut Vec<u8>) {
19312        bytes.reserve(100);
19313        self.response_type.serialize_into(bytes);
19314        self.extension.serialize_into(bytes);
19315        self.sequence.serialize_into(bytes);
19316        self.length.serialize_into(bytes);
19317        self.event_type.serialize_into(bytes);
19318        self.deviceid.serialize_into(bytes);
19319        self.time.serialize_into(bytes);
19320        self.detail.serialize_into(bytes);
19321        self.root.serialize_into(bytes);
19322        self.event.serialize_into(bytes);
19323        self.child.serialize_into(bytes);
19324        self.root_x.serialize_into(bytes);
19325        self.root_y.serialize_into(bytes);
19326        self.event_x.serialize_into(bytes);
19327        self.event_y.serialize_into(bytes);
19328        self.delta_x.serialize_into(bytes);
19329        self.delta_y.serialize_into(bytes);
19330        self.delta_unaccel_x.serialize_into(bytes);
19331        self.delta_unaccel_y.serialize_into(bytes);
19332        self.scale.serialize_into(bytes);
19333        self.delta_angle.serialize_into(bytes);
19334        self.sourceid.serialize_into(bytes);
19335        bytes.extend_from_slice(&[0; 2]);
19336        self.mods.serialize_into(bytes);
19337        self.group.serialize_into(bytes);
19338        u32::from(self.flags).serialize_into(bytes);
19339    }
19340}
19341
19342/// Opcode for the GesturePinchUpdate event
19343pub const GESTURE_PINCH_UPDATE_EVENT: u16 = 28;
19344pub type GesturePinchUpdateEvent = GesturePinchBeginEvent;
19345
19346/// Opcode for the GesturePinchEnd event
19347pub const GESTURE_PINCH_END_EVENT: u16 = 29;
19348pub type GesturePinchEndEvent = GesturePinchBeginEvent;
19349
19350#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
19351#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19352pub struct GestureSwipeEventFlags(u32);
19353impl GestureSwipeEventFlags {
19354    pub const GESTURE_SWIPE_CANCELLED: Self = Self(1 << 0);
19355}
19356impl From<GestureSwipeEventFlags> for u32 {
19357    #[inline]
19358    fn from(input: GestureSwipeEventFlags) -> Self {
19359        input.0
19360    }
19361}
19362impl From<GestureSwipeEventFlags> for Option<u32> {
19363    #[inline]
19364    fn from(input: GestureSwipeEventFlags) -> Self {
19365        Some(input.0)
19366    }
19367}
19368impl From<u8> for GestureSwipeEventFlags {
19369    #[inline]
19370    fn from(value: u8) -> Self {
19371        Self(value.into())
19372    }
19373}
19374impl From<u16> for GestureSwipeEventFlags {
19375    #[inline]
19376    fn from(value: u16) -> Self {
19377        Self(value.into())
19378    }
19379}
19380impl From<u32> for GestureSwipeEventFlags {
19381    #[inline]
19382    fn from(value: u32) -> Self {
19383        Self(value)
19384    }
19385}
19386impl core::fmt::Debug for GestureSwipeEventFlags  {
19387    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
19388        let variants = [
19389            (Self::GESTURE_SWIPE_CANCELLED.0, "GESTURE_SWIPE_CANCELLED", "GestureSwipeCancelled"),
19390        ];
19391        pretty_print_bitmask(fmt, self.0, &variants)
19392    }
19393}
19394bitmask_binop!(GestureSwipeEventFlags, u32);
19395
19396/// Opcode for the GestureSwipeBegin event
19397pub const GESTURE_SWIPE_BEGIN_EVENT: u16 = 30;
19398#[derive(Clone, Copy, Default)]
19399#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
19400#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19401pub struct GestureSwipeBeginEvent {
19402    pub response_type: u8,
19403    pub extension: u8,
19404    pub sequence: u16,
19405    pub length: u32,
19406    pub event_type: u16,
19407    pub deviceid: DeviceId,
19408    pub time: xproto::Timestamp,
19409    pub detail: u32,
19410    pub root: xproto::Window,
19411    pub event: xproto::Window,
19412    pub child: xproto::Window,
19413    pub root_x: Fp1616,
19414    pub root_y: Fp1616,
19415    pub event_x: Fp1616,
19416    pub event_y: Fp1616,
19417    pub delta_x: Fp1616,
19418    pub delta_y: Fp1616,
19419    pub delta_unaccel_x: Fp1616,
19420    pub delta_unaccel_y: Fp1616,
19421    pub sourceid: DeviceId,
19422    pub mods: ModifierInfo,
19423    pub group: GroupInfo,
19424    pub flags: GestureSwipeEventFlags,
19425}
19426impl_debug_if_no_extra_traits!(GestureSwipeBeginEvent, "GestureSwipeBeginEvent");
19427impl TryParse for GestureSwipeBeginEvent {
19428    fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
19429        let remaining = initial_value;
19430        let (response_type, remaining) = u8::try_parse(remaining)?;
19431        let (extension, remaining) = u8::try_parse(remaining)?;
19432        let (sequence, remaining) = u16::try_parse(remaining)?;
19433        let (length, remaining) = u32::try_parse(remaining)?;
19434        let (event_type, remaining) = u16::try_parse(remaining)?;
19435        let (deviceid, remaining) = DeviceId::try_parse(remaining)?;
19436        let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
19437        let (detail, remaining) = u32::try_parse(remaining)?;
19438        let (root, remaining) = xproto::Window::try_parse(remaining)?;
19439        let (event, remaining) = xproto::Window::try_parse(remaining)?;
19440        let (child, remaining) = xproto::Window::try_parse(remaining)?;
19441        let (root_x, remaining) = Fp1616::try_parse(remaining)?;
19442        let (root_y, remaining) = Fp1616::try_parse(remaining)?;
19443        let (event_x, remaining) = Fp1616::try_parse(remaining)?;
19444        let (event_y, remaining) = Fp1616::try_parse(remaining)?;
19445        let (delta_x, remaining) = Fp1616::try_parse(remaining)?;
19446        let (delta_y, remaining) = Fp1616::try_parse(remaining)?;
19447        let (delta_unaccel_x, remaining) = Fp1616::try_parse(remaining)?;
19448        let (delta_unaccel_y, remaining) = Fp1616::try_parse(remaining)?;
19449        let (sourceid, remaining) = DeviceId::try_parse(remaining)?;
19450        let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
19451        let (mods, remaining) = ModifierInfo::try_parse(remaining)?;
19452        let (group, remaining) = GroupInfo::try_parse(remaining)?;
19453        let (flags, remaining) = u32::try_parse(remaining)?;
19454        let flags = flags.into();
19455        let result = GestureSwipeBeginEvent { response_type, extension, sequence, length, event_type, deviceid, time, detail, root, event, child, root_x, root_y, event_x, event_y, delta_x, delta_y, delta_unaccel_x, delta_unaccel_y, sourceid, mods, group, flags };
19456        let _ = remaining;
19457        let remaining = initial_value.get(32 + length as usize * 4..)
19458            .ok_or(ParseError::InsufficientData)?;
19459        Ok((result, remaining))
19460    }
19461}
19462impl Serialize for GestureSwipeBeginEvent {
19463    type Bytes = [u8; 92];
19464    fn serialize(&self) -> [u8; 92] {
19465        let response_type_bytes = self.response_type.serialize();
19466        let extension_bytes = self.extension.serialize();
19467        let sequence_bytes = self.sequence.serialize();
19468        let length_bytes = self.length.serialize();
19469        let event_type_bytes = self.event_type.serialize();
19470        let deviceid_bytes = self.deviceid.serialize();
19471        let time_bytes = self.time.serialize();
19472        let detail_bytes = self.detail.serialize();
19473        let root_bytes = self.root.serialize();
19474        let event_bytes = self.event.serialize();
19475        let child_bytes = self.child.serialize();
19476        let root_x_bytes = self.root_x.serialize();
19477        let root_y_bytes = self.root_y.serialize();
19478        let event_x_bytes = self.event_x.serialize();
19479        let event_y_bytes = self.event_y.serialize();
19480        let delta_x_bytes = self.delta_x.serialize();
19481        let delta_y_bytes = self.delta_y.serialize();
19482        let delta_unaccel_x_bytes = self.delta_unaccel_x.serialize();
19483        let delta_unaccel_y_bytes = self.delta_unaccel_y.serialize();
19484        let sourceid_bytes = self.sourceid.serialize();
19485        let mods_bytes = self.mods.serialize();
19486        let group_bytes = self.group.serialize();
19487        let flags_bytes = u32::from(self.flags).serialize();
19488        [
19489            response_type_bytes[0],
19490            extension_bytes[0],
19491            sequence_bytes[0],
19492            sequence_bytes[1],
19493            length_bytes[0],
19494            length_bytes[1],
19495            length_bytes[2],
19496            length_bytes[3],
19497            event_type_bytes[0],
19498            event_type_bytes[1],
19499            deviceid_bytes[0],
19500            deviceid_bytes[1],
19501            time_bytes[0],
19502            time_bytes[1],
19503            time_bytes[2],
19504            time_bytes[3],
19505            detail_bytes[0],
19506            detail_bytes[1],
19507            detail_bytes[2],
19508            detail_bytes[3],
19509            root_bytes[0],
19510            root_bytes[1],
19511            root_bytes[2],
19512            root_bytes[3],
19513            event_bytes[0],
19514            event_bytes[1],
19515            event_bytes[2],
19516            event_bytes[3],
19517            child_bytes[0],
19518            child_bytes[1],
19519            child_bytes[2],
19520            child_bytes[3],
19521            root_x_bytes[0],
19522            root_x_bytes[1],
19523            root_x_bytes[2],
19524            root_x_bytes[3],
19525            root_y_bytes[0],
19526            root_y_bytes[1],
19527            root_y_bytes[2],
19528            root_y_bytes[3],
19529            event_x_bytes[0],
19530            event_x_bytes[1],
19531            event_x_bytes[2],
19532            event_x_bytes[3],
19533            event_y_bytes[0],
19534            event_y_bytes[1],
19535            event_y_bytes[2],
19536            event_y_bytes[3],
19537            delta_x_bytes[0],
19538            delta_x_bytes[1],
19539            delta_x_bytes[2],
19540            delta_x_bytes[3],
19541            delta_y_bytes[0],
19542            delta_y_bytes[1],
19543            delta_y_bytes[2],
19544            delta_y_bytes[3],
19545            delta_unaccel_x_bytes[0],
19546            delta_unaccel_x_bytes[1],
19547            delta_unaccel_x_bytes[2],
19548            delta_unaccel_x_bytes[3],
19549            delta_unaccel_y_bytes[0],
19550            delta_unaccel_y_bytes[1],
19551            delta_unaccel_y_bytes[2],
19552            delta_unaccel_y_bytes[3],
19553            sourceid_bytes[0],
19554            sourceid_bytes[1],
19555            0,
19556            0,
19557            mods_bytes[0],
19558            mods_bytes[1],
19559            mods_bytes[2],
19560            mods_bytes[3],
19561            mods_bytes[4],
19562            mods_bytes[5],
19563            mods_bytes[6],
19564            mods_bytes[7],
19565            mods_bytes[8],
19566            mods_bytes[9],
19567            mods_bytes[10],
19568            mods_bytes[11],
19569            mods_bytes[12],
19570            mods_bytes[13],
19571            mods_bytes[14],
19572            mods_bytes[15],
19573            group_bytes[0],
19574            group_bytes[1],
19575            group_bytes[2],
19576            group_bytes[3],
19577            flags_bytes[0],
19578            flags_bytes[1],
19579            flags_bytes[2],
19580            flags_bytes[3],
19581        ]
19582    }
19583    fn serialize_into(&self, bytes: &mut Vec<u8>) {
19584        bytes.reserve(92);
19585        self.response_type.serialize_into(bytes);
19586        self.extension.serialize_into(bytes);
19587        self.sequence.serialize_into(bytes);
19588        self.length.serialize_into(bytes);
19589        self.event_type.serialize_into(bytes);
19590        self.deviceid.serialize_into(bytes);
19591        self.time.serialize_into(bytes);
19592        self.detail.serialize_into(bytes);
19593        self.root.serialize_into(bytes);
19594        self.event.serialize_into(bytes);
19595        self.child.serialize_into(bytes);
19596        self.root_x.serialize_into(bytes);
19597        self.root_y.serialize_into(bytes);
19598        self.event_x.serialize_into(bytes);
19599        self.event_y.serialize_into(bytes);
19600        self.delta_x.serialize_into(bytes);
19601        self.delta_y.serialize_into(bytes);
19602        self.delta_unaccel_x.serialize_into(bytes);
19603        self.delta_unaccel_y.serialize_into(bytes);
19604        self.sourceid.serialize_into(bytes);
19605        bytes.extend_from_slice(&[0; 2]);
19606        self.mods.serialize_into(bytes);
19607        self.group.serialize_into(bytes);
19608        u32::from(self.flags).serialize_into(bytes);
19609    }
19610}
19611
19612/// Opcode for the GestureSwipeUpdate event
19613pub const GESTURE_SWIPE_UPDATE_EVENT: u16 = 31;
19614pub type GestureSwipeUpdateEvent = GestureSwipeBeginEvent;
19615
19616/// Opcode for the GestureSwipeEnd event
19617pub const GESTURE_SWIPE_END_EVENT: u16 = 32;
19618pub type GestureSwipeEndEvent = GestureSwipeBeginEvent;
19619
19620#[derive(Debug, Copy, Clone)]
19621#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19622pub struct EventForSend([u8; 32]);
19623impl EventForSend {
19624    pub fn as_device_valuator_event(&self) -> Result<DeviceValuatorEvent, ParseError> {
19625        let value: &[u8] = &self.0;
19626        DeviceValuatorEvent::try_parse(value).map(|(result, _remaining)| result)
19627    }
19628    pub fn as_device_key_press_event(&self) -> Result<DeviceKeyPressEvent, ParseError> {
19629        let value: &[u8] = &self.0;
19630        DeviceKeyPressEvent::try_parse(value).map(|(result, _remaining)| result)
19631    }
19632    pub fn as_device_key_release_event(&self) -> Result<DeviceKeyReleaseEvent, ParseError> {
19633        let value: &[u8] = &self.0;
19634        DeviceKeyReleaseEvent::try_parse(value).map(|(result, _remaining)| result)
19635    }
19636    pub fn as_device_button_press_event(&self) -> Result<DeviceButtonPressEvent, ParseError> {
19637        let value: &[u8] = &self.0;
19638        DeviceButtonPressEvent::try_parse(value).map(|(result, _remaining)| result)
19639    }
19640    pub fn as_device_button_release_event(&self) -> Result<DeviceButtonReleaseEvent, ParseError> {
19641        let value: &[u8] = &self.0;
19642        DeviceButtonReleaseEvent::try_parse(value).map(|(result, _remaining)| result)
19643    }
19644    pub fn as_device_motion_notify_event(&self) -> Result<DeviceMotionNotifyEvent, ParseError> {
19645        let value: &[u8] = &self.0;
19646        DeviceMotionNotifyEvent::try_parse(value).map(|(result, _remaining)| result)
19647    }
19648    pub fn as_device_focus_in_event(&self) -> Result<DeviceFocusInEvent, ParseError> {
19649        let value: &[u8] = &self.0;
19650        DeviceFocusInEvent::try_parse(value).map(|(result, _remaining)| result)
19651    }
19652    pub fn as_device_focus_out_event(&self) -> Result<DeviceFocusOutEvent, ParseError> {
19653        let value: &[u8] = &self.0;
19654        DeviceFocusOutEvent::try_parse(value).map(|(result, _remaining)| result)
19655    }
19656    pub fn as_proximity_in_event(&self) -> Result<ProximityInEvent, ParseError> {
19657        let value: &[u8] = &self.0;
19658        ProximityInEvent::try_parse(value).map(|(result, _remaining)| result)
19659    }
19660    pub fn as_proximity_out_event(&self) -> Result<ProximityOutEvent, ParseError> {
19661        let value: &[u8] = &self.0;
19662        ProximityOutEvent::try_parse(value).map(|(result, _remaining)| result)
19663    }
19664    pub fn as_device_state_notify_event(&self) -> Result<DeviceStateNotifyEvent, ParseError> {
19665        let value: &[u8] = &self.0;
19666        DeviceStateNotifyEvent::try_parse(value).map(|(result, _remaining)| result)
19667    }
19668    pub fn as_device_mapping_notify_event(&self) -> Result<DeviceMappingNotifyEvent, ParseError> {
19669        let value: &[u8] = &self.0;
19670        DeviceMappingNotifyEvent::try_parse(value).map(|(result, _remaining)| result)
19671    }
19672    pub fn as_change_device_notify_event(&self) -> Result<ChangeDeviceNotifyEvent, ParseError> {
19673        let value: &[u8] = &self.0;
19674        ChangeDeviceNotifyEvent::try_parse(value).map(|(result, _remaining)| result)
19675    }
19676    pub fn as_device_key_state_notify_event(&self) -> Result<DeviceKeyStateNotifyEvent, ParseError> {
19677        let value: &[u8] = &self.0;
19678        DeviceKeyStateNotifyEvent::try_parse(value).map(|(result, _remaining)| result)
19679    }
19680    pub fn as_device_button_state_notify_event(&self) -> Result<DeviceButtonStateNotifyEvent, ParseError> {
19681        let value: &[u8] = &self.0;
19682        DeviceButtonStateNotifyEvent::try_parse(value).map(|(result, _remaining)| result)
19683    }
19684    pub fn as_device_presence_notify_event(&self) -> Result<DevicePresenceNotifyEvent, ParseError> {
19685        let value: &[u8] = &self.0;
19686        DevicePresenceNotifyEvent::try_parse(value).map(|(result, _remaining)| result)
19687    }
19688    pub fn as_device_property_notify_event(&self) -> Result<DevicePropertyNotifyEvent, ParseError> {
19689        let value: &[u8] = &self.0;
19690        DevicePropertyNotifyEvent::try_parse(value).map(|(result, _remaining)| result)
19691    }
19692}
19693impl Serialize for EventForSend {
19694    type Bytes = [u8; 32];
19695    fn serialize(&self) -> [u8; 32] {
19696        self.0
19697    }
19698    fn serialize_into(&self, bytes: &mut Vec<u8>) {
19699        bytes.extend_from_slice(&self.0);
19700    }
19701}
19702impl TryParse for EventForSend {
19703    fn try_parse(value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
19704        let inner: [u8; 32] = value.get(..32)
19705            .ok_or(ParseError::InsufficientData)?
19706            .try_into()
19707            .unwrap();
19708        let result = EventForSend(inner);
19709        Ok((result, &value[32..]))
19710    }
19711}
19712impl From<DeviceValuatorEvent> for EventForSend {
19713    fn from(value: DeviceValuatorEvent) -> Self {
19714        Self(<[u8; 32]>::from(value))
19715    }
19716}
19717impl From<&DeviceValuatorEvent> for EventForSend {
19718    fn from(value: &DeviceValuatorEvent) -> Self {
19719        Self(<[u8; 32]>::from(value))
19720    }
19721}
19722impl From<DeviceKeyPressEvent> for EventForSend {
19723    fn from(value: DeviceKeyPressEvent) -> Self {
19724        Self(<[u8; 32]>::from(value))
19725    }
19726}
19727impl From<&DeviceKeyPressEvent> for EventForSend {
19728    fn from(value: &DeviceKeyPressEvent) -> Self {
19729        Self(<[u8; 32]>::from(value))
19730    }
19731}
19732impl From<DeviceFocusInEvent> for EventForSend {
19733    fn from(value: DeviceFocusInEvent) -> Self {
19734        Self(<[u8; 32]>::from(value))
19735    }
19736}
19737impl From<&DeviceFocusInEvent> for EventForSend {
19738    fn from(value: &DeviceFocusInEvent) -> Self {
19739        Self(<[u8; 32]>::from(value))
19740    }
19741}
19742impl From<DeviceStateNotifyEvent> for EventForSend {
19743    fn from(value: DeviceStateNotifyEvent) -> Self {
19744        Self(<[u8; 32]>::from(value))
19745    }
19746}
19747impl From<&DeviceStateNotifyEvent> for EventForSend {
19748    fn from(value: &DeviceStateNotifyEvent) -> Self {
19749        Self(<[u8; 32]>::from(value))
19750    }
19751}
19752impl From<DeviceMappingNotifyEvent> for EventForSend {
19753    fn from(value: DeviceMappingNotifyEvent) -> Self {
19754        Self(<[u8; 32]>::from(value))
19755    }
19756}
19757impl From<&DeviceMappingNotifyEvent> for EventForSend {
19758    fn from(value: &DeviceMappingNotifyEvent) -> Self {
19759        Self(<[u8; 32]>::from(value))
19760    }
19761}
19762impl From<ChangeDeviceNotifyEvent> for EventForSend {
19763    fn from(value: ChangeDeviceNotifyEvent) -> Self {
19764        Self(<[u8; 32]>::from(value))
19765    }
19766}
19767impl From<&ChangeDeviceNotifyEvent> for EventForSend {
19768    fn from(value: &ChangeDeviceNotifyEvent) -> Self {
19769        Self(<[u8; 32]>::from(value))
19770    }
19771}
19772impl From<DeviceKeyStateNotifyEvent> for EventForSend {
19773    fn from(value: DeviceKeyStateNotifyEvent) -> Self {
19774        Self(<[u8; 32]>::from(value))
19775    }
19776}
19777impl From<&DeviceKeyStateNotifyEvent> for EventForSend {
19778    fn from(value: &DeviceKeyStateNotifyEvent) -> Self {
19779        Self(<[u8; 32]>::from(value))
19780    }
19781}
19782impl From<DeviceButtonStateNotifyEvent> for EventForSend {
19783    fn from(value: DeviceButtonStateNotifyEvent) -> Self {
19784        Self(<[u8; 32]>::from(value))
19785    }
19786}
19787impl From<&DeviceButtonStateNotifyEvent> for EventForSend {
19788    fn from(value: &DeviceButtonStateNotifyEvent) -> Self {
19789        Self(<[u8; 32]>::from(value))
19790    }
19791}
19792impl From<DevicePresenceNotifyEvent> for EventForSend {
19793    fn from(value: DevicePresenceNotifyEvent) -> Self {
19794        Self(<[u8; 32]>::from(value))
19795    }
19796}
19797impl From<&DevicePresenceNotifyEvent> for EventForSend {
19798    fn from(value: &DevicePresenceNotifyEvent) -> Self {
19799        Self(<[u8; 32]>::from(value))
19800    }
19801}
19802impl From<DevicePropertyNotifyEvent> for EventForSend {
19803    fn from(value: DevicePropertyNotifyEvent) -> Self {
19804        Self(<[u8; 32]>::from(value))
19805    }
19806}
19807impl From<&DevicePropertyNotifyEvent> for EventForSend {
19808    fn from(value: &DevicePropertyNotifyEvent) -> Self {
19809        Self(<[u8; 32]>::from(value))
19810    }
19811}
19812
19813/// Opcode for the SendExtensionEvent request
19814pub const SEND_EXTENSION_EVENT_REQUEST: u8 = 31;
19815#[derive(Clone)]
19816#[cfg_attr(feature = "extra-traits", derive(Debug))]
19817#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19818pub struct SendExtensionEventRequest<'input> {
19819    pub destination: xproto::Window,
19820    pub device_id: u8,
19821    pub propagate: bool,
19822    pub events: Cow<'input, [EventForSend]>,
19823    pub classes: Cow<'input, [EventClass]>,
19824}
19825impl_debug_if_no_extra_traits!(SendExtensionEventRequest<'_>, "SendExtensionEventRequest");
19826impl<'input> SendExtensionEventRequest<'input> {
19827    /// Serialize this request into bytes for the provided connection
19828    pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 4]> {
19829        let length_so_far = 0;
19830        let destination_bytes = self.destination.serialize();
19831        let device_id_bytes = self.device_id.serialize();
19832        let propagate_bytes = self.propagate.serialize();
19833        let num_classes = u16::try_from(self.classes.len()).expect("`classes` has too many elements");
19834        let num_classes_bytes = num_classes.serialize();
19835        let num_events = u8::try_from(self.events.len()).expect("`events` has too many elements");
19836        let num_events_bytes = num_events.serialize();
19837        let mut request0 = vec![
19838            major_opcode,
19839            SEND_EXTENSION_EVENT_REQUEST,
19840            0,
19841            0,
19842            destination_bytes[0],
19843            destination_bytes[1],
19844            destination_bytes[2],
19845            destination_bytes[3],
19846            device_id_bytes[0],
19847            propagate_bytes[0],
19848            num_classes_bytes[0],
19849            num_classes_bytes[1],
19850            num_events_bytes[0],
19851            0,
19852            0,
19853            0,
19854        ];
19855        let length_so_far = length_so_far + request0.len();
19856        let events_bytes = self.events.serialize();
19857        let length_so_far = length_so_far + events_bytes.len();
19858        let classes_bytes = self.classes.serialize();
19859        let length_so_far = length_so_far + classes_bytes.len();
19860        let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
19861        let length_so_far = length_so_far + padding0.len();
19862        assert_eq!(length_so_far % 4, 0);
19863        let length = u16::try_from(length_so_far / 4).unwrap_or(0);
19864        request0[2..4].copy_from_slice(&length.to_ne_bytes());
19865        ([request0.into(), events_bytes.into(), classes_bytes.into(), padding0.into()], vec![])
19866    }
19867    /// Parse this request given its header, its body, and any fds that go along with it
19868    #[cfg(feature = "request-parsing")]
19869    pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
19870        if header.minor_opcode != SEND_EXTENSION_EVENT_REQUEST {
19871            return Err(ParseError::InvalidValue);
19872        }
19873        let (destination, remaining) = xproto::Window::try_parse(value)?;
19874        let (device_id, remaining) = u8::try_parse(remaining)?;
19875        let (propagate, remaining) = bool::try_parse(remaining)?;
19876        let (num_classes, remaining) = u16::try_parse(remaining)?;
19877        let (num_events, remaining) = u8::try_parse(remaining)?;
19878        let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
19879        let (events, remaining) = crate::x11_utils::parse_list::<EventForSend>(remaining, num_events.try_to_usize()?)?;
19880        let (classes, remaining) = crate::x11_utils::parse_list::<EventClass>(remaining, num_classes.try_to_usize()?)?;
19881        let _ = remaining;
19882        Ok(SendExtensionEventRequest {
19883            destination,
19884            device_id,
19885            propagate,
19886            events: Cow::Owned(events),
19887            classes: Cow::Owned(classes),
19888        })
19889    }
19890    /// Clone all borrowed data in this SendExtensionEventRequest.
19891    pub fn into_owned(self) -> SendExtensionEventRequest<'static> {
19892        SendExtensionEventRequest {
19893            destination: self.destination,
19894            device_id: self.device_id,
19895            propagate: self.propagate,
19896            events: Cow::Owned(self.events.into_owned()),
19897            classes: Cow::Owned(self.classes.into_owned()),
19898        }
19899    }
19900}
19901impl<'input> Request for SendExtensionEventRequest<'input> {
19902    const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
19903
19904    fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
19905        let (bufs, fds) = self.serialize(major_opcode);
19906        // Flatten the buffers into a single vector
19907        let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
19908        (buf, fds)
19909    }
19910}
19911impl<'input> crate::x11_utils::VoidRequest for SendExtensionEventRequest<'input> {
19912}
19913
19914/// Opcode for the Device error
19915pub const DEVICE_ERROR: u8 = 0;
19916
19917/// Opcode for the Event error
19918pub const EVENT_ERROR: u8 = 1;
19919
19920/// Opcode for the Mode error
19921pub const MODE_ERROR: u8 = 2;
19922
19923/// Opcode for the DeviceBusy error
19924pub const DEVICE_BUSY_ERROR: u8 = 3;
19925
19926/// Opcode for the Class error
19927pub const CLASS_ERROR: u8 = 4;
19928