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