1#![allow(clippy::too_many_arguments)]
7#![allow(clippy::useless_conversion)]
9
10#[allow(unused_imports)]
11use alloc::borrow::Cow;
12#[allow(unused_imports)]
13use core::convert::TryInto;
14use alloc::vec;
15use alloc::vec::Vec;
16use core::convert::TryFrom;
17use crate::errors::ParseError;
18#[allow(unused_imports)]
19use crate::x11_utils::TryIntoUSize;
20use crate::BufWithFds;
21#[allow(unused_imports)]
22use crate::utils::{RawFdContainer, pretty_print_bitmask, pretty_print_enum};
23#[allow(unused_imports)]
24use crate::x11_utils::{Request, RequestHeader, Serialize, TryParse, TryParseFd};
25#[allow(unused_imports)]
26use super::xproto;
27
28pub const X11_EXTENSION_NAME: &str = "MIT-SCREEN-SAVER";
30
31pub const X11_XML_VERSION: (u32, u32) = (1, 1);
38
39#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
40#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
41pub struct Kind(u8);
42impl Kind {
43 pub const BLANKED: Self = Self(0);
44 pub const INTERNAL: Self = Self(1);
45 pub const EXTERNAL: Self = Self(2);
46}
47impl From<Kind> for u8 {
48 #[inline]
49 fn from(input: Kind) -> Self {
50 input.0
51 }
52}
53impl From<Kind> for Option<u8> {
54 #[inline]
55 fn from(input: Kind) -> Self {
56 Some(input.0)
57 }
58}
59impl From<Kind> for u16 {
60 #[inline]
61 fn from(input: Kind) -> Self {
62 u16::from(input.0)
63 }
64}
65impl From<Kind> for Option<u16> {
66 #[inline]
67 fn from(input: Kind) -> Self {
68 Some(u16::from(input.0))
69 }
70}
71impl From<Kind> for u32 {
72 #[inline]
73 fn from(input: Kind) -> Self {
74 u32::from(input.0)
75 }
76}
77impl From<Kind> for Option<u32> {
78 #[inline]
79 fn from(input: Kind) -> Self {
80 Some(u32::from(input.0))
81 }
82}
83impl From<u8> for Kind {
84 #[inline]
85 fn from(value: u8) -> Self {
86 Self(value)
87 }
88}
89impl core::fmt::Debug for Kind {
90 fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
91 let variants = [
92 (Self::BLANKED.0.into(), "BLANKED", "Blanked"),
93 (Self::INTERNAL.0.into(), "INTERNAL", "Internal"),
94 (Self::EXTERNAL.0.into(), "EXTERNAL", "External"),
95 ];
96 pretty_print_enum(fmt, self.0.into(), &variants)
97 }
98}
99
100#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
101#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
102pub struct Event(u32);
103impl Event {
104 pub const NOTIFY_MASK: Self = Self(1 << 0);
105 pub const CYCLE_MASK: Self = Self(1 << 1);
106}
107impl From<Event> for u32 {
108 #[inline]
109 fn from(input: Event) -> Self {
110 input.0
111 }
112}
113impl From<Event> for Option<u32> {
114 #[inline]
115 fn from(input: Event) -> Self {
116 Some(input.0)
117 }
118}
119impl From<u8> for Event {
120 #[inline]
121 fn from(value: u8) -> Self {
122 Self(value.into())
123 }
124}
125impl From<u16> for Event {
126 #[inline]
127 fn from(value: u16) -> Self {
128 Self(value.into())
129 }
130}
131impl From<u32> for Event {
132 #[inline]
133 fn from(value: u32) -> Self {
134 Self(value)
135 }
136}
137impl core::fmt::Debug for Event {
138 fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
139 let variants = [
140 (Self::NOTIFY_MASK.0, "NOTIFY_MASK", "NotifyMask"),
141 (Self::CYCLE_MASK.0, "CYCLE_MASK", "CycleMask"),
142 ];
143 pretty_print_bitmask(fmt, self.0, &variants)
144 }
145}
146bitmask_binop!(Event, u32);
147
148#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
149#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
150pub struct State(u8);
151impl State {
152 pub const OFF: Self = Self(0);
153 pub const ON: Self = Self(1);
154 pub const CYCLE: Self = Self(2);
155 pub const DISABLED: Self = Self(3);
156}
157impl From<State> for u8 {
158 #[inline]
159 fn from(input: State) -> Self {
160 input.0
161 }
162}
163impl From<State> for Option<u8> {
164 #[inline]
165 fn from(input: State) -> Self {
166 Some(input.0)
167 }
168}
169impl From<State> for u16 {
170 #[inline]
171 fn from(input: State) -> Self {
172 u16::from(input.0)
173 }
174}
175impl From<State> for Option<u16> {
176 #[inline]
177 fn from(input: State) -> Self {
178 Some(u16::from(input.0))
179 }
180}
181impl From<State> for u32 {
182 #[inline]
183 fn from(input: State) -> Self {
184 u32::from(input.0)
185 }
186}
187impl From<State> for Option<u32> {
188 #[inline]
189 fn from(input: State) -> Self {
190 Some(u32::from(input.0))
191 }
192}
193impl From<u8> for State {
194 #[inline]
195 fn from(value: u8) -> Self {
196 Self(value)
197 }
198}
199impl core::fmt::Debug for State {
200 fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
201 let variants = [
202 (Self::OFF.0.into(), "OFF", "Off"),
203 (Self::ON.0.into(), "ON", "On"),
204 (Self::CYCLE.0.into(), "CYCLE", "Cycle"),
205 (Self::DISABLED.0.into(), "DISABLED", "Disabled"),
206 ];
207 pretty_print_enum(fmt, self.0.into(), &variants)
208 }
209}
210
211pub const QUERY_VERSION_REQUEST: u8 = 0;
213#[derive(Clone, Copy, Default)]
214#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
215#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
216pub struct QueryVersionRequest {
217 pub client_major_version: u8,
218 pub client_minor_version: u8,
219}
220impl_debug_if_no_extra_traits!(QueryVersionRequest, "QueryVersionRequest");
221impl QueryVersionRequest {
222 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
224 let length_so_far = 0;
225 let client_major_version_bytes = self.client_major_version.serialize();
226 let client_minor_version_bytes = self.client_minor_version.serialize();
227 let mut request0 = vec![
228 major_opcode,
229 QUERY_VERSION_REQUEST,
230 0,
231 0,
232 client_major_version_bytes[0],
233 client_minor_version_bytes[0],
234 0,
235 0,
236 ];
237 let length_so_far = length_so_far + request0.len();
238 assert_eq!(length_so_far % 4, 0);
239 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
240 request0[2..4].copy_from_slice(&length.to_ne_bytes());
241 ([request0.into()], vec![])
242 }
243 #[cfg(feature = "request-parsing")]
245 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
246 if header.minor_opcode != QUERY_VERSION_REQUEST {
247 return Err(ParseError::InvalidValue);
248 }
249 let (client_major_version, remaining) = u8::try_parse(value)?;
250 let (client_minor_version, remaining) = u8::try_parse(remaining)?;
251 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
252 let _ = remaining;
253 Ok(QueryVersionRequest {
254 client_major_version,
255 client_minor_version,
256 })
257 }
258}
259impl Request for QueryVersionRequest {
260 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
261
262 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
263 let (bufs, fds) = self.serialize(major_opcode);
264 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
266 (buf, fds)
267 }
268}
269impl crate::x11_utils::ReplyRequest for QueryVersionRequest {
270 type Reply = QueryVersionReply;
271}
272
273#[derive(Clone, Copy, Default)]
274#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
275#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
276pub struct QueryVersionReply {
277 pub sequence: u16,
278 pub length: u32,
279 pub server_major_version: u16,
280 pub server_minor_version: u16,
281}
282impl_debug_if_no_extra_traits!(QueryVersionReply, "QueryVersionReply");
283impl TryParse for QueryVersionReply {
284 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
285 let remaining = initial_value;
286 let (response_type, remaining) = u8::try_parse(remaining)?;
287 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
288 let (sequence, remaining) = u16::try_parse(remaining)?;
289 let (length, remaining) = u32::try_parse(remaining)?;
290 let (server_major_version, remaining) = u16::try_parse(remaining)?;
291 let (server_minor_version, remaining) = u16::try_parse(remaining)?;
292 let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
293 if response_type != 1 {
294 return Err(ParseError::InvalidValue);
295 }
296 let result = QueryVersionReply { sequence, length, server_major_version, server_minor_version };
297 let _ = remaining;
298 let remaining = initial_value.get(32 + length as usize * 4..)
299 .ok_or(ParseError::InsufficientData)?;
300 Ok((result, remaining))
301 }
302}
303impl Serialize for QueryVersionReply {
304 type Bytes = [u8; 32];
305 fn serialize(&self) -> [u8; 32] {
306 let response_type_bytes = &[1];
307 let sequence_bytes = self.sequence.serialize();
308 let length_bytes = self.length.serialize();
309 let server_major_version_bytes = self.server_major_version.serialize();
310 let server_minor_version_bytes = self.server_minor_version.serialize();
311 [
312 response_type_bytes[0],
313 0,
314 sequence_bytes[0],
315 sequence_bytes[1],
316 length_bytes[0],
317 length_bytes[1],
318 length_bytes[2],
319 length_bytes[3],
320 server_major_version_bytes[0],
321 server_major_version_bytes[1],
322 server_minor_version_bytes[0],
323 server_minor_version_bytes[1],
324 0,
325 0,
326 0,
327 0,
328 0,
329 0,
330 0,
331 0,
332 0,
333 0,
334 0,
335 0,
336 0,
337 0,
338 0,
339 0,
340 0,
341 0,
342 0,
343 0,
344 ]
345 }
346 fn serialize_into(&self, bytes: &mut Vec<u8>) {
347 bytes.reserve(32);
348 let response_type_bytes = &[1];
349 bytes.push(response_type_bytes[0]);
350 bytes.extend_from_slice(&[0; 1]);
351 self.sequence.serialize_into(bytes);
352 self.length.serialize_into(bytes);
353 self.server_major_version.serialize_into(bytes);
354 self.server_minor_version.serialize_into(bytes);
355 bytes.extend_from_slice(&[0; 20]);
356 }
357}
358
359pub const QUERY_INFO_REQUEST: u8 = 1;
361#[derive(Clone, Copy, Default)]
362#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
363#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
364pub struct QueryInfoRequest {
365 pub drawable: xproto::Drawable,
366}
367impl_debug_if_no_extra_traits!(QueryInfoRequest, "QueryInfoRequest");
368impl QueryInfoRequest {
369 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
371 let length_so_far = 0;
372 let drawable_bytes = self.drawable.serialize();
373 let mut request0 = vec![
374 major_opcode,
375 QUERY_INFO_REQUEST,
376 0,
377 0,
378 drawable_bytes[0],
379 drawable_bytes[1],
380 drawable_bytes[2],
381 drawable_bytes[3],
382 ];
383 let length_so_far = length_so_far + request0.len();
384 assert_eq!(length_so_far % 4, 0);
385 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
386 request0[2..4].copy_from_slice(&length.to_ne_bytes());
387 ([request0.into()], vec![])
388 }
389 #[cfg(feature = "request-parsing")]
391 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
392 if header.minor_opcode != QUERY_INFO_REQUEST {
393 return Err(ParseError::InvalidValue);
394 }
395 let (drawable, remaining) = xproto::Drawable::try_parse(value)?;
396 let _ = remaining;
397 Ok(QueryInfoRequest {
398 drawable,
399 })
400 }
401}
402impl Request for QueryInfoRequest {
403 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
404
405 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
406 let (bufs, fds) = self.serialize(major_opcode);
407 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
409 (buf, fds)
410 }
411}
412impl crate::x11_utils::ReplyRequest for QueryInfoRequest {
413 type Reply = QueryInfoReply;
414}
415
416#[derive(Clone, Copy, Default)]
417#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
418#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
419pub struct QueryInfoReply {
420 pub state: u8,
421 pub sequence: u16,
422 pub length: u32,
423 pub saver_window: xproto::Window,
424 pub ms_until_server: u32,
425 pub ms_since_user_input: u32,
426 pub event_mask: u32,
427 pub kind: Kind,
428}
429impl_debug_if_no_extra_traits!(QueryInfoReply, "QueryInfoReply");
430impl TryParse for QueryInfoReply {
431 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
432 let remaining = initial_value;
433 let (response_type, remaining) = u8::try_parse(remaining)?;
434 let (state, remaining) = u8::try_parse(remaining)?;
435 let (sequence, remaining) = u16::try_parse(remaining)?;
436 let (length, remaining) = u32::try_parse(remaining)?;
437 let (saver_window, remaining) = xproto::Window::try_parse(remaining)?;
438 let (ms_until_server, remaining) = u32::try_parse(remaining)?;
439 let (ms_since_user_input, remaining) = u32::try_parse(remaining)?;
440 let (event_mask, remaining) = u32::try_parse(remaining)?;
441 let (kind, remaining) = u8::try_parse(remaining)?;
442 let remaining = remaining.get(7..).ok_or(ParseError::InsufficientData)?;
443 if response_type != 1 {
444 return Err(ParseError::InvalidValue);
445 }
446 let kind = kind.into();
447 let result = QueryInfoReply { state, sequence, length, saver_window, ms_until_server, ms_since_user_input, event_mask, kind };
448 let _ = remaining;
449 let remaining = initial_value.get(32 + length as usize * 4..)
450 .ok_or(ParseError::InsufficientData)?;
451 Ok((result, remaining))
452 }
453}
454impl Serialize for QueryInfoReply {
455 type Bytes = [u8; 32];
456 fn serialize(&self) -> [u8; 32] {
457 let response_type_bytes = &[1];
458 let state_bytes = self.state.serialize();
459 let sequence_bytes = self.sequence.serialize();
460 let length_bytes = self.length.serialize();
461 let saver_window_bytes = self.saver_window.serialize();
462 let ms_until_server_bytes = self.ms_until_server.serialize();
463 let ms_since_user_input_bytes = self.ms_since_user_input.serialize();
464 let event_mask_bytes = self.event_mask.serialize();
465 let kind_bytes = u8::from(self.kind).serialize();
466 [
467 response_type_bytes[0],
468 state_bytes[0],
469 sequence_bytes[0],
470 sequence_bytes[1],
471 length_bytes[0],
472 length_bytes[1],
473 length_bytes[2],
474 length_bytes[3],
475 saver_window_bytes[0],
476 saver_window_bytes[1],
477 saver_window_bytes[2],
478 saver_window_bytes[3],
479 ms_until_server_bytes[0],
480 ms_until_server_bytes[1],
481 ms_until_server_bytes[2],
482 ms_until_server_bytes[3],
483 ms_since_user_input_bytes[0],
484 ms_since_user_input_bytes[1],
485 ms_since_user_input_bytes[2],
486 ms_since_user_input_bytes[3],
487 event_mask_bytes[0],
488 event_mask_bytes[1],
489 event_mask_bytes[2],
490 event_mask_bytes[3],
491 kind_bytes[0],
492 0,
493 0,
494 0,
495 0,
496 0,
497 0,
498 0,
499 ]
500 }
501 fn serialize_into(&self, bytes: &mut Vec<u8>) {
502 bytes.reserve(32);
503 let response_type_bytes = &[1];
504 bytes.push(response_type_bytes[0]);
505 self.state.serialize_into(bytes);
506 self.sequence.serialize_into(bytes);
507 self.length.serialize_into(bytes);
508 self.saver_window.serialize_into(bytes);
509 self.ms_until_server.serialize_into(bytes);
510 self.ms_since_user_input.serialize_into(bytes);
511 self.event_mask.serialize_into(bytes);
512 u8::from(self.kind).serialize_into(bytes);
513 bytes.extend_from_slice(&[0; 7]);
514 }
515}
516
517pub const SELECT_INPUT_REQUEST: u8 = 2;
519#[derive(Clone, Copy, Default)]
520#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
521#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
522pub struct SelectInputRequest {
523 pub drawable: xproto::Drawable,
524 pub event_mask: Event,
525}
526impl_debug_if_no_extra_traits!(SelectInputRequest, "SelectInputRequest");
527impl SelectInputRequest {
528 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
530 let length_so_far = 0;
531 let drawable_bytes = self.drawable.serialize();
532 let event_mask_bytes = u32::from(self.event_mask).serialize();
533 let mut request0 = vec![
534 major_opcode,
535 SELECT_INPUT_REQUEST,
536 0,
537 0,
538 drawable_bytes[0],
539 drawable_bytes[1],
540 drawable_bytes[2],
541 drawable_bytes[3],
542 event_mask_bytes[0],
543 event_mask_bytes[1],
544 event_mask_bytes[2],
545 event_mask_bytes[3],
546 ];
547 let length_so_far = length_so_far + request0.len();
548 assert_eq!(length_so_far % 4, 0);
549 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
550 request0[2..4].copy_from_slice(&length.to_ne_bytes());
551 ([request0.into()], vec![])
552 }
553 #[cfg(feature = "request-parsing")]
555 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
556 if header.minor_opcode != SELECT_INPUT_REQUEST {
557 return Err(ParseError::InvalidValue);
558 }
559 let (drawable, remaining) = xproto::Drawable::try_parse(value)?;
560 let (event_mask, remaining) = u32::try_parse(remaining)?;
561 let event_mask = event_mask.into();
562 let _ = remaining;
563 Ok(SelectInputRequest {
564 drawable,
565 event_mask,
566 })
567 }
568}
569impl Request for SelectInputRequest {
570 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
571
572 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
573 let (bufs, fds) = self.serialize(major_opcode);
574 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
576 (buf, fds)
577 }
578}
579impl crate::x11_utils::VoidRequest for SelectInputRequest {
580}
581
582#[derive(Clone, Copy, Default)]
584#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
585#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
586pub struct SetAttributesAux {
587 pub background_pixmap: Option<xproto::Pixmap>,
588 pub background_pixel: Option<u32>,
589 pub border_pixmap: Option<xproto::Pixmap>,
590 pub border_pixel: Option<u32>,
591 pub bit_gravity: Option<xproto::Gravity>,
592 pub win_gravity: Option<xproto::Gravity>,
593 pub backing_store: Option<xproto::BackingStore>,
594 pub backing_planes: Option<u32>,
595 pub backing_pixel: Option<u32>,
596 pub override_redirect: Option<xproto::Bool32>,
597 pub save_under: Option<xproto::Bool32>,
598 pub event_mask: Option<xproto::EventMask>,
599 pub do_not_propogate_mask: Option<xproto::EventMask>,
600 pub colormap: Option<xproto::Colormap>,
601 pub cursor: Option<xproto::Cursor>,
602}
603impl_debug_if_no_extra_traits!(SetAttributesAux, "SetAttributesAux");
604impl SetAttributesAux {
605 #[cfg_attr(not(feature = "request-parsing"), allow(dead_code))]
606 fn try_parse(value: &[u8], value_mask: u32) -> Result<(Self, &[u8]), ParseError> {
607 let switch_expr = u32::from(value_mask);
608 let mut outer_remaining = value;
609 let background_pixmap = if switch_expr & u32::from(xproto::CW::BACK_PIXMAP) != 0 {
610 let remaining = outer_remaining;
611 let (background_pixmap, remaining) = xproto::Pixmap::try_parse(remaining)?;
612 outer_remaining = remaining;
613 Some(background_pixmap)
614 } else {
615 None
616 };
617 let background_pixel = if switch_expr & u32::from(xproto::CW::BACK_PIXEL) != 0 {
618 let remaining = outer_remaining;
619 let (background_pixel, remaining) = u32::try_parse(remaining)?;
620 outer_remaining = remaining;
621 Some(background_pixel)
622 } else {
623 None
624 };
625 let border_pixmap = if switch_expr & u32::from(xproto::CW::BORDER_PIXMAP) != 0 {
626 let remaining = outer_remaining;
627 let (border_pixmap, remaining) = xproto::Pixmap::try_parse(remaining)?;
628 outer_remaining = remaining;
629 Some(border_pixmap)
630 } else {
631 None
632 };
633 let border_pixel = if switch_expr & u32::from(xproto::CW::BORDER_PIXEL) != 0 {
634 let remaining = outer_remaining;
635 let (border_pixel, remaining) = u32::try_parse(remaining)?;
636 outer_remaining = remaining;
637 Some(border_pixel)
638 } else {
639 None
640 };
641 let bit_gravity = if switch_expr & u32::from(xproto::CW::BIT_GRAVITY) != 0 {
642 let remaining = outer_remaining;
643 let (bit_gravity, remaining) = u32::try_parse(remaining)?;
644 let bit_gravity = bit_gravity.into();
645 outer_remaining = remaining;
646 Some(bit_gravity)
647 } else {
648 None
649 };
650 let win_gravity = if switch_expr & u32::from(xproto::CW::WIN_GRAVITY) != 0 {
651 let remaining = outer_remaining;
652 let (win_gravity, remaining) = u32::try_parse(remaining)?;
653 let win_gravity = win_gravity.into();
654 outer_remaining = remaining;
655 Some(win_gravity)
656 } else {
657 None
658 };
659 let backing_store = if switch_expr & u32::from(xproto::CW::BACKING_STORE) != 0 {
660 let remaining = outer_remaining;
661 let (backing_store, remaining) = u32::try_parse(remaining)?;
662 let backing_store = backing_store.into();
663 outer_remaining = remaining;
664 Some(backing_store)
665 } else {
666 None
667 };
668 let backing_planes = if switch_expr & u32::from(xproto::CW::BACKING_PLANES) != 0 {
669 let remaining = outer_remaining;
670 let (backing_planes, remaining) = u32::try_parse(remaining)?;
671 outer_remaining = remaining;
672 Some(backing_planes)
673 } else {
674 None
675 };
676 let backing_pixel = if switch_expr & u32::from(xproto::CW::BACKING_PIXEL) != 0 {
677 let remaining = outer_remaining;
678 let (backing_pixel, remaining) = u32::try_parse(remaining)?;
679 outer_remaining = remaining;
680 Some(backing_pixel)
681 } else {
682 None
683 };
684 let override_redirect = if switch_expr & u32::from(xproto::CW::OVERRIDE_REDIRECT) != 0 {
685 let remaining = outer_remaining;
686 let (override_redirect, remaining) = xproto::Bool32::try_parse(remaining)?;
687 outer_remaining = remaining;
688 Some(override_redirect)
689 } else {
690 None
691 };
692 let save_under = if switch_expr & u32::from(xproto::CW::SAVE_UNDER) != 0 {
693 let remaining = outer_remaining;
694 let (save_under, remaining) = xproto::Bool32::try_parse(remaining)?;
695 outer_remaining = remaining;
696 Some(save_under)
697 } else {
698 None
699 };
700 let event_mask = if switch_expr & u32::from(xproto::CW::EVENT_MASK) != 0 {
701 let remaining = outer_remaining;
702 let (event_mask, remaining) = u32::try_parse(remaining)?;
703 let event_mask = event_mask.into();
704 outer_remaining = remaining;
705 Some(event_mask)
706 } else {
707 None
708 };
709 let do_not_propogate_mask = if switch_expr & u32::from(xproto::CW::DONT_PROPAGATE) != 0 {
710 let remaining = outer_remaining;
711 let (do_not_propogate_mask, remaining) = u32::try_parse(remaining)?;
712 let do_not_propogate_mask = do_not_propogate_mask.into();
713 outer_remaining = remaining;
714 Some(do_not_propogate_mask)
715 } else {
716 None
717 };
718 let colormap = if switch_expr & u32::from(xproto::CW::COLORMAP) != 0 {
719 let remaining = outer_remaining;
720 let (colormap, remaining) = xproto::Colormap::try_parse(remaining)?;
721 outer_remaining = remaining;
722 Some(colormap)
723 } else {
724 None
725 };
726 let cursor = if switch_expr & u32::from(xproto::CW::CURSOR) != 0 {
727 let remaining = outer_remaining;
728 let (cursor, remaining) = xproto::Cursor::try_parse(remaining)?;
729 outer_remaining = remaining;
730 Some(cursor)
731 } else {
732 None
733 };
734 let result = SetAttributesAux { background_pixmap, background_pixel, border_pixmap, border_pixel, bit_gravity, win_gravity, backing_store, backing_planes, backing_pixel, override_redirect, save_under, event_mask, do_not_propogate_mask, colormap, cursor };
735 Ok((result, outer_remaining))
736 }
737}
738impl SetAttributesAux {
739 #[allow(dead_code)]
740 fn serialize(&self, value_mask: u32) -> Vec<u8> {
741 let mut result = Vec::new();
742 self.serialize_into(&mut result, u32::from(value_mask));
743 result
744 }
745 fn serialize_into(&self, bytes: &mut Vec<u8>, value_mask: u32) {
746 assert_eq!(self.switch_expr(), u32::from(value_mask), "switch `value_list` has an inconsistent discriminant");
747 if let Some(background_pixmap) = self.background_pixmap {
748 background_pixmap.serialize_into(bytes);
749 }
750 if let Some(background_pixel) = self.background_pixel {
751 background_pixel.serialize_into(bytes);
752 }
753 if let Some(border_pixmap) = self.border_pixmap {
754 border_pixmap.serialize_into(bytes);
755 }
756 if let Some(border_pixel) = self.border_pixel {
757 border_pixel.serialize_into(bytes);
758 }
759 if let Some(bit_gravity) = self.bit_gravity {
760 u32::from(bit_gravity).serialize_into(bytes);
761 }
762 if let Some(win_gravity) = self.win_gravity {
763 u32::from(win_gravity).serialize_into(bytes);
764 }
765 if let Some(backing_store) = self.backing_store {
766 u32::from(backing_store).serialize_into(bytes);
767 }
768 if let Some(backing_planes) = self.backing_planes {
769 backing_planes.serialize_into(bytes);
770 }
771 if let Some(backing_pixel) = self.backing_pixel {
772 backing_pixel.serialize_into(bytes);
773 }
774 if let Some(override_redirect) = self.override_redirect {
775 override_redirect.serialize_into(bytes);
776 }
777 if let Some(save_under) = self.save_under {
778 save_under.serialize_into(bytes);
779 }
780 if let Some(event_mask) = self.event_mask {
781 u32::from(event_mask).serialize_into(bytes);
782 }
783 if let Some(do_not_propogate_mask) = self.do_not_propogate_mask {
784 u32::from(do_not_propogate_mask).serialize_into(bytes);
785 }
786 if let Some(colormap) = self.colormap {
787 colormap.serialize_into(bytes);
788 }
789 if let Some(cursor) = self.cursor {
790 cursor.serialize_into(bytes);
791 }
792 }
793}
794impl SetAttributesAux {
795 fn switch_expr(&self) -> u32 {
796 let mut expr_value = 0;
797 if self.background_pixmap.is_some() {
798 expr_value |= u32::from(xproto::CW::BACK_PIXMAP);
799 }
800 if self.background_pixel.is_some() {
801 expr_value |= u32::from(xproto::CW::BACK_PIXEL);
802 }
803 if self.border_pixmap.is_some() {
804 expr_value |= u32::from(xproto::CW::BORDER_PIXMAP);
805 }
806 if self.border_pixel.is_some() {
807 expr_value |= u32::from(xproto::CW::BORDER_PIXEL);
808 }
809 if self.bit_gravity.is_some() {
810 expr_value |= u32::from(xproto::CW::BIT_GRAVITY);
811 }
812 if self.win_gravity.is_some() {
813 expr_value |= u32::from(xproto::CW::WIN_GRAVITY);
814 }
815 if self.backing_store.is_some() {
816 expr_value |= u32::from(xproto::CW::BACKING_STORE);
817 }
818 if self.backing_planes.is_some() {
819 expr_value |= u32::from(xproto::CW::BACKING_PLANES);
820 }
821 if self.backing_pixel.is_some() {
822 expr_value |= u32::from(xproto::CW::BACKING_PIXEL);
823 }
824 if self.override_redirect.is_some() {
825 expr_value |= u32::from(xproto::CW::OVERRIDE_REDIRECT);
826 }
827 if self.save_under.is_some() {
828 expr_value |= u32::from(xproto::CW::SAVE_UNDER);
829 }
830 if self.event_mask.is_some() {
831 expr_value |= u32::from(xproto::CW::EVENT_MASK);
832 }
833 if self.do_not_propogate_mask.is_some() {
834 expr_value |= u32::from(xproto::CW::DONT_PROPAGATE);
835 }
836 if self.colormap.is_some() {
837 expr_value |= u32::from(xproto::CW::COLORMAP);
838 }
839 if self.cursor.is_some() {
840 expr_value |= u32::from(xproto::CW::CURSOR);
841 }
842 expr_value
843 }
844}
845impl SetAttributesAux {
846 pub fn new() -> Self {
848 Default::default()
849 }
850 #[must_use]
852 pub fn background_pixmap<I>(mut self, value: I) -> Self where I: Into<Option<xproto::Pixmap>> {
853 self.background_pixmap = value.into();
854 self
855 }
856 #[must_use]
858 pub fn background_pixel<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
859 self.background_pixel = value.into();
860 self
861 }
862 #[must_use]
864 pub fn border_pixmap<I>(mut self, value: I) -> Self where I: Into<Option<xproto::Pixmap>> {
865 self.border_pixmap = value.into();
866 self
867 }
868 #[must_use]
870 pub fn border_pixel<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
871 self.border_pixel = value.into();
872 self
873 }
874 #[must_use]
876 pub fn bit_gravity<I>(mut self, value: I) -> Self where I: Into<Option<xproto::Gravity>> {
877 self.bit_gravity = value.into();
878 self
879 }
880 #[must_use]
882 pub fn win_gravity<I>(mut self, value: I) -> Self where I: Into<Option<xproto::Gravity>> {
883 self.win_gravity = value.into();
884 self
885 }
886 #[must_use]
888 pub fn backing_store<I>(mut self, value: I) -> Self where I: Into<Option<xproto::BackingStore>> {
889 self.backing_store = value.into();
890 self
891 }
892 #[must_use]
894 pub fn backing_planes<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
895 self.backing_planes = value.into();
896 self
897 }
898 #[must_use]
900 pub fn backing_pixel<I>(mut self, value: I) -> Self where I: Into<Option<u32>> {
901 self.backing_pixel = value.into();
902 self
903 }
904 #[must_use]
906 pub fn override_redirect<I>(mut self, value: I) -> Self where I: Into<Option<xproto::Bool32>> {
907 self.override_redirect = value.into();
908 self
909 }
910 #[must_use]
912 pub fn save_under<I>(mut self, value: I) -> Self where I: Into<Option<xproto::Bool32>> {
913 self.save_under = value.into();
914 self
915 }
916 #[must_use]
918 pub fn event_mask<I>(mut self, value: I) -> Self where I: Into<Option<xproto::EventMask>> {
919 self.event_mask = value.into();
920 self
921 }
922 #[must_use]
924 pub fn do_not_propogate_mask<I>(mut self, value: I) -> Self where I: Into<Option<xproto::EventMask>> {
925 self.do_not_propogate_mask = value.into();
926 self
927 }
928 #[must_use]
930 pub fn colormap<I>(mut self, value: I) -> Self where I: Into<Option<xproto::Colormap>> {
931 self.colormap = value.into();
932 self
933 }
934 #[must_use]
936 pub fn cursor<I>(mut self, value: I) -> Self where I: Into<Option<xproto::Cursor>> {
937 self.cursor = value.into();
938 self
939 }
940}
941
942pub const SET_ATTRIBUTES_REQUEST: u8 = 3;
944#[derive(Clone, Default)]
945#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
946#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
947pub struct SetAttributesRequest<'input> {
948 pub drawable: xproto::Drawable,
949 pub x: i16,
950 pub y: i16,
951 pub width: u16,
952 pub height: u16,
953 pub border_width: u16,
954 pub class: xproto::WindowClass,
955 pub depth: u8,
956 pub visual: xproto::Visualid,
957 pub value_list: Cow<'input, SetAttributesAux>,
958}
959impl_debug_if_no_extra_traits!(SetAttributesRequest<'_>, "SetAttributesRequest");
960impl<'input> SetAttributesRequest<'input> {
961 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
963 let length_so_far = 0;
964 let drawable_bytes = self.drawable.serialize();
965 let x_bytes = self.x.serialize();
966 let y_bytes = self.y.serialize();
967 let width_bytes = self.width.serialize();
968 let height_bytes = self.height.serialize();
969 let border_width_bytes = self.border_width.serialize();
970 let class_bytes = (u16::from(self.class) as u8).serialize();
971 let depth_bytes = self.depth.serialize();
972 let visual_bytes = self.visual.serialize();
973 let value_mask: u32 = self.value_list.switch_expr();
974 let value_mask_bytes = value_mask.serialize();
975 let mut request0 = vec![
976 major_opcode,
977 SET_ATTRIBUTES_REQUEST,
978 0,
979 0,
980 drawable_bytes[0],
981 drawable_bytes[1],
982 drawable_bytes[2],
983 drawable_bytes[3],
984 x_bytes[0],
985 x_bytes[1],
986 y_bytes[0],
987 y_bytes[1],
988 width_bytes[0],
989 width_bytes[1],
990 height_bytes[0],
991 height_bytes[1],
992 border_width_bytes[0],
993 border_width_bytes[1],
994 class_bytes[0],
995 depth_bytes[0],
996 visual_bytes[0],
997 visual_bytes[1],
998 visual_bytes[2],
999 visual_bytes[3],
1000 value_mask_bytes[0],
1001 value_mask_bytes[1],
1002 value_mask_bytes[2],
1003 value_mask_bytes[3],
1004 ];
1005 let length_so_far = length_so_far + request0.len();
1006 let value_list_bytes = self.value_list.serialize(u32::from(value_mask));
1007 let length_so_far = length_so_far + value_list_bytes.len();
1008 let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
1009 let length_so_far = length_so_far + padding0.len();
1010 assert_eq!(length_so_far % 4, 0);
1011 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1012 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1013 ([request0.into(), value_list_bytes.into(), padding0.into()], vec![])
1014 }
1015 #[cfg(feature = "request-parsing")]
1017 pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
1018 if header.minor_opcode != SET_ATTRIBUTES_REQUEST {
1019 return Err(ParseError::InvalidValue);
1020 }
1021 let (drawable, remaining) = xproto::Drawable::try_parse(value)?;
1022 let (x, remaining) = i16::try_parse(remaining)?;
1023 let (y, remaining) = i16::try_parse(remaining)?;
1024 let (width, remaining) = u16::try_parse(remaining)?;
1025 let (height, remaining) = u16::try_parse(remaining)?;
1026 let (border_width, remaining) = u16::try_parse(remaining)?;
1027 let (class, remaining) = u8::try_parse(remaining)?;
1028 let class = class.into();
1029 let (depth, remaining) = u8::try_parse(remaining)?;
1030 let (visual, remaining) = xproto::Visualid::try_parse(remaining)?;
1031 let (value_mask, remaining) = u32::try_parse(remaining)?;
1032 let (value_list, remaining) = SetAttributesAux::try_parse(remaining, u32::from(value_mask))?;
1033 let _ = remaining;
1034 Ok(SetAttributesRequest {
1035 drawable,
1036 x,
1037 y,
1038 width,
1039 height,
1040 border_width,
1041 class,
1042 depth,
1043 visual,
1044 value_list: Cow::Owned(value_list),
1045 })
1046 }
1047 pub fn into_owned(self) -> SetAttributesRequest<'static> {
1049 SetAttributesRequest {
1050 drawable: self.drawable,
1051 x: self.x,
1052 y: self.y,
1053 width: self.width,
1054 height: self.height,
1055 border_width: self.border_width,
1056 class: self.class,
1057 depth: self.depth,
1058 visual: self.visual,
1059 value_list: Cow::Owned(self.value_list.into_owned()),
1060 }
1061 }
1062}
1063impl<'input> Request for SetAttributesRequest<'input> {
1064 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1065
1066 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1067 let (bufs, fds) = self.serialize(major_opcode);
1068 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1070 (buf, fds)
1071 }
1072}
1073impl<'input> crate::x11_utils::VoidRequest for SetAttributesRequest<'input> {
1074}
1075
1076pub const UNSET_ATTRIBUTES_REQUEST: u8 = 4;
1078#[derive(Clone, Copy, Default)]
1079#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1080#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1081pub struct UnsetAttributesRequest {
1082 pub drawable: xproto::Drawable,
1083}
1084impl_debug_if_no_extra_traits!(UnsetAttributesRequest, "UnsetAttributesRequest");
1085impl UnsetAttributesRequest {
1086 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1088 let length_so_far = 0;
1089 let drawable_bytes = self.drawable.serialize();
1090 let mut request0 = vec![
1091 major_opcode,
1092 UNSET_ATTRIBUTES_REQUEST,
1093 0,
1094 0,
1095 drawable_bytes[0],
1096 drawable_bytes[1],
1097 drawable_bytes[2],
1098 drawable_bytes[3],
1099 ];
1100 let length_so_far = length_so_far + request0.len();
1101 assert_eq!(length_so_far % 4, 0);
1102 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1103 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1104 ([request0.into()], vec![])
1105 }
1106 #[cfg(feature = "request-parsing")]
1108 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1109 if header.minor_opcode != UNSET_ATTRIBUTES_REQUEST {
1110 return Err(ParseError::InvalidValue);
1111 }
1112 let (drawable, remaining) = xproto::Drawable::try_parse(value)?;
1113 let _ = remaining;
1114 Ok(UnsetAttributesRequest {
1115 drawable,
1116 })
1117 }
1118}
1119impl Request for UnsetAttributesRequest {
1120 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1121
1122 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1123 let (bufs, fds) = self.serialize(major_opcode);
1124 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1126 (buf, fds)
1127 }
1128}
1129impl crate::x11_utils::VoidRequest for UnsetAttributesRequest {
1130}
1131
1132pub const SUSPEND_REQUEST: u8 = 5;
1134#[derive(Clone, Copy, Default)]
1135#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1136#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1137pub struct SuspendRequest {
1138 pub suspend: u32,
1139}
1140impl_debug_if_no_extra_traits!(SuspendRequest, "SuspendRequest");
1141impl SuspendRequest {
1142 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1144 let length_so_far = 0;
1145 let suspend_bytes = self.suspend.serialize();
1146 let mut request0 = vec![
1147 major_opcode,
1148 SUSPEND_REQUEST,
1149 0,
1150 0,
1151 suspend_bytes[0],
1152 suspend_bytes[1],
1153 suspend_bytes[2],
1154 suspend_bytes[3],
1155 ];
1156 let length_so_far = length_so_far + request0.len();
1157 assert_eq!(length_so_far % 4, 0);
1158 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1159 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1160 ([request0.into()], vec![])
1161 }
1162 #[cfg(feature = "request-parsing")]
1164 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1165 if header.minor_opcode != SUSPEND_REQUEST {
1166 return Err(ParseError::InvalidValue);
1167 }
1168 let (suspend, remaining) = u32::try_parse(value)?;
1169 let _ = remaining;
1170 Ok(SuspendRequest {
1171 suspend,
1172 })
1173 }
1174}
1175impl Request for SuspendRequest {
1176 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1177
1178 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1179 let (bufs, fds) = self.serialize(major_opcode);
1180 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1182 (buf, fds)
1183 }
1184}
1185impl crate::x11_utils::VoidRequest for SuspendRequest {
1186}
1187
1188pub const NOTIFY_EVENT: u8 = 0;
1190#[derive(Clone, Copy, Default)]
1191#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1192#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1193pub struct NotifyEvent {
1194 pub response_type: u8,
1195 pub state: State,
1196 pub sequence: u16,
1197 pub time: xproto::Timestamp,
1198 pub root: xproto::Window,
1199 pub window: xproto::Window,
1200 pub kind: Kind,
1201 pub forced: bool,
1202}
1203impl_debug_if_no_extra_traits!(NotifyEvent, "NotifyEvent");
1204impl TryParse for NotifyEvent {
1205 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1206 let remaining = initial_value;
1207 let (response_type, remaining) = u8::try_parse(remaining)?;
1208 let (state, remaining) = u8::try_parse(remaining)?;
1209 let (sequence, remaining) = u16::try_parse(remaining)?;
1210 let (time, remaining) = xproto::Timestamp::try_parse(remaining)?;
1211 let (root, remaining) = xproto::Window::try_parse(remaining)?;
1212 let (window, remaining) = xproto::Window::try_parse(remaining)?;
1213 let (kind, remaining) = u8::try_parse(remaining)?;
1214 let (forced, remaining) = bool::try_parse(remaining)?;
1215 let remaining = remaining.get(14..).ok_or(ParseError::InsufficientData)?;
1216 let state = state.into();
1217 let kind = kind.into();
1218 let result = NotifyEvent { response_type, state, sequence, time, root, window, kind, forced };
1219 let _ = remaining;
1220 let remaining = initial_value.get(32..)
1221 .ok_or(ParseError::InsufficientData)?;
1222 Ok((result, remaining))
1223 }
1224}
1225impl Serialize for NotifyEvent {
1226 type Bytes = [u8; 32];
1227 fn serialize(&self) -> [u8; 32] {
1228 let response_type_bytes = self.response_type.serialize();
1229 let state_bytes = u8::from(self.state).serialize();
1230 let sequence_bytes = self.sequence.serialize();
1231 let time_bytes = self.time.serialize();
1232 let root_bytes = self.root.serialize();
1233 let window_bytes = self.window.serialize();
1234 let kind_bytes = u8::from(self.kind).serialize();
1235 let forced_bytes = self.forced.serialize();
1236 [
1237 response_type_bytes[0],
1238 state_bytes[0],
1239 sequence_bytes[0],
1240 sequence_bytes[1],
1241 time_bytes[0],
1242 time_bytes[1],
1243 time_bytes[2],
1244 time_bytes[3],
1245 root_bytes[0],
1246 root_bytes[1],
1247 root_bytes[2],
1248 root_bytes[3],
1249 window_bytes[0],
1250 window_bytes[1],
1251 window_bytes[2],
1252 window_bytes[3],
1253 kind_bytes[0],
1254 forced_bytes[0],
1255 0,
1256 0,
1257 0,
1258 0,
1259 0,
1260 0,
1261 0,
1262 0,
1263 0,
1264 0,
1265 0,
1266 0,
1267 0,
1268 0,
1269 ]
1270 }
1271 fn serialize_into(&self, bytes: &mut Vec<u8>) {
1272 bytes.reserve(32);
1273 self.response_type.serialize_into(bytes);
1274 u8::from(self.state).serialize_into(bytes);
1275 self.sequence.serialize_into(bytes);
1276 self.time.serialize_into(bytes);
1277 self.root.serialize_into(bytes);
1278 self.window.serialize_into(bytes);
1279 u8::from(self.kind).serialize_into(bytes);
1280 self.forced.serialize_into(bytes);
1281 bytes.extend_from_slice(&[0; 14]);
1282 }
1283}
1284impl From<&NotifyEvent> for [u8; 32] {
1285 fn from(input: &NotifyEvent) -> Self {
1286 let response_type_bytes = input.response_type.serialize();
1287 let state_bytes = u8::from(input.state).serialize();
1288 let sequence_bytes = input.sequence.serialize();
1289 let time_bytes = input.time.serialize();
1290 let root_bytes = input.root.serialize();
1291 let window_bytes = input.window.serialize();
1292 let kind_bytes = u8::from(input.kind).serialize();
1293 let forced_bytes = input.forced.serialize();
1294 [
1295 response_type_bytes[0],
1296 state_bytes[0],
1297 sequence_bytes[0],
1298 sequence_bytes[1],
1299 time_bytes[0],
1300 time_bytes[1],
1301 time_bytes[2],
1302 time_bytes[3],
1303 root_bytes[0],
1304 root_bytes[1],
1305 root_bytes[2],
1306 root_bytes[3],
1307 window_bytes[0],
1308 window_bytes[1],
1309 window_bytes[2],
1310 window_bytes[3],
1311 kind_bytes[0],
1312 forced_bytes[0],
1313 0,
1314 0,
1315 0,
1316 0,
1317 0,
1318 0,
1319 0,
1320 0,
1321 0,
1322 0,
1323 0,
1324 0,
1325 0,
1326 0,
1327 ]
1328 }
1329}
1330impl From<NotifyEvent> for [u8; 32] {
1331 fn from(input: NotifyEvent) -> Self {
1332 Self::from(&input)
1333 }
1334}
1335