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 = "DRI3";
30
31pub const X11_XML_VERSION: (u32, u32) = (1, 4);
38
39pub type Syncobj = u32;
40
41pub const QUERY_VERSION_REQUEST: u8 = 0;
43#[derive(Clone, Copy, Default)]
44#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
45#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
46pub struct QueryVersionRequest {
47 pub major_version: u32,
48 pub minor_version: u32,
49}
50impl_debug_if_no_extra_traits!(QueryVersionRequest, "QueryVersionRequest");
51impl QueryVersionRequest {
52 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
54 let length_so_far = 0;
55 let major_version_bytes = self.major_version.serialize();
56 let minor_version_bytes = self.minor_version.serialize();
57 let mut request0 = vec![
58 major_opcode,
59 QUERY_VERSION_REQUEST,
60 0,
61 0,
62 major_version_bytes[0],
63 major_version_bytes[1],
64 major_version_bytes[2],
65 major_version_bytes[3],
66 minor_version_bytes[0],
67 minor_version_bytes[1],
68 minor_version_bytes[2],
69 minor_version_bytes[3],
70 ];
71 let length_so_far = length_so_far + request0.len();
72 assert_eq!(length_so_far % 4, 0);
73 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
74 request0[2..4].copy_from_slice(&length.to_ne_bytes());
75 ([request0.into()], vec![])
76 }
77 #[cfg(feature = "request-parsing")]
79 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
80 if header.minor_opcode != QUERY_VERSION_REQUEST {
81 return Err(ParseError::InvalidValue);
82 }
83 let (major_version, remaining) = u32::try_parse(value)?;
84 let (minor_version, remaining) = u32::try_parse(remaining)?;
85 let _ = remaining;
86 Ok(QueryVersionRequest {
87 major_version,
88 minor_version,
89 })
90 }
91}
92impl Request for QueryVersionRequest {
93 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
94
95 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
96 let (bufs, fds) = self.serialize(major_opcode);
97 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
99 (buf, fds)
100 }
101}
102impl crate::x11_utils::ReplyRequest for QueryVersionRequest {
103 type Reply = QueryVersionReply;
104}
105
106#[derive(Clone, Copy, Default)]
107#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
108#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
109pub struct QueryVersionReply {
110 pub sequence: u16,
111 pub length: u32,
112 pub major_version: u32,
113 pub minor_version: u32,
114}
115impl_debug_if_no_extra_traits!(QueryVersionReply, "QueryVersionReply");
116impl TryParse for QueryVersionReply {
117 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
118 let remaining = initial_value;
119 let (response_type, remaining) = u8::try_parse(remaining)?;
120 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
121 let (sequence, remaining) = u16::try_parse(remaining)?;
122 let (length, remaining) = u32::try_parse(remaining)?;
123 let (major_version, remaining) = u32::try_parse(remaining)?;
124 let (minor_version, remaining) = u32::try_parse(remaining)?;
125 if response_type != 1 {
126 return Err(ParseError::InvalidValue);
127 }
128 let result = QueryVersionReply { sequence, length, major_version, minor_version };
129 let _ = remaining;
130 let remaining = initial_value.get(32 + length as usize * 4..)
131 .ok_or(ParseError::InsufficientData)?;
132 Ok((result, remaining))
133 }
134}
135impl Serialize for QueryVersionReply {
136 type Bytes = [u8; 16];
137 fn serialize(&self) -> [u8; 16] {
138 let response_type_bytes = &[1];
139 let sequence_bytes = self.sequence.serialize();
140 let length_bytes = self.length.serialize();
141 let major_version_bytes = self.major_version.serialize();
142 let minor_version_bytes = self.minor_version.serialize();
143 [
144 response_type_bytes[0],
145 0,
146 sequence_bytes[0],
147 sequence_bytes[1],
148 length_bytes[0],
149 length_bytes[1],
150 length_bytes[2],
151 length_bytes[3],
152 major_version_bytes[0],
153 major_version_bytes[1],
154 major_version_bytes[2],
155 major_version_bytes[3],
156 minor_version_bytes[0],
157 minor_version_bytes[1],
158 minor_version_bytes[2],
159 minor_version_bytes[3],
160 ]
161 }
162 fn serialize_into(&self, bytes: &mut Vec<u8>) {
163 bytes.reserve(16);
164 let response_type_bytes = &[1];
165 bytes.push(response_type_bytes[0]);
166 bytes.extend_from_slice(&[0; 1]);
167 self.sequence.serialize_into(bytes);
168 self.length.serialize_into(bytes);
169 self.major_version.serialize_into(bytes);
170 self.minor_version.serialize_into(bytes);
171 }
172}
173
174pub const OPEN_REQUEST: u8 = 1;
176#[derive(Clone, Copy, Default)]
177#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
178#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
179pub struct OpenRequest {
180 pub drawable: xproto::Drawable,
181 pub provider: u32,
182}
183impl_debug_if_no_extra_traits!(OpenRequest, "OpenRequest");
184impl OpenRequest {
185 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
187 let length_so_far = 0;
188 let drawable_bytes = self.drawable.serialize();
189 let provider_bytes = self.provider.serialize();
190 let mut request0 = vec![
191 major_opcode,
192 OPEN_REQUEST,
193 0,
194 0,
195 drawable_bytes[0],
196 drawable_bytes[1],
197 drawable_bytes[2],
198 drawable_bytes[3],
199 provider_bytes[0],
200 provider_bytes[1],
201 provider_bytes[2],
202 provider_bytes[3],
203 ];
204 let length_so_far = length_so_far + request0.len();
205 assert_eq!(length_so_far % 4, 0);
206 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
207 request0[2..4].copy_from_slice(&length.to_ne_bytes());
208 ([request0.into()], vec![])
209 }
210 #[cfg(feature = "request-parsing")]
212 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
213 if header.minor_opcode != OPEN_REQUEST {
214 return Err(ParseError::InvalidValue);
215 }
216 let (drawable, remaining) = xproto::Drawable::try_parse(value)?;
217 let (provider, remaining) = u32::try_parse(remaining)?;
218 let _ = remaining;
219 Ok(OpenRequest {
220 drawable,
221 provider,
222 })
223 }
224}
225impl Request for OpenRequest {
226 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
227
228 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
229 let (bufs, fds) = self.serialize(major_opcode);
230 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
232 (buf, fds)
233 }
234}
235impl crate::x11_utils::ReplyFDsRequest for OpenRequest {
236 type Reply = OpenReply;
237}
238
239#[cfg_attr(feature = "extra-traits", derive(Debug))]
240pub struct OpenReply {
241 pub nfd: u8,
242 pub sequence: u16,
243 pub length: u32,
244 pub device_fd: RawFdContainer,
245}
246impl_debug_if_no_extra_traits!(OpenReply, "OpenReply");
247impl TryParseFd for OpenReply {
248 fn try_parse_fd<'a>(initial_value: &'a [u8], fds: &mut Vec<RawFdContainer>) -> Result<(Self, &'a [u8]), ParseError> {
249 let remaining = initial_value;
250 let (response_type, remaining) = u8::try_parse(remaining)?;
251 let (nfd, remaining) = u8::try_parse(remaining)?;
252 let (sequence, remaining) = u16::try_parse(remaining)?;
253 let (length, remaining) = u32::try_parse(remaining)?;
254 if fds.is_empty() { return Err(ParseError::MissingFileDescriptors) }
255 let device_fd = fds.remove(0);
256 let remaining = remaining.get(24..).ok_or(ParseError::InsufficientData)?;
257 if response_type != 1 {
258 return Err(ParseError::InvalidValue);
259 }
260 let result = OpenReply { nfd, sequence, length, device_fd };
261 let _ = remaining;
262 let remaining = initial_value.get(32 + length as usize * 4..)
263 .ok_or(ParseError::InsufficientData)?;
264 Ok((result, remaining))
265 }
266}
267impl Serialize for OpenReply {
268 type Bytes = [u8; 32];
269 fn serialize(&self) -> [u8; 32] {
270 let response_type_bytes = &[1];
271 let nfd_bytes = self.nfd.serialize();
272 let sequence_bytes = self.sequence.serialize();
273 let length_bytes = self.length.serialize();
274 [
275 response_type_bytes[0],
276 nfd_bytes[0],
277 sequence_bytes[0],
278 sequence_bytes[1],
279 length_bytes[0],
280 length_bytes[1],
281 length_bytes[2],
282 length_bytes[3],
283 0,
284 0,
285 0,
286 0,
287 0,
288 0,
289 0,
290 0,
291 0,
292 0,
293 0,
294 0,
295 0,
296 0,
297 0,
298 0,
299 0,
300 0,
301 0,
302 0,
303 0,
304 0,
305 0,
306 0,
307 ]
308 }
309 fn serialize_into(&self, bytes: &mut Vec<u8>) {
310 bytes.reserve(32);
311 let response_type_bytes = &[1];
312 bytes.push(response_type_bytes[0]);
313 self.nfd.serialize_into(bytes);
314 self.sequence.serialize_into(bytes);
315 self.length.serialize_into(bytes);
316 bytes.extend_from_slice(&[0; 24]);
317 }
318}
319
320pub const PIXMAP_FROM_BUFFER_REQUEST: u8 = 2;
322#[cfg_attr(feature = "extra-traits", derive(Debug))]
323pub struct PixmapFromBufferRequest {
324 pub pixmap: xproto::Pixmap,
325 pub drawable: xproto::Drawable,
326 pub size: u32,
327 pub width: u16,
328 pub height: u16,
329 pub stride: u16,
330 pub depth: u8,
331 pub bpp: u8,
332 pub pixmap_fd: RawFdContainer,
333}
334impl_debug_if_no_extra_traits!(PixmapFromBufferRequest, "PixmapFromBufferRequest");
335impl PixmapFromBufferRequest {
336 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
338 let length_so_far = 0;
339 let pixmap_bytes = self.pixmap.serialize();
340 let drawable_bytes = self.drawable.serialize();
341 let size_bytes = self.size.serialize();
342 let width_bytes = self.width.serialize();
343 let height_bytes = self.height.serialize();
344 let stride_bytes = self.stride.serialize();
345 let depth_bytes = self.depth.serialize();
346 let bpp_bytes = self.bpp.serialize();
347 let mut request0 = vec![
348 major_opcode,
349 PIXMAP_FROM_BUFFER_REQUEST,
350 0,
351 0,
352 pixmap_bytes[0],
353 pixmap_bytes[1],
354 pixmap_bytes[2],
355 pixmap_bytes[3],
356 drawable_bytes[0],
357 drawable_bytes[1],
358 drawable_bytes[2],
359 drawable_bytes[3],
360 size_bytes[0],
361 size_bytes[1],
362 size_bytes[2],
363 size_bytes[3],
364 width_bytes[0],
365 width_bytes[1],
366 height_bytes[0],
367 height_bytes[1],
368 stride_bytes[0],
369 stride_bytes[1],
370 depth_bytes[0],
371 bpp_bytes[0],
372 ];
373 let length_so_far = length_so_far + request0.len();
374 assert_eq!(length_so_far % 4, 0);
375 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
376 request0[2..4].copy_from_slice(&length.to_ne_bytes());
377 ([request0.into()], vec![self.pixmap_fd])
378 }
379 #[cfg(feature = "request-parsing")]
381 pub fn try_parse_request_fd(header: RequestHeader, value: &[u8], fds: &mut Vec<RawFdContainer>) -> Result<Self, ParseError> {
382 if header.minor_opcode != PIXMAP_FROM_BUFFER_REQUEST {
383 return Err(ParseError::InvalidValue);
384 }
385 let (pixmap, remaining) = xproto::Pixmap::try_parse(value)?;
386 let (drawable, remaining) = xproto::Drawable::try_parse(remaining)?;
387 let (size, remaining) = u32::try_parse(remaining)?;
388 let (width, remaining) = u16::try_parse(remaining)?;
389 let (height, remaining) = u16::try_parse(remaining)?;
390 let (stride, remaining) = u16::try_parse(remaining)?;
391 let (depth, remaining) = u8::try_parse(remaining)?;
392 let (bpp, remaining) = u8::try_parse(remaining)?;
393 if fds.is_empty() { return Err(ParseError::MissingFileDescriptors) }
394 let pixmap_fd = fds.remove(0);
395 let _ = remaining;
396 Ok(PixmapFromBufferRequest {
397 pixmap,
398 drawable,
399 size,
400 width,
401 height,
402 stride,
403 depth,
404 bpp,
405 pixmap_fd,
406 })
407 }
408}
409impl Request for PixmapFromBufferRequest {
410 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
411
412 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
413 let (bufs, fds) = self.serialize(major_opcode);
414 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
416 (buf, fds)
417 }
418}
419impl crate::x11_utils::VoidRequest for PixmapFromBufferRequest {
420}
421
422pub const BUFFER_FROM_PIXMAP_REQUEST: u8 = 3;
424#[derive(Clone, Copy, Default)]
425#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
426#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
427pub struct BufferFromPixmapRequest {
428 pub pixmap: xproto::Pixmap,
429}
430impl_debug_if_no_extra_traits!(BufferFromPixmapRequest, "BufferFromPixmapRequest");
431impl BufferFromPixmapRequest {
432 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
434 let length_so_far = 0;
435 let pixmap_bytes = self.pixmap.serialize();
436 let mut request0 = vec![
437 major_opcode,
438 BUFFER_FROM_PIXMAP_REQUEST,
439 0,
440 0,
441 pixmap_bytes[0],
442 pixmap_bytes[1],
443 pixmap_bytes[2],
444 pixmap_bytes[3],
445 ];
446 let length_so_far = length_so_far + request0.len();
447 assert_eq!(length_so_far % 4, 0);
448 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
449 request0[2..4].copy_from_slice(&length.to_ne_bytes());
450 ([request0.into()], vec![])
451 }
452 #[cfg(feature = "request-parsing")]
454 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
455 if header.minor_opcode != BUFFER_FROM_PIXMAP_REQUEST {
456 return Err(ParseError::InvalidValue);
457 }
458 let (pixmap, remaining) = xproto::Pixmap::try_parse(value)?;
459 let _ = remaining;
460 Ok(BufferFromPixmapRequest {
461 pixmap,
462 })
463 }
464}
465impl Request for BufferFromPixmapRequest {
466 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
467
468 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
469 let (bufs, fds) = self.serialize(major_opcode);
470 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
472 (buf, fds)
473 }
474}
475impl crate::x11_utils::ReplyFDsRequest for BufferFromPixmapRequest {
476 type Reply = BufferFromPixmapReply;
477}
478
479#[cfg_attr(feature = "extra-traits", derive(Debug))]
480pub struct BufferFromPixmapReply {
481 pub nfd: u8,
482 pub sequence: u16,
483 pub length: u32,
484 pub size: u32,
485 pub width: u16,
486 pub height: u16,
487 pub stride: u16,
488 pub depth: u8,
489 pub bpp: u8,
490 pub pixmap_fd: RawFdContainer,
491}
492impl_debug_if_no_extra_traits!(BufferFromPixmapReply, "BufferFromPixmapReply");
493impl TryParseFd for BufferFromPixmapReply {
494 fn try_parse_fd<'a>(initial_value: &'a [u8], fds: &mut Vec<RawFdContainer>) -> Result<(Self, &'a [u8]), ParseError> {
495 let remaining = initial_value;
496 let (response_type, remaining) = u8::try_parse(remaining)?;
497 let (nfd, remaining) = u8::try_parse(remaining)?;
498 let (sequence, remaining) = u16::try_parse(remaining)?;
499 let (length, remaining) = u32::try_parse(remaining)?;
500 let (size, remaining) = u32::try_parse(remaining)?;
501 let (width, remaining) = u16::try_parse(remaining)?;
502 let (height, remaining) = u16::try_parse(remaining)?;
503 let (stride, remaining) = u16::try_parse(remaining)?;
504 let (depth, remaining) = u8::try_parse(remaining)?;
505 let (bpp, remaining) = u8::try_parse(remaining)?;
506 if fds.is_empty() { return Err(ParseError::MissingFileDescriptors) }
507 let pixmap_fd = fds.remove(0);
508 let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
509 if response_type != 1 {
510 return Err(ParseError::InvalidValue);
511 }
512 let result = BufferFromPixmapReply { nfd, sequence, length, size, width, height, stride, depth, bpp, pixmap_fd };
513 let _ = remaining;
514 let remaining = initial_value.get(32 + length as usize * 4..)
515 .ok_or(ParseError::InsufficientData)?;
516 Ok((result, remaining))
517 }
518}
519impl Serialize for BufferFromPixmapReply {
520 type Bytes = [u8; 32];
521 fn serialize(&self) -> [u8; 32] {
522 let response_type_bytes = &[1];
523 let nfd_bytes = self.nfd.serialize();
524 let sequence_bytes = self.sequence.serialize();
525 let length_bytes = self.length.serialize();
526 let size_bytes = self.size.serialize();
527 let width_bytes = self.width.serialize();
528 let height_bytes = self.height.serialize();
529 let stride_bytes = self.stride.serialize();
530 let depth_bytes = self.depth.serialize();
531 let bpp_bytes = self.bpp.serialize();
532 [
533 response_type_bytes[0],
534 nfd_bytes[0],
535 sequence_bytes[0],
536 sequence_bytes[1],
537 length_bytes[0],
538 length_bytes[1],
539 length_bytes[2],
540 length_bytes[3],
541 size_bytes[0],
542 size_bytes[1],
543 size_bytes[2],
544 size_bytes[3],
545 width_bytes[0],
546 width_bytes[1],
547 height_bytes[0],
548 height_bytes[1],
549 stride_bytes[0],
550 stride_bytes[1],
551 depth_bytes[0],
552 bpp_bytes[0],
553 0,
554 0,
555 0,
556 0,
557 0,
558 0,
559 0,
560 0,
561 0,
562 0,
563 0,
564 0,
565 ]
566 }
567 fn serialize_into(&self, bytes: &mut Vec<u8>) {
568 bytes.reserve(32);
569 let response_type_bytes = &[1];
570 bytes.push(response_type_bytes[0]);
571 self.nfd.serialize_into(bytes);
572 self.sequence.serialize_into(bytes);
573 self.length.serialize_into(bytes);
574 self.size.serialize_into(bytes);
575 self.width.serialize_into(bytes);
576 self.height.serialize_into(bytes);
577 self.stride.serialize_into(bytes);
578 self.depth.serialize_into(bytes);
579 self.bpp.serialize_into(bytes);
580 bytes.extend_from_slice(&[0; 12]);
581 }
582}
583
584pub const FENCE_FROM_FD_REQUEST: u8 = 4;
586#[cfg_attr(feature = "extra-traits", derive(Debug))]
587pub struct FenceFromFDRequest {
588 pub drawable: xproto::Drawable,
589 pub fence: u32,
590 pub initially_triggered: bool,
591 pub fence_fd: RawFdContainer,
592}
593impl_debug_if_no_extra_traits!(FenceFromFDRequest, "FenceFromFDRequest");
594impl FenceFromFDRequest {
595 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
597 let length_so_far = 0;
598 let drawable_bytes = self.drawable.serialize();
599 let fence_bytes = self.fence.serialize();
600 let initially_triggered_bytes = self.initially_triggered.serialize();
601 let mut request0 = vec![
602 major_opcode,
603 FENCE_FROM_FD_REQUEST,
604 0,
605 0,
606 drawable_bytes[0],
607 drawable_bytes[1],
608 drawable_bytes[2],
609 drawable_bytes[3],
610 fence_bytes[0],
611 fence_bytes[1],
612 fence_bytes[2],
613 fence_bytes[3],
614 initially_triggered_bytes[0],
615 0,
616 0,
617 0,
618 ];
619 let length_so_far = length_so_far + request0.len();
620 assert_eq!(length_so_far % 4, 0);
621 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
622 request0[2..4].copy_from_slice(&length.to_ne_bytes());
623 ([request0.into()], vec![self.fence_fd])
624 }
625 #[cfg(feature = "request-parsing")]
627 pub fn try_parse_request_fd(header: RequestHeader, value: &[u8], fds: &mut Vec<RawFdContainer>) -> Result<Self, ParseError> {
628 if header.minor_opcode != FENCE_FROM_FD_REQUEST {
629 return Err(ParseError::InvalidValue);
630 }
631 let (drawable, remaining) = xproto::Drawable::try_parse(value)?;
632 let (fence, remaining) = u32::try_parse(remaining)?;
633 let (initially_triggered, remaining) = bool::try_parse(remaining)?;
634 let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
635 if fds.is_empty() { return Err(ParseError::MissingFileDescriptors) }
636 let fence_fd = fds.remove(0);
637 let _ = remaining;
638 Ok(FenceFromFDRequest {
639 drawable,
640 fence,
641 initially_triggered,
642 fence_fd,
643 })
644 }
645}
646impl Request for FenceFromFDRequest {
647 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
648
649 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
650 let (bufs, fds) = self.serialize(major_opcode);
651 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
653 (buf, fds)
654 }
655}
656impl crate::x11_utils::VoidRequest for FenceFromFDRequest {
657}
658
659pub const FD_FROM_FENCE_REQUEST: u8 = 5;
661#[derive(Clone, Copy, Default)]
662#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
663#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
664pub struct FDFromFenceRequest {
665 pub drawable: xproto::Drawable,
666 pub fence: u32,
667}
668impl_debug_if_no_extra_traits!(FDFromFenceRequest, "FDFromFenceRequest");
669impl FDFromFenceRequest {
670 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
672 let length_so_far = 0;
673 let drawable_bytes = self.drawable.serialize();
674 let fence_bytes = self.fence.serialize();
675 let mut request0 = vec![
676 major_opcode,
677 FD_FROM_FENCE_REQUEST,
678 0,
679 0,
680 drawable_bytes[0],
681 drawable_bytes[1],
682 drawable_bytes[2],
683 drawable_bytes[3],
684 fence_bytes[0],
685 fence_bytes[1],
686 fence_bytes[2],
687 fence_bytes[3],
688 ];
689 let length_so_far = length_so_far + request0.len();
690 assert_eq!(length_so_far % 4, 0);
691 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
692 request0[2..4].copy_from_slice(&length.to_ne_bytes());
693 ([request0.into()], vec![])
694 }
695 #[cfg(feature = "request-parsing")]
697 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
698 if header.minor_opcode != FD_FROM_FENCE_REQUEST {
699 return Err(ParseError::InvalidValue);
700 }
701 let (drawable, remaining) = xproto::Drawable::try_parse(value)?;
702 let (fence, remaining) = u32::try_parse(remaining)?;
703 let _ = remaining;
704 Ok(FDFromFenceRequest {
705 drawable,
706 fence,
707 })
708 }
709}
710impl Request for FDFromFenceRequest {
711 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
712
713 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
714 let (bufs, fds) = self.serialize(major_opcode);
715 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
717 (buf, fds)
718 }
719}
720impl crate::x11_utils::ReplyFDsRequest for FDFromFenceRequest {
721 type Reply = FDFromFenceReply;
722}
723
724#[cfg_attr(feature = "extra-traits", derive(Debug))]
725pub struct FDFromFenceReply {
726 pub nfd: u8,
727 pub sequence: u16,
728 pub length: u32,
729 pub fence_fd: RawFdContainer,
730}
731impl_debug_if_no_extra_traits!(FDFromFenceReply, "FDFromFenceReply");
732impl TryParseFd for FDFromFenceReply {
733 fn try_parse_fd<'a>(initial_value: &'a [u8], fds: &mut Vec<RawFdContainer>) -> Result<(Self, &'a [u8]), ParseError> {
734 let remaining = initial_value;
735 let (response_type, remaining) = u8::try_parse(remaining)?;
736 let (nfd, remaining) = u8::try_parse(remaining)?;
737 let (sequence, remaining) = u16::try_parse(remaining)?;
738 let (length, remaining) = u32::try_parse(remaining)?;
739 if fds.is_empty() { return Err(ParseError::MissingFileDescriptors) }
740 let fence_fd = fds.remove(0);
741 let remaining = remaining.get(24..).ok_or(ParseError::InsufficientData)?;
742 if response_type != 1 {
743 return Err(ParseError::InvalidValue);
744 }
745 let result = FDFromFenceReply { nfd, sequence, length, fence_fd };
746 let _ = remaining;
747 let remaining = initial_value.get(32 + length as usize * 4..)
748 .ok_or(ParseError::InsufficientData)?;
749 Ok((result, remaining))
750 }
751}
752impl Serialize for FDFromFenceReply {
753 type Bytes = [u8; 32];
754 fn serialize(&self) -> [u8; 32] {
755 let response_type_bytes = &[1];
756 let nfd_bytes = self.nfd.serialize();
757 let sequence_bytes = self.sequence.serialize();
758 let length_bytes = self.length.serialize();
759 [
760 response_type_bytes[0],
761 nfd_bytes[0],
762 sequence_bytes[0],
763 sequence_bytes[1],
764 length_bytes[0],
765 length_bytes[1],
766 length_bytes[2],
767 length_bytes[3],
768 0,
769 0,
770 0,
771 0,
772 0,
773 0,
774 0,
775 0,
776 0,
777 0,
778 0,
779 0,
780 0,
781 0,
782 0,
783 0,
784 0,
785 0,
786 0,
787 0,
788 0,
789 0,
790 0,
791 0,
792 ]
793 }
794 fn serialize_into(&self, bytes: &mut Vec<u8>) {
795 bytes.reserve(32);
796 let response_type_bytes = &[1];
797 bytes.push(response_type_bytes[0]);
798 self.nfd.serialize_into(bytes);
799 self.sequence.serialize_into(bytes);
800 self.length.serialize_into(bytes);
801 bytes.extend_from_slice(&[0; 24]);
802 }
803}
804
805pub const GET_SUPPORTED_MODIFIERS_REQUEST: u8 = 6;
807#[derive(Clone, Copy, Default)]
808#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
809#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
810pub struct GetSupportedModifiersRequest {
811 pub window: u32,
812 pub depth: u8,
813 pub bpp: u8,
814}
815impl_debug_if_no_extra_traits!(GetSupportedModifiersRequest, "GetSupportedModifiersRequest");
816impl GetSupportedModifiersRequest {
817 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
819 let length_so_far = 0;
820 let window_bytes = self.window.serialize();
821 let depth_bytes = self.depth.serialize();
822 let bpp_bytes = self.bpp.serialize();
823 let mut request0 = vec![
824 major_opcode,
825 GET_SUPPORTED_MODIFIERS_REQUEST,
826 0,
827 0,
828 window_bytes[0],
829 window_bytes[1],
830 window_bytes[2],
831 window_bytes[3],
832 depth_bytes[0],
833 bpp_bytes[0],
834 0,
835 0,
836 ];
837 let length_so_far = length_so_far + request0.len();
838 assert_eq!(length_so_far % 4, 0);
839 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
840 request0[2..4].copy_from_slice(&length.to_ne_bytes());
841 ([request0.into()], vec![])
842 }
843 #[cfg(feature = "request-parsing")]
845 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
846 if header.minor_opcode != GET_SUPPORTED_MODIFIERS_REQUEST {
847 return Err(ParseError::InvalidValue);
848 }
849 let (window, remaining) = u32::try_parse(value)?;
850 let (depth, remaining) = u8::try_parse(remaining)?;
851 let (bpp, remaining) = u8::try_parse(remaining)?;
852 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
853 let _ = remaining;
854 Ok(GetSupportedModifiersRequest {
855 window,
856 depth,
857 bpp,
858 })
859 }
860}
861impl Request for GetSupportedModifiersRequest {
862 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
863
864 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
865 let (bufs, fds) = self.serialize(major_opcode);
866 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
868 (buf, fds)
869 }
870}
871impl crate::x11_utils::ReplyRequest for GetSupportedModifiersRequest {
872 type Reply = GetSupportedModifiersReply;
873}
874
875#[derive(Clone, Default)]
876#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
877#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
878pub struct GetSupportedModifiersReply {
879 pub sequence: u16,
880 pub length: u32,
881 pub window_modifiers: Vec<u64>,
882 pub screen_modifiers: Vec<u64>,
883}
884impl_debug_if_no_extra_traits!(GetSupportedModifiersReply, "GetSupportedModifiersReply");
885impl TryParse for GetSupportedModifiersReply {
886 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
887 let remaining = initial_value;
888 let (response_type, remaining) = u8::try_parse(remaining)?;
889 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
890 let (sequence, remaining) = u16::try_parse(remaining)?;
891 let (length, remaining) = u32::try_parse(remaining)?;
892 let (num_window_modifiers, remaining) = u32::try_parse(remaining)?;
893 let (num_screen_modifiers, remaining) = u32::try_parse(remaining)?;
894 let remaining = remaining.get(16..).ok_or(ParseError::InsufficientData)?;
895 let (window_modifiers, remaining) = crate::x11_utils::parse_list::<u64>(remaining, num_window_modifiers.try_to_usize()?)?;
896 let (screen_modifiers, remaining) = crate::x11_utils::parse_list::<u64>(remaining, num_screen_modifiers.try_to_usize()?)?;
897 if response_type != 1 {
898 return Err(ParseError::InvalidValue);
899 }
900 let result = GetSupportedModifiersReply { sequence, length, window_modifiers, screen_modifiers };
901 let _ = remaining;
902 let remaining = initial_value.get(32 + length as usize * 4..)
903 .ok_or(ParseError::InsufficientData)?;
904 Ok((result, remaining))
905 }
906}
907impl Serialize for GetSupportedModifiersReply {
908 type Bytes = Vec<u8>;
909 fn serialize(&self) -> Vec<u8> {
910 let mut result = Vec::new();
911 self.serialize_into(&mut result);
912 result
913 }
914 fn serialize_into(&self, bytes: &mut Vec<u8>) {
915 bytes.reserve(32);
916 let response_type_bytes = &[1];
917 bytes.push(response_type_bytes[0]);
918 bytes.extend_from_slice(&[0; 1]);
919 self.sequence.serialize_into(bytes);
920 self.length.serialize_into(bytes);
921 let num_window_modifiers = u32::try_from(self.window_modifiers.len()).expect("`window_modifiers` has too many elements");
922 num_window_modifiers.serialize_into(bytes);
923 let num_screen_modifiers = u32::try_from(self.screen_modifiers.len()).expect("`screen_modifiers` has too many elements");
924 num_screen_modifiers.serialize_into(bytes);
925 bytes.extend_from_slice(&[0; 16]);
926 self.window_modifiers.serialize_into(bytes);
927 self.screen_modifiers.serialize_into(bytes);
928 }
929}
930impl GetSupportedModifiersReply {
931 pub fn num_window_modifiers(&self) -> u32 {
941 self.window_modifiers.len()
942 .try_into().unwrap()
943 }
944 pub fn num_screen_modifiers(&self) -> u32 {
954 self.screen_modifiers.len()
955 .try_into().unwrap()
956 }
957}
958
959pub const PIXMAP_FROM_BUFFERS_REQUEST: u8 = 7;
961#[cfg_attr(feature = "extra-traits", derive(Debug))]
962pub struct PixmapFromBuffersRequest {
963 pub pixmap: xproto::Pixmap,
964 pub window: xproto::Window,
965 pub width: u16,
966 pub height: u16,
967 pub stride0: u32,
968 pub offset0: u32,
969 pub stride1: u32,
970 pub offset1: u32,
971 pub stride2: u32,
972 pub offset2: u32,
973 pub stride3: u32,
974 pub offset3: u32,
975 pub depth: u8,
976 pub bpp: u8,
977 pub modifier: u64,
978 pub buffers: Vec<RawFdContainer>,
979}
980impl_debug_if_no_extra_traits!(PixmapFromBuffersRequest, "PixmapFromBuffersRequest");
981impl PixmapFromBuffersRequest {
982 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
984 let length_so_far = 0;
985 let pixmap_bytes = self.pixmap.serialize();
986 let window_bytes = self.window.serialize();
987 let num_buffers = u8::try_from(self.buffers.len()).expect("`buffers` has too many elements");
988 let num_buffers_bytes = num_buffers.serialize();
989 let width_bytes = self.width.serialize();
990 let height_bytes = self.height.serialize();
991 let stride0_bytes = self.stride0.serialize();
992 let offset0_bytes = self.offset0.serialize();
993 let stride1_bytes = self.stride1.serialize();
994 let offset1_bytes = self.offset1.serialize();
995 let stride2_bytes = self.stride2.serialize();
996 let offset2_bytes = self.offset2.serialize();
997 let stride3_bytes = self.stride3.serialize();
998 let offset3_bytes = self.offset3.serialize();
999 let depth_bytes = self.depth.serialize();
1000 let bpp_bytes = self.bpp.serialize();
1001 let modifier_bytes = self.modifier.serialize();
1002 let mut request0 = vec![
1003 major_opcode,
1004 PIXMAP_FROM_BUFFERS_REQUEST,
1005 0,
1006 0,
1007 pixmap_bytes[0],
1008 pixmap_bytes[1],
1009 pixmap_bytes[2],
1010 pixmap_bytes[3],
1011 window_bytes[0],
1012 window_bytes[1],
1013 window_bytes[2],
1014 window_bytes[3],
1015 num_buffers_bytes[0],
1016 0,
1017 0,
1018 0,
1019 width_bytes[0],
1020 width_bytes[1],
1021 height_bytes[0],
1022 height_bytes[1],
1023 stride0_bytes[0],
1024 stride0_bytes[1],
1025 stride0_bytes[2],
1026 stride0_bytes[3],
1027 offset0_bytes[0],
1028 offset0_bytes[1],
1029 offset0_bytes[2],
1030 offset0_bytes[3],
1031 stride1_bytes[0],
1032 stride1_bytes[1],
1033 stride1_bytes[2],
1034 stride1_bytes[3],
1035 offset1_bytes[0],
1036 offset1_bytes[1],
1037 offset1_bytes[2],
1038 offset1_bytes[3],
1039 stride2_bytes[0],
1040 stride2_bytes[1],
1041 stride2_bytes[2],
1042 stride2_bytes[3],
1043 offset2_bytes[0],
1044 offset2_bytes[1],
1045 offset2_bytes[2],
1046 offset2_bytes[3],
1047 stride3_bytes[0],
1048 stride3_bytes[1],
1049 stride3_bytes[2],
1050 stride3_bytes[3],
1051 offset3_bytes[0],
1052 offset3_bytes[1],
1053 offset3_bytes[2],
1054 offset3_bytes[3],
1055 depth_bytes[0],
1056 bpp_bytes[0],
1057 0,
1058 0,
1059 modifier_bytes[0],
1060 modifier_bytes[1],
1061 modifier_bytes[2],
1062 modifier_bytes[3],
1063 modifier_bytes[4],
1064 modifier_bytes[5],
1065 modifier_bytes[6],
1066 modifier_bytes[7],
1067 ];
1068 let length_so_far = length_so_far + request0.len();
1069 assert_eq!(length_so_far % 4, 0);
1070 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1071 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1072 ([request0.into()], self.buffers)
1073 }
1074 #[cfg(feature = "request-parsing")]
1076 pub fn try_parse_request_fd(header: RequestHeader, value: &[u8], fds: &mut Vec<RawFdContainer>) -> Result<Self, ParseError> {
1077 if header.minor_opcode != PIXMAP_FROM_BUFFERS_REQUEST {
1078 return Err(ParseError::InvalidValue);
1079 }
1080 let (pixmap, remaining) = xproto::Pixmap::try_parse(value)?;
1081 let (window, remaining) = xproto::Window::try_parse(remaining)?;
1082 let (num_buffers, remaining) = u8::try_parse(remaining)?;
1083 let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?;
1084 let (width, remaining) = u16::try_parse(remaining)?;
1085 let (height, remaining) = u16::try_parse(remaining)?;
1086 let (stride0, remaining) = u32::try_parse(remaining)?;
1087 let (offset0, remaining) = u32::try_parse(remaining)?;
1088 let (stride1, remaining) = u32::try_parse(remaining)?;
1089 let (offset1, remaining) = u32::try_parse(remaining)?;
1090 let (stride2, remaining) = u32::try_parse(remaining)?;
1091 let (offset2, remaining) = u32::try_parse(remaining)?;
1092 let (stride3, remaining) = u32::try_parse(remaining)?;
1093 let (offset3, remaining) = u32::try_parse(remaining)?;
1094 let (depth, remaining) = u8::try_parse(remaining)?;
1095 let (bpp, remaining) = u8::try_parse(remaining)?;
1096 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1097 let (modifier, remaining) = u64::try_parse(remaining)?;
1098 let fds_len = num_buffers.try_to_usize()?;
1099 if fds.len() < fds_len { return Err(ParseError::MissingFileDescriptors) }
1100 let mut buffers = fds.split_off(fds_len);
1101 core::mem::swap(fds, &mut buffers);
1102 let _ = remaining;
1103 Ok(PixmapFromBuffersRequest {
1104 pixmap,
1105 window,
1106 width,
1107 height,
1108 stride0,
1109 offset0,
1110 stride1,
1111 offset1,
1112 stride2,
1113 offset2,
1114 stride3,
1115 offset3,
1116 depth,
1117 bpp,
1118 modifier,
1119 buffers,
1120 })
1121 }
1122}
1123impl Request for PixmapFromBuffersRequest {
1124 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1125
1126 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1127 let (bufs, fds) = self.serialize(major_opcode);
1128 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1130 (buf, fds)
1131 }
1132}
1133impl crate::x11_utils::VoidRequest for PixmapFromBuffersRequest {
1134}
1135
1136pub const BUFFERS_FROM_PIXMAP_REQUEST: u8 = 8;
1138#[derive(Clone, Copy, Default)]
1139#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1140#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1141pub struct BuffersFromPixmapRequest {
1142 pub pixmap: xproto::Pixmap,
1143}
1144impl_debug_if_no_extra_traits!(BuffersFromPixmapRequest, "BuffersFromPixmapRequest");
1145impl BuffersFromPixmapRequest {
1146 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1148 let length_so_far = 0;
1149 let pixmap_bytes = self.pixmap.serialize();
1150 let mut request0 = vec![
1151 major_opcode,
1152 BUFFERS_FROM_PIXMAP_REQUEST,
1153 0,
1154 0,
1155 pixmap_bytes[0],
1156 pixmap_bytes[1],
1157 pixmap_bytes[2],
1158 pixmap_bytes[3],
1159 ];
1160 let length_so_far = length_so_far + request0.len();
1161 assert_eq!(length_so_far % 4, 0);
1162 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1163 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1164 ([request0.into()], vec![])
1165 }
1166 #[cfg(feature = "request-parsing")]
1168 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1169 if header.minor_opcode != BUFFERS_FROM_PIXMAP_REQUEST {
1170 return Err(ParseError::InvalidValue);
1171 }
1172 let (pixmap, remaining) = xproto::Pixmap::try_parse(value)?;
1173 let _ = remaining;
1174 Ok(BuffersFromPixmapRequest {
1175 pixmap,
1176 })
1177 }
1178}
1179impl Request for BuffersFromPixmapRequest {
1180 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1181
1182 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1183 let (bufs, fds) = self.serialize(major_opcode);
1184 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1186 (buf, fds)
1187 }
1188}
1189impl crate::x11_utils::ReplyFDsRequest for BuffersFromPixmapRequest {
1190 type Reply = BuffersFromPixmapReply;
1191}
1192
1193#[cfg_attr(feature = "extra-traits", derive(Debug))]
1194pub struct BuffersFromPixmapReply {
1195 pub sequence: u16,
1196 pub length: u32,
1197 pub width: u16,
1198 pub height: u16,
1199 pub modifier: u64,
1200 pub depth: u8,
1201 pub bpp: u8,
1202 pub strides: Vec<u32>,
1203 pub offsets: Vec<u32>,
1204 pub buffers: Vec<RawFdContainer>,
1205}
1206impl_debug_if_no_extra_traits!(BuffersFromPixmapReply, "BuffersFromPixmapReply");
1207impl TryParseFd for BuffersFromPixmapReply {
1208 fn try_parse_fd<'a>(initial_value: &'a [u8], fds: &mut Vec<RawFdContainer>) -> Result<(Self, &'a [u8]), ParseError> {
1209 let remaining = initial_value;
1210 let (response_type, remaining) = u8::try_parse(remaining)?;
1211 let (nfd, remaining) = u8::try_parse(remaining)?;
1212 let (sequence, remaining) = u16::try_parse(remaining)?;
1213 let (length, remaining) = u32::try_parse(remaining)?;
1214 let (width, remaining) = u16::try_parse(remaining)?;
1215 let (height, remaining) = u16::try_parse(remaining)?;
1216 let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
1217 let (modifier, remaining) = u64::try_parse(remaining)?;
1218 let (depth, remaining) = u8::try_parse(remaining)?;
1219 let (bpp, remaining) = u8::try_parse(remaining)?;
1220 let remaining = remaining.get(6..).ok_or(ParseError::InsufficientData)?;
1221 let (strides, remaining) = crate::x11_utils::parse_list::<u32>(remaining, nfd.try_to_usize()?)?;
1222 let (offsets, remaining) = crate::x11_utils::parse_list::<u32>(remaining, nfd.try_to_usize()?)?;
1223 let fds_len = nfd.try_to_usize()?;
1224 if fds.len() < fds_len { return Err(ParseError::MissingFileDescriptors) }
1225 let mut buffers = fds.split_off(fds_len);
1226 core::mem::swap(fds, &mut buffers);
1227 if response_type != 1 {
1228 return Err(ParseError::InvalidValue);
1229 }
1230 let result = BuffersFromPixmapReply { sequence, length, width, height, modifier, depth, bpp, strides, offsets, buffers };
1231 let _ = remaining;
1232 let remaining = initial_value.get(32 + length as usize * 4..)
1233 .ok_or(ParseError::InsufficientData)?;
1234 Ok((result, remaining))
1235 }
1236}
1237impl Serialize for BuffersFromPixmapReply {
1238 type Bytes = Vec<u8>;
1239 fn serialize(&self) -> Vec<u8> {
1240 let mut result = Vec::new();
1241 self.serialize_into(&mut result);
1242 result
1243 }
1244 fn serialize_into(&self, bytes: &mut Vec<u8>) {
1245 bytes.reserve(32);
1246 let response_type_bytes = &[1];
1247 bytes.push(response_type_bytes[0]);
1248 let nfd = u8::try_from(self.strides.len()).expect("`strides` has too many elements");
1249 nfd.serialize_into(bytes);
1250 self.sequence.serialize_into(bytes);
1251 self.length.serialize_into(bytes);
1252 self.width.serialize_into(bytes);
1253 self.height.serialize_into(bytes);
1254 bytes.extend_from_slice(&[0; 4]);
1255 self.modifier.serialize_into(bytes);
1256 self.depth.serialize_into(bytes);
1257 self.bpp.serialize_into(bytes);
1258 bytes.extend_from_slice(&[0; 6]);
1259 self.strides.serialize_into(bytes);
1260 assert_eq!(self.offsets.len(), usize::try_from(nfd).unwrap(), "`offsets` has an incorrect length");
1261 self.offsets.serialize_into(bytes);
1262 assert_eq!(self.buffers.len(), usize::try_from(nfd).unwrap(), "`buffers` has an incorrect length");
1263 }
1264}
1265impl BuffersFromPixmapReply {
1266 pub fn nfd(&self) -> u8 {
1276 self.strides.len()
1277 .try_into().unwrap()
1278 }
1279}
1280
1281pub const SET_DRM_DEVICE_IN_USE_REQUEST: u8 = 9;
1283#[derive(Clone, Copy, Default)]
1284#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1285#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1286pub struct SetDRMDeviceInUseRequest {
1287 pub window: xproto::Window,
1288 pub drm_major: u32,
1289 pub drm_minor: u32,
1290}
1291impl_debug_if_no_extra_traits!(SetDRMDeviceInUseRequest, "SetDRMDeviceInUseRequest");
1292impl SetDRMDeviceInUseRequest {
1293 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1295 let length_so_far = 0;
1296 let window_bytes = self.window.serialize();
1297 let drm_major_bytes = self.drm_major.serialize();
1298 let drm_minor_bytes = self.drm_minor.serialize();
1299 let mut request0 = vec![
1300 major_opcode,
1301 SET_DRM_DEVICE_IN_USE_REQUEST,
1302 0,
1303 0,
1304 window_bytes[0],
1305 window_bytes[1],
1306 window_bytes[2],
1307 window_bytes[3],
1308 drm_major_bytes[0],
1309 drm_major_bytes[1],
1310 drm_major_bytes[2],
1311 drm_major_bytes[3],
1312 drm_minor_bytes[0],
1313 drm_minor_bytes[1],
1314 drm_minor_bytes[2],
1315 drm_minor_bytes[3],
1316 ];
1317 let length_so_far = length_so_far + request0.len();
1318 assert_eq!(length_so_far % 4, 0);
1319 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1320 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1321 ([request0.into()], vec![])
1322 }
1323 #[cfg(feature = "request-parsing")]
1325 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1326 if header.minor_opcode != SET_DRM_DEVICE_IN_USE_REQUEST {
1327 return Err(ParseError::InvalidValue);
1328 }
1329 let (window, remaining) = xproto::Window::try_parse(value)?;
1330 let (drm_major, remaining) = u32::try_parse(remaining)?;
1331 let (drm_minor, remaining) = u32::try_parse(remaining)?;
1332 let _ = remaining;
1333 Ok(SetDRMDeviceInUseRequest {
1334 window,
1335 drm_major,
1336 drm_minor,
1337 })
1338 }
1339}
1340impl Request for SetDRMDeviceInUseRequest {
1341 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1342
1343 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1344 let (bufs, fds) = self.serialize(major_opcode);
1345 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1347 (buf, fds)
1348 }
1349}
1350impl crate::x11_utils::VoidRequest for SetDRMDeviceInUseRequest {
1351}
1352
1353pub const IMPORT_SYNCOBJ_REQUEST: u8 = 10;
1355#[cfg_attr(feature = "extra-traits", derive(Debug))]
1356pub struct ImportSyncobjRequest {
1357 pub syncobj: Syncobj,
1358 pub drawable: xproto::Drawable,
1359 pub syncobj_fd: RawFdContainer,
1360}
1361impl_debug_if_no_extra_traits!(ImportSyncobjRequest, "ImportSyncobjRequest");
1362impl ImportSyncobjRequest {
1363 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1365 let length_so_far = 0;
1366 let syncobj_bytes = self.syncobj.serialize();
1367 let drawable_bytes = self.drawable.serialize();
1368 let mut request0 = vec![
1369 major_opcode,
1370 IMPORT_SYNCOBJ_REQUEST,
1371 0,
1372 0,
1373 syncobj_bytes[0],
1374 syncobj_bytes[1],
1375 syncobj_bytes[2],
1376 syncobj_bytes[3],
1377 drawable_bytes[0],
1378 drawable_bytes[1],
1379 drawable_bytes[2],
1380 drawable_bytes[3],
1381 ];
1382 let length_so_far = length_so_far + request0.len();
1383 assert_eq!(length_so_far % 4, 0);
1384 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1385 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1386 ([request0.into()], vec![self.syncobj_fd])
1387 }
1388 #[cfg(feature = "request-parsing")]
1390 pub fn try_parse_request_fd(header: RequestHeader, value: &[u8], fds: &mut Vec<RawFdContainer>) -> Result<Self, ParseError> {
1391 if header.minor_opcode != IMPORT_SYNCOBJ_REQUEST {
1392 return Err(ParseError::InvalidValue);
1393 }
1394 let (syncobj, remaining) = Syncobj::try_parse(value)?;
1395 let (drawable, remaining) = xproto::Drawable::try_parse(remaining)?;
1396 if fds.is_empty() { return Err(ParseError::MissingFileDescriptors) }
1397 let syncobj_fd = fds.remove(0);
1398 let _ = remaining;
1399 Ok(ImportSyncobjRequest {
1400 syncobj,
1401 drawable,
1402 syncobj_fd,
1403 })
1404 }
1405}
1406impl Request for ImportSyncobjRequest {
1407 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1408
1409 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1410 let (bufs, fds) = self.serialize(major_opcode);
1411 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1413 (buf, fds)
1414 }
1415}
1416impl crate::x11_utils::VoidRequest for ImportSyncobjRequest {
1417}
1418
1419pub const FREE_SYNCOBJ_REQUEST: u8 = 11;
1421#[derive(Clone, Copy, Default)]
1422#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1423#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1424pub struct FreeSyncobjRequest {
1425 pub syncobj: Syncobj,
1426}
1427impl_debug_if_no_extra_traits!(FreeSyncobjRequest, "FreeSyncobjRequest");
1428impl FreeSyncobjRequest {
1429 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1431 let length_so_far = 0;
1432 let syncobj_bytes = self.syncobj.serialize();
1433 let mut request0 = vec![
1434 major_opcode,
1435 FREE_SYNCOBJ_REQUEST,
1436 0,
1437 0,
1438 syncobj_bytes[0],
1439 syncobj_bytes[1],
1440 syncobj_bytes[2],
1441 syncobj_bytes[3],
1442 ];
1443 let length_so_far = length_so_far + request0.len();
1444 assert_eq!(length_so_far % 4, 0);
1445 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1446 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1447 ([request0.into()], vec![])
1448 }
1449 #[cfg(feature = "request-parsing")]
1451 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1452 if header.minor_opcode != FREE_SYNCOBJ_REQUEST {
1453 return Err(ParseError::InvalidValue);
1454 }
1455 let (syncobj, remaining) = Syncobj::try_parse(value)?;
1456 let _ = remaining;
1457 Ok(FreeSyncobjRequest {
1458 syncobj,
1459 })
1460 }
1461}
1462impl Request for FreeSyncobjRequest {
1463 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1464
1465 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1466 let (bufs, fds) = self.serialize(major_opcode);
1467 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1469 (buf, fds)
1470 }
1471}
1472impl crate::x11_utils::VoidRequest for FreeSyncobjRequest {
1473}
1474