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 = "XFree86-VidModeExtension";
28
29pub const X11_XML_VERSION: (u32, u32) = (2, 2);
36
37pub type Syncrange = u32;
38
39pub type Dotclock = u32;
40
41#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
42#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
43pub struct ModeFlag(u32);
44impl ModeFlag {
45 pub const POSITIVE_H_SYNC: Self = Self(1 << 0);
46 pub const NEGATIVE_H_SYNC: Self = Self(1 << 1);
47 pub const POSITIVE_V_SYNC: Self = Self(1 << 2);
48 pub const NEGATIVE_V_SYNC: Self = Self(1 << 3);
49 pub const INTERLACE: Self = Self(1 << 4);
50 pub const COMPOSITE_SYNC: Self = Self(1 << 5);
51 pub const POSITIVE_C_SYNC: Self = Self(1 << 6);
52 pub const NEGATIVE_C_SYNC: Self = Self(1 << 7);
53 pub const H_SKEW: Self = Self(1 << 8);
54 pub const BROADCAST: Self = Self(1 << 9);
55 pub const PIXMUX: Self = Self(1 << 10);
56 pub const DOUBLE_CLOCK: Self = Self(1 << 11);
57 pub const HALF_CLOCK: Self = Self(1 << 12);
58}
59impl From<ModeFlag> for u32 {
60 #[inline]
61 fn from(input: ModeFlag) -> Self {
62 input.0
63 }
64}
65impl From<ModeFlag> for Option<u32> {
66 #[inline]
67 fn from(input: ModeFlag) -> Self {
68 Some(input.0)
69 }
70}
71impl From<u8> for ModeFlag {
72 #[inline]
73 fn from(value: u8) -> Self {
74 Self(value.into())
75 }
76}
77impl From<u16> for ModeFlag {
78 #[inline]
79 fn from(value: u16) -> Self {
80 Self(value.into())
81 }
82}
83impl From<u32> for ModeFlag {
84 #[inline]
85 fn from(value: u32) -> Self {
86 Self(value)
87 }
88}
89impl core::fmt::Debug for ModeFlag {
90 fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
91 let variants = [
92 (Self::POSITIVE_H_SYNC.0, "POSITIVE_H_SYNC", "PositiveHSync"),
93 (Self::NEGATIVE_H_SYNC.0, "NEGATIVE_H_SYNC", "NegativeHSync"),
94 (Self::POSITIVE_V_SYNC.0, "POSITIVE_V_SYNC", "PositiveVSync"),
95 (Self::NEGATIVE_V_SYNC.0, "NEGATIVE_V_SYNC", "NegativeVSync"),
96 (Self::INTERLACE.0, "INTERLACE", "Interlace"),
97 (Self::COMPOSITE_SYNC.0, "COMPOSITE_SYNC", "CompositeSync"),
98 (Self::POSITIVE_C_SYNC.0, "POSITIVE_C_SYNC", "PositiveCSync"),
99 (Self::NEGATIVE_C_SYNC.0, "NEGATIVE_C_SYNC", "NegativeCSync"),
100 (Self::H_SKEW.0, "H_SKEW", "HSkew"),
101 (Self::BROADCAST.0, "BROADCAST", "Broadcast"),
102 (Self::PIXMUX.0, "PIXMUX", "Pixmux"),
103 (Self::DOUBLE_CLOCK.0, "DOUBLE_CLOCK", "DoubleClock"),
104 (Self::HALF_CLOCK.0, "HALF_CLOCK", "HalfClock"),
105 ];
106 pretty_print_bitmask(fmt, self.0, &variants)
107 }
108}
109bitmask_binop!(ModeFlag, u32);
110
111#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
112#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
113pub struct ClockFlag(u32);
114impl ClockFlag {
115 pub const PROGRAMABLE: Self = Self(1 << 0);
116}
117impl From<ClockFlag> for u32 {
118 #[inline]
119 fn from(input: ClockFlag) -> Self {
120 input.0
121 }
122}
123impl From<ClockFlag> for Option<u32> {
124 #[inline]
125 fn from(input: ClockFlag) -> Self {
126 Some(input.0)
127 }
128}
129impl From<u8> for ClockFlag {
130 #[inline]
131 fn from(value: u8) -> Self {
132 Self(value.into())
133 }
134}
135impl From<u16> for ClockFlag {
136 #[inline]
137 fn from(value: u16) -> Self {
138 Self(value.into())
139 }
140}
141impl From<u32> for ClockFlag {
142 #[inline]
143 fn from(value: u32) -> Self {
144 Self(value)
145 }
146}
147impl core::fmt::Debug for ClockFlag {
148 fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
149 let variants = [
150 (Self::PROGRAMABLE.0, "PROGRAMABLE", "Programable"),
151 ];
152 pretty_print_bitmask(fmt, self.0, &variants)
153 }
154}
155bitmask_binop!(ClockFlag, u32);
156
157#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
158#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
159pub struct Permission(u32);
160impl Permission {
161 pub const READ: Self = Self(1 << 0);
162 pub const WRITE: Self = Self(1 << 1);
163}
164impl From<Permission> for u32 {
165 #[inline]
166 fn from(input: Permission) -> Self {
167 input.0
168 }
169}
170impl From<Permission> for Option<u32> {
171 #[inline]
172 fn from(input: Permission) -> Self {
173 Some(input.0)
174 }
175}
176impl From<u8> for Permission {
177 #[inline]
178 fn from(value: u8) -> Self {
179 Self(value.into())
180 }
181}
182impl From<u16> for Permission {
183 #[inline]
184 fn from(value: u16) -> Self {
185 Self(value.into())
186 }
187}
188impl From<u32> for Permission {
189 #[inline]
190 fn from(value: u32) -> Self {
191 Self(value)
192 }
193}
194impl core::fmt::Debug for Permission {
195 fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
196 let variants = [
197 (Self::READ.0, "READ", "Read"),
198 (Self::WRITE.0, "WRITE", "Write"),
199 ];
200 pretty_print_bitmask(fmt, self.0, &variants)
201 }
202}
203bitmask_binop!(Permission, u32);
204
205#[derive(Clone, Copy, Default)]
206#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
207#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
208pub struct ModeInfo {
209 pub dotclock: Dotclock,
210 pub hdisplay: u16,
211 pub hsyncstart: u16,
212 pub hsyncend: u16,
213 pub htotal: u16,
214 pub hskew: u32,
215 pub vdisplay: u16,
216 pub vsyncstart: u16,
217 pub vsyncend: u16,
218 pub vtotal: u16,
219 pub flags: ModeFlag,
220 pub privsize: u32,
221}
222impl_debug_if_no_extra_traits!(ModeInfo, "ModeInfo");
223impl TryParse for ModeInfo {
224 fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
225 let (dotclock, remaining) = Dotclock::try_parse(remaining)?;
226 let (hdisplay, remaining) = u16::try_parse(remaining)?;
227 let (hsyncstart, remaining) = u16::try_parse(remaining)?;
228 let (hsyncend, remaining) = u16::try_parse(remaining)?;
229 let (htotal, remaining) = u16::try_parse(remaining)?;
230 let (hskew, remaining) = u32::try_parse(remaining)?;
231 let (vdisplay, remaining) = u16::try_parse(remaining)?;
232 let (vsyncstart, remaining) = u16::try_parse(remaining)?;
233 let (vsyncend, remaining) = u16::try_parse(remaining)?;
234 let (vtotal, remaining) = u16::try_parse(remaining)?;
235 let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?;
236 let (flags, remaining) = u32::try_parse(remaining)?;
237 let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
238 let (privsize, remaining) = u32::try_parse(remaining)?;
239 let flags = flags.into();
240 let result = ModeInfo { dotclock, hdisplay, hsyncstart, hsyncend, htotal, hskew, vdisplay, vsyncstart, vsyncend, vtotal, flags, privsize };
241 Ok((result, remaining))
242 }
243}
244impl Serialize for ModeInfo {
245 type Bytes = [u8; 48];
246 fn serialize(&self) -> [u8; 48] {
247 let dotclock_bytes = self.dotclock.serialize();
248 let hdisplay_bytes = self.hdisplay.serialize();
249 let hsyncstart_bytes = self.hsyncstart.serialize();
250 let hsyncend_bytes = self.hsyncend.serialize();
251 let htotal_bytes = self.htotal.serialize();
252 let hskew_bytes = self.hskew.serialize();
253 let vdisplay_bytes = self.vdisplay.serialize();
254 let vsyncstart_bytes = self.vsyncstart.serialize();
255 let vsyncend_bytes = self.vsyncend.serialize();
256 let vtotal_bytes = self.vtotal.serialize();
257 let flags_bytes = u32::from(self.flags).serialize();
258 let privsize_bytes = self.privsize.serialize();
259 [
260 dotclock_bytes[0],
261 dotclock_bytes[1],
262 dotclock_bytes[2],
263 dotclock_bytes[3],
264 hdisplay_bytes[0],
265 hdisplay_bytes[1],
266 hsyncstart_bytes[0],
267 hsyncstart_bytes[1],
268 hsyncend_bytes[0],
269 hsyncend_bytes[1],
270 htotal_bytes[0],
271 htotal_bytes[1],
272 hskew_bytes[0],
273 hskew_bytes[1],
274 hskew_bytes[2],
275 hskew_bytes[3],
276 vdisplay_bytes[0],
277 vdisplay_bytes[1],
278 vsyncstart_bytes[0],
279 vsyncstart_bytes[1],
280 vsyncend_bytes[0],
281 vsyncend_bytes[1],
282 vtotal_bytes[0],
283 vtotal_bytes[1],
284 0,
285 0,
286 0,
287 0,
288 flags_bytes[0],
289 flags_bytes[1],
290 flags_bytes[2],
291 flags_bytes[3],
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 privsize_bytes[0],
305 privsize_bytes[1],
306 privsize_bytes[2],
307 privsize_bytes[3],
308 ]
309 }
310 fn serialize_into(&self, bytes: &mut Vec<u8>) {
311 bytes.reserve(48);
312 self.dotclock.serialize_into(bytes);
313 self.hdisplay.serialize_into(bytes);
314 self.hsyncstart.serialize_into(bytes);
315 self.hsyncend.serialize_into(bytes);
316 self.htotal.serialize_into(bytes);
317 self.hskew.serialize_into(bytes);
318 self.vdisplay.serialize_into(bytes);
319 self.vsyncstart.serialize_into(bytes);
320 self.vsyncend.serialize_into(bytes);
321 self.vtotal.serialize_into(bytes);
322 bytes.extend_from_slice(&[0; 4]);
323 u32::from(self.flags).serialize_into(bytes);
324 bytes.extend_from_slice(&[0; 12]);
325 self.privsize.serialize_into(bytes);
326 }
327}
328
329pub const QUERY_VERSION_REQUEST: u8 = 0;
331#[derive(Clone, Copy, Default)]
332#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
333#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
334pub struct QueryVersionRequest;
335impl_debug_if_no_extra_traits!(QueryVersionRequest, "QueryVersionRequest");
336impl QueryVersionRequest {
337 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
339 let length_so_far = 0;
340 let mut request0 = vec![
341 major_opcode,
342 QUERY_VERSION_REQUEST,
343 0,
344 0,
345 ];
346 let length_so_far = length_so_far + request0.len();
347 assert_eq!(length_so_far % 4, 0);
348 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
349 request0[2..4].copy_from_slice(&length.to_ne_bytes());
350 ([request0.into()], vec![])
351 }
352 #[cfg(feature = "request-parsing")]
354 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
355 if header.minor_opcode != QUERY_VERSION_REQUEST {
356 return Err(ParseError::InvalidValue);
357 }
358 let _ = value;
359 Ok(QueryVersionRequest
360 )
361 }
362}
363impl Request for QueryVersionRequest {
364 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
365
366 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
367 let (bufs, fds) = self.serialize(major_opcode);
368 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
370 (buf, fds)
371 }
372}
373impl crate::x11_utils::ReplyRequest for QueryVersionRequest {
374 type Reply = QueryVersionReply;
375}
376
377#[derive(Clone, Copy, Default)]
378#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
379#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
380pub struct QueryVersionReply {
381 pub sequence: u16,
382 pub length: u32,
383 pub major_version: u16,
384 pub minor_version: u16,
385}
386impl_debug_if_no_extra_traits!(QueryVersionReply, "QueryVersionReply");
387impl TryParse for QueryVersionReply {
388 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
389 let remaining = initial_value;
390 let (response_type, remaining) = u8::try_parse(remaining)?;
391 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
392 let (sequence, remaining) = u16::try_parse(remaining)?;
393 let (length, remaining) = u32::try_parse(remaining)?;
394 let (major_version, remaining) = u16::try_parse(remaining)?;
395 let (minor_version, remaining) = u16::try_parse(remaining)?;
396 if response_type != 1 {
397 return Err(ParseError::InvalidValue);
398 }
399 let result = QueryVersionReply { sequence, length, major_version, minor_version };
400 let _ = remaining;
401 let remaining = initial_value.get(32 + length as usize * 4..)
402 .ok_or(ParseError::InsufficientData)?;
403 Ok((result, remaining))
404 }
405}
406impl Serialize for QueryVersionReply {
407 type Bytes = [u8; 12];
408 fn serialize(&self) -> [u8; 12] {
409 let response_type_bytes = &[1];
410 let sequence_bytes = self.sequence.serialize();
411 let length_bytes = self.length.serialize();
412 let major_version_bytes = self.major_version.serialize();
413 let minor_version_bytes = self.minor_version.serialize();
414 [
415 response_type_bytes[0],
416 0,
417 sequence_bytes[0],
418 sequence_bytes[1],
419 length_bytes[0],
420 length_bytes[1],
421 length_bytes[2],
422 length_bytes[3],
423 major_version_bytes[0],
424 major_version_bytes[1],
425 minor_version_bytes[0],
426 minor_version_bytes[1],
427 ]
428 }
429 fn serialize_into(&self, bytes: &mut Vec<u8>) {
430 bytes.reserve(12);
431 let response_type_bytes = &[1];
432 bytes.push(response_type_bytes[0]);
433 bytes.extend_from_slice(&[0; 1]);
434 self.sequence.serialize_into(bytes);
435 self.length.serialize_into(bytes);
436 self.major_version.serialize_into(bytes);
437 self.minor_version.serialize_into(bytes);
438 }
439}
440
441pub const GET_MODE_LINE_REQUEST: u8 = 1;
443#[derive(Clone, Copy, Default)]
444#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
445#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
446pub struct GetModeLineRequest {
447 pub screen: u16,
448}
449impl_debug_if_no_extra_traits!(GetModeLineRequest, "GetModeLineRequest");
450impl GetModeLineRequest {
451 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
453 let length_so_far = 0;
454 let screen_bytes = self.screen.serialize();
455 let mut request0 = vec![
456 major_opcode,
457 GET_MODE_LINE_REQUEST,
458 0,
459 0,
460 screen_bytes[0],
461 screen_bytes[1],
462 0,
463 0,
464 ];
465 let length_so_far = length_so_far + request0.len();
466 assert_eq!(length_so_far % 4, 0);
467 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
468 request0[2..4].copy_from_slice(&length.to_ne_bytes());
469 ([request0.into()], vec![])
470 }
471 #[cfg(feature = "request-parsing")]
473 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
474 if header.minor_opcode != GET_MODE_LINE_REQUEST {
475 return Err(ParseError::InvalidValue);
476 }
477 let (screen, remaining) = u16::try_parse(value)?;
478 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
479 let _ = remaining;
480 Ok(GetModeLineRequest {
481 screen,
482 })
483 }
484}
485impl Request for GetModeLineRequest {
486 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
487
488 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
489 let (bufs, fds) = self.serialize(major_opcode);
490 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
492 (buf, fds)
493 }
494}
495impl crate::x11_utils::ReplyRequest for GetModeLineRequest {
496 type Reply = GetModeLineReply;
497}
498
499#[derive(Clone, Default)]
500#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
501#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
502pub struct GetModeLineReply {
503 pub sequence: u16,
504 pub length: u32,
505 pub dotclock: Dotclock,
506 pub hdisplay: u16,
507 pub hsyncstart: u16,
508 pub hsyncend: u16,
509 pub htotal: u16,
510 pub hskew: u16,
511 pub vdisplay: u16,
512 pub vsyncstart: u16,
513 pub vsyncend: u16,
514 pub vtotal: u16,
515 pub flags: ModeFlag,
516 pub private: Vec<u8>,
517}
518impl_debug_if_no_extra_traits!(GetModeLineReply, "GetModeLineReply");
519impl TryParse for GetModeLineReply {
520 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
521 let remaining = initial_value;
522 let (response_type, remaining) = u8::try_parse(remaining)?;
523 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
524 let (sequence, remaining) = u16::try_parse(remaining)?;
525 let (length, remaining) = u32::try_parse(remaining)?;
526 let (dotclock, remaining) = Dotclock::try_parse(remaining)?;
527 let (hdisplay, remaining) = u16::try_parse(remaining)?;
528 let (hsyncstart, remaining) = u16::try_parse(remaining)?;
529 let (hsyncend, remaining) = u16::try_parse(remaining)?;
530 let (htotal, remaining) = u16::try_parse(remaining)?;
531 let (hskew, remaining) = u16::try_parse(remaining)?;
532 let (vdisplay, remaining) = u16::try_parse(remaining)?;
533 let (vsyncstart, remaining) = u16::try_parse(remaining)?;
534 let (vsyncend, remaining) = u16::try_parse(remaining)?;
535 let (vtotal, remaining) = u16::try_parse(remaining)?;
536 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
537 let (flags, remaining) = u32::try_parse(remaining)?;
538 let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
539 let (privsize, remaining) = u32::try_parse(remaining)?;
540 let (private, remaining) = crate::x11_utils::parse_u8_list(remaining, privsize.try_to_usize()?)?;
541 let private = private.to_vec();
542 if response_type != 1 {
543 return Err(ParseError::InvalidValue);
544 }
545 let flags = flags.into();
546 let result = GetModeLineReply { sequence, length, dotclock, hdisplay, hsyncstart, hsyncend, htotal, hskew, vdisplay, vsyncstart, vsyncend, vtotal, flags, private };
547 let _ = remaining;
548 let remaining = initial_value.get(32 + length as usize * 4..)
549 .ok_or(ParseError::InsufficientData)?;
550 Ok((result, remaining))
551 }
552}
553impl Serialize for GetModeLineReply {
554 type Bytes = Vec<u8>;
555 fn serialize(&self) -> Vec<u8> {
556 let mut result = Vec::new();
557 self.serialize_into(&mut result);
558 result
559 }
560 fn serialize_into(&self, bytes: &mut Vec<u8>) {
561 bytes.reserve(52);
562 let response_type_bytes = &[1];
563 bytes.push(response_type_bytes[0]);
564 bytes.extend_from_slice(&[0; 1]);
565 self.sequence.serialize_into(bytes);
566 self.length.serialize_into(bytes);
567 self.dotclock.serialize_into(bytes);
568 self.hdisplay.serialize_into(bytes);
569 self.hsyncstart.serialize_into(bytes);
570 self.hsyncend.serialize_into(bytes);
571 self.htotal.serialize_into(bytes);
572 self.hskew.serialize_into(bytes);
573 self.vdisplay.serialize_into(bytes);
574 self.vsyncstart.serialize_into(bytes);
575 self.vsyncend.serialize_into(bytes);
576 self.vtotal.serialize_into(bytes);
577 bytes.extend_from_slice(&[0; 2]);
578 u32::from(self.flags).serialize_into(bytes);
579 bytes.extend_from_slice(&[0; 12]);
580 let privsize = u32::try_from(self.private.len()).expect("`private` has too many elements");
581 privsize.serialize_into(bytes);
582 bytes.extend_from_slice(&self.private);
583 }
584}
585impl GetModeLineReply {
586 pub fn privsize(&self) -> u32 {
596 self.private.len()
597 .try_into().unwrap()
598 }
599}
600
601pub const MOD_MODE_LINE_REQUEST: u8 = 2;
603#[derive(Clone, Default)]
604#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
605#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
606pub struct ModModeLineRequest<'input> {
607 pub screen: u32,
608 pub hdisplay: u16,
609 pub hsyncstart: u16,
610 pub hsyncend: u16,
611 pub htotal: u16,
612 pub hskew: u16,
613 pub vdisplay: u16,
614 pub vsyncstart: u16,
615 pub vsyncend: u16,
616 pub vtotal: u16,
617 pub flags: ModeFlag,
618 pub private: Cow<'input, [u8]>,
619}
620impl_debug_if_no_extra_traits!(ModModeLineRequest<'_>, "ModModeLineRequest");
621impl<'input> ModModeLineRequest<'input> {
622 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
624 let length_so_far = 0;
625 let screen_bytes = self.screen.serialize();
626 let hdisplay_bytes = self.hdisplay.serialize();
627 let hsyncstart_bytes = self.hsyncstart.serialize();
628 let hsyncend_bytes = self.hsyncend.serialize();
629 let htotal_bytes = self.htotal.serialize();
630 let hskew_bytes = self.hskew.serialize();
631 let vdisplay_bytes = self.vdisplay.serialize();
632 let vsyncstart_bytes = self.vsyncstart.serialize();
633 let vsyncend_bytes = self.vsyncend.serialize();
634 let vtotal_bytes = self.vtotal.serialize();
635 let flags_bytes = u32::from(self.flags).serialize();
636 let privsize = u32::try_from(self.private.len()).expect("`private` has too many elements");
637 let privsize_bytes = privsize.serialize();
638 let mut request0 = vec![
639 major_opcode,
640 MOD_MODE_LINE_REQUEST,
641 0,
642 0,
643 screen_bytes[0],
644 screen_bytes[1],
645 screen_bytes[2],
646 screen_bytes[3],
647 hdisplay_bytes[0],
648 hdisplay_bytes[1],
649 hsyncstart_bytes[0],
650 hsyncstart_bytes[1],
651 hsyncend_bytes[0],
652 hsyncend_bytes[1],
653 htotal_bytes[0],
654 htotal_bytes[1],
655 hskew_bytes[0],
656 hskew_bytes[1],
657 vdisplay_bytes[0],
658 vdisplay_bytes[1],
659 vsyncstart_bytes[0],
660 vsyncstart_bytes[1],
661 vsyncend_bytes[0],
662 vsyncend_bytes[1],
663 vtotal_bytes[0],
664 vtotal_bytes[1],
665 0,
666 0,
667 flags_bytes[0],
668 flags_bytes[1],
669 flags_bytes[2],
670 flags_bytes[3],
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 privsize_bytes[0],
684 privsize_bytes[1],
685 privsize_bytes[2],
686 privsize_bytes[3],
687 ];
688 let length_so_far = length_so_far + request0.len();
689 let length_so_far = length_so_far + self.private.len();
690 let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
691 let length_so_far = length_so_far + padding0.len();
692 assert_eq!(length_so_far % 4, 0);
693 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
694 request0[2..4].copy_from_slice(&length.to_ne_bytes());
695 ([request0.into(), self.private, padding0.into()], vec![])
696 }
697 #[cfg(feature = "request-parsing")]
699 pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
700 if header.minor_opcode != MOD_MODE_LINE_REQUEST {
701 return Err(ParseError::InvalidValue);
702 }
703 let (screen, remaining) = u32::try_parse(value)?;
704 let (hdisplay, remaining) = u16::try_parse(remaining)?;
705 let (hsyncstart, remaining) = u16::try_parse(remaining)?;
706 let (hsyncend, remaining) = u16::try_parse(remaining)?;
707 let (htotal, remaining) = u16::try_parse(remaining)?;
708 let (hskew, remaining) = u16::try_parse(remaining)?;
709 let (vdisplay, remaining) = u16::try_parse(remaining)?;
710 let (vsyncstart, remaining) = u16::try_parse(remaining)?;
711 let (vsyncend, remaining) = u16::try_parse(remaining)?;
712 let (vtotal, remaining) = u16::try_parse(remaining)?;
713 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
714 let (flags, remaining) = u32::try_parse(remaining)?;
715 let flags = flags.into();
716 let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
717 let (privsize, remaining) = u32::try_parse(remaining)?;
718 let (private, remaining) = crate::x11_utils::parse_u8_list(remaining, privsize.try_to_usize()?)?;
719 let _ = remaining;
720 Ok(ModModeLineRequest {
721 screen,
722 hdisplay,
723 hsyncstart,
724 hsyncend,
725 htotal,
726 hskew,
727 vdisplay,
728 vsyncstart,
729 vsyncend,
730 vtotal,
731 flags,
732 private: Cow::Borrowed(private),
733 })
734 }
735 pub fn into_owned(self) -> ModModeLineRequest<'static> {
737 ModModeLineRequest {
738 screen: self.screen,
739 hdisplay: self.hdisplay,
740 hsyncstart: self.hsyncstart,
741 hsyncend: self.hsyncend,
742 htotal: self.htotal,
743 hskew: self.hskew,
744 vdisplay: self.vdisplay,
745 vsyncstart: self.vsyncstart,
746 vsyncend: self.vsyncend,
747 vtotal: self.vtotal,
748 flags: self.flags,
749 private: Cow::Owned(self.private.into_owned()),
750 }
751 }
752}
753impl<'input> Request for ModModeLineRequest<'input> {
754 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
755
756 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
757 let (bufs, fds) = self.serialize(major_opcode);
758 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
760 (buf, fds)
761 }
762}
763impl<'input> crate::x11_utils::VoidRequest for ModModeLineRequest<'input> {
764}
765
766pub const SWITCH_MODE_REQUEST: u8 = 3;
768#[derive(Clone, Copy, Default)]
769#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
770#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
771pub struct SwitchModeRequest {
772 pub screen: u16,
773 pub zoom: u16,
774}
775impl_debug_if_no_extra_traits!(SwitchModeRequest, "SwitchModeRequest");
776impl SwitchModeRequest {
777 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
779 let length_so_far = 0;
780 let screen_bytes = self.screen.serialize();
781 let zoom_bytes = self.zoom.serialize();
782 let mut request0 = vec![
783 major_opcode,
784 SWITCH_MODE_REQUEST,
785 0,
786 0,
787 screen_bytes[0],
788 screen_bytes[1],
789 zoom_bytes[0],
790 zoom_bytes[1],
791 ];
792 let length_so_far = length_so_far + request0.len();
793 assert_eq!(length_so_far % 4, 0);
794 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
795 request0[2..4].copy_from_slice(&length.to_ne_bytes());
796 ([request0.into()], vec![])
797 }
798 #[cfg(feature = "request-parsing")]
800 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
801 if header.minor_opcode != SWITCH_MODE_REQUEST {
802 return Err(ParseError::InvalidValue);
803 }
804 let (screen, remaining) = u16::try_parse(value)?;
805 let (zoom, remaining) = u16::try_parse(remaining)?;
806 let _ = remaining;
807 Ok(SwitchModeRequest {
808 screen,
809 zoom,
810 })
811 }
812}
813impl Request for SwitchModeRequest {
814 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
815
816 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
817 let (bufs, fds) = self.serialize(major_opcode);
818 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
820 (buf, fds)
821 }
822}
823impl crate::x11_utils::VoidRequest for SwitchModeRequest {
824}
825
826pub const GET_MONITOR_REQUEST: u8 = 4;
828#[derive(Clone, Copy, Default)]
829#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
830#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
831pub struct GetMonitorRequest {
832 pub screen: u16,
833}
834impl_debug_if_no_extra_traits!(GetMonitorRequest, "GetMonitorRequest");
835impl GetMonitorRequest {
836 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
838 let length_so_far = 0;
839 let screen_bytes = self.screen.serialize();
840 let mut request0 = vec![
841 major_opcode,
842 GET_MONITOR_REQUEST,
843 0,
844 0,
845 screen_bytes[0],
846 screen_bytes[1],
847 0,
848 0,
849 ];
850 let length_so_far = length_so_far + request0.len();
851 assert_eq!(length_so_far % 4, 0);
852 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
853 request0[2..4].copy_from_slice(&length.to_ne_bytes());
854 ([request0.into()], vec![])
855 }
856 #[cfg(feature = "request-parsing")]
858 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
859 if header.minor_opcode != GET_MONITOR_REQUEST {
860 return Err(ParseError::InvalidValue);
861 }
862 let (screen, remaining) = u16::try_parse(value)?;
863 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
864 let _ = remaining;
865 Ok(GetMonitorRequest {
866 screen,
867 })
868 }
869}
870impl Request for GetMonitorRequest {
871 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
872
873 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
874 let (bufs, fds) = self.serialize(major_opcode);
875 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
877 (buf, fds)
878 }
879}
880impl crate::x11_utils::ReplyRequest for GetMonitorRequest {
881 type Reply = GetMonitorReply;
882}
883
884#[derive(Clone, Default)]
885#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
886#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
887pub struct GetMonitorReply {
888 pub sequence: u16,
889 pub length: u32,
890 pub hsync: Vec<Syncrange>,
891 pub vsync: Vec<Syncrange>,
892 pub vendor: Vec<u8>,
893 pub alignment_pad: Vec<u8>,
894 pub model: Vec<u8>,
895}
896impl_debug_if_no_extra_traits!(GetMonitorReply, "GetMonitorReply");
897impl TryParse for GetMonitorReply {
898 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
899 let remaining = initial_value;
900 let (response_type, remaining) = u8::try_parse(remaining)?;
901 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
902 let (sequence, remaining) = u16::try_parse(remaining)?;
903 let (length, remaining) = u32::try_parse(remaining)?;
904 let (vendor_length, remaining) = u8::try_parse(remaining)?;
905 let (model_length, remaining) = u8::try_parse(remaining)?;
906 let (num_hsync, remaining) = u8::try_parse(remaining)?;
907 let (num_vsync, remaining) = u8::try_parse(remaining)?;
908 let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
909 let (hsync, remaining) = crate::x11_utils::parse_list::<Syncrange>(remaining, num_hsync.try_to_usize()?)?;
910 let (vsync, remaining) = crate::x11_utils::parse_list::<Syncrange>(remaining, num_vsync.try_to_usize()?)?;
911 let (vendor, remaining) = crate::x11_utils::parse_u8_list(remaining, vendor_length.try_to_usize()?)?;
912 let vendor = vendor.to_vec();
913 let (alignment_pad, remaining) = crate::x11_utils::parse_u8_list(remaining, (u32::from(vendor_length).checked_add(3u32).ok_or(ParseError::InvalidExpression)? & (!3u32)).checked_sub(u32::from(vendor_length)).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
914 let alignment_pad = alignment_pad.to_vec();
915 let (model, remaining) = crate::x11_utils::parse_u8_list(remaining, model_length.try_to_usize()?)?;
916 let model = model.to_vec();
917 if response_type != 1 {
918 return Err(ParseError::InvalidValue);
919 }
920 let result = GetMonitorReply { sequence, length, hsync, vsync, vendor, alignment_pad, model };
921 let _ = remaining;
922 let remaining = initial_value.get(32 + length as usize * 4..)
923 .ok_or(ParseError::InsufficientData)?;
924 Ok((result, remaining))
925 }
926}
927impl Serialize for GetMonitorReply {
928 type Bytes = Vec<u8>;
929 fn serialize(&self) -> Vec<u8> {
930 let mut result = Vec::new();
931 self.serialize_into(&mut result);
932 result
933 }
934 fn serialize_into(&self, bytes: &mut Vec<u8>) {
935 bytes.reserve(32);
936 let response_type_bytes = &[1];
937 bytes.push(response_type_bytes[0]);
938 bytes.extend_from_slice(&[0; 1]);
939 self.sequence.serialize_into(bytes);
940 self.length.serialize_into(bytes);
941 let vendor_length = u8::try_from(self.vendor.len()).expect("`vendor` has too many elements");
942 vendor_length.serialize_into(bytes);
943 let model_length = u8::try_from(self.model.len()).expect("`model` has too many elements");
944 model_length.serialize_into(bytes);
945 let num_hsync = u8::try_from(self.hsync.len()).expect("`hsync` has too many elements");
946 num_hsync.serialize_into(bytes);
947 let num_vsync = u8::try_from(self.vsync.len()).expect("`vsync` has too many elements");
948 num_vsync.serialize_into(bytes);
949 bytes.extend_from_slice(&[0; 20]);
950 self.hsync.serialize_into(bytes);
951 self.vsync.serialize_into(bytes);
952 bytes.extend_from_slice(&self.vendor);
953 assert_eq!(self.alignment_pad.len(), usize::try_from((u32::from(vendor_length).checked_add(3u32).unwrap() & (!3u32)).checked_sub(u32::from(vendor_length)).unwrap()).unwrap(), "`alignment_pad` has an incorrect length");
954 bytes.extend_from_slice(&self.alignment_pad);
955 bytes.extend_from_slice(&self.model);
956 }
957}
958impl GetMonitorReply {
959 pub fn vendor_length(&self) -> u8 {
969 self.vendor.len()
970 .try_into().unwrap()
971 }
972 pub fn model_length(&self) -> u8 {
982 self.model.len()
983 .try_into().unwrap()
984 }
985 pub fn num_hsync(&self) -> u8 {
995 self.hsync.len()
996 .try_into().unwrap()
997 }
998 pub fn num_vsync(&self) -> u8 {
1008 self.vsync.len()
1009 .try_into().unwrap()
1010 }
1011}
1012
1013pub const LOCK_MODE_SWITCH_REQUEST: u8 = 5;
1015#[derive(Clone, Copy, Default)]
1016#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1017#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1018pub struct LockModeSwitchRequest {
1019 pub screen: u16,
1020 pub lock: u16,
1021}
1022impl_debug_if_no_extra_traits!(LockModeSwitchRequest, "LockModeSwitchRequest");
1023impl LockModeSwitchRequest {
1024 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1026 let length_so_far = 0;
1027 let screen_bytes = self.screen.serialize();
1028 let lock_bytes = self.lock.serialize();
1029 let mut request0 = vec![
1030 major_opcode,
1031 LOCK_MODE_SWITCH_REQUEST,
1032 0,
1033 0,
1034 screen_bytes[0],
1035 screen_bytes[1],
1036 lock_bytes[0],
1037 lock_bytes[1],
1038 ];
1039 let length_so_far = length_so_far + request0.len();
1040 assert_eq!(length_so_far % 4, 0);
1041 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1042 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1043 ([request0.into()], vec![])
1044 }
1045 #[cfg(feature = "request-parsing")]
1047 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1048 if header.minor_opcode != LOCK_MODE_SWITCH_REQUEST {
1049 return Err(ParseError::InvalidValue);
1050 }
1051 let (screen, remaining) = u16::try_parse(value)?;
1052 let (lock, remaining) = u16::try_parse(remaining)?;
1053 let _ = remaining;
1054 Ok(LockModeSwitchRequest {
1055 screen,
1056 lock,
1057 })
1058 }
1059}
1060impl Request for LockModeSwitchRequest {
1061 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1062
1063 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1064 let (bufs, fds) = self.serialize(major_opcode);
1065 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1067 (buf, fds)
1068 }
1069}
1070impl crate::x11_utils::VoidRequest for LockModeSwitchRequest {
1071}
1072
1073pub const GET_ALL_MODE_LINES_REQUEST: u8 = 6;
1075#[derive(Clone, Copy, Default)]
1076#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1077#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1078pub struct GetAllModeLinesRequest {
1079 pub screen: u16,
1080}
1081impl_debug_if_no_extra_traits!(GetAllModeLinesRequest, "GetAllModeLinesRequest");
1082impl GetAllModeLinesRequest {
1083 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
1085 let length_so_far = 0;
1086 let screen_bytes = self.screen.serialize();
1087 let mut request0 = vec![
1088 major_opcode,
1089 GET_ALL_MODE_LINES_REQUEST,
1090 0,
1091 0,
1092 screen_bytes[0],
1093 screen_bytes[1],
1094 0,
1095 0,
1096 ];
1097 let length_so_far = length_so_far + request0.len();
1098 assert_eq!(length_so_far % 4, 0);
1099 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1100 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1101 ([request0.into()], vec![])
1102 }
1103 #[cfg(feature = "request-parsing")]
1105 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
1106 if header.minor_opcode != GET_ALL_MODE_LINES_REQUEST {
1107 return Err(ParseError::InvalidValue);
1108 }
1109 let (screen, remaining) = u16::try_parse(value)?;
1110 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1111 let _ = remaining;
1112 Ok(GetAllModeLinesRequest {
1113 screen,
1114 })
1115 }
1116}
1117impl Request for GetAllModeLinesRequest {
1118 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1119
1120 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1121 let (bufs, fds) = self.serialize(major_opcode);
1122 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1124 (buf, fds)
1125 }
1126}
1127impl crate::x11_utils::ReplyRequest for GetAllModeLinesRequest {
1128 type Reply = GetAllModeLinesReply;
1129}
1130
1131#[derive(Clone, Default)]
1132#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1133#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1134pub struct GetAllModeLinesReply {
1135 pub sequence: u16,
1136 pub length: u32,
1137 pub modeinfo: Vec<ModeInfo>,
1138}
1139impl_debug_if_no_extra_traits!(GetAllModeLinesReply, "GetAllModeLinesReply");
1140impl TryParse for GetAllModeLinesReply {
1141 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1142 let remaining = initial_value;
1143 let (response_type, remaining) = u8::try_parse(remaining)?;
1144 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1145 let (sequence, remaining) = u16::try_parse(remaining)?;
1146 let (length, remaining) = u32::try_parse(remaining)?;
1147 let (modecount, remaining) = u32::try_parse(remaining)?;
1148 let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
1149 let (modeinfo, remaining) = crate::x11_utils::parse_list::<ModeInfo>(remaining, modecount.try_to_usize()?)?;
1150 if response_type != 1 {
1151 return Err(ParseError::InvalidValue);
1152 }
1153 let result = GetAllModeLinesReply { sequence, length, modeinfo };
1154 let _ = remaining;
1155 let remaining = initial_value.get(32 + length as usize * 4..)
1156 .ok_or(ParseError::InsufficientData)?;
1157 Ok((result, remaining))
1158 }
1159}
1160impl Serialize for GetAllModeLinesReply {
1161 type Bytes = Vec<u8>;
1162 fn serialize(&self) -> Vec<u8> {
1163 let mut result = Vec::new();
1164 self.serialize_into(&mut result);
1165 result
1166 }
1167 fn serialize_into(&self, bytes: &mut Vec<u8>) {
1168 bytes.reserve(32);
1169 let response_type_bytes = &[1];
1170 bytes.push(response_type_bytes[0]);
1171 bytes.extend_from_slice(&[0; 1]);
1172 self.sequence.serialize_into(bytes);
1173 self.length.serialize_into(bytes);
1174 let modecount = u32::try_from(self.modeinfo.len()).expect("`modeinfo` has too many elements");
1175 modecount.serialize_into(bytes);
1176 bytes.extend_from_slice(&[0; 20]);
1177 self.modeinfo.serialize_into(bytes);
1178 }
1179}
1180impl GetAllModeLinesReply {
1181 pub fn modecount(&self) -> u32 {
1191 self.modeinfo.len()
1192 .try_into().unwrap()
1193 }
1194}
1195
1196pub const ADD_MODE_LINE_REQUEST: u8 = 7;
1198#[derive(Clone, Default)]
1199#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1200#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1201pub struct AddModeLineRequest<'input> {
1202 pub screen: u32,
1203 pub dotclock: Dotclock,
1204 pub hdisplay: u16,
1205 pub hsyncstart: u16,
1206 pub hsyncend: u16,
1207 pub htotal: u16,
1208 pub hskew: u16,
1209 pub vdisplay: u16,
1210 pub vsyncstart: u16,
1211 pub vsyncend: u16,
1212 pub vtotal: u16,
1213 pub flags: ModeFlag,
1214 pub after_dotclock: Dotclock,
1215 pub after_hdisplay: u16,
1216 pub after_hsyncstart: u16,
1217 pub after_hsyncend: u16,
1218 pub after_htotal: u16,
1219 pub after_hskew: u16,
1220 pub after_vdisplay: u16,
1221 pub after_vsyncstart: u16,
1222 pub after_vsyncend: u16,
1223 pub after_vtotal: u16,
1224 pub after_flags: ModeFlag,
1225 pub private: Cow<'input, [u8]>,
1226}
1227impl_debug_if_no_extra_traits!(AddModeLineRequest<'_>, "AddModeLineRequest");
1228impl<'input> AddModeLineRequest<'input> {
1229 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
1231 let length_so_far = 0;
1232 let screen_bytes = self.screen.serialize();
1233 let dotclock_bytes = self.dotclock.serialize();
1234 let hdisplay_bytes = self.hdisplay.serialize();
1235 let hsyncstart_bytes = self.hsyncstart.serialize();
1236 let hsyncend_bytes = self.hsyncend.serialize();
1237 let htotal_bytes = self.htotal.serialize();
1238 let hskew_bytes = self.hskew.serialize();
1239 let vdisplay_bytes = self.vdisplay.serialize();
1240 let vsyncstart_bytes = self.vsyncstart.serialize();
1241 let vsyncend_bytes = self.vsyncend.serialize();
1242 let vtotal_bytes = self.vtotal.serialize();
1243 let flags_bytes = u32::from(self.flags).serialize();
1244 let privsize = u32::try_from(self.private.len()).expect("`private` has too many elements");
1245 let privsize_bytes = privsize.serialize();
1246 let after_dotclock_bytes = self.after_dotclock.serialize();
1247 let after_hdisplay_bytes = self.after_hdisplay.serialize();
1248 let after_hsyncstart_bytes = self.after_hsyncstart.serialize();
1249 let after_hsyncend_bytes = self.after_hsyncend.serialize();
1250 let after_htotal_bytes = self.after_htotal.serialize();
1251 let after_hskew_bytes = self.after_hskew.serialize();
1252 let after_vdisplay_bytes = self.after_vdisplay.serialize();
1253 let after_vsyncstart_bytes = self.after_vsyncstart.serialize();
1254 let after_vsyncend_bytes = self.after_vsyncend.serialize();
1255 let after_vtotal_bytes = self.after_vtotal.serialize();
1256 let after_flags_bytes = u32::from(self.after_flags).serialize();
1257 let mut request0 = vec![
1258 major_opcode,
1259 ADD_MODE_LINE_REQUEST,
1260 0,
1261 0,
1262 screen_bytes[0],
1263 screen_bytes[1],
1264 screen_bytes[2],
1265 screen_bytes[3],
1266 dotclock_bytes[0],
1267 dotclock_bytes[1],
1268 dotclock_bytes[2],
1269 dotclock_bytes[3],
1270 hdisplay_bytes[0],
1271 hdisplay_bytes[1],
1272 hsyncstart_bytes[0],
1273 hsyncstart_bytes[1],
1274 hsyncend_bytes[0],
1275 hsyncend_bytes[1],
1276 htotal_bytes[0],
1277 htotal_bytes[1],
1278 hskew_bytes[0],
1279 hskew_bytes[1],
1280 vdisplay_bytes[0],
1281 vdisplay_bytes[1],
1282 vsyncstart_bytes[0],
1283 vsyncstart_bytes[1],
1284 vsyncend_bytes[0],
1285 vsyncend_bytes[1],
1286 vtotal_bytes[0],
1287 vtotal_bytes[1],
1288 0,
1289 0,
1290 flags_bytes[0],
1291 flags_bytes[1],
1292 flags_bytes[2],
1293 flags_bytes[3],
1294 0,
1295 0,
1296 0,
1297 0,
1298 0,
1299 0,
1300 0,
1301 0,
1302 0,
1303 0,
1304 0,
1305 0,
1306 privsize_bytes[0],
1307 privsize_bytes[1],
1308 privsize_bytes[2],
1309 privsize_bytes[3],
1310 after_dotclock_bytes[0],
1311 after_dotclock_bytes[1],
1312 after_dotclock_bytes[2],
1313 after_dotclock_bytes[3],
1314 after_hdisplay_bytes[0],
1315 after_hdisplay_bytes[1],
1316 after_hsyncstart_bytes[0],
1317 after_hsyncstart_bytes[1],
1318 after_hsyncend_bytes[0],
1319 after_hsyncend_bytes[1],
1320 after_htotal_bytes[0],
1321 after_htotal_bytes[1],
1322 after_hskew_bytes[0],
1323 after_hskew_bytes[1],
1324 after_vdisplay_bytes[0],
1325 after_vdisplay_bytes[1],
1326 after_vsyncstart_bytes[0],
1327 after_vsyncstart_bytes[1],
1328 after_vsyncend_bytes[0],
1329 after_vsyncend_bytes[1],
1330 after_vtotal_bytes[0],
1331 after_vtotal_bytes[1],
1332 0,
1333 0,
1334 after_flags_bytes[0],
1335 after_flags_bytes[1],
1336 after_flags_bytes[2],
1337 after_flags_bytes[3],
1338 0,
1339 0,
1340 0,
1341 0,
1342 0,
1343 0,
1344 0,
1345 0,
1346 0,
1347 0,
1348 0,
1349 0,
1350 ];
1351 let length_so_far = length_so_far + request0.len();
1352 let length_so_far = length_so_far + self.private.len();
1353 let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
1354 let length_so_far = length_so_far + padding0.len();
1355 assert_eq!(length_so_far % 4, 0);
1356 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1357 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1358 ([request0.into(), self.private, padding0.into()], vec![])
1359 }
1360 #[cfg(feature = "request-parsing")]
1362 pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
1363 if header.minor_opcode != ADD_MODE_LINE_REQUEST {
1364 return Err(ParseError::InvalidValue);
1365 }
1366 let (screen, remaining) = u32::try_parse(value)?;
1367 let (dotclock, remaining) = Dotclock::try_parse(remaining)?;
1368 let (hdisplay, remaining) = u16::try_parse(remaining)?;
1369 let (hsyncstart, remaining) = u16::try_parse(remaining)?;
1370 let (hsyncend, remaining) = u16::try_parse(remaining)?;
1371 let (htotal, remaining) = u16::try_parse(remaining)?;
1372 let (hskew, remaining) = u16::try_parse(remaining)?;
1373 let (vdisplay, remaining) = u16::try_parse(remaining)?;
1374 let (vsyncstart, remaining) = u16::try_parse(remaining)?;
1375 let (vsyncend, remaining) = u16::try_parse(remaining)?;
1376 let (vtotal, remaining) = u16::try_parse(remaining)?;
1377 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1378 let (flags, remaining) = u32::try_parse(remaining)?;
1379 let flags = flags.into();
1380 let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
1381 let (privsize, remaining) = u32::try_parse(remaining)?;
1382 let (after_dotclock, remaining) = Dotclock::try_parse(remaining)?;
1383 let (after_hdisplay, remaining) = u16::try_parse(remaining)?;
1384 let (after_hsyncstart, remaining) = u16::try_parse(remaining)?;
1385 let (after_hsyncend, remaining) = u16::try_parse(remaining)?;
1386 let (after_htotal, remaining) = u16::try_parse(remaining)?;
1387 let (after_hskew, remaining) = u16::try_parse(remaining)?;
1388 let (after_vdisplay, remaining) = u16::try_parse(remaining)?;
1389 let (after_vsyncstart, remaining) = u16::try_parse(remaining)?;
1390 let (after_vsyncend, remaining) = u16::try_parse(remaining)?;
1391 let (after_vtotal, remaining) = u16::try_parse(remaining)?;
1392 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1393 let (after_flags, remaining) = u32::try_parse(remaining)?;
1394 let after_flags = after_flags.into();
1395 let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
1396 let (private, remaining) = crate::x11_utils::parse_u8_list(remaining, privsize.try_to_usize()?)?;
1397 let _ = remaining;
1398 Ok(AddModeLineRequest {
1399 screen,
1400 dotclock,
1401 hdisplay,
1402 hsyncstart,
1403 hsyncend,
1404 htotal,
1405 hskew,
1406 vdisplay,
1407 vsyncstart,
1408 vsyncend,
1409 vtotal,
1410 flags,
1411 after_dotclock,
1412 after_hdisplay,
1413 after_hsyncstart,
1414 after_hsyncend,
1415 after_htotal,
1416 after_hskew,
1417 after_vdisplay,
1418 after_vsyncstart,
1419 after_vsyncend,
1420 after_vtotal,
1421 after_flags,
1422 private: Cow::Borrowed(private),
1423 })
1424 }
1425 pub fn into_owned(self) -> AddModeLineRequest<'static> {
1427 AddModeLineRequest {
1428 screen: self.screen,
1429 dotclock: self.dotclock,
1430 hdisplay: self.hdisplay,
1431 hsyncstart: self.hsyncstart,
1432 hsyncend: self.hsyncend,
1433 htotal: self.htotal,
1434 hskew: self.hskew,
1435 vdisplay: self.vdisplay,
1436 vsyncstart: self.vsyncstart,
1437 vsyncend: self.vsyncend,
1438 vtotal: self.vtotal,
1439 flags: self.flags,
1440 after_dotclock: self.after_dotclock,
1441 after_hdisplay: self.after_hdisplay,
1442 after_hsyncstart: self.after_hsyncstart,
1443 after_hsyncend: self.after_hsyncend,
1444 after_htotal: self.after_htotal,
1445 after_hskew: self.after_hskew,
1446 after_vdisplay: self.after_vdisplay,
1447 after_vsyncstart: self.after_vsyncstart,
1448 after_vsyncend: self.after_vsyncend,
1449 after_vtotal: self.after_vtotal,
1450 after_flags: self.after_flags,
1451 private: Cow::Owned(self.private.into_owned()),
1452 }
1453 }
1454}
1455impl<'input> Request for AddModeLineRequest<'input> {
1456 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1457
1458 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1459 let (bufs, fds) = self.serialize(major_opcode);
1460 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1462 (buf, fds)
1463 }
1464}
1465impl<'input> crate::x11_utils::VoidRequest for AddModeLineRequest<'input> {
1466}
1467
1468pub const DELETE_MODE_LINE_REQUEST: u8 = 8;
1470#[derive(Clone, Default)]
1471#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1472#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1473pub struct DeleteModeLineRequest<'input> {
1474 pub screen: u32,
1475 pub dotclock: Dotclock,
1476 pub hdisplay: u16,
1477 pub hsyncstart: u16,
1478 pub hsyncend: u16,
1479 pub htotal: u16,
1480 pub hskew: u16,
1481 pub vdisplay: u16,
1482 pub vsyncstart: u16,
1483 pub vsyncend: u16,
1484 pub vtotal: u16,
1485 pub flags: ModeFlag,
1486 pub private: Cow<'input, [u8]>,
1487}
1488impl_debug_if_no_extra_traits!(DeleteModeLineRequest<'_>, "DeleteModeLineRequest");
1489impl<'input> DeleteModeLineRequest<'input> {
1490 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
1492 let length_so_far = 0;
1493 let screen_bytes = self.screen.serialize();
1494 let dotclock_bytes = self.dotclock.serialize();
1495 let hdisplay_bytes = self.hdisplay.serialize();
1496 let hsyncstart_bytes = self.hsyncstart.serialize();
1497 let hsyncend_bytes = self.hsyncend.serialize();
1498 let htotal_bytes = self.htotal.serialize();
1499 let hskew_bytes = self.hskew.serialize();
1500 let vdisplay_bytes = self.vdisplay.serialize();
1501 let vsyncstart_bytes = self.vsyncstart.serialize();
1502 let vsyncend_bytes = self.vsyncend.serialize();
1503 let vtotal_bytes = self.vtotal.serialize();
1504 let flags_bytes = u32::from(self.flags).serialize();
1505 let privsize = u32::try_from(self.private.len()).expect("`private` has too many elements");
1506 let privsize_bytes = privsize.serialize();
1507 let mut request0 = vec![
1508 major_opcode,
1509 DELETE_MODE_LINE_REQUEST,
1510 0,
1511 0,
1512 screen_bytes[0],
1513 screen_bytes[1],
1514 screen_bytes[2],
1515 screen_bytes[3],
1516 dotclock_bytes[0],
1517 dotclock_bytes[1],
1518 dotclock_bytes[2],
1519 dotclock_bytes[3],
1520 hdisplay_bytes[0],
1521 hdisplay_bytes[1],
1522 hsyncstart_bytes[0],
1523 hsyncstart_bytes[1],
1524 hsyncend_bytes[0],
1525 hsyncend_bytes[1],
1526 htotal_bytes[0],
1527 htotal_bytes[1],
1528 hskew_bytes[0],
1529 hskew_bytes[1],
1530 vdisplay_bytes[0],
1531 vdisplay_bytes[1],
1532 vsyncstart_bytes[0],
1533 vsyncstart_bytes[1],
1534 vsyncend_bytes[0],
1535 vsyncend_bytes[1],
1536 vtotal_bytes[0],
1537 vtotal_bytes[1],
1538 0,
1539 0,
1540 flags_bytes[0],
1541 flags_bytes[1],
1542 flags_bytes[2],
1543 flags_bytes[3],
1544 0,
1545 0,
1546 0,
1547 0,
1548 0,
1549 0,
1550 0,
1551 0,
1552 0,
1553 0,
1554 0,
1555 0,
1556 privsize_bytes[0],
1557 privsize_bytes[1],
1558 privsize_bytes[2],
1559 privsize_bytes[3],
1560 ];
1561 let length_so_far = length_so_far + request0.len();
1562 let length_so_far = length_so_far + self.private.len();
1563 let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
1564 let length_so_far = length_so_far + padding0.len();
1565 assert_eq!(length_so_far % 4, 0);
1566 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1567 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1568 ([request0.into(), self.private, padding0.into()], vec![])
1569 }
1570 #[cfg(feature = "request-parsing")]
1572 pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
1573 if header.minor_opcode != DELETE_MODE_LINE_REQUEST {
1574 return Err(ParseError::InvalidValue);
1575 }
1576 let (screen, remaining) = u32::try_parse(value)?;
1577 let (dotclock, remaining) = Dotclock::try_parse(remaining)?;
1578 let (hdisplay, remaining) = u16::try_parse(remaining)?;
1579 let (hsyncstart, remaining) = u16::try_parse(remaining)?;
1580 let (hsyncend, remaining) = u16::try_parse(remaining)?;
1581 let (htotal, remaining) = u16::try_parse(remaining)?;
1582 let (hskew, remaining) = u16::try_parse(remaining)?;
1583 let (vdisplay, remaining) = u16::try_parse(remaining)?;
1584 let (vsyncstart, remaining) = u16::try_parse(remaining)?;
1585 let (vsyncend, remaining) = u16::try_parse(remaining)?;
1586 let (vtotal, remaining) = u16::try_parse(remaining)?;
1587 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1588 let (flags, remaining) = u32::try_parse(remaining)?;
1589 let flags = flags.into();
1590 let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
1591 let (privsize, remaining) = u32::try_parse(remaining)?;
1592 let (private, remaining) = crate::x11_utils::parse_u8_list(remaining, privsize.try_to_usize()?)?;
1593 let _ = remaining;
1594 Ok(DeleteModeLineRequest {
1595 screen,
1596 dotclock,
1597 hdisplay,
1598 hsyncstart,
1599 hsyncend,
1600 htotal,
1601 hskew,
1602 vdisplay,
1603 vsyncstart,
1604 vsyncend,
1605 vtotal,
1606 flags,
1607 private: Cow::Borrowed(private),
1608 })
1609 }
1610 pub fn into_owned(self) -> DeleteModeLineRequest<'static> {
1612 DeleteModeLineRequest {
1613 screen: self.screen,
1614 dotclock: self.dotclock,
1615 hdisplay: self.hdisplay,
1616 hsyncstart: self.hsyncstart,
1617 hsyncend: self.hsyncend,
1618 htotal: self.htotal,
1619 hskew: self.hskew,
1620 vdisplay: self.vdisplay,
1621 vsyncstart: self.vsyncstart,
1622 vsyncend: self.vsyncend,
1623 vtotal: self.vtotal,
1624 flags: self.flags,
1625 private: Cow::Owned(self.private.into_owned()),
1626 }
1627 }
1628}
1629impl<'input> Request for DeleteModeLineRequest<'input> {
1630 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1631
1632 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1633 let (bufs, fds) = self.serialize(major_opcode);
1634 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1636 (buf, fds)
1637 }
1638}
1639impl<'input> crate::x11_utils::VoidRequest for DeleteModeLineRequest<'input> {
1640}
1641
1642pub const VALIDATE_MODE_LINE_REQUEST: u8 = 9;
1644#[derive(Clone, Default)]
1645#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1646#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1647pub struct ValidateModeLineRequest<'input> {
1648 pub screen: u32,
1649 pub dotclock: Dotclock,
1650 pub hdisplay: u16,
1651 pub hsyncstart: u16,
1652 pub hsyncend: u16,
1653 pub htotal: u16,
1654 pub hskew: u16,
1655 pub vdisplay: u16,
1656 pub vsyncstart: u16,
1657 pub vsyncend: u16,
1658 pub vtotal: u16,
1659 pub flags: ModeFlag,
1660 pub private: Cow<'input, [u8]>,
1661}
1662impl_debug_if_no_extra_traits!(ValidateModeLineRequest<'_>, "ValidateModeLineRequest");
1663impl<'input> ValidateModeLineRequest<'input> {
1664 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
1666 let length_so_far = 0;
1667 let screen_bytes = self.screen.serialize();
1668 let dotclock_bytes = self.dotclock.serialize();
1669 let hdisplay_bytes = self.hdisplay.serialize();
1670 let hsyncstart_bytes = self.hsyncstart.serialize();
1671 let hsyncend_bytes = self.hsyncend.serialize();
1672 let htotal_bytes = self.htotal.serialize();
1673 let hskew_bytes = self.hskew.serialize();
1674 let vdisplay_bytes = self.vdisplay.serialize();
1675 let vsyncstart_bytes = self.vsyncstart.serialize();
1676 let vsyncend_bytes = self.vsyncend.serialize();
1677 let vtotal_bytes = self.vtotal.serialize();
1678 let flags_bytes = u32::from(self.flags).serialize();
1679 let privsize = u32::try_from(self.private.len()).expect("`private` has too many elements");
1680 let privsize_bytes = privsize.serialize();
1681 let mut request0 = vec![
1682 major_opcode,
1683 VALIDATE_MODE_LINE_REQUEST,
1684 0,
1685 0,
1686 screen_bytes[0],
1687 screen_bytes[1],
1688 screen_bytes[2],
1689 screen_bytes[3],
1690 dotclock_bytes[0],
1691 dotclock_bytes[1],
1692 dotclock_bytes[2],
1693 dotclock_bytes[3],
1694 hdisplay_bytes[0],
1695 hdisplay_bytes[1],
1696 hsyncstart_bytes[0],
1697 hsyncstart_bytes[1],
1698 hsyncend_bytes[0],
1699 hsyncend_bytes[1],
1700 htotal_bytes[0],
1701 htotal_bytes[1],
1702 hskew_bytes[0],
1703 hskew_bytes[1],
1704 vdisplay_bytes[0],
1705 vdisplay_bytes[1],
1706 vsyncstart_bytes[0],
1707 vsyncstart_bytes[1],
1708 vsyncend_bytes[0],
1709 vsyncend_bytes[1],
1710 vtotal_bytes[0],
1711 vtotal_bytes[1],
1712 0,
1713 0,
1714 flags_bytes[0],
1715 flags_bytes[1],
1716 flags_bytes[2],
1717 flags_bytes[3],
1718 0,
1719 0,
1720 0,
1721 0,
1722 0,
1723 0,
1724 0,
1725 0,
1726 0,
1727 0,
1728 0,
1729 0,
1730 privsize_bytes[0],
1731 privsize_bytes[1],
1732 privsize_bytes[2],
1733 privsize_bytes[3],
1734 ];
1735 let length_so_far = length_so_far + request0.len();
1736 let length_so_far = length_so_far + self.private.len();
1737 let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
1738 let length_so_far = length_so_far + padding0.len();
1739 assert_eq!(length_so_far % 4, 0);
1740 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1741 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1742 ([request0.into(), self.private, padding0.into()], vec![])
1743 }
1744 #[cfg(feature = "request-parsing")]
1746 pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
1747 if header.minor_opcode != VALIDATE_MODE_LINE_REQUEST {
1748 return Err(ParseError::InvalidValue);
1749 }
1750 let (screen, remaining) = u32::try_parse(value)?;
1751 let (dotclock, remaining) = Dotclock::try_parse(remaining)?;
1752 let (hdisplay, remaining) = u16::try_parse(remaining)?;
1753 let (hsyncstart, remaining) = u16::try_parse(remaining)?;
1754 let (hsyncend, remaining) = u16::try_parse(remaining)?;
1755 let (htotal, remaining) = u16::try_parse(remaining)?;
1756 let (hskew, remaining) = u16::try_parse(remaining)?;
1757 let (vdisplay, remaining) = u16::try_parse(remaining)?;
1758 let (vsyncstart, remaining) = u16::try_parse(remaining)?;
1759 let (vsyncend, remaining) = u16::try_parse(remaining)?;
1760 let (vtotal, remaining) = u16::try_parse(remaining)?;
1761 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
1762 let (flags, remaining) = u32::try_parse(remaining)?;
1763 let flags = flags.into();
1764 let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
1765 let (privsize, remaining) = u32::try_parse(remaining)?;
1766 let (private, remaining) = crate::x11_utils::parse_u8_list(remaining, privsize.try_to_usize()?)?;
1767 let _ = remaining;
1768 Ok(ValidateModeLineRequest {
1769 screen,
1770 dotclock,
1771 hdisplay,
1772 hsyncstart,
1773 hsyncend,
1774 htotal,
1775 hskew,
1776 vdisplay,
1777 vsyncstart,
1778 vsyncend,
1779 vtotal,
1780 flags,
1781 private: Cow::Borrowed(private),
1782 })
1783 }
1784 pub fn into_owned(self) -> ValidateModeLineRequest<'static> {
1786 ValidateModeLineRequest {
1787 screen: self.screen,
1788 dotclock: self.dotclock,
1789 hdisplay: self.hdisplay,
1790 hsyncstart: self.hsyncstart,
1791 hsyncend: self.hsyncend,
1792 htotal: self.htotal,
1793 hskew: self.hskew,
1794 vdisplay: self.vdisplay,
1795 vsyncstart: self.vsyncstart,
1796 vsyncend: self.vsyncend,
1797 vtotal: self.vtotal,
1798 flags: self.flags,
1799 private: Cow::Owned(self.private.into_owned()),
1800 }
1801 }
1802}
1803impl<'input> Request for ValidateModeLineRequest<'input> {
1804 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1805
1806 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1807 let (bufs, fds) = self.serialize(major_opcode);
1808 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1810 (buf, fds)
1811 }
1812}
1813impl<'input> crate::x11_utils::ReplyRequest for ValidateModeLineRequest<'input> {
1814 type Reply = ValidateModeLineReply;
1815}
1816
1817#[derive(Clone, Copy, Default)]
1818#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1819#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1820pub struct ValidateModeLineReply {
1821 pub sequence: u16,
1822 pub length: u32,
1823 pub status: u32,
1824}
1825impl_debug_if_no_extra_traits!(ValidateModeLineReply, "ValidateModeLineReply");
1826impl TryParse for ValidateModeLineReply {
1827 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1828 let remaining = initial_value;
1829 let (response_type, remaining) = u8::try_parse(remaining)?;
1830 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1831 let (sequence, remaining) = u16::try_parse(remaining)?;
1832 let (length, remaining) = u32::try_parse(remaining)?;
1833 let (status, remaining) = u32::try_parse(remaining)?;
1834 let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
1835 if response_type != 1 {
1836 return Err(ParseError::InvalidValue);
1837 }
1838 let result = ValidateModeLineReply { sequence, length, status };
1839 let _ = remaining;
1840 let remaining = initial_value.get(32 + length as usize * 4..)
1841 .ok_or(ParseError::InsufficientData)?;
1842 Ok((result, remaining))
1843 }
1844}
1845impl Serialize for ValidateModeLineReply {
1846 type Bytes = [u8; 32];
1847 fn serialize(&self) -> [u8; 32] {
1848 let response_type_bytes = &[1];
1849 let sequence_bytes = self.sequence.serialize();
1850 let length_bytes = self.length.serialize();
1851 let status_bytes = self.status.serialize();
1852 [
1853 response_type_bytes[0],
1854 0,
1855 sequence_bytes[0],
1856 sequence_bytes[1],
1857 length_bytes[0],
1858 length_bytes[1],
1859 length_bytes[2],
1860 length_bytes[3],
1861 status_bytes[0],
1862 status_bytes[1],
1863 status_bytes[2],
1864 status_bytes[3],
1865 0,
1866 0,
1867 0,
1868 0,
1869 0,
1870 0,
1871 0,
1872 0,
1873 0,
1874 0,
1875 0,
1876 0,
1877 0,
1878 0,
1879 0,
1880 0,
1881 0,
1882 0,
1883 0,
1884 0,
1885 ]
1886 }
1887 fn serialize_into(&self, bytes: &mut Vec<u8>) {
1888 bytes.reserve(32);
1889 let response_type_bytes = &[1];
1890 bytes.push(response_type_bytes[0]);
1891 bytes.extend_from_slice(&[0; 1]);
1892 self.sequence.serialize_into(bytes);
1893 self.length.serialize_into(bytes);
1894 self.status.serialize_into(bytes);
1895 bytes.extend_from_slice(&[0; 20]);
1896 }
1897}
1898
1899pub const SWITCH_TO_MODE_REQUEST: u8 = 10;
1901#[derive(Clone, Default)]
1902#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1903#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1904pub struct SwitchToModeRequest<'input> {
1905 pub screen: u32,
1906 pub dotclock: Dotclock,
1907 pub hdisplay: u16,
1908 pub hsyncstart: u16,
1909 pub hsyncend: u16,
1910 pub htotal: u16,
1911 pub hskew: u16,
1912 pub vdisplay: u16,
1913 pub vsyncstart: u16,
1914 pub vsyncend: u16,
1915 pub vtotal: u16,
1916 pub flags: ModeFlag,
1917 pub private: Cow<'input, [u8]>,
1918}
1919impl_debug_if_no_extra_traits!(SwitchToModeRequest<'_>, "SwitchToModeRequest");
1920impl<'input> SwitchToModeRequest<'input> {
1921 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
1923 let length_so_far = 0;
1924 let screen_bytes = self.screen.serialize();
1925 let dotclock_bytes = self.dotclock.serialize();
1926 let hdisplay_bytes = self.hdisplay.serialize();
1927 let hsyncstart_bytes = self.hsyncstart.serialize();
1928 let hsyncend_bytes = self.hsyncend.serialize();
1929 let htotal_bytes = self.htotal.serialize();
1930 let hskew_bytes = self.hskew.serialize();
1931 let vdisplay_bytes = self.vdisplay.serialize();
1932 let vsyncstart_bytes = self.vsyncstart.serialize();
1933 let vsyncend_bytes = self.vsyncend.serialize();
1934 let vtotal_bytes = self.vtotal.serialize();
1935 let flags_bytes = u32::from(self.flags).serialize();
1936 let privsize = u32::try_from(self.private.len()).expect("`private` has too many elements");
1937 let privsize_bytes = privsize.serialize();
1938 let mut request0 = vec![
1939 major_opcode,
1940 SWITCH_TO_MODE_REQUEST,
1941 0,
1942 0,
1943 screen_bytes[0],
1944 screen_bytes[1],
1945 screen_bytes[2],
1946 screen_bytes[3],
1947 dotclock_bytes[0],
1948 dotclock_bytes[1],
1949 dotclock_bytes[2],
1950 dotclock_bytes[3],
1951 hdisplay_bytes[0],
1952 hdisplay_bytes[1],
1953 hsyncstart_bytes[0],
1954 hsyncstart_bytes[1],
1955 hsyncend_bytes[0],
1956 hsyncend_bytes[1],
1957 htotal_bytes[0],
1958 htotal_bytes[1],
1959 hskew_bytes[0],
1960 hskew_bytes[1],
1961 vdisplay_bytes[0],
1962 vdisplay_bytes[1],
1963 vsyncstart_bytes[0],
1964 vsyncstart_bytes[1],
1965 vsyncend_bytes[0],
1966 vsyncend_bytes[1],
1967 vtotal_bytes[0],
1968 vtotal_bytes[1],
1969 0,
1970 0,
1971 flags_bytes[0],
1972 flags_bytes[1],
1973 flags_bytes[2],
1974 flags_bytes[3],
1975 0,
1976 0,
1977 0,
1978 0,
1979 0,
1980 0,
1981 0,
1982 0,
1983 0,
1984 0,
1985 0,
1986 0,
1987 privsize_bytes[0],
1988 privsize_bytes[1],
1989 privsize_bytes[2],
1990 privsize_bytes[3],
1991 ];
1992 let length_so_far = length_so_far + request0.len();
1993 let length_so_far = length_so_far + self.private.len();
1994 let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
1995 let length_so_far = length_so_far + padding0.len();
1996 assert_eq!(length_so_far % 4, 0);
1997 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1998 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1999 ([request0.into(), self.private, padding0.into()], vec![])
2000 }
2001 #[cfg(feature = "request-parsing")]
2003 pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
2004 if header.minor_opcode != SWITCH_TO_MODE_REQUEST {
2005 return Err(ParseError::InvalidValue);
2006 }
2007 let (screen, remaining) = u32::try_parse(value)?;
2008 let (dotclock, remaining) = Dotclock::try_parse(remaining)?;
2009 let (hdisplay, remaining) = u16::try_parse(remaining)?;
2010 let (hsyncstart, remaining) = u16::try_parse(remaining)?;
2011 let (hsyncend, remaining) = u16::try_parse(remaining)?;
2012 let (htotal, remaining) = u16::try_parse(remaining)?;
2013 let (hskew, remaining) = u16::try_parse(remaining)?;
2014 let (vdisplay, remaining) = u16::try_parse(remaining)?;
2015 let (vsyncstart, remaining) = u16::try_parse(remaining)?;
2016 let (vsyncend, remaining) = u16::try_parse(remaining)?;
2017 let (vtotal, remaining) = u16::try_parse(remaining)?;
2018 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
2019 let (flags, remaining) = u32::try_parse(remaining)?;
2020 let flags = flags.into();
2021 let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
2022 let (privsize, remaining) = u32::try_parse(remaining)?;
2023 let (private, remaining) = crate::x11_utils::parse_u8_list(remaining, privsize.try_to_usize()?)?;
2024 let _ = remaining;
2025 Ok(SwitchToModeRequest {
2026 screen,
2027 dotclock,
2028 hdisplay,
2029 hsyncstart,
2030 hsyncend,
2031 htotal,
2032 hskew,
2033 vdisplay,
2034 vsyncstart,
2035 vsyncend,
2036 vtotal,
2037 flags,
2038 private: Cow::Borrowed(private),
2039 })
2040 }
2041 pub fn into_owned(self) -> SwitchToModeRequest<'static> {
2043 SwitchToModeRequest {
2044 screen: self.screen,
2045 dotclock: self.dotclock,
2046 hdisplay: self.hdisplay,
2047 hsyncstart: self.hsyncstart,
2048 hsyncend: self.hsyncend,
2049 htotal: self.htotal,
2050 hskew: self.hskew,
2051 vdisplay: self.vdisplay,
2052 vsyncstart: self.vsyncstart,
2053 vsyncend: self.vsyncend,
2054 vtotal: self.vtotal,
2055 flags: self.flags,
2056 private: Cow::Owned(self.private.into_owned()),
2057 }
2058 }
2059}
2060impl<'input> Request for SwitchToModeRequest<'input> {
2061 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2062
2063 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2064 let (bufs, fds) = self.serialize(major_opcode);
2065 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2067 (buf, fds)
2068 }
2069}
2070impl<'input> crate::x11_utils::VoidRequest for SwitchToModeRequest<'input> {
2071}
2072
2073pub const GET_VIEW_PORT_REQUEST: u8 = 11;
2075#[derive(Clone, Copy, Default)]
2076#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2077#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2078pub struct GetViewPortRequest {
2079 pub screen: u16,
2080}
2081impl_debug_if_no_extra_traits!(GetViewPortRequest, "GetViewPortRequest");
2082impl GetViewPortRequest {
2083 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2085 let length_so_far = 0;
2086 let screen_bytes = self.screen.serialize();
2087 let mut request0 = vec![
2088 major_opcode,
2089 GET_VIEW_PORT_REQUEST,
2090 0,
2091 0,
2092 screen_bytes[0],
2093 screen_bytes[1],
2094 0,
2095 0,
2096 ];
2097 let length_so_far = length_so_far + request0.len();
2098 assert_eq!(length_so_far % 4, 0);
2099 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2100 request0[2..4].copy_from_slice(&length.to_ne_bytes());
2101 ([request0.into()], vec![])
2102 }
2103 #[cfg(feature = "request-parsing")]
2105 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2106 if header.minor_opcode != GET_VIEW_PORT_REQUEST {
2107 return Err(ParseError::InvalidValue);
2108 }
2109 let (screen, remaining) = u16::try_parse(value)?;
2110 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
2111 let _ = remaining;
2112 Ok(GetViewPortRequest {
2113 screen,
2114 })
2115 }
2116}
2117impl Request for GetViewPortRequest {
2118 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2119
2120 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2121 let (bufs, fds) = self.serialize(major_opcode);
2122 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2124 (buf, fds)
2125 }
2126}
2127impl crate::x11_utils::ReplyRequest for GetViewPortRequest {
2128 type Reply = GetViewPortReply;
2129}
2130
2131#[derive(Clone, Copy, Default)]
2132#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2133#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2134pub struct GetViewPortReply {
2135 pub sequence: u16,
2136 pub length: u32,
2137 pub x: u32,
2138 pub y: u32,
2139}
2140impl_debug_if_no_extra_traits!(GetViewPortReply, "GetViewPortReply");
2141impl TryParse for GetViewPortReply {
2142 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2143 let remaining = initial_value;
2144 let (response_type, remaining) = u8::try_parse(remaining)?;
2145 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2146 let (sequence, remaining) = u16::try_parse(remaining)?;
2147 let (length, remaining) = u32::try_parse(remaining)?;
2148 let (x, remaining) = u32::try_parse(remaining)?;
2149 let (y, remaining) = u32::try_parse(remaining)?;
2150 let remaining = remaining.get(16..).ok_or(ParseError::InsufficientData)?;
2151 if response_type != 1 {
2152 return Err(ParseError::InvalidValue);
2153 }
2154 let result = GetViewPortReply { sequence, length, x, y };
2155 let _ = remaining;
2156 let remaining = initial_value.get(32 + length as usize * 4..)
2157 .ok_or(ParseError::InsufficientData)?;
2158 Ok((result, remaining))
2159 }
2160}
2161impl Serialize for GetViewPortReply {
2162 type Bytes = [u8; 32];
2163 fn serialize(&self) -> [u8; 32] {
2164 let response_type_bytes = &[1];
2165 let sequence_bytes = self.sequence.serialize();
2166 let length_bytes = self.length.serialize();
2167 let x_bytes = self.x.serialize();
2168 let y_bytes = self.y.serialize();
2169 [
2170 response_type_bytes[0],
2171 0,
2172 sequence_bytes[0],
2173 sequence_bytes[1],
2174 length_bytes[0],
2175 length_bytes[1],
2176 length_bytes[2],
2177 length_bytes[3],
2178 x_bytes[0],
2179 x_bytes[1],
2180 x_bytes[2],
2181 x_bytes[3],
2182 y_bytes[0],
2183 y_bytes[1],
2184 y_bytes[2],
2185 y_bytes[3],
2186 0,
2187 0,
2188 0,
2189 0,
2190 0,
2191 0,
2192 0,
2193 0,
2194 0,
2195 0,
2196 0,
2197 0,
2198 0,
2199 0,
2200 0,
2201 0,
2202 ]
2203 }
2204 fn serialize_into(&self, bytes: &mut Vec<u8>) {
2205 bytes.reserve(32);
2206 let response_type_bytes = &[1];
2207 bytes.push(response_type_bytes[0]);
2208 bytes.extend_from_slice(&[0; 1]);
2209 self.sequence.serialize_into(bytes);
2210 self.length.serialize_into(bytes);
2211 self.x.serialize_into(bytes);
2212 self.y.serialize_into(bytes);
2213 bytes.extend_from_slice(&[0; 16]);
2214 }
2215}
2216
2217pub const SET_VIEW_PORT_REQUEST: u8 = 12;
2219#[derive(Clone, Copy, Default)]
2220#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2221#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2222pub struct SetViewPortRequest {
2223 pub screen: u16,
2224 pub x: u32,
2225 pub y: u32,
2226}
2227impl_debug_if_no_extra_traits!(SetViewPortRequest, "SetViewPortRequest");
2228impl SetViewPortRequest {
2229 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2231 let length_so_far = 0;
2232 let screen_bytes = self.screen.serialize();
2233 let x_bytes = self.x.serialize();
2234 let y_bytes = self.y.serialize();
2235 let mut request0 = vec![
2236 major_opcode,
2237 SET_VIEW_PORT_REQUEST,
2238 0,
2239 0,
2240 screen_bytes[0],
2241 screen_bytes[1],
2242 0,
2243 0,
2244 x_bytes[0],
2245 x_bytes[1],
2246 x_bytes[2],
2247 x_bytes[3],
2248 y_bytes[0],
2249 y_bytes[1],
2250 y_bytes[2],
2251 y_bytes[3],
2252 ];
2253 let length_so_far = length_so_far + request0.len();
2254 assert_eq!(length_so_far % 4, 0);
2255 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2256 request0[2..4].copy_from_slice(&length.to_ne_bytes());
2257 ([request0.into()], vec![])
2258 }
2259 #[cfg(feature = "request-parsing")]
2261 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2262 if header.minor_opcode != SET_VIEW_PORT_REQUEST {
2263 return Err(ParseError::InvalidValue);
2264 }
2265 let (screen, remaining) = u16::try_parse(value)?;
2266 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
2267 let (x, remaining) = u32::try_parse(remaining)?;
2268 let (y, remaining) = u32::try_parse(remaining)?;
2269 let _ = remaining;
2270 Ok(SetViewPortRequest {
2271 screen,
2272 x,
2273 y,
2274 })
2275 }
2276}
2277impl Request for SetViewPortRequest {
2278 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2279
2280 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2281 let (bufs, fds) = self.serialize(major_opcode);
2282 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2284 (buf, fds)
2285 }
2286}
2287impl crate::x11_utils::VoidRequest for SetViewPortRequest {
2288}
2289
2290pub const GET_DOT_CLOCKS_REQUEST: u8 = 13;
2292#[derive(Clone, Copy, Default)]
2293#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2294#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2295pub struct GetDotClocksRequest {
2296 pub screen: u16,
2297}
2298impl_debug_if_no_extra_traits!(GetDotClocksRequest, "GetDotClocksRequest");
2299impl GetDotClocksRequest {
2300 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2302 let length_so_far = 0;
2303 let screen_bytes = self.screen.serialize();
2304 let mut request0 = vec![
2305 major_opcode,
2306 GET_DOT_CLOCKS_REQUEST,
2307 0,
2308 0,
2309 screen_bytes[0],
2310 screen_bytes[1],
2311 0,
2312 0,
2313 ];
2314 let length_so_far = length_so_far + request0.len();
2315 assert_eq!(length_so_far % 4, 0);
2316 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2317 request0[2..4].copy_from_slice(&length.to_ne_bytes());
2318 ([request0.into()], vec![])
2319 }
2320 #[cfg(feature = "request-parsing")]
2322 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2323 if header.minor_opcode != GET_DOT_CLOCKS_REQUEST {
2324 return Err(ParseError::InvalidValue);
2325 }
2326 let (screen, remaining) = u16::try_parse(value)?;
2327 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
2328 let _ = remaining;
2329 Ok(GetDotClocksRequest {
2330 screen,
2331 })
2332 }
2333}
2334impl Request for GetDotClocksRequest {
2335 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2336
2337 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2338 let (bufs, fds) = self.serialize(major_opcode);
2339 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2341 (buf, fds)
2342 }
2343}
2344impl crate::x11_utils::ReplyRequest for GetDotClocksRequest {
2345 type Reply = GetDotClocksReply;
2346}
2347
2348#[derive(Clone, Default)]
2349#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2350#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2351pub struct GetDotClocksReply {
2352 pub sequence: u16,
2353 pub length: u32,
2354 pub flags: ClockFlag,
2355 pub clocks: u32,
2356 pub maxclocks: u32,
2357 pub clock: Vec<u32>,
2358}
2359impl_debug_if_no_extra_traits!(GetDotClocksReply, "GetDotClocksReply");
2360impl TryParse for GetDotClocksReply {
2361 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2362 let remaining = initial_value;
2363 let (response_type, remaining) = u8::try_parse(remaining)?;
2364 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2365 let (sequence, remaining) = u16::try_parse(remaining)?;
2366 let (length, remaining) = u32::try_parse(remaining)?;
2367 let (flags, remaining) = u32::try_parse(remaining)?;
2368 let (clocks, remaining) = u32::try_parse(remaining)?;
2369 let (maxclocks, remaining) = u32::try_parse(remaining)?;
2370 let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
2371 let (clock, remaining) = crate::x11_utils::parse_list::<u32>(remaining, 1u32.checked_sub(u32::from(flags) & 1u32).ok_or(ParseError::InvalidExpression)?.checked_mul(u32::from(clocks)).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
2372 if response_type != 1 {
2373 return Err(ParseError::InvalidValue);
2374 }
2375 let flags = flags.into();
2376 let result = GetDotClocksReply { sequence, length, flags, clocks, maxclocks, clock };
2377 let _ = remaining;
2378 let remaining = initial_value.get(32 + length as usize * 4..)
2379 .ok_or(ParseError::InsufficientData)?;
2380 Ok((result, remaining))
2381 }
2382}
2383impl Serialize for GetDotClocksReply {
2384 type Bytes = Vec<u8>;
2385 fn serialize(&self) -> Vec<u8> {
2386 let mut result = Vec::new();
2387 self.serialize_into(&mut result);
2388 result
2389 }
2390 fn serialize_into(&self, bytes: &mut Vec<u8>) {
2391 bytes.reserve(32);
2392 let response_type_bytes = &[1];
2393 bytes.push(response_type_bytes[0]);
2394 bytes.extend_from_slice(&[0; 1]);
2395 self.sequence.serialize_into(bytes);
2396 self.length.serialize_into(bytes);
2397 u32::from(self.flags).serialize_into(bytes);
2398 self.clocks.serialize_into(bytes);
2399 self.maxclocks.serialize_into(bytes);
2400 bytes.extend_from_slice(&[0; 12]);
2401 assert_eq!(self.clock.len(), usize::try_from(1u32.checked_sub(u32::from(self.flags) & 1u32).unwrap().checked_mul(u32::from(self.clocks)).unwrap()).unwrap(), "`clock` has an incorrect length");
2402 self.clock.serialize_into(bytes);
2403 }
2404}
2405
2406pub const SET_CLIENT_VERSION_REQUEST: u8 = 14;
2408#[derive(Clone, Copy, Default)]
2409#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2410#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2411pub struct SetClientVersionRequest {
2412 pub major: u16,
2413 pub minor: u16,
2414}
2415impl_debug_if_no_extra_traits!(SetClientVersionRequest, "SetClientVersionRequest");
2416impl SetClientVersionRequest {
2417 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2419 let length_so_far = 0;
2420 let major_bytes = self.major.serialize();
2421 let minor_bytes = self.minor.serialize();
2422 let mut request0 = vec![
2423 major_opcode,
2424 SET_CLIENT_VERSION_REQUEST,
2425 0,
2426 0,
2427 major_bytes[0],
2428 major_bytes[1],
2429 minor_bytes[0],
2430 minor_bytes[1],
2431 ];
2432 let length_so_far = length_so_far + request0.len();
2433 assert_eq!(length_so_far % 4, 0);
2434 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2435 request0[2..4].copy_from_slice(&length.to_ne_bytes());
2436 ([request0.into()], vec![])
2437 }
2438 #[cfg(feature = "request-parsing")]
2440 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2441 if header.minor_opcode != SET_CLIENT_VERSION_REQUEST {
2442 return Err(ParseError::InvalidValue);
2443 }
2444 let (major, remaining) = u16::try_parse(value)?;
2445 let (minor, remaining) = u16::try_parse(remaining)?;
2446 let _ = remaining;
2447 Ok(SetClientVersionRequest {
2448 major,
2449 minor,
2450 })
2451 }
2452}
2453impl Request for SetClientVersionRequest {
2454 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2455
2456 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2457 let (bufs, fds) = self.serialize(major_opcode);
2458 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2460 (buf, fds)
2461 }
2462}
2463impl crate::x11_utils::VoidRequest for SetClientVersionRequest {
2464}
2465
2466pub const SET_GAMMA_REQUEST: u8 = 15;
2468#[derive(Clone, Copy, Default)]
2469#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2470#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2471pub struct SetGammaRequest {
2472 pub screen: u16,
2473 pub red: u32,
2474 pub green: u32,
2475 pub blue: u32,
2476}
2477impl_debug_if_no_extra_traits!(SetGammaRequest, "SetGammaRequest");
2478impl SetGammaRequest {
2479 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2481 let length_so_far = 0;
2482 let screen_bytes = self.screen.serialize();
2483 let red_bytes = self.red.serialize();
2484 let green_bytes = self.green.serialize();
2485 let blue_bytes = self.blue.serialize();
2486 let mut request0 = vec![
2487 major_opcode,
2488 SET_GAMMA_REQUEST,
2489 0,
2490 0,
2491 screen_bytes[0],
2492 screen_bytes[1],
2493 0,
2494 0,
2495 red_bytes[0],
2496 red_bytes[1],
2497 red_bytes[2],
2498 red_bytes[3],
2499 green_bytes[0],
2500 green_bytes[1],
2501 green_bytes[2],
2502 green_bytes[3],
2503 blue_bytes[0],
2504 blue_bytes[1],
2505 blue_bytes[2],
2506 blue_bytes[3],
2507 0,
2508 0,
2509 0,
2510 0,
2511 0,
2512 0,
2513 0,
2514 0,
2515 0,
2516 0,
2517 0,
2518 0,
2519 ];
2520 let length_so_far = length_so_far + request0.len();
2521 assert_eq!(length_so_far % 4, 0);
2522 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2523 request0[2..4].copy_from_slice(&length.to_ne_bytes());
2524 ([request0.into()], vec![])
2525 }
2526 #[cfg(feature = "request-parsing")]
2528 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2529 if header.minor_opcode != SET_GAMMA_REQUEST {
2530 return Err(ParseError::InvalidValue);
2531 }
2532 let (screen, remaining) = u16::try_parse(value)?;
2533 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
2534 let (red, remaining) = u32::try_parse(remaining)?;
2535 let (green, remaining) = u32::try_parse(remaining)?;
2536 let (blue, remaining) = u32::try_parse(remaining)?;
2537 let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
2538 let _ = remaining;
2539 Ok(SetGammaRequest {
2540 screen,
2541 red,
2542 green,
2543 blue,
2544 })
2545 }
2546}
2547impl Request for SetGammaRequest {
2548 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2549
2550 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2551 let (bufs, fds) = self.serialize(major_opcode);
2552 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2554 (buf, fds)
2555 }
2556}
2557impl crate::x11_utils::VoidRequest for SetGammaRequest {
2558}
2559
2560pub const GET_GAMMA_REQUEST: u8 = 16;
2562#[derive(Clone, Copy, Default)]
2563#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2564#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2565pub struct GetGammaRequest {
2566 pub screen: u16,
2567}
2568impl_debug_if_no_extra_traits!(GetGammaRequest, "GetGammaRequest");
2569impl GetGammaRequest {
2570 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2572 let length_so_far = 0;
2573 let screen_bytes = self.screen.serialize();
2574 let mut request0 = vec![
2575 major_opcode,
2576 GET_GAMMA_REQUEST,
2577 0,
2578 0,
2579 screen_bytes[0],
2580 screen_bytes[1],
2581 0,
2582 0,
2583 0,
2584 0,
2585 0,
2586 0,
2587 0,
2588 0,
2589 0,
2590 0,
2591 0,
2592 0,
2593 0,
2594 0,
2595 0,
2596 0,
2597 0,
2598 0,
2599 0,
2600 0,
2601 0,
2602 0,
2603 0,
2604 0,
2605 0,
2606 0,
2607 ];
2608 let length_so_far = length_so_far + request0.len();
2609 assert_eq!(length_so_far % 4, 0);
2610 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2611 request0[2..4].copy_from_slice(&length.to_ne_bytes());
2612 ([request0.into()], vec![])
2613 }
2614 #[cfg(feature = "request-parsing")]
2616 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2617 if header.minor_opcode != GET_GAMMA_REQUEST {
2618 return Err(ParseError::InvalidValue);
2619 }
2620 let (screen, remaining) = u16::try_parse(value)?;
2621 let remaining = remaining.get(26..).ok_or(ParseError::InsufficientData)?;
2622 let _ = remaining;
2623 Ok(GetGammaRequest {
2624 screen,
2625 })
2626 }
2627}
2628impl Request for GetGammaRequest {
2629 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2630
2631 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2632 let (bufs, fds) = self.serialize(major_opcode);
2633 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2635 (buf, fds)
2636 }
2637}
2638impl crate::x11_utils::ReplyRequest for GetGammaRequest {
2639 type Reply = GetGammaReply;
2640}
2641
2642#[derive(Clone, Copy, Default)]
2643#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2644#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2645pub struct GetGammaReply {
2646 pub sequence: u16,
2647 pub length: u32,
2648 pub red: u32,
2649 pub green: u32,
2650 pub blue: u32,
2651}
2652impl_debug_if_no_extra_traits!(GetGammaReply, "GetGammaReply");
2653impl TryParse for GetGammaReply {
2654 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2655 let remaining = initial_value;
2656 let (response_type, remaining) = u8::try_parse(remaining)?;
2657 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2658 let (sequence, remaining) = u16::try_parse(remaining)?;
2659 let (length, remaining) = u32::try_parse(remaining)?;
2660 let (red, remaining) = u32::try_parse(remaining)?;
2661 let (green, remaining) = u32::try_parse(remaining)?;
2662 let (blue, remaining) = u32::try_parse(remaining)?;
2663 let remaining = remaining.get(12..).ok_or(ParseError::InsufficientData)?;
2664 if response_type != 1 {
2665 return Err(ParseError::InvalidValue);
2666 }
2667 let result = GetGammaReply { sequence, length, red, green, blue };
2668 let _ = remaining;
2669 let remaining = initial_value.get(32 + length as usize * 4..)
2670 .ok_or(ParseError::InsufficientData)?;
2671 Ok((result, remaining))
2672 }
2673}
2674impl Serialize for GetGammaReply {
2675 type Bytes = [u8; 32];
2676 fn serialize(&self) -> [u8; 32] {
2677 let response_type_bytes = &[1];
2678 let sequence_bytes = self.sequence.serialize();
2679 let length_bytes = self.length.serialize();
2680 let red_bytes = self.red.serialize();
2681 let green_bytes = self.green.serialize();
2682 let blue_bytes = self.blue.serialize();
2683 [
2684 response_type_bytes[0],
2685 0,
2686 sequence_bytes[0],
2687 sequence_bytes[1],
2688 length_bytes[0],
2689 length_bytes[1],
2690 length_bytes[2],
2691 length_bytes[3],
2692 red_bytes[0],
2693 red_bytes[1],
2694 red_bytes[2],
2695 red_bytes[3],
2696 green_bytes[0],
2697 green_bytes[1],
2698 green_bytes[2],
2699 green_bytes[3],
2700 blue_bytes[0],
2701 blue_bytes[1],
2702 blue_bytes[2],
2703 blue_bytes[3],
2704 0,
2705 0,
2706 0,
2707 0,
2708 0,
2709 0,
2710 0,
2711 0,
2712 0,
2713 0,
2714 0,
2715 0,
2716 ]
2717 }
2718 fn serialize_into(&self, bytes: &mut Vec<u8>) {
2719 bytes.reserve(32);
2720 let response_type_bytes = &[1];
2721 bytes.push(response_type_bytes[0]);
2722 bytes.extend_from_slice(&[0; 1]);
2723 self.sequence.serialize_into(bytes);
2724 self.length.serialize_into(bytes);
2725 self.red.serialize_into(bytes);
2726 self.green.serialize_into(bytes);
2727 self.blue.serialize_into(bytes);
2728 bytes.extend_from_slice(&[0; 12]);
2729 }
2730}
2731
2732pub const GET_GAMMA_RAMP_REQUEST: u8 = 17;
2734#[derive(Clone, Copy, Default)]
2735#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2736#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2737pub struct GetGammaRampRequest {
2738 pub screen: u16,
2739 pub size: u16,
2740}
2741impl_debug_if_no_extra_traits!(GetGammaRampRequest, "GetGammaRampRequest");
2742impl GetGammaRampRequest {
2743 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2745 let length_so_far = 0;
2746 let screen_bytes = self.screen.serialize();
2747 let size_bytes = self.size.serialize();
2748 let mut request0 = vec![
2749 major_opcode,
2750 GET_GAMMA_RAMP_REQUEST,
2751 0,
2752 0,
2753 screen_bytes[0],
2754 screen_bytes[1],
2755 size_bytes[0],
2756 size_bytes[1],
2757 ];
2758 let length_so_far = length_so_far + request0.len();
2759 assert_eq!(length_so_far % 4, 0);
2760 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2761 request0[2..4].copy_from_slice(&length.to_ne_bytes());
2762 ([request0.into()], vec![])
2763 }
2764 #[cfg(feature = "request-parsing")]
2766 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2767 if header.minor_opcode != GET_GAMMA_RAMP_REQUEST {
2768 return Err(ParseError::InvalidValue);
2769 }
2770 let (screen, remaining) = u16::try_parse(value)?;
2771 let (size, remaining) = u16::try_parse(remaining)?;
2772 let _ = remaining;
2773 Ok(GetGammaRampRequest {
2774 screen,
2775 size,
2776 })
2777 }
2778}
2779impl Request for GetGammaRampRequest {
2780 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2781
2782 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2783 let (bufs, fds) = self.serialize(major_opcode);
2784 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2786 (buf, fds)
2787 }
2788}
2789impl crate::x11_utils::ReplyRequest for GetGammaRampRequest {
2790 type Reply = GetGammaRampReply;
2791}
2792
2793#[derive(Clone, Default)]
2794#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2795#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2796pub struct GetGammaRampReply {
2797 pub sequence: u16,
2798 pub length: u32,
2799 pub size: u16,
2800 pub red: Vec<u16>,
2801 pub green: Vec<u16>,
2802 pub blue: Vec<u16>,
2803}
2804impl_debug_if_no_extra_traits!(GetGammaRampReply, "GetGammaRampReply");
2805impl TryParse for GetGammaRampReply {
2806 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
2807 let remaining = initial_value;
2808 let (response_type, remaining) = u8::try_parse(remaining)?;
2809 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
2810 let (sequence, remaining) = u16::try_parse(remaining)?;
2811 let (length, remaining) = u32::try_parse(remaining)?;
2812 let (size, remaining) = u16::try_parse(remaining)?;
2813 let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
2814 let (red, remaining) = crate::x11_utils::parse_list::<u16>(remaining, (u32::from(size).checked_add(1u32).ok_or(ParseError::InvalidExpression)? & (!1u32)).try_to_usize()?)?;
2815 let (green, remaining) = crate::x11_utils::parse_list::<u16>(remaining, (u32::from(size).checked_add(1u32).ok_or(ParseError::InvalidExpression)? & (!1u32)).try_to_usize()?)?;
2816 let (blue, remaining) = crate::x11_utils::parse_list::<u16>(remaining, (u32::from(size).checked_add(1u32).ok_or(ParseError::InvalidExpression)? & (!1u32)).try_to_usize()?)?;
2817 if response_type != 1 {
2818 return Err(ParseError::InvalidValue);
2819 }
2820 let result = GetGammaRampReply { sequence, length, size, red, green, blue };
2821 let _ = remaining;
2822 let remaining = initial_value.get(32 + length as usize * 4..)
2823 .ok_or(ParseError::InsufficientData)?;
2824 Ok((result, remaining))
2825 }
2826}
2827impl Serialize for GetGammaRampReply {
2828 type Bytes = Vec<u8>;
2829 fn serialize(&self) -> Vec<u8> {
2830 let mut result = Vec::new();
2831 self.serialize_into(&mut result);
2832 result
2833 }
2834 fn serialize_into(&self, bytes: &mut Vec<u8>) {
2835 bytes.reserve(32);
2836 let response_type_bytes = &[1];
2837 bytes.push(response_type_bytes[0]);
2838 bytes.extend_from_slice(&[0; 1]);
2839 self.sequence.serialize_into(bytes);
2840 self.length.serialize_into(bytes);
2841 self.size.serialize_into(bytes);
2842 bytes.extend_from_slice(&[0; 22]);
2843 assert_eq!(self.red.len(), usize::try_from(u32::from(self.size).checked_add(1u32).unwrap() & (!1u32)).unwrap(), "`red` has an incorrect length");
2844 self.red.serialize_into(bytes);
2845 assert_eq!(self.green.len(), usize::try_from(u32::from(self.size).checked_add(1u32).unwrap() & (!1u32)).unwrap(), "`green` has an incorrect length");
2846 self.green.serialize_into(bytes);
2847 assert_eq!(self.blue.len(), usize::try_from(u32::from(self.size).checked_add(1u32).unwrap() & (!1u32)).unwrap(), "`blue` has an incorrect length");
2848 self.blue.serialize_into(bytes);
2849 }
2850}
2851
2852pub const SET_GAMMA_RAMP_REQUEST: u8 = 18;
2854#[derive(Clone, Default)]
2855#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2856#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2857pub struct SetGammaRampRequest<'input> {
2858 pub screen: u16,
2859 pub size: u16,
2860 pub red: Cow<'input, [u16]>,
2861 pub green: Cow<'input, [u16]>,
2862 pub blue: Cow<'input, [u16]>,
2863}
2864impl_debug_if_no_extra_traits!(SetGammaRampRequest<'_>, "SetGammaRampRequest");
2865impl<'input> SetGammaRampRequest<'input> {
2866 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 5]> {
2868 let length_so_far = 0;
2869 let screen_bytes = self.screen.serialize();
2870 let size_bytes = self.size.serialize();
2871 let mut request0 = vec![
2872 major_opcode,
2873 SET_GAMMA_RAMP_REQUEST,
2874 0,
2875 0,
2876 screen_bytes[0],
2877 screen_bytes[1],
2878 size_bytes[0],
2879 size_bytes[1],
2880 ];
2881 let length_so_far = length_so_far + request0.len();
2882 assert_eq!(self.red.len(), usize::try_from(u32::from(self.size).checked_add(1u32).unwrap() & (!1u32)).unwrap(), "`red` has an incorrect length");
2883 let red_bytes = self.red.serialize();
2884 let length_so_far = length_so_far + red_bytes.len();
2885 assert_eq!(self.green.len(), usize::try_from(u32::from(self.size).checked_add(1u32).unwrap() & (!1u32)).unwrap(), "`green` has an incorrect length");
2886 let green_bytes = self.green.serialize();
2887 let length_so_far = length_so_far + green_bytes.len();
2888 assert_eq!(self.blue.len(), usize::try_from(u32::from(self.size).checked_add(1u32).unwrap() & (!1u32)).unwrap(), "`blue` has an incorrect length");
2889 let blue_bytes = self.blue.serialize();
2890 let length_so_far = length_so_far + blue_bytes.len();
2891 let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
2892 let length_so_far = length_so_far + padding0.len();
2893 assert_eq!(length_so_far % 4, 0);
2894 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2895 request0[2..4].copy_from_slice(&length.to_ne_bytes());
2896 ([request0.into(), red_bytes.into(), green_bytes.into(), blue_bytes.into(), padding0.into()], vec![])
2897 }
2898 #[cfg(feature = "request-parsing")]
2900 pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
2901 if header.minor_opcode != SET_GAMMA_RAMP_REQUEST {
2902 return Err(ParseError::InvalidValue);
2903 }
2904 let (screen, remaining) = u16::try_parse(value)?;
2905 let (size, remaining) = u16::try_parse(remaining)?;
2906 let (red, remaining) = crate::x11_utils::parse_list::<u16>(remaining, (u32::from(size).checked_add(1u32).ok_or(ParseError::InvalidExpression)? & (!1u32)).try_to_usize()?)?;
2907 let (green, remaining) = crate::x11_utils::parse_list::<u16>(remaining, (u32::from(size).checked_add(1u32).ok_or(ParseError::InvalidExpression)? & (!1u32)).try_to_usize()?)?;
2908 let (blue, remaining) = crate::x11_utils::parse_list::<u16>(remaining, (u32::from(size).checked_add(1u32).ok_or(ParseError::InvalidExpression)? & (!1u32)).try_to_usize()?)?;
2909 let _ = remaining;
2910 Ok(SetGammaRampRequest {
2911 screen,
2912 size,
2913 red: Cow::Owned(red),
2914 green: Cow::Owned(green),
2915 blue: Cow::Owned(blue),
2916 })
2917 }
2918 pub fn into_owned(self) -> SetGammaRampRequest<'static> {
2920 SetGammaRampRequest {
2921 screen: self.screen,
2922 size: self.size,
2923 red: Cow::Owned(self.red.into_owned()),
2924 green: Cow::Owned(self.green.into_owned()),
2925 blue: Cow::Owned(self.blue.into_owned()),
2926 }
2927 }
2928}
2929impl<'input> Request for SetGammaRampRequest<'input> {
2930 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2931
2932 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2933 let (bufs, fds) = self.serialize(major_opcode);
2934 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2936 (buf, fds)
2937 }
2938}
2939impl<'input> crate::x11_utils::VoidRequest for SetGammaRampRequest<'input> {
2940}
2941
2942pub const GET_GAMMA_RAMP_SIZE_REQUEST: u8 = 19;
2944#[derive(Clone, Copy, Default)]
2945#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
2946#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2947pub struct GetGammaRampSizeRequest {
2948 pub screen: u16,
2949}
2950impl_debug_if_no_extra_traits!(GetGammaRampSizeRequest, "GetGammaRampSizeRequest");
2951impl GetGammaRampSizeRequest {
2952 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
2954 let length_so_far = 0;
2955 let screen_bytes = self.screen.serialize();
2956 let mut request0 = vec![
2957 major_opcode,
2958 GET_GAMMA_RAMP_SIZE_REQUEST,
2959 0,
2960 0,
2961 screen_bytes[0],
2962 screen_bytes[1],
2963 0,
2964 0,
2965 ];
2966 let length_so_far = length_so_far + request0.len();
2967 assert_eq!(length_so_far % 4, 0);
2968 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
2969 request0[2..4].copy_from_slice(&length.to_ne_bytes());
2970 ([request0.into()], vec![])
2971 }
2972 #[cfg(feature = "request-parsing")]
2974 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
2975 if header.minor_opcode != GET_GAMMA_RAMP_SIZE_REQUEST {
2976 return Err(ParseError::InvalidValue);
2977 }
2978 let (screen, remaining) = u16::try_parse(value)?;
2979 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
2980 let _ = remaining;
2981 Ok(GetGammaRampSizeRequest {
2982 screen,
2983 })
2984 }
2985}
2986impl Request for GetGammaRampSizeRequest {
2987 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
2988
2989 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
2990 let (bufs, fds) = self.serialize(major_opcode);
2991 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
2993 (buf, fds)
2994 }
2995}
2996impl crate::x11_utils::ReplyRequest for GetGammaRampSizeRequest {
2997 type Reply = GetGammaRampSizeReply;
2998}
2999
3000#[derive(Clone, Copy, Default)]
3001#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3002#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3003pub struct GetGammaRampSizeReply {
3004 pub sequence: u16,
3005 pub length: u32,
3006 pub size: u16,
3007}
3008impl_debug_if_no_extra_traits!(GetGammaRampSizeReply, "GetGammaRampSizeReply");
3009impl TryParse for GetGammaRampSizeReply {
3010 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3011 let remaining = initial_value;
3012 let (response_type, remaining) = u8::try_parse(remaining)?;
3013 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
3014 let (sequence, remaining) = u16::try_parse(remaining)?;
3015 let (length, remaining) = u32::try_parse(remaining)?;
3016 let (size, remaining) = u16::try_parse(remaining)?;
3017 let remaining = remaining.get(22..).ok_or(ParseError::InsufficientData)?;
3018 if response_type != 1 {
3019 return Err(ParseError::InvalidValue);
3020 }
3021 let result = GetGammaRampSizeReply { sequence, length, size };
3022 let _ = remaining;
3023 let remaining = initial_value.get(32 + length as usize * 4..)
3024 .ok_or(ParseError::InsufficientData)?;
3025 Ok((result, remaining))
3026 }
3027}
3028impl Serialize for GetGammaRampSizeReply {
3029 type Bytes = [u8; 32];
3030 fn serialize(&self) -> [u8; 32] {
3031 let response_type_bytes = &[1];
3032 let sequence_bytes = self.sequence.serialize();
3033 let length_bytes = self.length.serialize();
3034 let size_bytes = self.size.serialize();
3035 [
3036 response_type_bytes[0],
3037 0,
3038 sequence_bytes[0],
3039 sequence_bytes[1],
3040 length_bytes[0],
3041 length_bytes[1],
3042 length_bytes[2],
3043 length_bytes[3],
3044 size_bytes[0],
3045 size_bytes[1],
3046 0,
3047 0,
3048 0,
3049 0,
3050 0,
3051 0,
3052 0,
3053 0,
3054 0,
3055 0,
3056 0,
3057 0,
3058 0,
3059 0,
3060 0,
3061 0,
3062 0,
3063 0,
3064 0,
3065 0,
3066 0,
3067 0,
3068 ]
3069 }
3070 fn serialize_into(&self, bytes: &mut Vec<u8>) {
3071 bytes.reserve(32);
3072 let response_type_bytes = &[1];
3073 bytes.push(response_type_bytes[0]);
3074 bytes.extend_from_slice(&[0; 1]);
3075 self.sequence.serialize_into(bytes);
3076 self.length.serialize_into(bytes);
3077 self.size.serialize_into(bytes);
3078 bytes.extend_from_slice(&[0; 22]);
3079 }
3080}
3081
3082pub const GET_PERMISSIONS_REQUEST: u8 = 20;
3084#[derive(Clone, Copy, Default)]
3085#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3086#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3087pub struct GetPermissionsRequest {
3088 pub screen: u16,
3089}
3090impl_debug_if_no_extra_traits!(GetPermissionsRequest, "GetPermissionsRequest");
3091impl GetPermissionsRequest {
3092 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
3094 let length_so_far = 0;
3095 let screen_bytes = self.screen.serialize();
3096 let mut request0 = vec![
3097 major_opcode,
3098 GET_PERMISSIONS_REQUEST,
3099 0,
3100 0,
3101 screen_bytes[0],
3102 screen_bytes[1],
3103 0,
3104 0,
3105 ];
3106 let length_so_far = length_so_far + request0.len();
3107 assert_eq!(length_so_far % 4, 0);
3108 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
3109 request0[2..4].copy_from_slice(&length.to_ne_bytes());
3110 ([request0.into()], vec![])
3111 }
3112 #[cfg(feature = "request-parsing")]
3114 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
3115 if header.minor_opcode != GET_PERMISSIONS_REQUEST {
3116 return Err(ParseError::InvalidValue);
3117 }
3118 let (screen, remaining) = u16::try_parse(value)?;
3119 let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?;
3120 let _ = remaining;
3121 Ok(GetPermissionsRequest {
3122 screen,
3123 })
3124 }
3125}
3126impl Request for GetPermissionsRequest {
3127 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
3128
3129 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
3130 let (bufs, fds) = self.serialize(major_opcode);
3131 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
3133 (buf, fds)
3134 }
3135}
3136impl crate::x11_utils::ReplyRequest for GetPermissionsRequest {
3137 type Reply = GetPermissionsReply;
3138}
3139
3140#[derive(Clone, Copy, Default)]
3141#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
3142#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3143pub struct GetPermissionsReply {
3144 pub sequence: u16,
3145 pub length: u32,
3146 pub permissions: Permission,
3147}
3148impl_debug_if_no_extra_traits!(GetPermissionsReply, "GetPermissionsReply");
3149impl TryParse for GetPermissionsReply {
3150 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
3151 let remaining = initial_value;
3152 let (response_type, remaining) = u8::try_parse(remaining)?;
3153 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
3154 let (sequence, remaining) = u16::try_parse(remaining)?;
3155 let (length, remaining) = u32::try_parse(remaining)?;
3156 let (permissions, remaining) = u32::try_parse(remaining)?;
3157 let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
3158 if response_type != 1 {
3159 return Err(ParseError::InvalidValue);
3160 }
3161 let permissions = permissions.into();
3162 let result = GetPermissionsReply { sequence, length, permissions };
3163 let _ = remaining;
3164 let remaining = initial_value.get(32 + length as usize * 4..)
3165 .ok_or(ParseError::InsufficientData)?;
3166 Ok((result, remaining))
3167 }
3168}
3169impl Serialize for GetPermissionsReply {
3170 type Bytes = [u8; 32];
3171 fn serialize(&self) -> [u8; 32] {
3172 let response_type_bytes = &[1];
3173 let sequence_bytes = self.sequence.serialize();
3174 let length_bytes = self.length.serialize();
3175 let permissions_bytes = u32::from(self.permissions).serialize();
3176 [
3177 response_type_bytes[0],
3178 0,
3179 sequence_bytes[0],
3180 sequence_bytes[1],
3181 length_bytes[0],
3182 length_bytes[1],
3183 length_bytes[2],
3184 length_bytes[3],
3185 permissions_bytes[0],
3186 permissions_bytes[1],
3187 permissions_bytes[2],
3188 permissions_bytes[3],
3189 0,
3190 0,
3191 0,
3192 0,
3193 0,
3194 0,
3195 0,
3196 0,
3197 0,
3198 0,
3199 0,
3200 0,
3201 0,
3202 0,
3203 0,
3204 0,
3205 0,
3206 0,
3207 0,
3208 0,
3209 ]
3210 }
3211 fn serialize_into(&self, bytes: &mut Vec<u8>) {
3212 bytes.reserve(32);
3213 let response_type_bytes = &[1];
3214 bytes.push(response_type_bytes[0]);
3215 bytes.extend_from_slice(&[0; 1]);
3216 self.sequence.serialize_into(bytes);
3217 self.length.serialize_into(bytes);
3218 u32::from(self.permissions).serialize_into(bytes);
3219 bytes.extend_from_slice(&[0; 20]);
3220 }
3221}
3222
3223pub const BAD_CLOCK_ERROR: u8 = 0;
3225
3226pub const BAD_H_TIMINGS_ERROR: u8 = 1;
3228
3229pub const BAD_V_TIMINGS_ERROR: u8 = 2;
3231
3232pub const MODE_UNSUITABLE_ERROR: u8 = 3;
3234
3235pub const EXTENSION_DISABLED_ERROR: u8 = 4;
3237
3238pub const CLIENT_NOT_LOCAL_ERROR: u8 = 5;
3240
3241pub const ZOOM_LOCKED_ERROR: u8 = 6;
3243