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::dri3;
27#[allow(unused_imports)]
28use super::randr;
29#[allow(unused_imports)]
30use super::sync;
31#[allow(unused_imports)]
32use super::xfixes;
33#[allow(unused_imports)]
34use super::xproto;
35
36pub const X11_EXTENSION_NAME: &str = "Present";
38
39pub const X11_XML_VERSION: (u32, u32) = (1, 4);
46
47#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
48#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
49pub struct EventEnum(u8);
50impl EventEnum {
51 pub const CONFIGURE_NOTIFY: Self = Self(0);
52 pub const COMPLETE_NOTIFY: Self = Self(1);
53 pub const IDLE_NOTIFY: Self = Self(2);
54 pub const REDIRECT_NOTIFY: Self = Self(3);
55}
56impl From<EventEnum> for u8 {
57 #[inline]
58 fn from(input: EventEnum) -> Self {
59 input.0
60 }
61}
62impl From<EventEnum> for core::option::Option<u8> {
63 #[inline]
64 fn from(input: EventEnum) -> Self {
65 Some(input.0)
66 }
67}
68impl From<EventEnum> for u16 {
69 #[inline]
70 fn from(input: EventEnum) -> Self {
71 u16::from(input.0)
72 }
73}
74impl From<EventEnum> for core::option::Option<u16> {
75 #[inline]
76 fn from(input: EventEnum) -> Self {
77 Some(u16::from(input.0))
78 }
79}
80impl From<EventEnum> for u32 {
81 #[inline]
82 fn from(input: EventEnum) -> Self {
83 u32::from(input.0)
84 }
85}
86impl From<EventEnum> for core::option::Option<u32> {
87 #[inline]
88 fn from(input: EventEnum) -> Self {
89 Some(u32::from(input.0))
90 }
91}
92impl From<u8> for EventEnum {
93 #[inline]
94 fn from(value: u8) -> Self {
95 Self(value)
96 }
97}
98impl core::fmt::Debug for EventEnum {
99 fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
100 let variants = [
101 (Self::CONFIGURE_NOTIFY.0.into(), "CONFIGURE_NOTIFY", "ConfigureNotify"),
102 (Self::COMPLETE_NOTIFY.0.into(), "COMPLETE_NOTIFY", "CompleteNotify"),
103 (Self::IDLE_NOTIFY.0.into(), "IDLE_NOTIFY", "IdleNotify"),
104 (Self::REDIRECT_NOTIFY.0.into(), "REDIRECT_NOTIFY", "RedirectNotify"),
105 ];
106 pretty_print_enum(fmt, self.0.into(), &variants)
107 }
108}
109
110#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
111#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
112pub struct EventMask(u32);
113impl EventMask {
114 pub const NO_EVENT: Self = Self(0);
115 pub const CONFIGURE_NOTIFY: Self = Self(1 << 0);
116 pub const COMPLETE_NOTIFY: Self = Self(1 << 1);
117 pub const IDLE_NOTIFY: Self = Self(1 << 2);
118 pub const REDIRECT_NOTIFY: Self = Self(1 << 3);
119}
120impl From<EventMask> for u32 {
121 #[inline]
122 fn from(input: EventMask) -> Self {
123 input.0
124 }
125}
126impl From<EventMask> for core::option::Option<u32> {
127 #[inline]
128 fn from(input: EventMask) -> Self {
129 Some(input.0)
130 }
131}
132impl From<u8> for EventMask {
133 #[inline]
134 fn from(value: u8) -> Self {
135 Self(value.into())
136 }
137}
138impl From<u16> for EventMask {
139 #[inline]
140 fn from(value: u16) -> Self {
141 Self(value.into())
142 }
143}
144impl From<u32> for EventMask {
145 #[inline]
146 fn from(value: u32) -> Self {
147 Self(value)
148 }
149}
150impl core::fmt::Debug for EventMask {
151 fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
152 let variants = [
153 (Self::NO_EVENT.0, "NO_EVENT", "NoEvent"),
154 (Self::CONFIGURE_NOTIFY.0, "CONFIGURE_NOTIFY", "ConfigureNotify"),
155 (Self::COMPLETE_NOTIFY.0, "COMPLETE_NOTIFY", "CompleteNotify"),
156 (Self::IDLE_NOTIFY.0, "IDLE_NOTIFY", "IdleNotify"),
157 (Self::REDIRECT_NOTIFY.0, "REDIRECT_NOTIFY", "RedirectNotify"),
158 ];
159 pretty_print_bitmask(fmt, self.0, &variants)
160 }
161}
162bitmask_binop!(EventMask, u32);
163
164#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
165#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
166pub struct Option(u8);
167impl Option {
168 pub const NONE: Self = Self(0);
169 pub const ASYNC: Self = Self(1 << 0);
170 pub const COPY: Self = Self(1 << 1);
171 pub const UST: Self = Self(1 << 2);
172 pub const SUBOPTIMAL: Self = Self(1 << 3);
173 pub const ASYNC_MAY_TEAR: Self = Self(1 << 4);
174}
175impl From<Option> for u8 {
176 #[inline]
177 fn from(input: Option) -> Self {
178 input.0
179 }
180}
181impl From<Option> for core::option::Option<u8> {
182 #[inline]
183 fn from(input: Option) -> Self {
184 Some(input.0)
185 }
186}
187impl From<Option> for u16 {
188 #[inline]
189 fn from(input: Option) -> Self {
190 u16::from(input.0)
191 }
192}
193impl From<Option> for core::option::Option<u16> {
194 #[inline]
195 fn from(input: Option) -> Self {
196 Some(u16::from(input.0))
197 }
198}
199impl From<Option> for u32 {
200 #[inline]
201 fn from(input: Option) -> Self {
202 u32::from(input.0)
203 }
204}
205impl From<Option> for core::option::Option<u32> {
206 #[inline]
207 fn from(input: Option) -> Self {
208 Some(u32::from(input.0))
209 }
210}
211impl From<u8> for Option {
212 #[inline]
213 fn from(value: u8) -> Self {
214 Self(value)
215 }
216}
217impl core::fmt::Debug for Option {
218 fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
219 let variants = [
220 (Self::NONE.0.into(), "NONE", "None"),
221 (Self::ASYNC.0.into(), "ASYNC", "Async"),
222 (Self::COPY.0.into(), "COPY", "Copy"),
223 (Self::UST.0.into(), "UST", "UST"),
224 (Self::SUBOPTIMAL.0.into(), "SUBOPTIMAL", "Suboptimal"),
225 (Self::ASYNC_MAY_TEAR.0.into(), "ASYNC_MAY_TEAR", "AsyncMayTear"),
226 ];
227 pretty_print_bitmask(fmt, self.0.into(), &variants)
228 }
229}
230bitmask_binop!(Option, u8);
231
232#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
233#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
234pub struct Capability(u8);
235impl Capability {
236 pub const NONE: Self = Self(0);
237 pub const ASYNC: Self = Self(1 << 0);
238 pub const FENCE: Self = Self(1 << 1);
239 pub const UST: Self = Self(1 << 2);
240 pub const ASYNC_MAY_TEAR: Self = Self(1 << 3);
241 pub const SYNCOBJ: Self = Self(1 << 4);
242}
243impl From<Capability> for u8 {
244 #[inline]
245 fn from(input: Capability) -> Self {
246 input.0
247 }
248}
249impl From<Capability> for core::option::Option<u8> {
250 #[inline]
251 fn from(input: Capability) -> Self {
252 Some(input.0)
253 }
254}
255impl From<Capability> for u16 {
256 #[inline]
257 fn from(input: Capability) -> Self {
258 u16::from(input.0)
259 }
260}
261impl From<Capability> for core::option::Option<u16> {
262 #[inline]
263 fn from(input: Capability) -> Self {
264 Some(u16::from(input.0))
265 }
266}
267impl From<Capability> for u32 {
268 #[inline]
269 fn from(input: Capability) -> Self {
270 u32::from(input.0)
271 }
272}
273impl From<Capability> for core::option::Option<u32> {
274 #[inline]
275 fn from(input: Capability) -> Self {
276 Some(u32::from(input.0))
277 }
278}
279impl From<u8> for Capability {
280 #[inline]
281 fn from(value: u8) -> Self {
282 Self(value)
283 }
284}
285impl core::fmt::Debug for Capability {
286 fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
287 let variants = [
288 (Self::NONE.0.into(), "NONE", "None"),
289 (Self::ASYNC.0.into(), "ASYNC", "Async"),
290 (Self::FENCE.0.into(), "FENCE", "Fence"),
291 (Self::UST.0.into(), "UST", "UST"),
292 (Self::ASYNC_MAY_TEAR.0.into(), "ASYNC_MAY_TEAR", "AsyncMayTear"),
293 (Self::SYNCOBJ.0.into(), "SYNCOBJ", "Syncobj"),
294 ];
295 pretty_print_bitmask(fmt, self.0.into(), &variants)
296 }
297}
298bitmask_binop!(Capability, u8);
299
300#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
301#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
302pub struct CompleteKind(u8);
303impl CompleteKind {
304 pub const PIXMAP: Self = Self(0);
305 pub const NOTIFY_MSC: Self = Self(1);
306}
307impl From<CompleteKind> for u8 {
308 #[inline]
309 fn from(input: CompleteKind) -> Self {
310 input.0
311 }
312}
313impl From<CompleteKind> for core::option::Option<u8> {
314 #[inline]
315 fn from(input: CompleteKind) -> Self {
316 Some(input.0)
317 }
318}
319impl From<CompleteKind> for u16 {
320 #[inline]
321 fn from(input: CompleteKind) -> Self {
322 u16::from(input.0)
323 }
324}
325impl From<CompleteKind> for core::option::Option<u16> {
326 #[inline]
327 fn from(input: CompleteKind) -> Self {
328 Some(u16::from(input.0))
329 }
330}
331impl From<CompleteKind> for u32 {
332 #[inline]
333 fn from(input: CompleteKind) -> Self {
334 u32::from(input.0)
335 }
336}
337impl From<CompleteKind> for core::option::Option<u32> {
338 #[inline]
339 fn from(input: CompleteKind) -> Self {
340 Some(u32::from(input.0))
341 }
342}
343impl From<u8> for CompleteKind {
344 #[inline]
345 fn from(value: u8) -> Self {
346 Self(value)
347 }
348}
349impl core::fmt::Debug for CompleteKind {
350 fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
351 let variants = [
352 (Self::PIXMAP.0.into(), "PIXMAP", "Pixmap"),
353 (Self::NOTIFY_MSC.0.into(), "NOTIFY_MSC", "NotifyMSC"),
354 ];
355 pretty_print_enum(fmt, self.0.into(), &variants)
356 }
357}
358
359#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
360#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
361pub struct CompleteMode(u8);
362impl CompleteMode {
363 pub const COPY: Self = Self(0);
364 pub const FLIP: Self = Self(1);
365 pub const SKIP: Self = Self(2);
366 pub const SUBOPTIMAL_COPY: Self = Self(3);
367}
368impl From<CompleteMode> for u8 {
369 #[inline]
370 fn from(input: CompleteMode) -> Self {
371 input.0
372 }
373}
374impl From<CompleteMode> for core::option::Option<u8> {
375 #[inline]
376 fn from(input: CompleteMode) -> Self {
377 Some(input.0)
378 }
379}
380impl From<CompleteMode> for u16 {
381 #[inline]
382 fn from(input: CompleteMode) -> Self {
383 u16::from(input.0)
384 }
385}
386impl From<CompleteMode> for core::option::Option<u16> {
387 #[inline]
388 fn from(input: CompleteMode) -> Self {
389 Some(u16::from(input.0))
390 }
391}
392impl From<CompleteMode> for u32 {
393 #[inline]
394 fn from(input: CompleteMode) -> Self {
395 u32::from(input.0)
396 }
397}
398impl From<CompleteMode> for core::option::Option<u32> {
399 #[inline]
400 fn from(input: CompleteMode) -> Self {
401 Some(u32::from(input.0))
402 }
403}
404impl From<u8> for CompleteMode {
405 #[inline]
406 fn from(value: u8) -> Self {
407 Self(value)
408 }
409}
410impl core::fmt::Debug for CompleteMode {
411 fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
412 let variants = [
413 (Self::COPY.0.into(), "COPY", "Copy"),
414 (Self::FLIP.0.into(), "FLIP", "Flip"),
415 (Self::SKIP.0.into(), "SKIP", "Skip"),
416 (Self::SUBOPTIMAL_COPY.0.into(), "SUBOPTIMAL_COPY", "SuboptimalCopy"),
417 ];
418 pretty_print_enum(fmt, self.0.into(), &variants)
419 }
420}
421
422#[derive(Clone, Copy, Default)]
423#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
424#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
425pub struct Notify {
426 pub window: xproto::Window,
427 pub serial: u32,
428}
429impl_debug_if_no_extra_traits!(Notify, "Notify");
430impl TryParse for Notify {
431 fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
432 let (window, remaining) = xproto::Window::try_parse(remaining)?;
433 let (serial, remaining) = u32::try_parse(remaining)?;
434 let result = Notify { window, serial };
435 Ok((result, remaining))
436 }
437}
438impl Serialize for Notify {
439 type Bytes = [u8; 8];
440 fn serialize(&self) -> [u8; 8] {
441 let window_bytes = self.window.serialize();
442 let serial_bytes = self.serial.serialize();
443 [
444 window_bytes[0],
445 window_bytes[1],
446 window_bytes[2],
447 window_bytes[3],
448 serial_bytes[0],
449 serial_bytes[1],
450 serial_bytes[2],
451 serial_bytes[3],
452 ]
453 }
454 fn serialize_into(&self, bytes: &mut Vec<u8>) {
455 bytes.reserve(8);
456 self.window.serialize_into(bytes);
457 self.serial.serialize_into(bytes);
458 }
459}
460
461pub const QUERY_VERSION_REQUEST: u8 = 0;
463#[derive(Clone, Copy, Default)]
464#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
465#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
466pub struct QueryVersionRequest {
467 pub major_version: u32,
468 pub minor_version: u32,
469}
470impl_debug_if_no_extra_traits!(QueryVersionRequest, "QueryVersionRequest");
471impl QueryVersionRequest {
472 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
474 let length_so_far = 0;
475 let major_version_bytes = self.major_version.serialize();
476 let minor_version_bytes = self.minor_version.serialize();
477 let mut request0 = vec![
478 major_opcode,
479 QUERY_VERSION_REQUEST,
480 0,
481 0,
482 major_version_bytes[0],
483 major_version_bytes[1],
484 major_version_bytes[2],
485 major_version_bytes[3],
486 minor_version_bytes[0],
487 minor_version_bytes[1],
488 minor_version_bytes[2],
489 minor_version_bytes[3],
490 ];
491 let length_so_far = length_so_far + request0.len();
492 assert_eq!(length_so_far % 4, 0);
493 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
494 request0[2..4].copy_from_slice(&length.to_ne_bytes());
495 ([request0.into()], vec![])
496 }
497 #[cfg(feature = "request-parsing")]
499 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
500 if header.minor_opcode != QUERY_VERSION_REQUEST {
501 return Err(ParseError::InvalidValue);
502 }
503 let (major_version, remaining) = u32::try_parse(value)?;
504 let (minor_version, remaining) = u32::try_parse(remaining)?;
505 let _ = remaining;
506 Ok(QueryVersionRequest {
507 major_version,
508 minor_version,
509 })
510 }
511}
512impl Request for QueryVersionRequest {
513 const EXTENSION_NAME: core::option::Option<&'static str> = Some(X11_EXTENSION_NAME);
514
515 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
516 let (bufs, fds) = self.serialize(major_opcode);
517 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
519 (buf, fds)
520 }
521}
522impl crate::x11_utils::ReplyRequest for QueryVersionRequest {
523 type Reply = QueryVersionReply;
524}
525
526#[derive(Clone, Copy, Default)]
527#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
528#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
529pub struct QueryVersionReply {
530 pub sequence: u16,
531 pub length: u32,
532 pub major_version: u32,
533 pub minor_version: u32,
534}
535impl_debug_if_no_extra_traits!(QueryVersionReply, "QueryVersionReply");
536impl TryParse for QueryVersionReply {
537 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
538 let remaining = initial_value;
539 let (response_type, remaining) = u8::try_parse(remaining)?;
540 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
541 let (sequence, remaining) = u16::try_parse(remaining)?;
542 let (length, remaining) = u32::try_parse(remaining)?;
543 let (major_version, remaining) = u32::try_parse(remaining)?;
544 let (minor_version, remaining) = u32::try_parse(remaining)?;
545 if response_type != 1 {
546 return Err(ParseError::InvalidValue);
547 }
548 let result = QueryVersionReply { sequence, length, major_version, minor_version };
549 let _ = remaining;
550 let remaining = initial_value.get(32 + length as usize * 4..)
551 .ok_or(ParseError::InsufficientData)?;
552 Ok((result, remaining))
553 }
554}
555impl Serialize for QueryVersionReply {
556 type Bytes = [u8; 16];
557 fn serialize(&self) -> [u8; 16] {
558 let response_type_bytes = &[1];
559 let sequence_bytes = self.sequence.serialize();
560 let length_bytes = self.length.serialize();
561 let major_version_bytes = self.major_version.serialize();
562 let minor_version_bytes = self.minor_version.serialize();
563 [
564 response_type_bytes[0],
565 0,
566 sequence_bytes[0],
567 sequence_bytes[1],
568 length_bytes[0],
569 length_bytes[1],
570 length_bytes[2],
571 length_bytes[3],
572 major_version_bytes[0],
573 major_version_bytes[1],
574 major_version_bytes[2],
575 major_version_bytes[3],
576 minor_version_bytes[0],
577 minor_version_bytes[1],
578 minor_version_bytes[2],
579 minor_version_bytes[3],
580 ]
581 }
582 fn serialize_into(&self, bytes: &mut Vec<u8>) {
583 bytes.reserve(16);
584 let response_type_bytes = &[1];
585 bytes.push(response_type_bytes[0]);
586 bytes.extend_from_slice(&[0; 1]);
587 self.sequence.serialize_into(bytes);
588 self.length.serialize_into(bytes);
589 self.major_version.serialize_into(bytes);
590 self.minor_version.serialize_into(bytes);
591 }
592}
593
594pub const PIXMAP_REQUEST: u8 = 1;
596#[derive(Clone, Default)]
597#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
598#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
599pub struct PixmapRequest<'input> {
600 pub window: xproto::Window,
601 pub pixmap: xproto::Pixmap,
602 pub serial: u32,
603 pub valid: xfixes::Region,
604 pub update: xfixes::Region,
605 pub x_off: i16,
606 pub y_off: i16,
607 pub target_crtc: randr::Crtc,
608 pub wait_fence: sync::Fence,
609 pub idle_fence: sync::Fence,
610 pub options: u32,
611 pub target_msc: u64,
612 pub divisor: u64,
613 pub remainder: u64,
614 pub notifies: Cow<'input, [Notify]>,
615}
616impl_debug_if_no_extra_traits!(PixmapRequest<'_>, "PixmapRequest");
617impl<'input> PixmapRequest<'input> {
618 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
620 let length_so_far = 0;
621 let window_bytes = self.window.serialize();
622 let pixmap_bytes = self.pixmap.serialize();
623 let serial_bytes = self.serial.serialize();
624 let valid_bytes = self.valid.serialize();
625 let update_bytes = self.update.serialize();
626 let x_off_bytes = self.x_off.serialize();
627 let y_off_bytes = self.y_off.serialize();
628 let target_crtc_bytes = self.target_crtc.serialize();
629 let wait_fence_bytes = self.wait_fence.serialize();
630 let idle_fence_bytes = self.idle_fence.serialize();
631 let options_bytes = self.options.serialize();
632 let target_msc_bytes = self.target_msc.serialize();
633 let divisor_bytes = self.divisor.serialize();
634 let remainder_bytes = self.remainder.serialize();
635 let mut request0 = vec![
636 major_opcode,
637 PIXMAP_REQUEST,
638 0,
639 0,
640 window_bytes[0],
641 window_bytes[1],
642 window_bytes[2],
643 window_bytes[3],
644 pixmap_bytes[0],
645 pixmap_bytes[1],
646 pixmap_bytes[2],
647 pixmap_bytes[3],
648 serial_bytes[0],
649 serial_bytes[1],
650 serial_bytes[2],
651 serial_bytes[3],
652 valid_bytes[0],
653 valid_bytes[1],
654 valid_bytes[2],
655 valid_bytes[3],
656 update_bytes[0],
657 update_bytes[1],
658 update_bytes[2],
659 update_bytes[3],
660 x_off_bytes[0],
661 x_off_bytes[1],
662 y_off_bytes[0],
663 y_off_bytes[1],
664 target_crtc_bytes[0],
665 target_crtc_bytes[1],
666 target_crtc_bytes[2],
667 target_crtc_bytes[3],
668 wait_fence_bytes[0],
669 wait_fence_bytes[1],
670 wait_fence_bytes[2],
671 wait_fence_bytes[3],
672 idle_fence_bytes[0],
673 idle_fence_bytes[1],
674 idle_fence_bytes[2],
675 idle_fence_bytes[3],
676 options_bytes[0],
677 options_bytes[1],
678 options_bytes[2],
679 options_bytes[3],
680 0,
681 0,
682 0,
683 0,
684 target_msc_bytes[0],
685 target_msc_bytes[1],
686 target_msc_bytes[2],
687 target_msc_bytes[3],
688 target_msc_bytes[4],
689 target_msc_bytes[5],
690 target_msc_bytes[6],
691 target_msc_bytes[7],
692 divisor_bytes[0],
693 divisor_bytes[1],
694 divisor_bytes[2],
695 divisor_bytes[3],
696 divisor_bytes[4],
697 divisor_bytes[5],
698 divisor_bytes[6],
699 divisor_bytes[7],
700 remainder_bytes[0],
701 remainder_bytes[1],
702 remainder_bytes[2],
703 remainder_bytes[3],
704 remainder_bytes[4],
705 remainder_bytes[5],
706 remainder_bytes[6],
707 remainder_bytes[7],
708 ];
709 let length_so_far = length_so_far + request0.len();
710 let notifies_bytes = self.notifies.serialize();
711 let length_so_far = length_so_far + notifies_bytes.len();
712 let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
713 let length_so_far = length_so_far + padding0.len();
714 assert_eq!(length_so_far % 4, 0);
715 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
716 request0[2..4].copy_from_slice(&length.to_ne_bytes());
717 ([request0.into(), notifies_bytes.into(), padding0.into()], vec![])
718 }
719 #[cfg(feature = "request-parsing")]
721 pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
722 if header.minor_opcode != PIXMAP_REQUEST {
723 return Err(ParseError::InvalidValue);
724 }
725 let (window, remaining) = xproto::Window::try_parse(value)?;
726 let (pixmap, remaining) = xproto::Pixmap::try_parse(remaining)?;
727 let (serial, remaining) = u32::try_parse(remaining)?;
728 let (valid, remaining) = xfixes::Region::try_parse(remaining)?;
729 let (update, remaining) = xfixes::Region::try_parse(remaining)?;
730 let (x_off, remaining) = i16::try_parse(remaining)?;
731 let (y_off, remaining) = i16::try_parse(remaining)?;
732 let (target_crtc, remaining) = randr::Crtc::try_parse(remaining)?;
733 let (wait_fence, remaining) = sync::Fence::try_parse(remaining)?;
734 let (idle_fence, remaining) = sync::Fence::try_parse(remaining)?;
735 let (options, remaining) = u32::try_parse(remaining)?;
736 let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
737 let (target_msc, remaining) = u64::try_parse(remaining)?;
738 let (divisor, remaining) = u64::try_parse(remaining)?;
739 let (remainder, remaining) = u64::try_parse(remaining)?;
740 let mut remaining = remaining;
741 let mut notifies = Vec::new();
743 while !remaining.is_empty() {
744 let (v, new_remaining) = Notify::try_parse(remaining)?;
745 remaining = new_remaining;
746 notifies.push(v);
747 }
748 let _ = remaining;
749 Ok(PixmapRequest {
750 window,
751 pixmap,
752 serial,
753 valid,
754 update,
755 x_off,
756 y_off,
757 target_crtc,
758 wait_fence,
759 idle_fence,
760 options,
761 target_msc,
762 divisor,
763 remainder,
764 notifies: Cow::Owned(notifies),
765 })
766 }
767 pub fn into_owned(self) -> PixmapRequest<'static> {
769 PixmapRequest {
770 window: self.window,
771 pixmap: self.pixmap,
772 serial: self.serial,
773 valid: self.valid,
774 update: self.update,
775 x_off: self.x_off,
776 y_off: self.y_off,
777 target_crtc: self.target_crtc,
778 wait_fence: self.wait_fence,
779 idle_fence: self.idle_fence,
780 options: self.options,
781 target_msc: self.target_msc,
782 divisor: self.divisor,
783 remainder: self.remainder,
784 notifies: Cow::Owned(self.notifies.into_owned()),
785 }
786 }
787}
788impl<'input> Request for PixmapRequest<'input> {
789 const EXTENSION_NAME: core::option::Option<&'static str> = Some(X11_EXTENSION_NAME);
790
791 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
792 let (bufs, fds) = self.serialize(major_opcode);
793 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
795 (buf, fds)
796 }
797}
798impl<'input> crate::x11_utils::VoidRequest for PixmapRequest<'input> {
799}
800
801pub const NOTIFY_MSC_REQUEST: u8 = 2;
803#[derive(Clone, Copy, Default)]
804#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
805#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
806pub struct NotifyMSCRequest {
807 pub window: xproto::Window,
808 pub serial: u32,
809 pub target_msc: u64,
810 pub divisor: u64,
811 pub remainder: u64,
812}
813impl_debug_if_no_extra_traits!(NotifyMSCRequest, "NotifyMSCRequest");
814impl NotifyMSCRequest {
815 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
817 let length_so_far = 0;
818 let window_bytes = self.window.serialize();
819 let serial_bytes = self.serial.serialize();
820 let target_msc_bytes = self.target_msc.serialize();
821 let divisor_bytes = self.divisor.serialize();
822 let remainder_bytes = self.remainder.serialize();
823 let mut request0 = vec![
824 major_opcode,
825 NOTIFY_MSC_REQUEST,
826 0,
827 0,
828 window_bytes[0],
829 window_bytes[1],
830 window_bytes[2],
831 window_bytes[3],
832 serial_bytes[0],
833 serial_bytes[1],
834 serial_bytes[2],
835 serial_bytes[3],
836 0,
837 0,
838 0,
839 0,
840 target_msc_bytes[0],
841 target_msc_bytes[1],
842 target_msc_bytes[2],
843 target_msc_bytes[3],
844 target_msc_bytes[4],
845 target_msc_bytes[5],
846 target_msc_bytes[6],
847 target_msc_bytes[7],
848 divisor_bytes[0],
849 divisor_bytes[1],
850 divisor_bytes[2],
851 divisor_bytes[3],
852 divisor_bytes[4],
853 divisor_bytes[5],
854 divisor_bytes[6],
855 divisor_bytes[7],
856 remainder_bytes[0],
857 remainder_bytes[1],
858 remainder_bytes[2],
859 remainder_bytes[3],
860 remainder_bytes[4],
861 remainder_bytes[5],
862 remainder_bytes[6],
863 remainder_bytes[7],
864 ];
865 let length_so_far = length_so_far + request0.len();
866 assert_eq!(length_so_far % 4, 0);
867 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
868 request0[2..4].copy_from_slice(&length.to_ne_bytes());
869 ([request0.into()], vec![])
870 }
871 #[cfg(feature = "request-parsing")]
873 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
874 if header.minor_opcode != NOTIFY_MSC_REQUEST {
875 return Err(ParseError::InvalidValue);
876 }
877 let (window, remaining) = xproto::Window::try_parse(value)?;
878 let (serial, remaining) = u32::try_parse(remaining)?;
879 let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
880 let (target_msc, remaining) = u64::try_parse(remaining)?;
881 let (divisor, remaining) = u64::try_parse(remaining)?;
882 let (remainder, remaining) = u64::try_parse(remaining)?;
883 let _ = remaining;
884 Ok(NotifyMSCRequest {
885 window,
886 serial,
887 target_msc,
888 divisor,
889 remainder,
890 })
891 }
892}
893impl Request for NotifyMSCRequest {
894 const EXTENSION_NAME: core::option::Option<&'static str> = Some(X11_EXTENSION_NAME);
895
896 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
897 let (bufs, fds) = self.serialize(major_opcode);
898 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
900 (buf, fds)
901 }
902}
903impl crate::x11_utils::VoidRequest for NotifyMSCRequest {
904}
905
906pub type Event = u32;
907
908pub const SELECT_INPUT_REQUEST: u8 = 3;
910#[derive(Clone, Copy, Default)]
911#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
912#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
913pub struct SelectInputRequest {
914 pub eid: Event,
915 pub window: xproto::Window,
916 pub event_mask: EventMask,
917}
918impl_debug_if_no_extra_traits!(SelectInputRequest, "SelectInputRequest");
919impl SelectInputRequest {
920 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
922 let length_so_far = 0;
923 let eid_bytes = self.eid.serialize();
924 let window_bytes = self.window.serialize();
925 let event_mask_bytes = u32::from(self.event_mask).serialize();
926 let mut request0 = vec![
927 major_opcode,
928 SELECT_INPUT_REQUEST,
929 0,
930 0,
931 eid_bytes[0],
932 eid_bytes[1],
933 eid_bytes[2],
934 eid_bytes[3],
935 window_bytes[0],
936 window_bytes[1],
937 window_bytes[2],
938 window_bytes[3],
939 event_mask_bytes[0],
940 event_mask_bytes[1],
941 event_mask_bytes[2],
942 event_mask_bytes[3],
943 ];
944 let length_so_far = length_so_far + request0.len();
945 assert_eq!(length_so_far % 4, 0);
946 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
947 request0[2..4].copy_from_slice(&length.to_ne_bytes());
948 ([request0.into()], vec![])
949 }
950 #[cfg(feature = "request-parsing")]
952 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
953 if header.minor_opcode != SELECT_INPUT_REQUEST {
954 return Err(ParseError::InvalidValue);
955 }
956 let (eid, remaining) = Event::try_parse(value)?;
957 let (window, remaining) = xproto::Window::try_parse(remaining)?;
958 let (event_mask, remaining) = u32::try_parse(remaining)?;
959 let event_mask = event_mask.into();
960 let _ = remaining;
961 Ok(SelectInputRequest {
962 eid,
963 window,
964 event_mask,
965 })
966 }
967}
968impl Request for SelectInputRequest {
969 const EXTENSION_NAME: core::option::Option<&'static str> = Some(X11_EXTENSION_NAME);
970
971 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
972 let (bufs, fds) = self.serialize(major_opcode);
973 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
975 (buf, fds)
976 }
977}
978impl crate::x11_utils::VoidRequest for SelectInputRequest {
979}
980
981pub const QUERY_CAPABILITIES_REQUEST: u8 = 4;
983#[derive(Clone, Copy, Default)]
984#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
985#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
986pub struct QueryCapabilitiesRequest {
987 pub target: u32,
988}
989impl_debug_if_no_extra_traits!(QueryCapabilitiesRequest, "QueryCapabilitiesRequest");
990impl QueryCapabilitiesRequest {
991 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
993 let length_so_far = 0;
994 let target_bytes = self.target.serialize();
995 let mut request0 = vec![
996 major_opcode,
997 QUERY_CAPABILITIES_REQUEST,
998 0,
999 0,
1000 target_bytes[0],
1001 target_bytes[1],
1002 target_bytes[2],
1003 target_bytes[3],
1004 ];
1005 let length_so_far = length_so_far + request0.len();
1006 assert_eq!(length_so_far % 4, 0);
1007 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1008 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1009 ([request0.into()], vec![])
1010 }
1011 #[cfg(feature = "request-parsing")]
1013 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1014 if header.minor_opcode != QUERY_CAPABILITIES_REQUEST {
1015 return Err(ParseError::InvalidValue);
1016 }
1017 let (target, remaining) = u32::try_parse(value)?;
1018 let _ = remaining;
1019 Ok(QueryCapabilitiesRequest {
1020 target,
1021 })
1022 }
1023}
1024impl Request for QueryCapabilitiesRequest {
1025 const EXTENSION_NAME: core::option::Option<&'static str> = Some(X11_EXTENSION_NAME);
1026
1027 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1028 let (bufs, fds) = self.serialize(major_opcode);
1029 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1031 (buf, fds)
1032 }
1033}
1034impl crate::x11_utils::ReplyRequest for QueryCapabilitiesRequest {
1035 type Reply = QueryCapabilitiesReply;
1036}
1037
1038#[derive(Clone, Copy, Default)]
1039#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1040#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1041pub struct QueryCapabilitiesReply {
1042 pub sequence: u16,
1043 pub length: u32,
1044 pub capabilities: u32,
1045}
1046impl_debug_if_no_extra_traits!(QueryCapabilitiesReply, "QueryCapabilitiesReply");
1047impl TryParse for QueryCapabilitiesReply {
1048 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1049 let remaining = initial_value;
1050 let (response_type, remaining) = u8::try_parse(remaining)?;
1051 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1052 let (sequence, remaining) = u16::try_parse(remaining)?;
1053 let (length, remaining) = u32::try_parse(remaining)?;
1054 let (capabilities, remaining) = u32::try_parse(remaining)?;
1055 if response_type != 1 {
1056 return Err(ParseError::InvalidValue);
1057 }
1058 let result = QueryCapabilitiesReply { sequence, length, capabilities };
1059 let _ = remaining;
1060 let remaining = initial_value.get(32 + length as usize * 4..)
1061 .ok_or(ParseError::InsufficientData)?;
1062 Ok((result, remaining))
1063 }
1064}
1065impl Serialize for QueryCapabilitiesReply {
1066 type Bytes = [u8; 12];
1067 fn serialize(&self) -> [u8; 12] {
1068 let response_type_bytes = &[1];
1069 let sequence_bytes = self.sequence.serialize();
1070 let length_bytes = self.length.serialize();
1071 let capabilities_bytes = self.capabilities.serialize();
1072 [
1073 response_type_bytes[0],
1074 0,
1075 sequence_bytes[0],
1076 sequence_bytes[1],
1077 length_bytes[0],
1078 length_bytes[1],
1079 length_bytes[2],
1080 length_bytes[3],
1081 capabilities_bytes[0],
1082 capabilities_bytes[1],
1083 capabilities_bytes[2],
1084 capabilities_bytes[3],
1085 ]
1086 }
1087 fn serialize_into(&self, bytes: &mut Vec<u8>) {
1088 bytes.reserve(12);
1089 let response_type_bytes = &[1];
1090 bytes.push(response_type_bytes[0]);
1091 bytes.extend_from_slice(&[0; 1]);
1092 self.sequence.serialize_into(bytes);
1093 self.length.serialize_into(bytes);
1094 self.capabilities.serialize_into(bytes);
1095 }
1096}
1097
1098pub const PIXMAP_SYNCED_REQUEST: u8 = 5;
1100#[derive(Clone, Default)]
1101#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1102#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1103pub struct PixmapSyncedRequest<'input> {
1104 pub window: xproto::Window,
1105 pub pixmap: xproto::Pixmap,
1106 pub serial: u32,
1107 pub valid: xfixes::Region,
1108 pub update: xfixes::Region,
1109 pub x_off: i16,
1110 pub y_off: i16,
1111 pub target_crtc: randr::Crtc,
1112 pub acquire_syncobj: dri3::Syncobj,
1113 pub release_syncobj: dri3::Syncobj,
1114 pub acquire_point: u64,
1115 pub release_point: u64,
1116 pub options: u32,
1117 pub target_msc: u64,
1118 pub divisor: u64,
1119 pub remainder: u64,
1120 pub notifies: Cow<'input, [Notify]>,
1121}
1122impl_debug_if_no_extra_traits!(PixmapSyncedRequest<'_>, "PixmapSyncedRequest");
1123impl<'input> PixmapSyncedRequest<'input> {
1124 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
1126 let length_so_far = 0;
1127 let window_bytes = self.window.serialize();
1128 let pixmap_bytes = self.pixmap.serialize();
1129 let serial_bytes = self.serial.serialize();
1130 let valid_bytes = self.valid.serialize();
1131 let update_bytes = self.update.serialize();
1132 let x_off_bytes = self.x_off.serialize();
1133 let y_off_bytes = self.y_off.serialize();
1134 let target_crtc_bytes = self.target_crtc.serialize();
1135 let acquire_syncobj_bytes = self.acquire_syncobj.serialize();
1136 let release_syncobj_bytes = self.release_syncobj.serialize();
1137 let acquire_point_bytes = self.acquire_point.serialize();
1138 let release_point_bytes = self.release_point.serialize();
1139 let options_bytes = self.options.serialize();
1140 let target_msc_bytes = self.target_msc.serialize();
1141 let divisor_bytes = self.divisor.serialize();
1142 let remainder_bytes = self.remainder.serialize();
1143 let mut request0 = vec![
1144 major_opcode,
1145 PIXMAP_SYNCED_REQUEST,
1146 0,
1147 0,
1148 window_bytes[0],
1149 window_bytes[1],
1150 window_bytes[2],
1151 window_bytes[3],
1152 pixmap_bytes[0],
1153 pixmap_bytes[1],
1154 pixmap_bytes[2],
1155 pixmap_bytes[3],
1156 serial_bytes[0],
1157 serial_bytes[1],
1158 serial_bytes[2],
1159 serial_bytes[3],
1160 valid_bytes[0],
1161 valid_bytes[1],
1162 valid_bytes[2],
1163 valid_bytes[3],
1164 update_bytes[0],
1165 update_bytes[1],
1166 update_bytes[2],
1167 update_bytes[3],
1168 x_off_bytes[0],
1169 x_off_bytes[1],
1170 y_off_bytes[0],
1171 y_off_bytes[1],
1172 target_crtc_bytes[0],
1173 target_crtc_bytes[1],
1174 target_crtc_bytes[2],
1175 target_crtc_bytes[3],
1176 acquire_syncobj_bytes[0],
1177 acquire_syncobj_bytes[1],
1178 acquire_syncobj_bytes[2],
1179 acquire_syncobj_bytes[3],
1180 release_syncobj_bytes[0],
1181 release_syncobj_bytes[1],
1182 release_syncobj_bytes[2],
1183 release_syncobj_bytes[3],
1184 acquire_point_bytes[0],
1185 acquire_point_bytes[1],
1186 acquire_point_bytes[2],
1187 acquire_point_bytes[3],
1188 acquire_point_bytes[4],
1189 acquire_point_bytes[5],
1190 acquire_point_bytes[6],
1191 acquire_point_bytes[7],
1192 release_point_bytes[0],
1193 release_point_bytes[1],
1194 release_point_bytes[2],
1195 release_point_bytes[3],
1196 release_point_bytes[4],
1197 release_point_bytes[5],
1198 release_point_bytes[6],
1199 release_point_bytes[7],
1200 options_bytes[0],
1201 options_bytes[1],
1202 options_bytes[2],
1203 options_bytes[3],
1204 0,
1205 0,
1206 0,
1207 0,
1208 target_msc_bytes[0],
1209 target_msc_bytes[1],
1210 target_msc_bytes[2],
1211 target_msc_bytes[3],
1212 target_msc_bytes[4],
1213 target_msc_bytes[5],
1214 target_msc_bytes[6],
1215 target_msc_bytes[7],
1216 divisor_bytes[0],
1217 divisor_bytes[1],
1218 divisor_bytes[2],
1219 divisor_bytes[3],
1220 divisor_bytes[4],
1221 divisor_bytes[5],
1222 divisor_bytes[6],
1223 divisor_bytes[7],
1224 remainder_bytes[0],
1225 remainder_bytes[1],
1226 remainder_bytes[2],
1227 remainder_bytes[3],
1228 remainder_bytes[4],
1229 remainder_bytes[5],
1230 remainder_bytes[6],
1231 remainder_bytes[7],
1232 ];
1233 let length_so_far = length_so_far + request0.len();
1234 let notifies_bytes = self.notifies.serialize();
1235 let length_so_far = length_so_far + notifies_bytes.len();
1236 let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
1237 let length_so_far = length_so_far + padding0.len();
1238 assert_eq!(length_so_far % 4, 0);
1239 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1240 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1241 ([request0.into(), notifies_bytes.into(), padding0.into()], vec![])
1242 }
1243 #[cfg(feature = "request-parsing")]
1245 pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
1246 if header.minor_opcode != PIXMAP_SYNCED_REQUEST {
1247 return Err(ParseError::InvalidValue);
1248 }
1249 let (window, remaining) = xproto::Window::try_parse(value)?;
1250 let (pixmap, remaining) = xproto::Pixmap::try_parse(remaining)?;
1251 let (serial, remaining) = u32::try_parse(remaining)?;
1252 let (valid, remaining) = xfixes::Region::try_parse(remaining)?;
1253 let (update, remaining) = xfixes::Region::try_parse(remaining)?;
1254 let (x_off, remaining) = i16::try_parse(remaining)?;
1255 let (y_off, remaining) = i16::try_parse(remaining)?;
1256 let (target_crtc, remaining) = randr::Crtc::try_parse(remaining)?;
1257 let (acquire_syncobj, remaining) = dri3::Syncobj::try_parse(remaining)?;
1258 let (release_syncobj, remaining) = dri3::Syncobj::try_parse(remaining)?;
1259 let (acquire_point, remaining) = u64::try_parse(remaining)?;
1260 let (release_point, remaining) = u64::try_parse(remaining)?;
1261 let (options, remaining) = u32::try_parse(remaining)?;
1262 let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
1263 let (target_msc, remaining) = u64::try_parse(remaining)?;
1264 let (divisor, remaining) = u64::try_parse(remaining)?;
1265 let (remainder, remaining) = u64::try_parse(remaining)?;
1266 let mut remaining = remaining;
1267 let mut notifies = Vec::new();
1269 while !remaining.is_empty() {
1270 let (v, new_remaining) = Notify::try_parse(remaining)?;
1271 remaining = new_remaining;
1272 notifies.push(v);
1273 }
1274 let _ = remaining;
1275 Ok(PixmapSyncedRequest {
1276 window,
1277 pixmap,
1278 serial,
1279 valid,
1280 update,
1281 x_off,
1282 y_off,
1283 target_crtc,
1284 acquire_syncobj,
1285 release_syncobj,
1286 acquire_point,
1287 release_point,
1288 options,
1289 target_msc,
1290 divisor,
1291 remainder,
1292 notifies: Cow::Owned(notifies),
1293 })
1294 }
1295 pub fn into_owned(self) -> PixmapSyncedRequest<'static> {
1297 PixmapSyncedRequest {
1298 window: self.window,
1299 pixmap: self.pixmap,
1300 serial: self.serial,
1301 valid: self.valid,
1302 update: self.update,
1303 x_off: self.x_off,
1304 y_off: self.y_off,
1305 target_crtc: self.target_crtc,
1306 acquire_syncobj: self.acquire_syncobj,
1307 release_syncobj: self.release_syncobj,
1308 acquire_point: self.acquire_point,
1309 release_point: self.release_point,
1310 options: self.options,
1311 target_msc: self.target_msc,
1312 divisor: self.divisor,
1313 remainder: self.remainder,
1314 notifies: Cow::Owned(self.notifies.into_owned()),
1315 }
1316 }
1317}
1318impl<'input> Request for PixmapSyncedRequest<'input> {
1319 const EXTENSION_NAME: core::option::Option<&'static str> = Some(X11_EXTENSION_NAME);
1320
1321 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1322 let (bufs, fds) = self.serialize(major_opcode);
1323 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1325 (buf, fds)
1326 }
1327}
1328impl<'input> crate::x11_utils::VoidRequest for PixmapSyncedRequest<'input> {
1329}
1330
1331pub const GENERIC_EVENT: u8 = 0;
1333#[derive(Clone, Copy, Default)]
1334#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1335#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1336pub struct GenericEvent {
1337 pub response_type: u8,
1338 pub extension: u8,
1339 pub sequence: u16,
1340 pub length: u32,
1341 pub evtype: u16,
1342 pub event: Event,
1343}
1344impl_debug_if_no_extra_traits!(GenericEvent, "GenericEvent");
1345impl TryParse for GenericEvent {
1346 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1347 let remaining = initial_value;
1348 let (response_type, remaining) = u8::try_parse(remaining)?;
1349 let (extension, remaining) = u8::try_parse(remaining)?;
1350 let (sequence, remaining) = u16::try_parse(remaining)?;
1351 let (length, remaining) = u32::try_parse(remaining)?;
1352 let (evtype, remaining) = u16::try_parse(remaining)?;
1353 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1354 let (event, remaining) = Event::try_parse(remaining)?;
1355 let result = GenericEvent { response_type, extension, sequence, length, evtype, event };
1356 let _ = remaining;
1357 let remaining = initial_value.get(32..)
1358 .ok_or(ParseError::InsufficientData)?;
1359 Ok((result, remaining))
1360 }
1361}
1362impl Serialize for GenericEvent {
1363 type Bytes = [u8; 16];
1364 fn serialize(&self) -> [u8; 16] {
1365 let response_type_bytes = self.response_type.serialize();
1366 let extension_bytes = self.extension.serialize();
1367 let sequence_bytes = self.sequence.serialize();
1368 let length_bytes = self.length.serialize();
1369 let evtype_bytes = self.evtype.serialize();
1370 let event_bytes = self.event.serialize();
1371 [
1372 response_type_bytes[0],
1373 extension_bytes[0],
1374 sequence_bytes[0],
1375 sequence_bytes[1],
1376 length_bytes[0],
1377 length_bytes[1],
1378 length_bytes[2],
1379 length_bytes[3],
1380 evtype_bytes[0],
1381 evtype_bytes[1],
1382 0,
1383 0,
1384 event_bytes[0],
1385 event_bytes[1],
1386 event_bytes[2],
1387 event_bytes[3],
1388 ]
1389 }
1390 fn serialize_into(&self, bytes: &mut Vec<u8>) {
1391 bytes.reserve(16);
1392 self.response_type.serialize_into(bytes);
1393 self.extension.serialize_into(bytes);
1394 self.sequence.serialize_into(bytes);
1395 self.length.serialize_into(bytes);
1396 self.evtype.serialize_into(bytes);
1397 bytes.extend_from_slice(&[0; 2]);
1398 self.event.serialize_into(bytes);
1399 }
1400}
1401impl From<&GenericEvent> for [u8; 32] {
1402 fn from(input: &GenericEvent) -> Self {
1403 let response_type_bytes = input.response_type.serialize();
1404 let extension_bytes = input.extension.serialize();
1405 let sequence_bytes = input.sequence.serialize();
1406 let length_bytes = input.length.serialize();
1407 let evtype_bytes = input.evtype.serialize();
1408 let event_bytes = input.event.serialize();
1409 [
1410 response_type_bytes[0],
1411 extension_bytes[0],
1412 sequence_bytes[0],
1413 sequence_bytes[1],
1414 length_bytes[0],
1415 length_bytes[1],
1416 length_bytes[2],
1417 length_bytes[3],
1418 evtype_bytes[0],
1419 evtype_bytes[1],
1420 0,
1421 0,
1422 event_bytes[0],
1423 event_bytes[1],
1424 event_bytes[2],
1425 event_bytes[3],
1426 0,
1428 0,
1429 0,
1430 0,
1431 0,
1432 0,
1433 0,
1434 0,
1435 0,
1436 0,
1437 0,
1438 0,
1439 0,
1440 0,
1441 0,
1442 0,
1443 ]
1444 }
1445}
1446impl From<GenericEvent> for [u8; 32] {
1447 fn from(input: GenericEvent) -> Self {
1448 Self::from(&input)
1449 }
1450}
1451
1452pub const CONFIGURE_NOTIFY_EVENT: u16 = 0;
1454#[derive(Clone, Copy, Default)]
1455#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1456#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1457pub struct ConfigureNotifyEvent {
1458 pub response_type: u8,
1459 pub extension: u8,
1460 pub sequence: u16,
1461 pub length: u32,
1462 pub event_type: u16,
1463 pub event: Event,
1464 pub window: xproto::Window,
1465 pub x: i16,
1466 pub y: i16,
1467 pub width: u16,
1468 pub height: u16,
1469 pub off_x: i16,
1470 pub off_y: i16,
1471 pub pixmap_width: u16,
1472 pub pixmap_height: u16,
1473 pub pixmap_flags: u32,
1474}
1475impl_debug_if_no_extra_traits!(ConfigureNotifyEvent, "ConfigureNotifyEvent");
1476impl TryParse for ConfigureNotifyEvent {
1477 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1478 let remaining = initial_value;
1479 let (response_type, remaining) = u8::try_parse(remaining)?;
1480 let (extension, remaining) = u8::try_parse(remaining)?;
1481 let (sequence, remaining) = u16::try_parse(remaining)?;
1482 let (length, remaining) = u32::try_parse(remaining)?;
1483 let (event_type, remaining) = u16::try_parse(remaining)?;
1484 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1485 let (event, remaining) = Event::try_parse(remaining)?;
1486 let (window, remaining) = xproto::Window::try_parse(remaining)?;
1487 let (x, remaining) = i16::try_parse(remaining)?;
1488 let (y, remaining) = i16::try_parse(remaining)?;
1489 let (width, remaining) = u16::try_parse(remaining)?;
1490 let (height, remaining) = u16::try_parse(remaining)?;
1491 let (off_x, remaining) = i16::try_parse(remaining)?;
1492 let (off_y, remaining) = i16::try_parse(remaining)?;
1493 let (pixmap_width, remaining) = u16::try_parse(remaining)?;
1494 let (pixmap_height, remaining) = u16::try_parse(remaining)?;
1495 let (pixmap_flags, remaining) = u32::try_parse(remaining)?;
1496 let result = ConfigureNotifyEvent { response_type, extension, sequence, length, event_type, event, window, x, y, width, height, off_x, off_y, pixmap_width, pixmap_height, pixmap_flags };
1497 let _ = remaining;
1498 let remaining = initial_value.get(32 + length as usize * 4..)
1499 .ok_or(ParseError::InsufficientData)?;
1500 Ok((result, remaining))
1501 }
1502}
1503impl Serialize for ConfigureNotifyEvent {
1504 type Bytes = [u8; 40];
1505 fn serialize(&self) -> [u8; 40] {
1506 let response_type_bytes = self.response_type.serialize();
1507 let extension_bytes = self.extension.serialize();
1508 let sequence_bytes = self.sequence.serialize();
1509 let length_bytes = self.length.serialize();
1510 let event_type_bytes = self.event_type.serialize();
1511 let event_bytes = self.event.serialize();
1512 let window_bytes = self.window.serialize();
1513 let x_bytes = self.x.serialize();
1514 let y_bytes = self.y.serialize();
1515 let width_bytes = self.width.serialize();
1516 let height_bytes = self.height.serialize();
1517 let off_x_bytes = self.off_x.serialize();
1518 let off_y_bytes = self.off_y.serialize();
1519 let pixmap_width_bytes = self.pixmap_width.serialize();
1520 let pixmap_height_bytes = self.pixmap_height.serialize();
1521 let pixmap_flags_bytes = self.pixmap_flags.serialize();
1522 [
1523 response_type_bytes[0],
1524 extension_bytes[0],
1525 sequence_bytes[0],
1526 sequence_bytes[1],
1527 length_bytes[0],
1528 length_bytes[1],
1529 length_bytes[2],
1530 length_bytes[3],
1531 event_type_bytes[0],
1532 event_type_bytes[1],
1533 0,
1534 0,
1535 event_bytes[0],
1536 event_bytes[1],
1537 event_bytes[2],
1538 event_bytes[3],
1539 window_bytes[0],
1540 window_bytes[1],
1541 window_bytes[2],
1542 window_bytes[3],
1543 x_bytes[0],
1544 x_bytes[1],
1545 y_bytes[0],
1546 y_bytes[1],
1547 width_bytes[0],
1548 width_bytes[1],
1549 height_bytes[0],
1550 height_bytes[1],
1551 off_x_bytes[0],
1552 off_x_bytes[1],
1553 off_y_bytes[0],
1554 off_y_bytes[1],
1555 pixmap_width_bytes[0],
1556 pixmap_width_bytes[1],
1557 pixmap_height_bytes[0],
1558 pixmap_height_bytes[1],
1559 pixmap_flags_bytes[0],
1560 pixmap_flags_bytes[1],
1561 pixmap_flags_bytes[2],
1562 pixmap_flags_bytes[3],
1563 ]
1564 }
1565 fn serialize_into(&self, bytes: &mut Vec<u8>) {
1566 bytes.reserve(40);
1567 self.response_type.serialize_into(bytes);
1568 self.extension.serialize_into(bytes);
1569 self.sequence.serialize_into(bytes);
1570 self.length.serialize_into(bytes);
1571 self.event_type.serialize_into(bytes);
1572 bytes.extend_from_slice(&[0; 2]);
1573 self.event.serialize_into(bytes);
1574 self.window.serialize_into(bytes);
1575 self.x.serialize_into(bytes);
1576 self.y.serialize_into(bytes);
1577 self.width.serialize_into(bytes);
1578 self.height.serialize_into(bytes);
1579 self.off_x.serialize_into(bytes);
1580 self.off_y.serialize_into(bytes);
1581 self.pixmap_width.serialize_into(bytes);
1582 self.pixmap_height.serialize_into(bytes);
1583 self.pixmap_flags.serialize_into(bytes);
1584 }
1585}
1586
1587pub const COMPLETE_NOTIFY_EVENT: u16 = 1;
1589#[derive(Clone, Copy, Default)]
1590#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1591#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1592pub struct CompleteNotifyEvent {
1593 pub response_type: u8,
1594 pub extension: u8,
1595 pub sequence: u16,
1596 pub length: u32,
1597 pub event_type: u16,
1598 pub kind: CompleteKind,
1599 pub mode: CompleteMode,
1600 pub event: Event,
1601 pub window: xproto::Window,
1602 pub serial: u32,
1603 pub ust: u64,
1604 pub msc: u64,
1605}
1606impl_debug_if_no_extra_traits!(CompleteNotifyEvent, "CompleteNotifyEvent");
1607impl TryParse for CompleteNotifyEvent {
1608 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1609 let remaining = initial_value;
1610 let (response_type, remaining) = u8::try_parse(remaining)?;
1611 let (extension, remaining) = u8::try_parse(remaining)?;
1612 let (sequence, remaining) = u16::try_parse(remaining)?;
1613 let (length, remaining) = u32::try_parse(remaining)?;
1614 let (event_type, remaining) = u16::try_parse(remaining)?;
1615 let (kind, remaining) = u8::try_parse(remaining)?;
1616 let (mode, remaining) = u8::try_parse(remaining)?;
1617 let (event, remaining) = Event::try_parse(remaining)?;
1618 let (window, remaining) = xproto::Window::try_parse(remaining)?;
1619 let (serial, remaining) = u32::try_parse(remaining)?;
1620 let (ust, remaining) = u64::try_parse(remaining)?;
1621 let (msc, remaining) = u64::try_parse(remaining)?;
1622 let kind = kind.into();
1623 let mode = mode.into();
1624 let result = CompleteNotifyEvent { response_type, extension, sequence, length, event_type, kind, mode, event, window, serial, ust, msc };
1625 let _ = remaining;
1626 let remaining = initial_value.get(32 + length as usize * 4..)
1627 .ok_or(ParseError::InsufficientData)?;
1628 Ok((result, remaining))
1629 }
1630}
1631impl Serialize for CompleteNotifyEvent {
1632 type Bytes = [u8; 40];
1633 fn serialize(&self) -> [u8; 40] {
1634 let response_type_bytes = self.response_type.serialize();
1635 let extension_bytes = self.extension.serialize();
1636 let sequence_bytes = self.sequence.serialize();
1637 let length_bytes = self.length.serialize();
1638 let event_type_bytes = self.event_type.serialize();
1639 let kind_bytes = u8::from(self.kind).serialize();
1640 let mode_bytes = u8::from(self.mode).serialize();
1641 let event_bytes = self.event.serialize();
1642 let window_bytes = self.window.serialize();
1643 let serial_bytes = self.serial.serialize();
1644 let ust_bytes = self.ust.serialize();
1645 let msc_bytes = self.msc.serialize();
1646 [
1647 response_type_bytes[0],
1648 extension_bytes[0],
1649 sequence_bytes[0],
1650 sequence_bytes[1],
1651 length_bytes[0],
1652 length_bytes[1],
1653 length_bytes[2],
1654 length_bytes[3],
1655 event_type_bytes[0],
1656 event_type_bytes[1],
1657 kind_bytes[0],
1658 mode_bytes[0],
1659 event_bytes[0],
1660 event_bytes[1],
1661 event_bytes[2],
1662 event_bytes[3],
1663 window_bytes[0],
1664 window_bytes[1],
1665 window_bytes[2],
1666 window_bytes[3],
1667 serial_bytes[0],
1668 serial_bytes[1],
1669 serial_bytes[2],
1670 serial_bytes[3],
1671 ust_bytes[0],
1672 ust_bytes[1],
1673 ust_bytes[2],
1674 ust_bytes[3],
1675 ust_bytes[4],
1676 ust_bytes[5],
1677 ust_bytes[6],
1678 ust_bytes[7],
1679 msc_bytes[0],
1680 msc_bytes[1],
1681 msc_bytes[2],
1682 msc_bytes[3],
1683 msc_bytes[4],
1684 msc_bytes[5],
1685 msc_bytes[6],
1686 msc_bytes[7],
1687 ]
1688 }
1689 fn serialize_into(&self, bytes: &mut Vec<u8>) {
1690 bytes.reserve(40);
1691 self.response_type.serialize_into(bytes);
1692 self.extension.serialize_into(bytes);
1693 self.sequence.serialize_into(bytes);
1694 self.length.serialize_into(bytes);
1695 self.event_type.serialize_into(bytes);
1696 u8::from(self.kind).serialize_into(bytes);
1697 u8::from(self.mode).serialize_into(bytes);
1698 self.event.serialize_into(bytes);
1699 self.window.serialize_into(bytes);
1700 self.serial.serialize_into(bytes);
1701 self.ust.serialize_into(bytes);
1702 self.msc.serialize_into(bytes);
1703 }
1704}
1705
1706pub const IDLE_NOTIFY_EVENT: u16 = 2;
1708#[derive(Clone, Copy, Default)]
1709#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1710#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1711pub struct IdleNotifyEvent {
1712 pub response_type: u8,
1713 pub extension: u8,
1714 pub sequence: u16,
1715 pub length: u32,
1716 pub event_type: u16,
1717 pub event: Event,
1718 pub window: xproto::Window,
1719 pub serial: u32,
1720 pub pixmap: xproto::Pixmap,
1721 pub idle_fence: sync::Fence,
1722}
1723impl_debug_if_no_extra_traits!(IdleNotifyEvent, "IdleNotifyEvent");
1724impl TryParse for IdleNotifyEvent {
1725 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1726 let remaining = initial_value;
1727 let (response_type, remaining) = u8::try_parse(remaining)?;
1728 let (extension, remaining) = u8::try_parse(remaining)?;
1729 let (sequence, remaining) = u16::try_parse(remaining)?;
1730 let (length, remaining) = u32::try_parse(remaining)?;
1731 let (event_type, remaining) = u16::try_parse(remaining)?;
1732 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1733 let (event, remaining) = Event::try_parse(remaining)?;
1734 let (window, remaining) = xproto::Window::try_parse(remaining)?;
1735 let (serial, remaining) = u32::try_parse(remaining)?;
1736 let (pixmap, remaining) = xproto::Pixmap::try_parse(remaining)?;
1737 let (idle_fence, remaining) = sync::Fence::try_parse(remaining)?;
1738 let result = IdleNotifyEvent { response_type, extension, sequence, length, event_type, event, window, serial, pixmap, idle_fence };
1739 let _ = remaining;
1740 let remaining = initial_value.get(32 + length as usize * 4..)
1741 .ok_or(ParseError::InsufficientData)?;
1742 Ok((result, remaining))
1743 }
1744}
1745impl Serialize for IdleNotifyEvent {
1746 type Bytes = [u8; 32];
1747 fn serialize(&self) -> [u8; 32] {
1748 let response_type_bytes = self.response_type.serialize();
1749 let extension_bytes = self.extension.serialize();
1750 let sequence_bytes = self.sequence.serialize();
1751 let length_bytes = self.length.serialize();
1752 let event_type_bytes = self.event_type.serialize();
1753 let event_bytes = self.event.serialize();
1754 let window_bytes = self.window.serialize();
1755 let serial_bytes = self.serial.serialize();
1756 let pixmap_bytes = self.pixmap.serialize();
1757 let idle_fence_bytes = self.idle_fence.serialize();
1758 [
1759 response_type_bytes[0],
1760 extension_bytes[0],
1761 sequence_bytes[0],
1762 sequence_bytes[1],
1763 length_bytes[0],
1764 length_bytes[1],
1765 length_bytes[2],
1766 length_bytes[3],
1767 event_type_bytes[0],
1768 event_type_bytes[1],
1769 0,
1770 0,
1771 event_bytes[0],
1772 event_bytes[1],
1773 event_bytes[2],
1774 event_bytes[3],
1775 window_bytes[0],
1776 window_bytes[1],
1777 window_bytes[2],
1778 window_bytes[3],
1779 serial_bytes[0],
1780 serial_bytes[1],
1781 serial_bytes[2],
1782 serial_bytes[3],
1783 pixmap_bytes[0],
1784 pixmap_bytes[1],
1785 pixmap_bytes[2],
1786 pixmap_bytes[3],
1787 idle_fence_bytes[0],
1788 idle_fence_bytes[1],
1789 idle_fence_bytes[2],
1790 idle_fence_bytes[3],
1791 ]
1792 }
1793 fn serialize_into(&self, bytes: &mut Vec<u8>) {
1794 bytes.reserve(32);
1795 self.response_type.serialize_into(bytes);
1796 self.extension.serialize_into(bytes);
1797 self.sequence.serialize_into(bytes);
1798 self.length.serialize_into(bytes);
1799 self.event_type.serialize_into(bytes);
1800 bytes.extend_from_slice(&[0; 2]);
1801 self.event.serialize_into(bytes);
1802 self.window.serialize_into(bytes);
1803 self.serial.serialize_into(bytes);
1804 self.pixmap.serialize_into(bytes);
1805 self.idle_fence.serialize_into(bytes);
1806 }
1807}
1808
1809pub const REDIRECT_NOTIFY_EVENT: u16 = 3;
1811#[derive(Clone, Default)]
1812#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1813#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1814pub struct RedirectNotifyEvent {
1815 pub response_type: u8,
1816 pub extension: u8,
1817 pub sequence: u16,
1818 pub length: u32,
1819 pub event_type: u16,
1820 pub update_window: bool,
1821 pub event: Event,
1822 pub event_window: xproto::Window,
1823 pub window: xproto::Window,
1824 pub pixmap: xproto::Pixmap,
1825 pub serial: u32,
1826 pub valid_region: xfixes::Region,
1827 pub update_region: xfixes::Region,
1828 pub valid_rect: xproto::Rectangle,
1829 pub update_rect: xproto::Rectangle,
1830 pub x_off: i16,
1831 pub y_off: i16,
1832 pub target_crtc: randr::Crtc,
1833 pub wait_fence: sync::Fence,
1834 pub idle_fence: sync::Fence,
1835 pub options: u32,
1836 pub target_msc: u64,
1837 pub divisor: u64,
1838 pub remainder: u64,
1839 pub notifies: Vec<Notify>,
1840}
1841impl_debug_if_no_extra_traits!(RedirectNotifyEvent, "RedirectNotifyEvent");
1842impl TryParse for RedirectNotifyEvent {
1843 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1844 let remaining = initial_value;
1845 let (response_type, remaining) = u8::try_parse(remaining)?;
1846 let (extension, remaining) = u8::try_parse(remaining)?;
1847 let (sequence, remaining) = u16::try_parse(remaining)?;
1848 let (length, remaining) = u32::try_parse(remaining)?;
1849 let (event_type, remaining) = u16::try_parse(remaining)?;
1850 let (update_window, remaining) = bool::try_parse(remaining)?;
1851 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1852 let (event, remaining) = Event::try_parse(remaining)?;
1853 let (event_window, remaining) = xproto::Window::try_parse(remaining)?;
1854 let (window, remaining) = xproto::Window::try_parse(remaining)?;
1855 let (pixmap, remaining) = xproto::Pixmap::try_parse(remaining)?;
1856 let (serial, remaining) = u32::try_parse(remaining)?;
1857 let (valid_region, remaining) = xfixes::Region::try_parse(remaining)?;
1858 let (update_region, remaining) = xfixes::Region::try_parse(remaining)?;
1859 let (valid_rect, remaining) = xproto::Rectangle::try_parse(remaining)?;
1860 let (update_rect, remaining) = xproto::Rectangle::try_parse(remaining)?;
1861 let (x_off, remaining) = i16::try_parse(remaining)?;
1862 let (y_off, remaining) = i16::try_parse(remaining)?;
1863 let (target_crtc, remaining) = randr::Crtc::try_parse(remaining)?;
1864 let (wait_fence, remaining) = sync::Fence::try_parse(remaining)?;
1865 let (idle_fence, remaining) = sync::Fence::try_parse(remaining)?;
1866 let (options, remaining) = u32::try_parse(remaining)?;
1867 let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
1868 let (target_msc, remaining) = u64::try_parse(remaining)?;
1869 let (divisor, remaining) = u64::try_parse(remaining)?;
1870 let (remainder, remaining) = u64::try_parse(remaining)?;
1871 let mut remaining = remaining;
1872 let mut notifies = Vec::new();
1874 while !remaining.is_empty() {
1875 let (v, new_remaining) = Notify::try_parse(remaining)?;
1876 remaining = new_remaining;
1877 notifies.push(v);
1878 }
1879 let result = RedirectNotifyEvent { response_type, extension, sequence, length, event_type, update_window, event, event_window, window, pixmap, serial, valid_region, update_region, valid_rect, update_rect, x_off, y_off, target_crtc, wait_fence, idle_fence, options, target_msc, divisor, remainder, notifies };
1880 let _ = remaining;
1881 let remaining = initial_value.get(32 + length as usize * 4..)
1882 .ok_or(ParseError::InsufficientData)?;
1883 Ok((result, remaining))
1884 }
1885}
1886impl Serialize for RedirectNotifyEvent {
1887 type Bytes = Vec<u8>;
1888 fn serialize(&self) -> Vec<u8> {
1889 let mut result = Vec::new();
1890 self.serialize_into(&mut result);
1891 result
1892 }
1893 fn serialize_into(&self, bytes: &mut Vec<u8>) {
1894 bytes.reserve(104);
1895 self.response_type.serialize_into(bytes);
1896 self.extension.serialize_into(bytes);
1897 self.sequence.serialize_into(bytes);
1898 self.length.serialize_into(bytes);
1899 self.event_type.serialize_into(bytes);
1900 self.update_window.serialize_into(bytes);
1901 bytes.extend_from_slice(&[0; 1]);
1902 self.event.serialize_into(bytes);
1903 self.event_window.serialize_into(bytes);
1904 self.window.serialize_into(bytes);
1905 self.pixmap.serialize_into(bytes);
1906 self.serial.serialize_into(bytes);
1907 self.valid_region.serialize_into(bytes);
1908 self.update_region.serialize_into(bytes);
1909 self.valid_rect.serialize_into(bytes);
1910 self.update_rect.serialize_into(bytes);
1911 self.x_off.serialize_into(bytes);
1912 self.y_off.serialize_into(bytes);
1913 self.target_crtc.serialize_into(bytes);
1914 self.wait_fence.serialize_into(bytes);
1915 self.idle_fence.serialize_into(bytes);
1916 self.options.serialize_into(bytes);
1917 bytes.extend_from_slice(&[0; 4]);
1918 self.target_msc.serialize_into(bytes);
1919 self.divisor.serialize_into(bytes);
1920 self.remainder.serialize_into(bytes);
1921 self.notifies.serialize_into(bytes);
1922 let notifies_len_bytes = u32::try_from(self.notifies.len()).unwrap();
1923 let notifies_len_bytes = notifies_len_bytes.to_ne_bytes();
1924 bytes.extend_from_slice(¬ifies_len_bytes);
1925 }
1926}
1927