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
26pub const X11_EXTENSION_NAME: &str = "XEVIE";
28
29pub const X11_XML_VERSION: (u32, u32) = (1, 0);
36
37pub const QUERY_VERSION_REQUEST: u8 = 0;
39#[derive(Clone, Copy, Default)]
40#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
41#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
42pub struct QueryVersionRequest {
43 pub client_major_version: u16,
44 pub client_minor_version: u16,
45}
46impl_debug_if_no_extra_traits!(QueryVersionRequest, "QueryVersionRequest");
47impl QueryVersionRequest {
48 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
50 let length_so_far = 0;
51 let client_major_version_bytes = self.client_major_version.serialize();
52 let client_minor_version_bytes = self.client_minor_version.serialize();
53 let mut request0 = vec![
54 major_opcode,
55 QUERY_VERSION_REQUEST,
56 0,
57 0,
58 client_major_version_bytes[0],
59 client_major_version_bytes[1],
60 client_minor_version_bytes[0],
61 client_minor_version_bytes[1],
62 ];
63 let length_so_far = length_so_far + request0.len();
64 assert_eq!(length_so_far % 4, 0);
65 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
66 request0[2..4].copy_from_slice(&length.to_ne_bytes());
67 ([request0.into()], vec![])
68 }
69 #[cfg(feature = "request-parsing")]
71 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
72 if header.minor_opcode != QUERY_VERSION_REQUEST {
73 return Err(ParseError::InvalidValue);
74 }
75 let (client_major_version, remaining) = u16::try_parse(value)?;
76 let (client_minor_version, remaining) = u16::try_parse(remaining)?;
77 let _ = remaining;
78 Ok(QueryVersionRequest {
79 client_major_version,
80 client_minor_version,
81 })
82 }
83}
84impl Request for QueryVersionRequest {
85 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
86
87 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
88 let (bufs, fds) = self.serialize(major_opcode);
89 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
91 (buf, fds)
92 }
93}
94impl crate::x11_utils::ReplyRequest for QueryVersionRequest {
95 type Reply = QueryVersionReply;
96}
97
98#[derive(Clone, Copy, Default)]
99#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
100#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
101pub struct QueryVersionReply {
102 pub sequence: u16,
103 pub length: u32,
104 pub server_major_version: u16,
105 pub server_minor_version: u16,
106}
107impl_debug_if_no_extra_traits!(QueryVersionReply, "QueryVersionReply");
108impl TryParse for QueryVersionReply {
109 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
110 let remaining = initial_value;
111 let (response_type, remaining) = u8::try_parse(remaining)?;
112 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
113 let (sequence, remaining) = u16::try_parse(remaining)?;
114 let (length, remaining) = u32::try_parse(remaining)?;
115 let (server_major_version, remaining) = u16::try_parse(remaining)?;
116 let (server_minor_version, remaining) = u16::try_parse(remaining)?;
117 let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
118 if response_type != 1 {
119 return Err(ParseError::InvalidValue);
120 }
121 let result = QueryVersionReply { sequence, length, server_major_version, server_minor_version };
122 let _ = remaining;
123 let remaining = initial_value.get(32 + length as usize * 4..)
124 .ok_or(ParseError::InsufficientData)?;
125 Ok((result, remaining))
126 }
127}
128impl Serialize for QueryVersionReply {
129 type Bytes = [u8; 32];
130 fn serialize(&self) -> [u8; 32] {
131 let response_type_bytes = &[1];
132 let sequence_bytes = self.sequence.serialize();
133 let length_bytes = self.length.serialize();
134 let server_major_version_bytes = self.server_major_version.serialize();
135 let server_minor_version_bytes = self.server_minor_version.serialize();
136 [
137 response_type_bytes[0],
138 0,
139 sequence_bytes[0],
140 sequence_bytes[1],
141 length_bytes[0],
142 length_bytes[1],
143 length_bytes[2],
144 length_bytes[3],
145 server_major_version_bytes[0],
146 server_major_version_bytes[1],
147 server_minor_version_bytes[0],
148 server_minor_version_bytes[1],
149 0,
150 0,
151 0,
152 0,
153 0,
154 0,
155 0,
156 0,
157 0,
158 0,
159 0,
160 0,
161 0,
162 0,
163 0,
164 0,
165 0,
166 0,
167 0,
168 0,
169 ]
170 }
171 fn serialize_into(&self, bytes: &mut Vec<u8>) {
172 bytes.reserve(32);
173 let response_type_bytes = &[1];
174 bytes.push(response_type_bytes[0]);
175 bytes.extend_from_slice(&[0; 1]);
176 self.sequence.serialize_into(bytes);
177 self.length.serialize_into(bytes);
178 self.server_major_version.serialize_into(bytes);
179 self.server_minor_version.serialize_into(bytes);
180 bytes.extend_from_slice(&[0; 20]);
181 }
182}
183
184pub const START_REQUEST: u8 = 1;
186#[derive(Clone, Copy, Default)]
187#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
188#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
189pub struct StartRequest {
190 pub screen: u32,
191}
192impl_debug_if_no_extra_traits!(StartRequest, "StartRequest");
193impl StartRequest {
194 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
196 let length_so_far = 0;
197 let screen_bytes = self.screen.serialize();
198 let mut request0 = vec![
199 major_opcode,
200 START_REQUEST,
201 0,
202 0,
203 screen_bytes[0],
204 screen_bytes[1],
205 screen_bytes[2],
206 screen_bytes[3],
207 ];
208 let length_so_far = length_so_far + request0.len();
209 assert_eq!(length_so_far % 4, 0);
210 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
211 request0[2..4].copy_from_slice(&length.to_ne_bytes());
212 ([request0.into()], vec![])
213 }
214 #[cfg(feature = "request-parsing")]
216 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
217 if header.minor_opcode != START_REQUEST {
218 return Err(ParseError::InvalidValue);
219 }
220 let (screen, remaining) = u32::try_parse(value)?;
221 let _ = remaining;
222 Ok(StartRequest {
223 screen,
224 })
225 }
226}
227impl Request for StartRequest {
228 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
229
230 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
231 let (bufs, fds) = self.serialize(major_opcode);
232 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
234 (buf, fds)
235 }
236}
237impl crate::x11_utils::ReplyRequest for StartRequest {
238 type Reply = StartReply;
239}
240
241#[derive(Clone, Copy, Default)]
242#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
243#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
244pub struct StartReply {
245 pub sequence: u16,
246 pub length: u32,
247}
248impl_debug_if_no_extra_traits!(StartReply, "StartReply");
249impl TryParse for StartReply {
250 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
251 let remaining = initial_value;
252 let (response_type, remaining) = u8::try_parse(remaining)?;
253 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
254 let (sequence, remaining) = u16::try_parse(remaining)?;
255 let (length, remaining) = u32::try_parse(remaining)?;
256 let remaining = remaining.get(24..).ok_or(ParseError::InsufficientData)?;
257 if response_type != 1 {
258 return Err(ParseError::InvalidValue);
259 }
260 let result = StartReply { sequence, length };
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 StartReply {
268 type Bytes = [u8; 32];
269 fn serialize(&self) -> [u8; 32] {
270 let response_type_bytes = &[1];
271 let sequence_bytes = self.sequence.serialize();
272 let length_bytes = self.length.serialize();
273 [
274 response_type_bytes[0],
275 0,
276 sequence_bytes[0],
277 sequence_bytes[1],
278 length_bytes[0],
279 length_bytes[1],
280 length_bytes[2],
281 length_bytes[3],
282 0,
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 ]
307 }
308 fn serialize_into(&self, bytes: &mut Vec<u8>) {
309 bytes.reserve(32);
310 let response_type_bytes = &[1];
311 bytes.push(response_type_bytes[0]);
312 bytes.extend_from_slice(&[0; 1]);
313 self.sequence.serialize_into(bytes);
314 self.length.serialize_into(bytes);
315 bytes.extend_from_slice(&[0; 24]);
316 }
317}
318
319pub const END_REQUEST: u8 = 2;
321#[derive(Clone, Copy, Default)]
322#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
323#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
324pub struct EndRequest {
325 pub cmap: u32,
326}
327impl_debug_if_no_extra_traits!(EndRequest, "EndRequest");
328impl EndRequest {
329 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
331 let length_so_far = 0;
332 let cmap_bytes = self.cmap.serialize();
333 let mut request0 = vec![
334 major_opcode,
335 END_REQUEST,
336 0,
337 0,
338 cmap_bytes[0],
339 cmap_bytes[1],
340 cmap_bytes[2],
341 cmap_bytes[3],
342 ];
343 let length_so_far = length_so_far + request0.len();
344 assert_eq!(length_so_far % 4, 0);
345 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
346 request0[2..4].copy_from_slice(&length.to_ne_bytes());
347 ([request0.into()], vec![])
348 }
349 #[cfg(feature = "request-parsing")]
351 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
352 if header.minor_opcode != END_REQUEST {
353 return Err(ParseError::InvalidValue);
354 }
355 let (cmap, remaining) = u32::try_parse(value)?;
356 let _ = remaining;
357 Ok(EndRequest {
358 cmap,
359 })
360 }
361}
362impl Request for EndRequest {
363 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
364
365 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
366 let (bufs, fds) = self.serialize(major_opcode);
367 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
369 (buf, fds)
370 }
371}
372impl crate::x11_utils::ReplyRequest for EndRequest {
373 type Reply = EndReply;
374}
375
376#[derive(Clone, Copy, Default)]
377#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
378#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
379pub struct EndReply {
380 pub sequence: u16,
381 pub length: u32,
382}
383impl_debug_if_no_extra_traits!(EndReply, "EndReply");
384impl TryParse for EndReply {
385 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
386 let remaining = initial_value;
387 let (response_type, remaining) = u8::try_parse(remaining)?;
388 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
389 let (sequence, remaining) = u16::try_parse(remaining)?;
390 let (length, remaining) = u32::try_parse(remaining)?;
391 let remaining = remaining.get(24..).ok_or(ParseError::InsufficientData)?;
392 if response_type != 1 {
393 return Err(ParseError::InvalidValue);
394 }
395 let result = EndReply { sequence, length };
396 let _ = remaining;
397 let remaining = initial_value.get(32 + length as usize * 4..)
398 .ok_or(ParseError::InsufficientData)?;
399 Ok((result, remaining))
400 }
401}
402impl Serialize for EndReply {
403 type Bytes = [u8; 32];
404 fn serialize(&self) -> [u8; 32] {
405 let response_type_bytes = &[1];
406 let sequence_bytes = self.sequence.serialize();
407 let length_bytes = self.length.serialize();
408 [
409 response_type_bytes[0],
410 0,
411 sequence_bytes[0],
412 sequence_bytes[1],
413 length_bytes[0],
414 length_bytes[1],
415 length_bytes[2],
416 length_bytes[3],
417 0,
418 0,
419 0,
420 0,
421 0,
422 0,
423 0,
424 0,
425 0,
426 0,
427 0,
428 0,
429 0,
430 0,
431 0,
432 0,
433 0,
434 0,
435 0,
436 0,
437 0,
438 0,
439 0,
440 0,
441 ]
442 }
443 fn serialize_into(&self, bytes: &mut Vec<u8>) {
444 bytes.reserve(32);
445 let response_type_bytes = &[1];
446 bytes.push(response_type_bytes[0]);
447 bytes.extend_from_slice(&[0; 1]);
448 self.sequence.serialize_into(bytes);
449 self.length.serialize_into(bytes);
450 bytes.extend_from_slice(&[0; 24]);
451 }
452}
453
454#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
455#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
456pub struct Datatype(bool);
457impl Datatype {
458 pub const UNMODIFIED: Self = Self(false);
459 pub const MODIFIED: Self = Self(true);
460}
461impl From<Datatype> for bool {
462 #[inline]
463 fn from(input: Datatype) -> Self {
464 input.0
465 }
466}
467impl From<Datatype> for Option<bool> {
468 #[inline]
469 fn from(input: Datatype) -> Self {
470 Some(input.0)
471 }
472}
473impl From<Datatype> for u8 {
474 #[inline]
475 fn from(input: Datatype) -> Self {
476 u8::from(input.0)
477 }
478}
479impl From<Datatype> for Option<u8> {
480 #[inline]
481 fn from(input: Datatype) -> Self {
482 Some(u8::from(input.0))
483 }
484}
485impl From<Datatype> for u16 {
486 #[inline]
487 fn from(input: Datatype) -> Self {
488 u16::from(input.0)
489 }
490}
491impl From<Datatype> for Option<u16> {
492 #[inline]
493 fn from(input: Datatype) -> Self {
494 Some(u16::from(input.0))
495 }
496}
497impl From<Datatype> for u32 {
498 #[inline]
499 fn from(input: Datatype) -> Self {
500 u32::from(input.0)
501 }
502}
503impl From<Datatype> for Option<u32> {
504 #[inline]
505 fn from(input: Datatype) -> Self {
506 Some(u32::from(input.0))
507 }
508}
509impl From<bool> for Datatype {
510 #[inline]
511 fn from(value: bool) -> Self {
512 Self(value)
513 }
514}
515impl core::fmt::Debug for Datatype {
516 fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
517 let variants = [
518 (Self::UNMODIFIED.0.into(), "UNMODIFIED", "Unmodified"),
519 (Self::MODIFIED.0.into(), "MODIFIED", "Modified"),
520 ];
521 pretty_print_enum(fmt, self.0.into(), &variants)
522 }
523}
524
525#[derive(Clone, Copy, Default)]
526#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
527#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
528pub struct Event {
529}
530impl_debug_if_no_extra_traits!(Event, "Event");
531impl TryParse for Event {
532 fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
533 let remaining = remaining.get(32..).ok_or(ParseError::InsufficientData)?;
534 let result = Event { };
535 Ok((result, remaining))
536 }
537}
538impl Serialize for Event {
539 type Bytes = [u8; 32];
540 fn serialize(&self) -> [u8; 32] {
541 [
542 0,
543 0,
544 0,
545 0,
546 0,
547 0,
548 0,
549 0,
550 0,
551 0,
552 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 0,
566 0,
567 0,
568 0,
569 0,
570 0,
571 0,
572 0,
573 0,
574 ]
575 }
576 fn serialize_into(&self, bytes: &mut Vec<u8>) {
577 bytes.reserve(32);
578 bytes.extend_from_slice(&[0; 32]);
579 }
580}
581
582pub const SEND_REQUEST: u8 = 3;
584#[derive(Clone, Copy, Default)]
585#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
586#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
587pub struct SendRequest {
588 pub event: Event,
589 pub data_type: u32,
590}
591impl_debug_if_no_extra_traits!(SendRequest, "SendRequest");
592impl SendRequest {
593 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
595 let length_so_far = 0;
596 let event_bytes = self.event.serialize();
597 let data_type_bytes = self.data_type.serialize();
598 let mut request0 = vec![
599 major_opcode,
600 SEND_REQUEST,
601 0,
602 0,
603 event_bytes[0],
604 event_bytes[1],
605 event_bytes[2],
606 event_bytes[3],
607 event_bytes[4],
608 event_bytes[5],
609 event_bytes[6],
610 event_bytes[7],
611 event_bytes[8],
612 event_bytes[9],
613 event_bytes[10],
614 event_bytes[11],
615 event_bytes[12],
616 event_bytes[13],
617 event_bytes[14],
618 event_bytes[15],
619 event_bytes[16],
620 event_bytes[17],
621 event_bytes[18],
622 event_bytes[19],
623 event_bytes[20],
624 event_bytes[21],
625 event_bytes[22],
626 event_bytes[23],
627 event_bytes[24],
628 event_bytes[25],
629 event_bytes[26],
630 event_bytes[27],
631 event_bytes[28],
632 event_bytes[29],
633 event_bytes[30],
634 event_bytes[31],
635 data_type_bytes[0],
636 data_type_bytes[1],
637 data_type_bytes[2],
638 data_type_bytes[3],
639 0,
640 0,
641 0,
642 0,
643 0,
644 0,
645 0,
646 0,
647 0,
648 0,
649 0,
650 0,
651 0,
652 0,
653 0,
654 0,
655 0,
656 0,
657 0,
658 0,
659 0,
660 0,
661 0,
662 0,
663 0,
664 0,
665 0,
666 0,
667 0,
668 0,
669 0,
670 0,
671 0,
672 0,
673 0,
674 0,
675 0,
676 0,
677 0,
678 0,
679 0,
680 0,
681 0,
682 0,
683 0,
684 0,
685 0,
686 0,
687 0,
688 0,
689 0,
690 0,
691 0,
692 0,
693 0,
694 0,
695 0,
696 0,
697 0,
698 0,
699 0,
700 0,
701 0,
702 0,
703 ];
704 let length_so_far = length_so_far + request0.len();
705 assert_eq!(length_so_far % 4, 0);
706 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
707 request0[2..4].copy_from_slice(&length.to_ne_bytes());
708 ([request0.into()], vec![])
709 }
710 #[cfg(feature = "request-parsing")]
712 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
713 if header.minor_opcode != SEND_REQUEST {
714 return Err(ParseError::InvalidValue);
715 }
716 let (event, remaining) = Event::try_parse(value)?;
717 let (data_type, remaining) = u32::try_parse(remaining)?;
718 let remaining = remaining.get(64..).ok_or(ParseError::InsufficientData)?;
719 let _ = remaining;
720 Ok(SendRequest {
721 event,
722 data_type,
723 })
724 }
725}
726impl Request for SendRequest {
727 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
728
729 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
730 let (bufs, fds) = self.serialize(major_opcode);
731 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
733 (buf, fds)
734 }
735}
736impl crate::x11_utils::ReplyRequest for SendRequest {
737 type Reply = SendReply;
738}
739
740#[derive(Clone, Copy, Default)]
741#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
742#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
743pub struct SendReply {
744 pub sequence: u16,
745 pub length: u32,
746}
747impl_debug_if_no_extra_traits!(SendReply, "SendReply");
748impl TryParse for SendReply {
749 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
750 let remaining = initial_value;
751 let (response_type, remaining) = u8::try_parse(remaining)?;
752 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
753 let (sequence, remaining) = u16::try_parse(remaining)?;
754 let (length, remaining) = u32::try_parse(remaining)?;
755 let remaining = remaining.get(24..).ok_or(ParseError::InsufficientData)?;
756 if response_type != 1 {
757 return Err(ParseError::InvalidValue);
758 }
759 let result = SendReply { sequence, length };
760 let _ = remaining;
761 let remaining = initial_value.get(32 + length as usize * 4..)
762 .ok_or(ParseError::InsufficientData)?;
763 Ok((result, remaining))
764 }
765}
766impl Serialize for SendReply {
767 type Bytes = [u8; 32];
768 fn serialize(&self) -> [u8; 32] {
769 let response_type_bytes = &[1];
770 let sequence_bytes = self.sequence.serialize();
771 let length_bytes = self.length.serialize();
772 [
773 response_type_bytes[0],
774 0,
775 sequence_bytes[0],
776 sequence_bytes[1],
777 length_bytes[0],
778 length_bytes[1],
779 length_bytes[2],
780 length_bytes[3],
781 0,
782 0,
783 0,
784 0,
785 0,
786 0,
787 0,
788 0,
789 0,
790 0,
791 0,
792 0,
793 0,
794 0,
795 0,
796 0,
797 0,
798 0,
799 0,
800 0,
801 0,
802 0,
803 0,
804 0,
805 ]
806 }
807 fn serialize_into(&self, bytes: &mut Vec<u8>) {
808 bytes.reserve(32);
809 let response_type_bytes = &[1];
810 bytes.push(response_type_bytes[0]);
811 bytes.extend_from_slice(&[0; 1]);
812 self.sequence.serialize_into(bytes);
813 self.length.serialize_into(bytes);
814 bytes.extend_from_slice(&[0; 24]);
815 }
816}
817
818pub const SELECT_INPUT_REQUEST: u8 = 4;
820#[derive(Clone, Copy, Default)]
821#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
822#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
823pub struct SelectInputRequest {
824 pub event_mask: u32,
825}
826impl_debug_if_no_extra_traits!(SelectInputRequest, "SelectInputRequest");
827impl SelectInputRequest {
828 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
830 let length_so_far = 0;
831 let event_mask_bytes = self.event_mask.serialize();
832 let mut request0 = vec![
833 major_opcode,
834 SELECT_INPUT_REQUEST,
835 0,
836 0,
837 event_mask_bytes[0],
838 event_mask_bytes[1],
839 event_mask_bytes[2],
840 event_mask_bytes[3],
841 ];
842 let length_so_far = length_so_far + request0.len();
843 assert_eq!(length_so_far % 4, 0);
844 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
845 request0[2..4].copy_from_slice(&length.to_ne_bytes());
846 ([request0.into()], vec![])
847 }
848 #[cfg(feature = "request-parsing")]
850 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
851 if header.minor_opcode != SELECT_INPUT_REQUEST {
852 return Err(ParseError::InvalidValue);
853 }
854 let (event_mask, remaining) = u32::try_parse(value)?;
855 let _ = remaining;
856 Ok(SelectInputRequest {
857 event_mask,
858 })
859 }
860}
861impl Request for SelectInputRequest {
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 SelectInputRequest {
872 type Reply = SelectInputReply;
873}
874
875#[derive(Clone, Copy, 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 SelectInputReply {
879 pub sequence: u16,
880 pub length: u32,
881}
882impl_debug_if_no_extra_traits!(SelectInputReply, "SelectInputReply");
883impl TryParse for SelectInputReply {
884 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
885 let remaining = initial_value;
886 let (response_type, remaining) = u8::try_parse(remaining)?;
887 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
888 let (sequence, remaining) = u16::try_parse(remaining)?;
889 let (length, remaining) = u32::try_parse(remaining)?;
890 let remaining = remaining.get(24..).ok_or(ParseError::InsufficientData)?;
891 if response_type != 1 {
892 return Err(ParseError::InvalidValue);
893 }
894 let result = SelectInputReply { sequence, length };
895 let _ = remaining;
896 let remaining = initial_value.get(32 + length as usize * 4..)
897 .ok_or(ParseError::InsufficientData)?;
898 Ok((result, remaining))
899 }
900}
901impl Serialize for SelectInputReply {
902 type Bytes = [u8; 32];
903 fn serialize(&self) -> [u8; 32] {
904 let response_type_bytes = &[1];
905 let sequence_bytes = self.sequence.serialize();
906 let length_bytes = self.length.serialize();
907 [
908 response_type_bytes[0],
909 0,
910 sequence_bytes[0],
911 sequence_bytes[1],
912 length_bytes[0],
913 length_bytes[1],
914 length_bytes[2],
915 length_bytes[3],
916 0,
917 0,
918 0,
919 0,
920 0,
921 0,
922 0,
923 0,
924 0,
925 0,
926 0,
927 0,
928 0,
929 0,
930 0,
931 0,
932 0,
933 0,
934 0,
935 0,
936 0,
937 0,
938 0,
939 0,
940 ]
941 }
942 fn serialize_into(&self, bytes: &mut Vec<u8>) {
943 bytes.reserve(32);
944 let response_type_bytes = &[1];
945 bytes.push(response_type_bytes[0]);
946 bytes.extend_from_slice(&[0; 1]);
947 self.sequence.serialize_into(bytes);
948 self.length.serialize_into(bytes);
949 bytes.extend_from_slice(&[0; 24]);
950 }
951}
952