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::xproto;
27
28pub const X11_EXTENSION_NAME: &str = "MIT-SHM";
30
31pub const X11_XML_VERSION: (u32, u32) = (1, 2);
38
39pub type Seg = u32;
40
41pub const COMPLETION_EVENT: u8 = 0;
43#[derive(Clone, Copy, Default)]
57#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
58#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
59pub struct CompletionEvent {
60 pub response_type: u8,
61 pub sequence: u16,
62 pub drawable: xproto::Drawable,
63 pub minor_event: u16,
64 pub major_event: u8,
65 pub shmseg: Seg,
66 pub offset: u32,
67}
68impl_debug_if_no_extra_traits!(CompletionEvent, "CompletionEvent");
69impl TryParse for CompletionEvent {
70 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
71 let remaining = initial_value;
72 let (response_type, remaining) = u8::try_parse(remaining)?;
73 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
74 let (sequence, remaining) = u16::try_parse(remaining)?;
75 let (drawable, remaining) = xproto::Drawable::try_parse(remaining)?;
76 let (minor_event, remaining) = u16::try_parse(remaining)?;
77 let (major_event, remaining) = u8::try_parse(remaining)?;
78 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
79 let (shmseg, remaining) = Seg::try_parse(remaining)?;
80 let (offset, remaining) = u32::try_parse(remaining)?;
81 let result = CompletionEvent { response_type, sequence, drawable, minor_event, major_event, shmseg, offset };
82 let _ = remaining;
83 let remaining = initial_value.get(32..)
84 .ok_or(ParseError::InsufficientData)?;
85 Ok((result, remaining))
86 }
87}
88impl Serialize for CompletionEvent {
89 type Bytes = [u8; 20];
90 fn serialize(&self) -> [u8; 20] {
91 let response_type_bytes = self.response_type.serialize();
92 let sequence_bytes = self.sequence.serialize();
93 let drawable_bytes = self.drawable.serialize();
94 let minor_event_bytes = self.minor_event.serialize();
95 let major_event_bytes = self.major_event.serialize();
96 let shmseg_bytes = self.shmseg.serialize();
97 let offset_bytes = self.offset.serialize();
98 [
99 response_type_bytes[0],
100 0,
101 sequence_bytes[0],
102 sequence_bytes[1],
103 drawable_bytes[0],
104 drawable_bytes[1],
105 drawable_bytes[2],
106 drawable_bytes[3],
107 minor_event_bytes[0],
108 minor_event_bytes[1],
109 major_event_bytes[0],
110 0,
111 shmseg_bytes[0],
112 shmseg_bytes[1],
113 shmseg_bytes[2],
114 shmseg_bytes[3],
115 offset_bytes[0],
116 offset_bytes[1],
117 offset_bytes[2],
118 offset_bytes[3],
119 ]
120 }
121 fn serialize_into(&self, bytes: &mut Vec<u8>) {
122 bytes.reserve(20);
123 self.response_type.serialize_into(bytes);
124 bytes.extend_from_slice(&[0; 1]);
125 self.sequence.serialize_into(bytes);
126 self.drawable.serialize_into(bytes);
127 self.minor_event.serialize_into(bytes);
128 self.major_event.serialize_into(bytes);
129 bytes.extend_from_slice(&[0; 1]);
130 self.shmseg.serialize_into(bytes);
131 self.offset.serialize_into(bytes);
132 }
133}
134impl From<&CompletionEvent> for [u8; 32] {
135 fn from(input: &CompletionEvent) -> Self {
136 let response_type_bytes = input.response_type.serialize();
137 let sequence_bytes = input.sequence.serialize();
138 let drawable_bytes = input.drawable.serialize();
139 let minor_event_bytes = input.minor_event.serialize();
140 let major_event_bytes = input.major_event.serialize();
141 let shmseg_bytes = input.shmseg.serialize();
142 let offset_bytes = input.offset.serialize();
143 [
144 response_type_bytes[0],
145 0,
146 sequence_bytes[0],
147 sequence_bytes[1],
148 drawable_bytes[0],
149 drawable_bytes[1],
150 drawable_bytes[2],
151 drawable_bytes[3],
152 minor_event_bytes[0],
153 minor_event_bytes[1],
154 major_event_bytes[0],
155 0,
156 shmseg_bytes[0],
157 shmseg_bytes[1],
158 shmseg_bytes[2],
159 shmseg_bytes[3],
160 offset_bytes[0],
161 offset_bytes[1],
162 offset_bytes[2],
163 offset_bytes[3],
164 0,
166 0,
167 0,
168 0,
169 0,
170 0,
171 0,
172 0,
173 0,
174 0,
175 0,
176 0,
177 ]
178 }
179}
180impl From<CompletionEvent> for [u8; 32] {
181 fn from(input: CompletionEvent) -> Self {
182 Self::from(&input)
183 }
184}
185
186pub const BAD_SEG_ERROR: u8 = 0;
188
189pub const QUERY_VERSION_REQUEST: u8 = 0;
191#[derive(Clone, Copy, Default)]
197#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
198#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
199pub struct QueryVersionRequest;
200impl_debug_if_no_extra_traits!(QueryVersionRequest, "QueryVersionRequest");
201impl QueryVersionRequest {
202 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
204 let length_so_far = 0;
205 let mut request0 = vec![
206 major_opcode,
207 QUERY_VERSION_REQUEST,
208 0,
209 0,
210 ];
211 let length_so_far = length_so_far + request0.len();
212 assert_eq!(length_so_far % 4, 0);
213 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
214 request0[2..4].copy_from_slice(&length.to_ne_bytes());
215 ([request0.into()], vec![])
216 }
217 #[cfg(feature = "request-parsing")]
219 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
220 if header.minor_opcode != QUERY_VERSION_REQUEST {
221 return Err(ParseError::InvalidValue);
222 }
223 let _ = value;
224 Ok(QueryVersionRequest
225 )
226 }
227}
228impl Request for QueryVersionRequest {
229 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
230
231 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
232 let (bufs, fds) = self.serialize(major_opcode);
233 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
235 (buf, fds)
236 }
237}
238impl crate::x11_utils::ReplyRequest for QueryVersionRequest {
239 type Reply = QueryVersionReply;
240}
241
242#[derive(Clone, Copy, Default)]
261#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
262#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
263pub struct QueryVersionReply {
264 pub shared_pixmaps: bool,
265 pub sequence: u16,
266 pub length: u32,
267 pub major_version: u16,
268 pub minor_version: u16,
269 pub uid: u16,
270 pub gid: u16,
271 pub pixmap_format: u8,
272}
273impl_debug_if_no_extra_traits!(QueryVersionReply, "QueryVersionReply");
274impl TryParse for QueryVersionReply {
275 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
276 let remaining = initial_value;
277 let (response_type, remaining) = u8::try_parse(remaining)?;
278 let (shared_pixmaps, remaining) = bool::try_parse(remaining)?;
279 let (sequence, remaining) = u16::try_parse(remaining)?;
280 let (length, remaining) = u32::try_parse(remaining)?;
281 let (major_version, remaining) = u16::try_parse(remaining)?;
282 let (minor_version, remaining) = u16::try_parse(remaining)?;
283 let (uid, remaining) = u16::try_parse(remaining)?;
284 let (gid, remaining) = u16::try_parse(remaining)?;
285 let (pixmap_format, remaining) = u8::try_parse(remaining)?;
286 let remaining = remaining.get(15..).ok_or(ParseError::InsufficientData)?;
287 if response_type != 1 {
288 return Err(ParseError::InvalidValue);
289 }
290 let result = QueryVersionReply { shared_pixmaps, sequence, length, major_version, minor_version, uid, gid, pixmap_format };
291 let _ = remaining;
292 let remaining = initial_value.get(32 + length as usize * 4..)
293 .ok_or(ParseError::InsufficientData)?;
294 Ok((result, remaining))
295 }
296}
297impl Serialize for QueryVersionReply {
298 type Bytes = [u8; 32];
299 fn serialize(&self) -> [u8; 32] {
300 let response_type_bytes = &[1];
301 let shared_pixmaps_bytes = self.shared_pixmaps.serialize();
302 let sequence_bytes = self.sequence.serialize();
303 let length_bytes = self.length.serialize();
304 let major_version_bytes = self.major_version.serialize();
305 let minor_version_bytes = self.minor_version.serialize();
306 let uid_bytes = self.uid.serialize();
307 let gid_bytes = self.gid.serialize();
308 let pixmap_format_bytes = self.pixmap_format.serialize();
309 [
310 response_type_bytes[0],
311 shared_pixmaps_bytes[0],
312 sequence_bytes[0],
313 sequence_bytes[1],
314 length_bytes[0],
315 length_bytes[1],
316 length_bytes[2],
317 length_bytes[3],
318 major_version_bytes[0],
319 major_version_bytes[1],
320 minor_version_bytes[0],
321 minor_version_bytes[1],
322 uid_bytes[0],
323 uid_bytes[1],
324 gid_bytes[0],
325 gid_bytes[1],
326 pixmap_format_bytes[0],
327 0,
328 0,
329 0,
330 0,
331 0,
332 0,
333 0,
334 0,
335 0,
336 0,
337 0,
338 0,
339 0,
340 0,
341 0,
342 ]
343 }
344 fn serialize_into(&self, bytes: &mut Vec<u8>) {
345 bytes.reserve(32);
346 let response_type_bytes = &[1];
347 bytes.push(response_type_bytes[0]);
348 self.shared_pixmaps.serialize_into(bytes);
349 self.sequence.serialize_into(bytes);
350 self.length.serialize_into(bytes);
351 self.major_version.serialize_into(bytes);
352 self.minor_version.serialize_into(bytes);
353 self.uid.serialize_into(bytes);
354 self.gid.serialize_into(bytes);
355 self.pixmap_format.serialize_into(bytes);
356 bytes.extend_from_slice(&[0; 15]);
357 }
358}
359
360pub const ATTACH_REQUEST: u8 = 1;
362#[derive(Clone, Copy, Default)]
375#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
376#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
377pub struct AttachRequest {
378 pub shmseg: Seg,
379 pub shmid: u32,
380 pub read_only: bool,
381}
382impl_debug_if_no_extra_traits!(AttachRequest, "AttachRequest");
383impl AttachRequest {
384 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
386 let length_so_far = 0;
387 let shmseg_bytes = self.shmseg.serialize();
388 let shmid_bytes = self.shmid.serialize();
389 let read_only_bytes = self.read_only.serialize();
390 let mut request0 = vec![
391 major_opcode,
392 ATTACH_REQUEST,
393 0,
394 0,
395 shmseg_bytes[0],
396 shmseg_bytes[1],
397 shmseg_bytes[2],
398 shmseg_bytes[3],
399 shmid_bytes[0],
400 shmid_bytes[1],
401 shmid_bytes[2],
402 shmid_bytes[3],
403 read_only_bytes[0],
404 0,
405 0,
406 0,
407 ];
408 let length_so_far = length_so_far + request0.len();
409 assert_eq!(length_so_far % 4, 0);
410 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
411 request0[2..4].copy_from_slice(&length.to_ne_bytes());
412 ([request0.into()], vec![])
413 }
414 #[cfg(feature = "request-parsing")]
416 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
417 if header.minor_opcode != ATTACH_REQUEST {
418 return Err(ParseError::InvalidValue);
419 }
420 let (shmseg, remaining) = Seg::try_parse(value)?;
421 let (shmid, remaining) = u32::try_parse(remaining)?;
422 let (read_only, remaining) = bool::try_parse(remaining)?;
423 let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
424 let _ = remaining;
425 Ok(AttachRequest {
426 shmseg,
427 shmid,
428 read_only,
429 })
430 }
431}
432impl Request for AttachRequest {
433 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
434
435 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
436 let (bufs, fds) = self.serialize(major_opcode);
437 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
439 (buf, fds)
440 }
441}
442impl crate::x11_utils::VoidRequest for AttachRequest {
443}
444
445pub const DETACH_REQUEST: u8 = 2;
447#[derive(Clone, Copy, Default)]
456#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
457#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
458pub struct DetachRequest {
459 pub shmseg: Seg,
460}
461impl_debug_if_no_extra_traits!(DetachRequest, "DetachRequest");
462impl DetachRequest {
463 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
465 let length_so_far = 0;
466 let shmseg_bytes = self.shmseg.serialize();
467 let mut request0 = vec![
468 major_opcode,
469 DETACH_REQUEST,
470 0,
471 0,
472 shmseg_bytes[0],
473 shmseg_bytes[1],
474 shmseg_bytes[2],
475 shmseg_bytes[3],
476 ];
477 let length_so_far = length_so_far + request0.len();
478 assert_eq!(length_so_far % 4, 0);
479 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
480 request0[2..4].copy_from_slice(&length.to_ne_bytes());
481 ([request0.into()], vec![])
482 }
483 #[cfg(feature = "request-parsing")]
485 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
486 if header.minor_opcode != DETACH_REQUEST {
487 return Err(ParseError::InvalidValue);
488 }
489 let (shmseg, remaining) = Seg::try_parse(value)?;
490 let _ = remaining;
491 Ok(DetachRequest {
492 shmseg,
493 })
494 }
495}
496impl Request for DetachRequest {
497 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
498
499 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
500 let (bufs, fds) = self.serialize(major_opcode);
501 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
503 (buf, fds)
504 }
505}
506impl crate::x11_utils::VoidRequest for DetachRequest {
507}
508
509pub const PUT_IMAGE_REQUEST: u8 = 3;
511#[derive(Clone, Copy, Default)]
543#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
544#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
545pub struct PutImageRequest {
546 pub drawable: xproto::Drawable,
547 pub gc: xproto::Gcontext,
548 pub total_width: u16,
549 pub total_height: u16,
550 pub src_x: u16,
551 pub src_y: u16,
552 pub src_width: u16,
553 pub src_height: u16,
554 pub dst_x: i16,
555 pub dst_y: i16,
556 pub depth: u8,
557 pub format: u8,
558 pub send_event: bool,
559 pub shmseg: Seg,
560 pub offset: u32,
561}
562impl_debug_if_no_extra_traits!(PutImageRequest, "PutImageRequest");
563impl PutImageRequest {
564 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
566 let length_so_far = 0;
567 let drawable_bytes = self.drawable.serialize();
568 let gc_bytes = self.gc.serialize();
569 let total_width_bytes = self.total_width.serialize();
570 let total_height_bytes = self.total_height.serialize();
571 let src_x_bytes = self.src_x.serialize();
572 let src_y_bytes = self.src_y.serialize();
573 let src_width_bytes = self.src_width.serialize();
574 let src_height_bytes = self.src_height.serialize();
575 let dst_x_bytes = self.dst_x.serialize();
576 let dst_y_bytes = self.dst_y.serialize();
577 let depth_bytes = self.depth.serialize();
578 let format_bytes = self.format.serialize();
579 let send_event_bytes = self.send_event.serialize();
580 let shmseg_bytes = self.shmseg.serialize();
581 let offset_bytes = self.offset.serialize();
582 let mut request0 = vec![
583 major_opcode,
584 PUT_IMAGE_REQUEST,
585 0,
586 0,
587 drawable_bytes[0],
588 drawable_bytes[1],
589 drawable_bytes[2],
590 drawable_bytes[3],
591 gc_bytes[0],
592 gc_bytes[1],
593 gc_bytes[2],
594 gc_bytes[3],
595 total_width_bytes[0],
596 total_width_bytes[1],
597 total_height_bytes[0],
598 total_height_bytes[1],
599 src_x_bytes[0],
600 src_x_bytes[1],
601 src_y_bytes[0],
602 src_y_bytes[1],
603 src_width_bytes[0],
604 src_width_bytes[1],
605 src_height_bytes[0],
606 src_height_bytes[1],
607 dst_x_bytes[0],
608 dst_x_bytes[1],
609 dst_y_bytes[0],
610 dst_y_bytes[1],
611 depth_bytes[0],
612 format_bytes[0],
613 send_event_bytes[0],
614 0,
615 shmseg_bytes[0],
616 shmseg_bytes[1],
617 shmseg_bytes[2],
618 shmseg_bytes[3],
619 offset_bytes[0],
620 offset_bytes[1],
621 offset_bytes[2],
622 offset_bytes[3],
623 ];
624 let length_so_far = length_so_far + request0.len();
625 assert_eq!(length_so_far % 4, 0);
626 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
627 request0[2..4].copy_from_slice(&length.to_ne_bytes());
628 ([request0.into()], vec![])
629 }
630 #[cfg(feature = "request-parsing")]
632 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
633 if header.minor_opcode != PUT_IMAGE_REQUEST {
634 return Err(ParseError::InvalidValue);
635 }
636 let (drawable, remaining) = xproto::Drawable::try_parse(value)?;
637 let (gc, remaining) = xproto::Gcontext::try_parse(remaining)?;
638 let (total_width, remaining) = u16::try_parse(remaining)?;
639 let (total_height, remaining) = u16::try_parse(remaining)?;
640 let (src_x, remaining) = u16::try_parse(remaining)?;
641 let (src_y, remaining) = u16::try_parse(remaining)?;
642 let (src_width, remaining) = u16::try_parse(remaining)?;
643 let (src_height, remaining) = u16::try_parse(remaining)?;
644 let (dst_x, remaining) = i16::try_parse(remaining)?;
645 let (dst_y, remaining) = i16::try_parse(remaining)?;
646 let (depth, remaining) = u8::try_parse(remaining)?;
647 let (format, remaining) = u8::try_parse(remaining)?;
648 let (send_event, remaining) = bool::try_parse(remaining)?;
649 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
650 let (shmseg, remaining) = Seg::try_parse(remaining)?;
651 let (offset, remaining) = u32::try_parse(remaining)?;
652 let _ = remaining;
653 Ok(PutImageRequest {
654 drawable,
655 gc,
656 total_width,
657 total_height,
658 src_x,
659 src_y,
660 src_width,
661 src_height,
662 dst_x,
663 dst_y,
664 depth,
665 format,
666 send_event,
667 shmseg,
668 offset,
669 })
670 }
671}
672impl Request for PutImageRequest {
673 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
674
675 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
676 let (bufs, fds) = self.serialize(major_opcode);
677 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
679 (buf, fds)
680 }
681}
682impl crate::x11_utils::VoidRequest for PutImageRequest {
683}
684
685pub const GET_IMAGE_REQUEST: u8 = 4;
687#[derive(Clone, Copy, Default)]
705#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
706#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
707pub struct GetImageRequest {
708 pub drawable: xproto::Drawable,
709 pub x: i16,
710 pub y: i16,
711 pub width: u16,
712 pub height: u16,
713 pub plane_mask: u32,
714 pub format: u8,
715 pub shmseg: Seg,
716 pub offset: u32,
717}
718impl_debug_if_no_extra_traits!(GetImageRequest, "GetImageRequest");
719impl GetImageRequest {
720 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
722 let length_so_far = 0;
723 let drawable_bytes = self.drawable.serialize();
724 let x_bytes = self.x.serialize();
725 let y_bytes = self.y.serialize();
726 let width_bytes = self.width.serialize();
727 let height_bytes = self.height.serialize();
728 let plane_mask_bytes = self.plane_mask.serialize();
729 let format_bytes = self.format.serialize();
730 let shmseg_bytes = self.shmseg.serialize();
731 let offset_bytes = self.offset.serialize();
732 let mut request0 = vec![
733 major_opcode,
734 GET_IMAGE_REQUEST,
735 0,
736 0,
737 drawable_bytes[0],
738 drawable_bytes[1],
739 drawable_bytes[2],
740 drawable_bytes[3],
741 x_bytes[0],
742 x_bytes[1],
743 y_bytes[0],
744 y_bytes[1],
745 width_bytes[0],
746 width_bytes[1],
747 height_bytes[0],
748 height_bytes[1],
749 plane_mask_bytes[0],
750 plane_mask_bytes[1],
751 plane_mask_bytes[2],
752 plane_mask_bytes[3],
753 format_bytes[0],
754 0,
755 0,
756 0,
757 shmseg_bytes[0],
758 shmseg_bytes[1],
759 shmseg_bytes[2],
760 shmseg_bytes[3],
761 offset_bytes[0],
762 offset_bytes[1],
763 offset_bytes[2],
764 offset_bytes[3],
765 ];
766 let length_so_far = length_so_far + request0.len();
767 assert_eq!(length_so_far % 4, 0);
768 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
769 request0[2..4].copy_from_slice(&length.to_ne_bytes());
770 ([request0.into()], vec![])
771 }
772 #[cfg(feature = "request-parsing")]
774 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
775 if header.minor_opcode != GET_IMAGE_REQUEST {
776 return Err(ParseError::InvalidValue);
777 }
778 let (drawable, remaining) = xproto::Drawable::try_parse(value)?;
779 let (x, remaining) = i16::try_parse(remaining)?;
780 let (y, remaining) = i16::try_parse(remaining)?;
781 let (width, remaining) = u16::try_parse(remaining)?;
782 let (height, remaining) = u16::try_parse(remaining)?;
783 let (plane_mask, remaining) = u32::try_parse(remaining)?;
784 let (format, remaining) = u8::try_parse(remaining)?;
785 let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
786 let (shmseg, remaining) = Seg::try_parse(remaining)?;
787 let (offset, remaining) = u32::try_parse(remaining)?;
788 let _ = remaining;
789 Ok(GetImageRequest {
790 drawable,
791 x,
792 y,
793 width,
794 height,
795 plane_mask,
796 format,
797 shmseg,
798 offset,
799 })
800 }
801}
802impl Request for GetImageRequest {
803 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
804
805 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
806 let (bufs, fds) = self.serialize(major_opcode);
807 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
809 (buf, fds)
810 }
811}
812impl crate::x11_utils::ReplyRequest for GetImageRequest {
813 type Reply = GetImageReply;
814}
815
816#[derive(Clone, Copy, Default)]
826#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
827#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
828pub struct GetImageReply {
829 pub depth: u8,
830 pub sequence: u16,
831 pub length: u32,
832 pub visual: xproto::Visualid,
833 pub size: u32,
834}
835impl_debug_if_no_extra_traits!(GetImageReply, "GetImageReply");
836impl TryParse for GetImageReply {
837 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
838 let remaining = initial_value;
839 let (response_type, remaining) = u8::try_parse(remaining)?;
840 let (depth, remaining) = u8::try_parse(remaining)?;
841 let (sequence, remaining) = u16::try_parse(remaining)?;
842 let (length, remaining) = u32::try_parse(remaining)?;
843 let (visual, remaining) = xproto::Visualid::try_parse(remaining)?;
844 let (size, remaining) = u32::try_parse(remaining)?;
845 if response_type != 1 {
846 return Err(ParseError::InvalidValue);
847 }
848 let result = GetImageReply { depth, sequence, length, visual, size };
849 let _ = remaining;
850 let remaining = initial_value.get(32 + length as usize * 4..)
851 .ok_or(ParseError::InsufficientData)?;
852 Ok((result, remaining))
853 }
854}
855impl Serialize for GetImageReply {
856 type Bytes = [u8; 16];
857 fn serialize(&self) -> [u8; 16] {
858 let response_type_bytes = &[1];
859 let depth_bytes = self.depth.serialize();
860 let sequence_bytes = self.sequence.serialize();
861 let length_bytes = self.length.serialize();
862 let visual_bytes = self.visual.serialize();
863 let size_bytes = self.size.serialize();
864 [
865 response_type_bytes[0],
866 depth_bytes[0],
867 sequence_bytes[0],
868 sequence_bytes[1],
869 length_bytes[0],
870 length_bytes[1],
871 length_bytes[2],
872 length_bytes[3],
873 visual_bytes[0],
874 visual_bytes[1],
875 visual_bytes[2],
876 visual_bytes[3],
877 size_bytes[0],
878 size_bytes[1],
879 size_bytes[2],
880 size_bytes[3],
881 ]
882 }
883 fn serialize_into(&self, bytes: &mut Vec<u8>) {
884 bytes.reserve(16);
885 let response_type_bytes = &[1];
886 bytes.push(response_type_bytes[0]);
887 self.depth.serialize_into(bytes);
888 self.sequence.serialize_into(bytes);
889 self.length.serialize_into(bytes);
890 self.visual.serialize_into(bytes);
891 self.size.serialize_into(bytes);
892 }
893}
894
895pub const CREATE_PIXMAP_REQUEST: u8 = 5;
897#[derive(Clone, Copy, Default)]
913#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
914#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
915pub struct CreatePixmapRequest {
916 pub pid: xproto::Pixmap,
917 pub drawable: xproto::Drawable,
918 pub width: u16,
919 pub height: u16,
920 pub depth: u8,
921 pub shmseg: Seg,
922 pub offset: u32,
923}
924impl_debug_if_no_extra_traits!(CreatePixmapRequest, "CreatePixmapRequest");
925impl CreatePixmapRequest {
926 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
928 let length_so_far = 0;
929 let pid_bytes = self.pid.serialize();
930 let drawable_bytes = self.drawable.serialize();
931 let width_bytes = self.width.serialize();
932 let height_bytes = self.height.serialize();
933 let depth_bytes = self.depth.serialize();
934 let shmseg_bytes = self.shmseg.serialize();
935 let offset_bytes = self.offset.serialize();
936 let mut request0 = vec![
937 major_opcode,
938 CREATE_PIXMAP_REQUEST,
939 0,
940 0,
941 pid_bytes[0],
942 pid_bytes[1],
943 pid_bytes[2],
944 pid_bytes[3],
945 drawable_bytes[0],
946 drawable_bytes[1],
947 drawable_bytes[2],
948 drawable_bytes[3],
949 width_bytes[0],
950 width_bytes[1],
951 height_bytes[0],
952 height_bytes[1],
953 depth_bytes[0],
954 0,
955 0,
956 0,
957 shmseg_bytes[0],
958 shmseg_bytes[1],
959 shmseg_bytes[2],
960 shmseg_bytes[3],
961 offset_bytes[0],
962 offset_bytes[1],
963 offset_bytes[2],
964 offset_bytes[3],
965 ];
966 let length_so_far = length_so_far + request0.len();
967 assert_eq!(length_so_far % 4, 0);
968 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
969 request0[2..4].copy_from_slice(&length.to_ne_bytes());
970 ([request0.into()], vec![])
971 }
972 #[cfg(feature = "request-parsing")]
974 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
975 if header.minor_opcode != CREATE_PIXMAP_REQUEST {
976 return Err(ParseError::InvalidValue);
977 }
978 let (pid, remaining) = xproto::Pixmap::try_parse(value)?;
979 let (drawable, remaining) = xproto::Drawable::try_parse(remaining)?;
980 let (width, remaining) = u16::try_parse(remaining)?;
981 let (height, remaining) = u16::try_parse(remaining)?;
982 let (depth, remaining) = u8::try_parse(remaining)?;
983 let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
984 let (shmseg, remaining) = Seg::try_parse(remaining)?;
985 let (offset, remaining) = u32::try_parse(remaining)?;
986 let _ = remaining;
987 Ok(CreatePixmapRequest {
988 pid,
989 drawable,
990 width,
991 height,
992 depth,
993 shmseg,
994 offset,
995 })
996 }
997}
998impl Request for CreatePixmapRequest {
999 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1000
1001 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1002 let (bufs, fds) = self.serialize(major_opcode);
1003 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1005 (buf, fds)
1006 }
1007}
1008impl crate::x11_utils::VoidRequest for CreatePixmapRequest {
1009}
1010
1011pub const ATTACH_FD_REQUEST: u8 = 6;
1013#[cfg_attr(feature = "extra-traits", derive(Debug))]
1025pub struct AttachFdRequest {
1026 pub shmseg: Seg,
1027 pub shm_fd: RawFdContainer,
1028 pub read_only: bool,
1029}
1030impl_debug_if_no_extra_traits!(AttachFdRequest, "AttachFdRequest");
1031impl AttachFdRequest {
1032 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1034 let length_so_far = 0;
1035 let shmseg_bytes = self.shmseg.serialize();
1036 let read_only_bytes = self.read_only.serialize();
1037 let mut request0 = vec![
1038 major_opcode,
1039 ATTACH_FD_REQUEST,
1040 0,
1041 0,
1042 shmseg_bytes[0],
1043 shmseg_bytes[1],
1044 shmseg_bytes[2],
1045 shmseg_bytes[3],
1046 read_only_bytes[0],
1047 0,
1048 0,
1049 0,
1050 ];
1051 let length_so_far = length_so_far + request0.len();
1052 assert_eq!(length_so_far % 4, 0);
1053 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1054 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1055 ([request0.into()], vec![self.shm_fd])
1056 }
1057 #[cfg(feature = "request-parsing")]
1059 pub fn try_parse_request_fd(header: RequestHeader, value: &[u8], fds: &mut Vec<RawFdContainer>) -> Result<Self, ParseError> {
1060 if header.minor_opcode != ATTACH_FD_REQUEST {
1061 return Err(ParseError::InvalidValue);
1062 }
1063 let (shmseg, remaining) = Seg::try_parse(value)?;
1064 if fds.is_empty() { return Err(ParseError::MissingFileDescriptors) }
1065 let shm_fd = fds.remove(0);
1066 let (read_only, remaining) = bool::try_parse(remaining)?;
1067 let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
1068 let _ = remaining;
1069 Ok(AttachFdRequest {
1070 shmseg,
1071 shm_fd,
1072 read_only,
1073 })
1074 }
1075}
1076impl Request for AttachFdRequest {
1077 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1078
1079 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1080 let (bufs, fds) = self.serialize(major_opcode);
1081 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1083 (buf, fds)
1084 }
1085}
1086impl crate::x11_utils::VoidRequest for AttachFdRequest {
1087}
1088
1089pub const CREATE_SEGMENT_REQUEST: u8 = 7;
1091#[derive(Clone, Copy, Default)]
1102#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1103#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1104pub struct CreateSegmentRequest {
1105 pub shmseg: Seg,
1106 pub size: u32,
1107 pub read_only: bool,
1108}
1109impl_debug_if_no_extra_traits!(CreateSegmentRequest, "CreateSegmentRequest");
1110impl CreateSegmentRequest {
1111 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1113 let length_so_far = 0;
1114 let shmseg_bytes = self.shmseg.serialize();
1115 let size_bytes = self.size.serialize();
1116 let read_only_bytes = self.read_only.serialize();
1117 let mut request0 = vec![
1118 major_opcode,
1119 CREATE_SEGMENT_REQUEST,
1120 0,
1121 0,
1122 shmseg_bytes[0],
1123 shmseg_bytes[1],
1124 shmseg_bytes[2],
1125 shmseg_bytes[3],
1126 size_bytes[0],
1127 size_bytes[1],
1128 size_bytes[2],
1129 size_bytes[3],
1130 read_only_bytes[0],
1131 0,
1132 0,
1133 0,
1134 ];
1135 let length_so_far = length_so_far + request0.len();
1136 assert_eq!(length_so_far % 4, 0);
1137 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1138 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1139 ([request0.into()], vec![])
1140 }
1141 #[cfg(feature = "request-parsing")]
1143 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1144 if header.minor_opcode != CREATE_SEGMENT_REQUEST {
1145 return Err(ParseError::InvalidValue);
1146 }
1147 let (shmseg, remaining) = Seg::try_parse(value)?;
1148 let (size, remaining) = u32::try_parse(remaining)?;
1149 let (read_only, remaining) = bool::try_parse(remaining)?;
1150 let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
1151 let _ = remaining;
1152 Ok(CreateSegmentRequest {
1153 shmseg,
1154 size,
1155 read_only,
1156 })
1157 }
1158}
1159impl Request for CreateSegmentRequest {
1160 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1161
1162 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1163 let (bufs, fds) = self.serialize(major_opcode);
1164 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1166 (buf, fds)
1167 }
1168}
1169impl crate::x11_utils::ReplyFDsRequest for CreateSegmentRequest {
1170 type Reply = CreateSegmentReply;
1171}
1172
1173#[cfg_attr(feature = "extra-traits", derive(Debug))]
1182pub struct CreateSegmentReply {
1183 pub nfd: u8,
1184 pub sequence: u16,
1185 pub length: u32,
1186 pub shm_fd: RawFdContainer,
1187}
1188impl_debug_if_no_extra_traits!(CreateSegmentReply, "CreateSegmentReply");
1189impl TryParseFd for CreateSegmentReply {
1190 fn try_parse_fd<'a>(initial_value: &'a [u8], fds: &mut Vec<RawFdContainer>) -> Result<(Self, &'a [u8]), ParseError> {
1191 let remaining = initial_value;
1192 let (response_type, remaining) = u8::try_parse(remaining)?;
1193 let (nfd, remaining) = u8::try_parse(remaining)?;
1194 let (sequence, remaining) = u16::try_parse(remaining)?;
1195 let (length, remaining) = u32::try_parse(remaining)?;
1196 if fds.is_empty() { return Err(ParseError::MissingFileDescriptors) }
1197 let shm_fd = fds.remove(0);
1198 let remaining = remaining.get(24..).ok_or(ParseError::InsufficientData)?;
1199 if response_type != 1 {
1200 return Err(ParseError::InvalidValue);
1201 }
1202 let result = CreateSegmentReply { nfd, sequence, length, shm_fd };
1203 let _ = remaining;
1204 let remaining = initial_value.get(32 + length as usize * 4..)
1205 .ok_or(ParseError::InsufficientData)?;
1206 Ok((result, remaining))
1207 }
1208}
1209impl Serialize for CreateSegmentReply {
1210 type Bytes = [u8; 32];
1211 fn serialize(&self) -> [u8; 32] {
1212 let response_type_bytes = &[1];
1213 let nfd_bytes = self.nfd.serialize();
1214 let sequence_bytes = self.sequence.serialize();
1215 let length_bytes = self.length.serialize();
1216 [
1217 response_type_bytes[0],
1218 nfd_bytes[0],
1219 sequence_bytes[0],
1220 sequence_bytes[1],
1221 length_bytes[0],
1222 length_bytes[1],
1223 length_bytes[2],
1224 length_bytes[3],
1225 0,
1226 0,
1227 0,
1228 0,
1229 0,
1230 0,
1231 0,
1232 0,
1233 0,
1234 0,
1235 0,
1236 0,
1237 0,
1238 0,
1239 0,
1240 0,
1241 0,
1242 0,
1243 0,
1244 0,
1245 0,
1246 0,
1247 0,
1248 0,
1249 ]
1250 }
1251 fn serialize_into(&self, bytes: &mut Vec<u8>) {
1252 bytes.reserve(32);
1253 let response_type_bytes = &[1];
1254 bytes.push(response_type_bytes[0]);
1255 self.nfd.serialize_into(bytes);
1256 self.sequence.serialize_into(bytes);
1257 self.length.serialize_into(bytes);
1258 bytes.extend_from_slice(&[0; 24]);
1259 }
1260}
1261