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 = "XINERAMA";
30
31pub const X11_XML_VERSION: (u32, u32) = (1, 1);
38
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 ScreenInfo {
43 pub x_org: i16,
44 pub y_org: i16,
45 pub width: u16,
46 pub height: u16,
47}
48impl_debug_if_no_extra_traits!(ScreenInfo, "ScreenInfo");
49impl TryParse for ScreenInfo {
50 fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
51 let (x_org, remaining) = i16::try_parse(remaining)?;
52 let (y_org, remaining) = i16::try_parse(remaining)?;
53 let (width, remaining) = u16::try_parse(remaining)?;
54 let (height, remaining) = u16::try_parse(remaining)?;
55 let result = ScreenInfo { x_org, y_org, width, height };
56 Ok((result, remaining))
57 }
58}
59impl Serialize for ScreenInfo {
60 type Bytes = [u8; 8];
61 fn serialize(&self) -> [u8; 8] {
62 let x_org_bytes = self.x_org.serialize();
63 let y_org_bytes = self.y_org.serialize();
64 let width_bytes = self.width.serialize();
65 let height_bytes = self.height.serialize();
66 [
67 x_org_bytes[0],
68 x_org_bytes[1],
69 y_org_bytes[0],
70 y_org_bytes[1],
71 width_bytes[0],
72 width_bytes[1],
73 height_bytes[0],
74 height_bytes[1],
75 ]
76 }
77 fn serialize_into(&self, bytes: &mut Vec<u8>) {
78 bytes.reserve(8);
79 self.x_org.serialize_into(bytes);
80 self.y_org.serialize_into(bytes);
81 self.width.serialize_into(bytes);
82 self.height.serialize_into(bytes);
83 }
84}
85
86pub const QUERY_VERSION_REQUEST: u8 = 0;
88#[derive(Clone, Copy, Default)]
89#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
90#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
91pub struct QueryVersionRequest {
92 pub major: u8,
93 pub minor: u8,
94}
95impl_debug_if_no_extra_traits!(QueryVersionRequest, "QueryVersionRequest");
96impl QueryVersionRequest {
97 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
99 let length_so_far = 0;
100 let major_bytes = self.major.serialize();
101 let minor_bytes = self.minor.serialize();
102 let mut request0 = vec![
103 major_opcode,
104 QUERY_VERSION_REQUEST,
105 0,
106 0,
107 major_bytes[0],
108 minor_bytes[0],
109 0,
110 0,
111 ];
112 let length_so_far = length_so_far + request0.len();
113 assert_eq!(length_so_far % 4, 0);
114 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
115 request0[2..4].copy_from_slice(&length.to_ne_bytes());
116 ([request0.into()], vec![])
117 }
118 #[cfg(feature = "request-parsing")]
120 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
121 if header.minor_opcode != QUERY_VERSION_REQUEST {
122 return Err(ParseError::InvalidValue);
123 }
124 let (major, remaining) = u8::try_parse(value)?;
125 let (minor, remaining) = u8::try_parse(remaining)?;
126 let _ = remaining;
127 Ok(QueryVersionRequest {
128 major,
129 minor,
130 })
131 }
132}
133impl Request for QueryVersionRequest {
134 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
135
136 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
137 let (bufs, fds) = self.serialize(major_opcode);
138 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
140 (buf, fds)
141 }
142}
143impl crate::x11_utils::ReplyRequest for QueryVersionRequest {
144 type Reply = QueryVersionReply;
145}
146
147#[derive(Clone, Copy, Default)]
148#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
149#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
150pub struct QueryVersionReply {
151 pub sequence: u16,
152 pub length: u32,
153 pub major: u16,
154 pub minor: u16,
155}
156impl_debug_if_no_extra_traits!(QueryVersionReply, "QueryVersionReply");
157impl TryParse for QueryVersionReply {
158 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
159 let remaining = initial_value;
160 let (response_type, remaining) = u8::try_parse(remaining)?;
161 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
162 let (sequence, remaining) = u16::try_parse(remaining)?;
163 let (length, remaining) = u32::try_parse(remaining)?;
164 let (major, remaining) = u16::try_parse(remaining)?;
165 let (minor, remaining) = u16::try_parse(remaining)?;
166 if response_type != 1 {
167 return Err(ParseError::InvalidValue);
168 }
169 let result = QueryVersionReply { sequence, length, major, minor };
170 let _ = remaining;
171 let remaining = initial_value.get(32 + length as usize * 4..)
172 .ok_or(ParseError::InsufficientData)?;
173 Ok((result, remaining))
174 }
175}
176impl Serialize for QueryVersionReply {
177 type Bytes = [u8; 12];
178 fn serialize(&self) -> [u8; 12] {
179 let response_type_bytes = &[1];
180 let sequence_bytes = self.sequence.serialize();
181 let length_bytes = self.length.serialize();
182 let major_bytes = self.major.serialize();
183 let minor_bytes = self.minor.serialize();
184 [
185 response_type_bytes[0],
186 0,
187 sequence_bytes[0],
188 sequence_bytes[1],
189 length_bytes[0],
190 length_bytes[1],
191 length_bytes[2],
192 length_bytes[3],
193 major_bytes[0],
194 major_bytes[1],
195 minor_bytes[0],
196 minor_bytes[1],
197 ]
198 }
199 fn serialize_into(&self, bytes: &mut Vec<u8>) {
200 bytes.reserve(12);
201 let response_type_bytes = &[1];
202 bytes.push(response_type_bytes[0]);
203 bytes.extend_from_slice(&[0; 1]);
204 self.sequence.serialize_into(bytes);
205 self.length.serialize_into(bytes);
206 self.major.serialize_into(bytes);
207 self.minor.serialize_into(bytes);
208 }
209}
210
211pub const GET_STATE_REQUEST: u8 = 1;
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 GetStateRequest {
217 pub window: xproto::Window,
218}
219impl_debug_if_no_extra_traits!(GetStateRequest, "GetStateRequest");
220impl GetStateRequest {
221 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
223 let length_so_far = 0;
224 let window_bytes = self.window.serialize();
225 let mut request0 = vec![
226 major_opcode,
227 GET_STATE_REQUEST,
228 0,
229 0,
230 window_bytes[0],
231 window_bytes[1],
232 window_bytes[2],
233 window_bytes[3],
234 ];
235 let length_so_far = length_so_far + request0.len();
236 assert_eq!(length_so_far % 4, 0);
237 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
238 request0[2..4].copy_from_slice(&length.to_ne_bytes());
239 ([request0.into()], vec![])
240 }
241 #[cfg(feature = "request-parsing")]
243 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
244 if header.minor_opcode != GET_STATE_REQUEST {
245 return Err(ParseError::InvalidValue);
246 }
247 let (window, remaining) = xproto::Window::try_parse(value)?;
248 let _ = remaining;
249 Ok(GetStateRequest {
250 window,
251 })
252 }
253}
254impl Request for GetStateRequest {
255 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
256
257 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
258 let (bufs, fds) = self.serialize(major_opcode);
259 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
261 (buf, fds)
262 }
263}
264impl crate::x11_utils::ReplyRequest for GetStateRequest {
265 type Reply = GetStateReply;
266}
267
268#[derive(Clone, Copy, Default)]
269#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
270#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
271pub struct GetStateReply {
272 pub state: u8,
273 pub sequence: u16,
274 pub length: u32,
275 pub window: xproto::Window,
276}
277impl_debug_if_no_extra_traits!(GetStateReply, "GetStateReply");
278impl TryParse for GetStateReply {
279 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
280 let remaining = initial_value;
281 let (response_type, remaining) = u8::try_parse(remaining)?;
282 let (state, remaining) = u8::try_parse(remaining)?;
283 let (sequence, remaining) = u16::try_parse(remaining)?;
284 let (length, remaining) = u32::try_parse(remaining)?;
285 let (window, remaining) = xproto::Window::try_parse(remaining)?;
286 if response_type != 1 {
287 return Err(ParseError::InvalidValue);
288 }
289 let result = GetStateReply { state, sequence, length, window };
290 let _ = remaining;
291 let remaining = initial_value.get(32 + length as usize * 4..)
292 .ok_or(ParseError::InsufficientData)?;
293 Ok((result, remaining))
294 }
295}
296impl Serialize for GetStateReply {
297 type Bytes = [u8; 12];
298 fn serialize(&self) -> [u8; 12] {
299 let response_type_bytes = &[1];
300 let state_bytes = self.state.serialize();
301 let sequence_bytes = self.sequence.serialize();
302 let length_bytes = self.length.serialize();
303 let window_bytes = self.window.serialize();
304 [
305 response_type_bytes[0],
306 state_bytes[0],
307 sequence_bytes[0],
308 sequence_bytes[1],
309 length_bytes[0],
310 length_bytes[1],
311 length_bytes[2],
312 length_bytes[3],
313 window_bytes[0],
314 window_bytes[1],
315 window_bytes[2],
316 window_bytes[3],
317 ]
318 }
319 fn serialize_into(&self, bytes: &mut Vec<u8>) {
320 bytes.reserve(12);
321 let response_type_bytes = &[1];
322 bytes.push(response_type_bytes[0]);
323 self.state.serialize_into(bytes);
324 self.sequence.serialize_into(bytes);
325 self.length.serialize_into(bytes);
326 self.window.serialize_into(bytes);
327 }
328}
329
330pub const GET_SCREEN_COUNT_REQUEST: u8 = 2;
332#[derive(Clone, Copy, Default)]
333#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
334#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
335pub struct GetScreenCountRequest {
336 pub window: xproto::Window,
337}
338impl_debug_if_no_extra_traits!(GetScreenCountRequest, "GetScreenCountRequest");
339impl GetScreenCountRequest {
340 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
342 let length_so_far = 0;
343 let window_bytes = self.window.serialize();
344 let mut request0 = vec![
345 major_opcode,
346 GET_SCREEN_COUNT_REQUEST,
347 0,
348 0,
349 window_bytes[0],
350 window_bytes[1],
351 window_bytes[2],
352 window_bytes[3],
353 ];
354 let length_so_far = length_so_far + request0.len();
355 assert_eq!(length_so_far % 4, 0);
356 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
357 request0[2..4].copy_from_slice(&length.to_ne_bytes());
358 ([request0.into()], vec![])
359 }
360 #[cfg(feature = "request-parsing")]
362 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
363 if header.minor_opcode != GET_SCREEN_COUNT_REQUEST {
364 return Err(ParseError::InvalidValue);
365 }
366 let (window, remaining) = xproto::Window::try_parse(value)?;
367 let _ = remaining;
368 Ok(GetScreenCountRequest {
369 window,
370 })
371 }
372}
373impl Request for GetScreenCountRequest {
374 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
375
376 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
377 let (bufs, fds) = self.serialize(major_opcode);
378 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
380 (buf, fds)
381 }
382}
383impl crate::x11_utils::ReplyRequest for GetScreenCountRequest {
384 type Reply = GetScreenCountReply;
385}
386
387#[derive(Clone, Copy, Default)]
388#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
389#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
390pub struct GetScreenCountReply {
391 pub screen_count: u8,
392 pub sequence: u16,
393 pub length: u32,
394 pub window: xproto::Window,
395}
396impl_debug_if_no_extra_traits!(GetScreenCountReply, "GetScreenCountReply");
397impl TryParse for GetScreenCountReply {
398 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
399 let remaining = initial_value;
400 let (response_type, remaining) = u8::try_parse(remaining)?;
401 let (screen_count, remaining) = u8::try_parse(remaining)?;
402 let (sequence, remaining) = u16::try_parse(remaining)?;
403 let (length, remaining) = u32::try_parse(remaining)?;
404 let (window, remaining) = xproto::Window::try_parse(remaining)?;
405 if response_type != 1 {
406 return Err(ParseError::InvalidValue);
407 }
408 let result = GetScreenCountReply { screen_count, sequence, length, window };
409 let _ = remaining;
410 let remaining = initial_value.get(32 + length as usize * 4..)
411 .ok_or(ParseError::InsufficientData)?;
412 Ok((result, remaining))
413 }
414}
415impl Serialize for GetScreenCountReply {
416 type Bytes = [u8; 12];
417 fn serialize(&self) -> [u8; 12] {
418 let response_type_bytes = &[1];
419 let screen_count_bytes = self.screen_count.serialize();
420 let sequence_bytes = self.sequence.serialize();
421 let length_bytes = self.length.serialize();
422 let window_bytes = self.window.serialize();
423 [
424 response_type_bytes[0],
425 screen_count_bytes[0],
426 sequence_bytes[0],
427 sequence_bytes[1],
428 length_bytes[0],
429 length_bytes[1],
430 length_bytes[2],
431 length_bytes[3],
432 window_bytes[0],
433 window_bytes[1],
434 window_bytes[2],
435 window_bytes[3],
436 ]
437 }
438 fn serialize_into(&self, bytes: &mut Vec<u8>) {
439 bytes.reserve(12);
440 let response_type_bytes = &[1];
441 bytes.push(response_type_bytes[0]);
442 self.screen_count.serialize_into(bytes);
443 self.sequence.serialize_into(bytes);
444 self.length.serialize_into(bytes);
445 self.window.serialize_into(bytes);
446 }
447}
448
449pub const GET_SCREEN_SIZE_REQUEST: u8 = 3;
451#[derive(Clone, Copy, Default)]
452#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
453#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
454pub struct GetScreenSizeRequest {
455 pub window: xproto::Window,
456 pub screen: u32,
457}
458impl_debug_if_no_extra_traits!(GetScreenSizeRequest, "GetScreenSizeRequest");
459impl GetScreenSizeRequest {
460 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
462 let length_so_far = 0;
463 let window_bytes = self.window.serialize();
464 let screen_bytes = self.screen.serialize();
465 let mut request0 = vec![
466 major_opcode,
467 GET_SCREEN_SIZE_REQUEST,
468 0,
469 0,
470 window_bytes[0],
471 window_bytes[1],
472 window_bytes[2],
473 window_bytes[3],
474 screen_bytes[0],
475 screen_bytes[1],
476 screen_bytes[2],
477 screen_bytes[3],
478 ];
479 let length_so_far = length_so_far + request0.len();
480 assert_eq!(length_so_far % 4, 0);
481 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
482 request0[2..4].copy_from_slice(&length.to_ne_bytes());
483 ([request0.into()], vec![])
484 }
485 #[cfg(feature = "request-parsing")]
487 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
488 if header.minor_opcode != GET_SCREEN_SIZE_REQUEST {
489 return Err(ParseError::InvalidValue);
490 }
491 let (window, remaining) = xproto::Window::try_parse(value)?;
492 let (screen, remaining) = u32::try_parse(remaining)?;
493 let _ = remaining;
494 Ok(GetScreenSizeRequest {
495 window,
496 screen,
497 })
498 }
499}
500impl Request for GetScreenSizeRequest {
501 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
502
503 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
504 let (bufs, fds) = self.serialize(major_opcode);
505 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
507 (buf, fds)
508 }
509}
510impl crate::x11_utils::ReplyRequest for GetScreenSizeRequest {
511 type Reply = GetScreenSizeReply;
512}
513
514#[derive(Clone, Copy, Default)]
515#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
516#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
517pub struct GetScreenSizeReply {
518 pub sequence: u16,
519 pub length: u32,
520 pub width: u32,
521 pub height: u32,
522 pub window: xproto::Window,
523 pub screen: u32,
524}
525impl_debug_if_no_extra_traits!(GetScreenSizeReply, "GetScreenSizeReply");
526impl TryParse for GetScreenSizeReply {
527 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
528 let remaining = initial_value;
529 let (response_type, remaining) = u8::try_parse(remaining)?;
530 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
531 let (sequence, remaining) = u16::try_parse(remaining)?;
532 let (length, remaining) = u32::try_parse(remaining)?;
533 let (width, remaining) = u32::try_parse(remaining)?;
534 let (height, remaining) = u32::try_parse(remaining)?;
535 let (window, remaining) = xproto::Window::try_parse(remaining)?;
536 let (screen, remaining) = u32::try_parse(remaining)?;
537 if response_type != 1 {
538 return Err(ParseError::InvalidValue);
539 }
540 let result = GetScreenSizeReply { sequence, length, width, height, window, screen };
541 let _ = remaining;
542 let remaining = initial_value.get(32 + length as usize * 4..)
543 .ok_or(ParseError::InsufficientData)?;
544 Ok((result, remaining))
545 }
546}
547impl Serialize for GetScreenSizeReply {
548 type Bytes = [u8; 24];
549 fn serialize(&self) -> [u8; 24] {
550 let response_type_bytes = &[1];
551 let sequence_bytes = self.sequence.serialize();
552 let length_bytes = self.length.serialize();
553 let width_bytes = self.width.serialize();
554 let height_bytes = self.height.serialize();
555 let window_bytes = self.window.serialize();
556 let screen_bytes = self.screen.serialize();
557 [
558 response_type_bytes[0],
559 0,
560 sequence_bytes[0],
561 sequence_bytes[1],
562 length_bytes[0],
563 length_bytes[1],
564 length_bytes[2],
565 length_bytes[3],
566 width_bytes[0],
567 width_bytes[1],
568 width_bytes[2],
569 width_bytes[3],
570 height_bytes[0],
571 height_bytes[1],
572 height_bytes[2],
573 height_bytes[3],
574 window_bytes[0],
575 window_bytes[1],
576 window_bytes[2],
577 window_bytes[3],
578 screen_bytes[0],
579 screen_bytes[1],
580 screen_bytes[2],
581 screen_bytes[3],
582 ]
583 }
584 fn serialize_into(&self, bytes: &mut Vec<u8>) {
585 bytes.reserve(24);
586 let response_type_bytes = &[1];
587 bytes.push(response_type_bytes[0]);
588 bytes.extend_from_slice(&[0; 1]);
589 self.sequence.serialize_into(bytes);
590 self.length.serialize_into(bytes);
591 self.width.serialize_into(bytes);
592 self.height.serialize_into(bytes);
593 self.window.serialize_into(bytes);
594 self.screen.serialize_into(bytes);
595 }
596}
597
598pub const IS_ACTIVE_REQUEST: u8 = 4;
600#[derive(Clone, Copy, Default)]
601#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
602#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
603pub struct IsActiveRequest;
604impl_debug_if_no_extra_traits!(IsActiveRequest, "IsActiveRequest");
605impl IsActiveRequest {
606 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
608 let length_so_far = 0;
609 let mut request0 = vec![
610 major_opcode,
611 IS_ACTIVE_REQUEST,
612 0,
613 0,
614 ];
615 let length_so_far = length_so_far + request0.len();
616 assert_eq!(length_so_far % 4, 0);
617 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
618 request0[2..4].copy_from_slice(&length.to_ne_bytes());
619 ([request0.into()], vec![])
620 }
621 #[cfg(feature = "request-parsing")]
623 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
624 if header.minor_opcode != IS_ACTIVE_REQUEST {
625 return Err(ParseError::InvalidValue);
626 }
627 let _ = value;
628 Ok(IsActiveRequest
629 )
630 }
631}
632impl Request for IsActiveRequest {
633 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
634
635 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
636 let (bufs, fds) = self.serialize(major_opcode);
637 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
639 (buf, fds)
640 }
641}
642impl crate::x11_utils::ReplyRequest for IsActiveRequest {
643 type Reply = IsActiveReply;
644}
645
646#[derive(Clone, Copy, Default)]
647#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
648#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
649pub struct IsActiveReply {
650 pub sequence: u16,
651 pub length: u32,
652 pub state: u32,
653}
654impl_debug_if_no_extra_traits!(IsActiveReply, "IsActiveReply");
655impl TryParse for IsActiveReply {
656 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
657 let remaining = initial_value;
658 let (response_type, remaining) = u8::try_parse(remaining)?;
659 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
660 let (sequence, remaining) = u16::try_parse(remaining)?;
661 let (length, remaining) = u32::try_parse(remaining)?;
662 let (state, remaining) = u32::try_parse(remaining)?;
663 if response_type != 1 {
664 return Err(ParseError::InvalidValue);
665 }
666 let result = IsActiveReply { sequence, length, state };
667 let _ = remaining;
668 let remaining = initial_value.get(32 + length as usize * 4..)
669 .ok_or(ParseError::InsufficientData)?;
670 Ok((result, remaining))
671 }
672}
673impl Serialize for IsActiveReply {
674 type Bytes = [u8; 12];
675 fn serialize(&self) -> [u8; 12] {
676 let response_type_bytes = &[1];
677 let sequence_bytes = self.sequence.serialize();
678 let length_bytes = self.length.serialize();
679 let state_bytes = self.state.serialize();
680 [
681 response_type_bytes[0],
682 0,
683 sequence_bytes[0],
684 sequence_bytes[1],
685 length_bytes[0],
686 length_bytes[1],
687 length_bytes[2],
688 length_bytes[3],
689 state_bytes[0],
690 state_bytes[1],
691 state_bytes[2],
692 state_bytes[3],
693 ]
694 }
695 fn serialize_into(&self, bytes: &mut Vec<u8>) {
696 bytes.reserve(12);
697 let response_type_bytes = &[1];
698 bytes.push(response_type_bytes[0]);
699 bytes.extend_from_slice(&[0; 1]);
700 self.sequence.serialize_into(bytes);
701 self.length.serialize_into(bytes);
702 self.state.serialize_into(bytes);
703 }
704}
705
706pub const QUERY_SCREENS_REQUEST: u8 = 5;
708#[derive(Clone, Copy, Default)]
709#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
710#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
711pub struct QueryScreensRequest;
712impl_debug_if_no_extra_traits!(QueryScreensRequest, "QueryScreensRequest");
713impl QueryScreensRequest {
714 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
716 let length_so_far = 0;
717 let mut request0 = vec![
718 major_opcode,
719 QUERY_SCREENS_REQUEST,
720 0,
721 0,
722 ];
723 let length_so_far = length_so_far + request0.len();
724 assert_eq!(length_so_far % 4, 0);
725 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
726 request0[2..4].copy_from_slice(&length.to_ne_bytes());
727 ([request0.into()], vec![])
728 }
729 #[cfg(feature = "request-parsing")]
731 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
732 if header.minor_opcode != QUERY_SCREENS_REQUEST {
733 return Err(ParseError::InvalidValue);
734 }
735 let _ = value;
736 Ok(QueryScreensRequest
737 )
738 }
739}
740impl Request for QueryScreensRequest {
741 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
742
743 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
744 let (bufs, fds) = self.serialize(major_opcode);
745 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
747 (buf, fds)
748 }
749}
750impl crate::x11_utils::ReplyRequest for QueryScreensRequest {
751 type Reply = QueryScreensReply;
752}
753
754#[derive(Clone, Default)]
755#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
756#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
757pub struct QueryScreensReply {
758 pub sequence: u16,
759 pub length: u32,
760 pub screen_info: Vec<ScreenInfo>,
761}
762impl_debug_if_no_extra_traits!(QueryScreensReply, "QueryScreensReply");
763impl TryParse for QueryScreensReply {
764 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
765 let remaining = initial_value;
766 let (response_type, remaining) = u8::try_parse(remaining)?;
767 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
768 let (sequence, remaining) = u16::try_parse(remaining)?;
769 let (length, remaining) = u32::try_parse(remaining)?;
770 let (number, remaining) = u32::try_parse(remaining)?;
771 let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
772 let (screen_info, remaining) = crate::x11_utils::parse_list::<ScreenInfo>(remaining, number.try_to_usize()?)?;
773 if response_type != 1 {
774 return Err(ParseError::InvalidValue);
775 }
776 let result = QueryScreensReply { sequence, length, screen_info };
777 let _ = remaining;
778 let remaining = initial_value.get(32 + length as usize * 4..)
779 .ok_or(ParseError::InsufficientData)?;
780 Ok((result, remaining))
781 }
782}
783impl Serialize for QueryScreensReply {
784 type Bytes = Vec<u8>;
785 fn serialize(&self) -> Vec<u8> {
786 let mut result = Vec::new();
787 self.serialize_into(&mut result);
788 result
789 }
790 fn serialize_into(&self, bytes: &mut Vec<u8>) {
791 bytes.reserve(32);
792 let response_type_bytes = &[1];
793 bytes.push(response_type_bytes[0]);
794 bytes.extend_from_slice(&[0; 1]);
795 self.sequence.serialize_into(bytes);
796 self.length.serialize_into(bytes);
797 let number = u32::try_from(self.screen_info.len()).expect("`screen_info` has too many elements");
798 number.serialize_into(bytes);
799 bytes.extend_from_slice(&[0; 20]);
800 self.screen_info.serialize_into(bytes);
801 }
802}
803impl QueryScreensReply {
804 pub fn number(&self) -> u32 {
814 self.screen_info.len()
815 .try_into().unwrap()
816 }
817}
818