1 | // This file contains generated code. Do not edit directly. |
2 | // To regenerate this, run 'make'. |
3 | |
4 | //! Bindings to the `RandR` X11 extension. |
5 | |
6 | #![allow (clippy::too_many_arguments)] |
7 | // The code generator is simpler if it can always use conversions |
8 | #![allow (clippy::useless_conversion)] |
9 | |
10 | #[allow (unused_imports)] |
11 | use alloc::borrow::Cow; |
12 | #[allow (unused_imports)] |
13 | use core::convert::TryInto; |
14 | use alloc::vec; |
15 | use alloc::vec::Vec; |
16 | use core::convert::TryFrom; |
17 | use crate::errors::ParseError; |
18 | #[allow (unused_imports)] |
19 | use crate::x11_utils::TryIntoUSize; |
20 | use crate::BufWithFds; |
21 | #[allow (unused_imports)] |
22 | use crate::utils::{RawFdContainer, pretty_print_bitmask, pretty_print_enum}; |
23 | #[allow (unused_imports)] |
24 | use crate::x11_utils::{Request, RequestHeader, Serialize, TryParse, TryParseFd}; |
25 | #[allow (unused_imports)] |
26 | use super::render; |
27 | #[allow (unused_imports)] |
28 | use super::xproto; |
29 | |
30 | /// The X11 name of the extension for QueryExtension |
31 | pub const X11_EXTENSION_NAME: &str = "RANDR" ; |
32 | |
33 | /// The version number of this extension that this client library supports. |
34 | /// |
35 | /// This constant contains the version number of this extension that is supported |
36 | /// by this build of x11rb. For most things, it does not make sense to use this |
37 | /// information. If you need to send a `QueryVersion`, it is recommended to instead |
38 | /// send the maximum version of the extension that you need. |
39 | pub const X11_XML_VERSION: (u32, u32) = (1, 6); |
40 | |
41 | pub type Mode = u32; |
42 | |
43 | pub type Crtc = u32; |
44 | |
45 | pub type Output = u32; |
46 | |
47 | pub type Provider = u32; |
48 | |
49 | pub type Lease = u32; |
50 | |
51 | /// Opcode for the BadOutput error |
52 | pub const BAD_OUTPUT_ERROR: u8 = 0; |
53 | |
54 | /// Opcode for the BadCrtc error |
55 | pub const BAD_CRTC_ERROR: u8 = 1; |
56 | |
57 | /// Opcode for the BadMode error |
58 | pub const BAD_MODE_ERROR: u8 = 2; |
59 | |
60 | /// Opcode for the BadProvider error |
61 | pub const BAD_PROVIDER_ERROR: u8 = 3; |
62 | |
63 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
64 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
65 | pub struct Rotation(u16); |
66 | impl Rotation { |
67 | pub const ROTATE0: Self = Self(1 << 0); |
68 | pub const ROTATE90: Self = Self(1 << 1); |
69 | pub const ROTATE180: Self = Self(1 << 2); |
70 | pub const ROTATE270: Self = Self(1 << 3); |
71 | pub const REFLECT_X: Self = Self(1 << 4); |
72 | pub const REFLECT_Y: Self = Self(1 << 5); |
73 | } |
74 | impl From<Rotation> for u16 { |
75 | #[inline ] |
76 | fn from(input: Rotation) -> Self { |
77 | input.0 |
78 | } |
79 | } |
80 | impl From<Rotation> for Option<u16> { |
81 | #[inline ] |
82 | fn from(input: Rotation) -> Self { |
83 | Some(input.0) |
84 | } |
85 | } |
86 | impl From<Rotation> for u32 { |
87 | #[inline ] |
88 | fn from(input: Rotation) -> Self { |
89 | u32::from(input.0) |
90 | } |
91 | } |
92 | impl From<Rotation> for Option<u32> { |
93 | #[inline ] |
94 | fn from(input: Rotation) -> Self { |
95 | Some(u32::from(input.0)) |
96 | } |
97 | } |
98 | impl From<u8> for Rotation { |
99 | #[inline ] |
100 | fn from(value: u8) -> Self { |
101 | Self(value.into()) |
102 | } |
103 | } |
104 | impl From<u16> for Rotation { |
105 | #[inline ] |
106 | fn from(value: u16) -> Self { |
107 | Self(value) |
108 | } |
109 | } |
110 | impl core::fmt::Debug for Rotation { |
111 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
112 | let variants: [(u32, &str, &str); 6] = [ |
113 | (Self::ROTATE0.0.into(), "ROTATE0" , "Rotate0" ), |
114 | (Self::ROTATE90.0.into(), "ROTATE90" , "Rotate90" ), |
115 | (Self::ROTATE180.0.into(), "ROTATE180" , "Rotate180" ), |
116 | (Self::ROTATE270.0.into(), "ROTATE270" , "Rotate270" ), |
117 | (Self::REFLECT_X.0.into(), "REFLECT_X" , "ReflectX" ), |
118 | (Self::REFLECT_Y.0.into(), "REFLECT_Y" , "ReflectY" ), |
119 | ]; |
120 | pretty_print_bitmask(fmt, self.0.into(), &variants) |
121 | } |
122 | } |
123 | bitmask_binop!(Rotation, u16); |
124 | |
125 | #[derive (Clone, Copy, Default)] |
126 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
127 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
128 | pub struct ScreenSize { |
129 | pub width: u16, |
130 | pub height: u16, |
131 | pub mwidth: u16, |
132 | pub mheight: u16, |
133 | } |
134 | impl_debug_if_no_extra_traits!(ScreenSize, "ScreenSize" ); |
135 | impl TryParse for ScreenSize { |
136 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
137 | let (width: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
138 | let (height: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
139 | let (mwidth: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
140 | let (mheight: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
141 | let result: ScreenSize = ScreenSize { width, height, mwidth, mheight }; |
142 | Ok((result, remaining)) |
143 | } |
144 | } |
145 | impl Serialize for ScreenSize { |
146 | type Bytes = [u8; 8]; |
147 | fn serialize(&self) -> [u8; 8] { |
148 | let width_bytes = self.width.serialize(); |
149 | let height_bytes = self.height.serialize(); |
150 | let mwidth_bytes = self.mwidth.serialize(); |
151 | let mheight_bytes = self.mheight.serialize(); |
152 | [ |
153 | width_bytes[0], |
154 | width_bytes[1], |
155 | height_bytes[0], |
156 | height_bytes[1], |
157 | mwidth_bytes[0], |
158 | mwidth_bytes[1], |
159 | mheight_bytes[0], |
160 | mheight_bytes[1], |
161 | ] |
162 | } |
163 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
164 | bytes.reserve(8); |
165 | self.width.serialize_into(bytes); |
166 | self.height.serialize_into(bytes); |
167 | self.mwidth.serialize_into(bytes); |
168 | self.mheight.serialize_into(bytes); |
169 | } |
170 | } |
171 | |
172 | #[derive (Clone, Default)] |
173 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
174 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
175 | pub struct RefreshRates { |
176 | pub rates: Vec<u16>, |
177 | } |
178 | impl_debug_if_no_extra_traits!(RefreshRates, "RefreshRates" ); |
179 | impl TryParse for RefreshRates { |
180 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
181 | let (n_rates: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
182 | let (rates: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<u16>(data:remaining, list_length:n_rates.try_to_usize()?)?; |
183 | let result: RefreshRates = RefreshRates { rates }; |
184 | Ok((result, remaining)) |
185 | } |
186 | } |
187 | impl Serialize for RefreshRates { |
188 | type Bytes = Vec<u8>; |
189 | fn serialize(&self) -> Vec<u8> { |
190 | let mut result: Vec = Vec::new(); |
191 | self.serialize_into(&mut result); |
192 | result |
193 | } |
194 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
195 | let n_rates: u16 = u16::try_from(self.rates.len()).expect(msg:"`rates` has too many elements" ); |
196 | n_rates.serialize_into(bytes); |
197 | self.rates.serialize_into(bytes); |
198 | } |
199 | } |
200 | impl RefreshRates { |
201 | /// Get the value of the `nRates` field. |
202 | /// |
203 | /// The `nRates` field is used as the length field of the `rates` field. |
204 | /// This function computes the field's value again based on the length of the list. |
205 | /// |
206 | /// # Panics |
207 | /// |
208 | /// Panics if the value cannot be represented in the target type. This |
209 | /// cannot happen with values of the struct received from the X11 server. |
210 | pub fn n_rates(&self) -> u16 { |
211 | self.rates.len() |
212 | .try_into().unwrap() |
213 | } |
214 | } |
215 | |
216 | /// Opcode for the QueryVersion request |
217 | pub const QUERY_VERSION_REQUEST: u8 = 0; |
218 | #[derive (Clone, Copy, Default)] |
219 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
220 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
221 | pub struct QueryVersionRequest { |
222 | pub major_version: u32, |
223 | pub minor_version: u32, |
224 | } |
225 | impl_debug_if_no_extra_traits!(QueryVersionRequest, "QueryVersionRequest" ); |
226 | impl QueryVersionRequest { |
227 | /// Serialize this request into bytes for the provided connection |
228 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
229 | let length_so_far = 0; |
230 | let major_version_bytes = self.major_version.serialize(); |
231 | let minor_version_bytes = self.minor_version.serialize(); |
232 | let mut request0 = vec![ |
233 | major_opcode, |
234 | QUERY_VERSION_REQUEST, |
235 | 0, |
236 | 0, |
237 | major_version_bytes[0], |
238 | major_version_bytes[1], |
239 | major_version_bytes[2], |
240 | major_version_bytes[3], |
241 | minor_version_bytes[0], |
242 | minor_version_bytes[1], |
243 | minor_version_bytes[2], |
244 | minor_version_bytes[3], |
245 | ]; |
246 | let length_so_far = length_so_far + request0.len(); |
247 | assert_eq!(length_so_far % 4, 0); |
248 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
249 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
250 | ([request0.into()], vec![]) |
251 | } |
252 | /// Parse this request given its header, its body, and any fds that go along with it |
253 | #[cfg (feature = "request-parsing" )] |
254 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
255 | if header.minor_opcode != QUERY_VERSION_REQUEST { |
256 | return Err(ParseError::InvalidValue); |
257 | } |
258 | let (major_version, remaining) = u32::try_parse(value)?; |
259 | let (minor_version, remaining) = u32::try_parse(remaining)?; |
260 | let _ = remaining; |
261 | Ok(QueryVersionRequest { |
262 | major_version, |
263 | minor_version, |
264 | }) |
265 | } |
266 | } |
267 | impl Request for QueryVersionRequest { |
268 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
269 | |
270 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
271 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
272 | // Flatten the buffers into a single vector |
273 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
274 | (buf, fds) |
275 | } |
276 | } |
277 | impl crate::x11_utils::ReplyRequest for QueryVersionRequest { |
278 | type Reply = QueryVersionReply; |
279 | } |
280 | |
281 | #[derive (Clone, Copy, Default)] |
282 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
283 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
284 | pub struct QueryVersionReply { |
285 | pub sequence: u16, |
286 | pub length: u32, |
287 | pub major_version: u32, |
288 | pub minor_version: u32, |
289 | } |
290 | impl_debug_if_no_extra_traits!(QueryVersionReply, "QueryVersionReply" ); |
291 | impl TryParse for QueryVersionReply { |
292 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
293 | let remaining: &[u8] = initial_value; |
294 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
295 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
296 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
297 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
298 | let (major_version: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
299 | let (minor_version: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
300 | let remaining: &[u8] = remaining.get(16..).ok_or(err:ParseError::InsufficientData)?; |
301 | if response_type != 1 { |
302 | return Err(ParseError::InvalidValue); |
303 | } |
304 | let result: QueryVersionReply = QueryVersionReply { sequence, length, major_version, minor_version }; |
305 | let _ = remaining; |
306 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
307 | .ok_or(err:ParseError::InsufficientData)?; |
308 | Ok((result, remaining)) |
309 | } |
310 | } |
311 | impl Serialize for QueryVersionReply { |
312 | type Bytes = [u8; 32]; |
313 | fn serialize(&self) -> [u8; 32] { |
314 | let response_type_bytes = &[1]; |
315 | let sequence_bytes = self.sequence.serialize(); |
316 | let length_bytes = self.length.serialize(); |
317 | let major_version_bytes = self.major_version.serialize(); |
318 | let minor_version_bytes = self.minor_version.serialize(); |
319 | [ |
320 | response_type_bytes[0], |
321 | 0, |
322 | sequence_bytes[0], |
323 | sequence_bytes[1], |
324 | length_bytes[0], |
325 | length_bytes[1], |
326 | length_bytes[2], |
327 | length_bytes[3], |
328 | major_version_bytes[0], |
329 | major_version_bytes[1], |
330 | major_version_bytes[2], |
331 | major_version_bytes[3], |
332 | minor_version_bytes[0], |
333 | minor_version_bytes[1], |
334 | minor_version_bytes[2], |
335 | minor_version_bytes[3], |
336 | 0, |
337 | 0, |
338 | 0, |
339 | 0, |
340 | 0, |
341 | 0, |
342 | 0, |
343 | 0, |
344 | 0, |
345 | 0, |
346 | 0, |
347 | 0, |
348 | 0, |
349 | 0, |
350 | 0, |
351 | 0, |
352 | ] |
353 | } |
354 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
355 | bytes.reserve(32); |
356 | let response_type_bytes = &[1]; |
357 | bytes.push(response_type_bytes[0]); |
358 | bytes.extend_from_slice(&[0; 1]); |
359 | self.sequence.serialize_into(bytes); |
360 | self.length.serialize_into(bytes); |
361 | self.major_version.serialize_into(bytes); |
362 | self.minor_version.serialize_into(bytes); |
363 | bytes.extend_from_slice(&[0; 16]); |
364 | } |
365 | } |
366 | |
367 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
368 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
369 | pub struct SetConfig(u8); |
370 | impl SetConfig { |
371 | pub const SUCCESS: Self = Self(0); |
372 | pub const INVALID_CONFIG_TIME: Self = Self(1); |
373 | pub const INVALID_TIME: Self = Self(2); |
374 | pub const FAILED: Self = Self(3); |
375 | } |
376 | impl From<SetConfig> for u8 { |
377 | #[inline ] |
378 | fn from(input: SetConfig) -> Self { |
379 | input.0 |
380 | } |
381 | } |
382 | impl From<SetConfig> for Option<u8> { |
383 | #[inline ] |
384 | fn from(input: SetConfig) -> Self { |
385 | Some(input.0) |
386 | } |
387 | } |
388 | impl From<SetConfig> for u16 { |
389 | #[inline ] |
390 | fn from(input: SetConfig) -> Self { |
391 | u16::from(input.0) |
392 | } |
393 | } |
394 | impl From<SetConfig> for Option<u16> { |
395 | #[inline ] |
396 | fn from(input: SetConfig) -> Self { |
397 | Some(u16::from(input.0)) |
398 | } |
399 | } |
400 | impl From<SetConfig> for u32 { |
401 | #[inline ] |
402 | fn from(input: SetConfig) -> Self { |
403 | u32::from(input.0) |
404 | } |
405 | } |
406 | impl From<SetConfig> for Option<u32> { |
407 | #[inline ] |
408 | fn from(input: SetConfig) -> Self { |
409 | Some(u32::from(input.0)) |
410 | } |
411 | } |
412 | impl From<u8> for SetConfig { |
413 | #[inline ] |
414 | fn from(value: u8) -> Self { |
415 | Self(value) |
416 | } |
417 | } |
418 | impl core::fmt::Debug for SetConfig { |
419 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
420 | let variants: [(u32, &str, &str); 4] = [ |
421 | (Self::SUCCESS.0.into(), "SUCCESS" , "Success" ), |
422 | (Self::INVALID_CONFIG_TIME.0.into(), "INVALID_CONFIG_TIME" , "InvalidConfigTime" ), |
423 | (Self::INVALID_TIME.0.into(), "INVALID_TIME" , "InvalidTime" ), |
424 | (Self::FAILED.0.into(), "FAILED" , "Failed" ), |
425 | ]; |
426 | pretty_print_enum(fmt, self.0.into(), &variants) |
427 | } |
428 | } |
429 | |
430 | /// Opcode for the SetScreenConfig request |
431 | pub const SET_SCREEN_CONFIG_REQUEST: u8 = 2; |
432 | #[derive (Clone, Copy, Default)] |
433 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
434 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
435 | pub struct SetScreenConfigRequest { |
436 | pub window: xproto::Window, |
437 | pub timestamp: xproto::Timestamp, |
438 | pub config_timestamp: xproto::Timestamp, |
439 | pub size_id: u16, |
440 | pub rotation: Rotation, |
441 | pub rate: u16, |
442 | } |
443 | impl_debug_if_no_extra_traits!(SetScreenConfigRequest, "SetScreenConfigRequest" ); |
444 | impl SetScreenConfigRequest { |
445 | /// Serialize this request into bytes for the provided connection |
446 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
447 | let length_so_far = 0; |
448 | let window_bytes = self.window.serialize(); |
449 | let timestamp_bytes = self.timestamp.serialize(); |
450 | let config_timestamp_bytes = self.config_timestamp.serialize(); |
451 | let size_id_bytes = self.size_id.serialize(); |
452 | let rotation_bytes = u16::from(self.rotation).serialize(); |
453 | let rate_bytes = self.rate.serialize(); |
454 | let mut request0 = vec![ |
455 | major_opcode, |
456 | SET_SCREEN_CONFIG_REQUEST, |
457 | 0, |
458 | 0, |
459 | window_bytes[0], |
460 | window_bytes[1], |
461 | window_bytes[2], |
462 | window_bytes[3], |
463 | timestamp_bytes[0], |
464 | timestamp_bytes[1], |
465 | timestamp_bytes[2], |
466 | timestamp_bytes[3], |
467 | config_timestamp_bytes[0], |
468 | config_timestamp_bytes[1], |
469 | config_timestamp_bytes[2], |
470 | config_timestamp_bytes[3], |
471 | size_id_bytes[0], |
472 | size_id_bytes[1], |
473 | rotation_bytes[0], |
474 | rotation_bytes[1], |
475 | rate_bytes[0], |
476 | rate_bytes[1], |
477 | 0, |
478 | 0, |
479 | ]; |
480 | let length_so_far = length_so_far + request0.len(); |
481 | assert_eq!(length_so_far % 4, 0); |
482 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
483 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
484 | ([request0.into()], vec![]) |
485 | } |
486 | /// Parse this request given its header, its body, and any fds that go along with it |
487 | #[cfg (feature = "request-parsing" )] |
488 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
489 | if header.minor_opcode != SET_SCREEN_CONFIG_REQUEST { |
490 | return Err(ParseError::InvalidValue); |
491 | } |
492 | let (window, remaining) = xproto::Window::try_parse(value)?; |
493 | let (timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
494 | let (config_timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
495 | let (size_id, remaining) = u16::try_parse(remaining)?; |
496 | let (rotation, remaining) = u16::try_parse(remaining)?; |
497 | let rotation = rotation.into(); |
498 | let (rate, remaining) = u16::try_parse(remaining)?; |
499 | let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?; |
500 | let _ = remaining; |
501 | Ok(SetScreenConfigRequest { |
502 | window, |
503 | timestamp, |
504 | config_timestamp, |
505 | size_id, |
506 | rotation, |
507 | rate, |
508 | }) |
509 | } |
510 | } |
511 | impl Request for SetScreenConfigRequest { |
512 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
513 | |
514 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
515 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
516 | // Flatten the buffers into a single vector |
517 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
518 | (buf, fds) |
519 | } |
520 | } |
521 | impl crate::x11_utils::ReplyRequest for SetScreenConfigRequest { |
522 | type Reply = SetScreenConfigReply; |
523 | } |
524 | |
525 | #[derive (Clone, Copy, Default)] |
526 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
527 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
528 | pub struct SetScreenConfigReply { |
529 | pub status: SetConfig, |
530 | pub sequence: u16, |
531 | pub length: u32, |
532 | pub new_timestamp: xproto::Timestamp, |
533 | pub config_timestamp: xproto::Timestamp, |
534 | pub root: xproto::Window, |
535 | pub subpixel_order: render::SubPixel, |
536 | } |
537 | impl_debug_if_no_extra_traits!(SetScreenConfigReply, "SetScreenConfigReply" ); |
538 | impl TryParse for SetScreenConfigReply { |
539 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
540 | let remaining: &[u8] = initial_value; |
541 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
542 | let (status: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
543 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
544 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
545 | let (new_timestamp: u32, remaining: &[u8]) = xproto::Timestamp::try_parse(remaining)?; |
546 | let (config_timestamp: u32, remaining: &[u8]) = xproto::Timestamp::try_parse(remaining)?; |
547 | let (root: u32, remaining: &[u8]) = xproto::Window::try_parse(remaining)?; |
548 | let (subpixel_order: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
549 | let remaining: &[u8] = remaining.get(10..).ok_or(err:ParseError::InsufficientData)?; |
550 | if response_type != 1 { |
551 | return Err(ParseError::InvalidValue); |
552 | } |
553 | let status: SetConfig = status.into(); |
554 | let subpixel_order: SubPixel = subpixel_order.into(); |
555 | let result: SetScreenConfigReply = SetScreenConfigReply { status, sequence, length, new_timestamp, config_timestamp, root, subpixel_order }; |
556 | let _ = remaining; |
557 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
558 | .ok_or(err:ParseError::InsufficientData)?; |
559 | Ok((result, remaining)) |
560 | } |
561 | } |
562 | impl Serialize for SetScreenConfigReply { |
563 | type Bytes = [u8; 32]; |
564 | fn serialize(&self) -> [u8; 32] { |
565 | let response_type_bytes = &[1]; |
566 | let status_bytes = u8::from(self.status).serialize(); |
567 | let sequence_bytes = self.sequence.serialize(); |
568 | let length_bytes = self.length.serialize(); |
569 | let new_timestamp_bytes = self.new_timestamp.serialize(); |
570 | let config_timestamp_bytes = self.config_timestamp.serialize(); |
571 | let root_bytes = self.root.serialize(); |
572 | let subpixel_order_bytes = (u32::from(self.subpixel_order) as u16).serialize(); |
573 | [ |
574 | response_type_bytes[0], |
575 | status_bytes[0], |
576 | sequence_bytes[0], |
577 | sequence_bytes[1], |
578 | length_bytes[0], |
579 | length_bytes[1], |
580 | length_bytes[2], |
581 | length_bytes[3], |
582 | new_timestamp_bytes[0], |
583 | new_timestamp_bytes[1], |
584 | new_timestamp_bytes[2], |
585 | new_timestamp_bytes[3], |
586 | config_timestamp_bytes[0], |
587 | config_timestamp_bytes[1], |
588 | config_timestamp_bytes[2], |
589 | config_timestamp_bytes[3], |
590 | root_bytes[0], |
591 | root_bytes[1], |
592 | root_bytes[2], |
593 | root_bytes[3], |
594 | subpixel_order_bytes[0], |
595 | subpixel_order_bytes[1], |
596 | 0, |
597 | 0, |
598 | 0, |
599 | 0, |
600 | 0, |
601 | 0, |
602 | 0, |
603 | 0, |
604 | 0, |
605 | 0, |
606 | ] |
607 | } |
608 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
609 | bytes.reserve(32); |
610 | let response_type_bytes = &[1]; |
611 | bytes.push(response_type_bytes[0]); |
612 | u8::from(self.status).serialize_into(bytes); |
613 | self.sequence.serialize_into(bytes); |
614 | self.length.serialize_into(bytes); |
615 | self.new_timestamp.serialize_into(bytes); |
616 | self.config_timestamp.serialize_into(bytes); |
617 | self.root.serialize_into(bytes); |
618 | (u32::from(self.subpixel_order) as u16).serialize_into(bytes); |
619 | bytes.extend_from_slice(&[0; 10]); |
620 | } |
621 | } |
622 | |
623 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
624 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
625 | pub struct NotifyMask(u16); |
626 | impl NotifyMask { |
627 | pub const SCREEN_CHANGE: Self = Self(1 << 0); |
628 | pub const CRTC_CHANGE: Self = Self(1 << 1); |
629 | pub const OUTPUT_CHANGE: Self = Self(1 << 2); |
630 | pub const OUTPUT_PROPERTY: Self = Self(1 << 3); |
631 | pub const PROVIDER_CHANGE: Self = Self(1 << 4); |
632 | pub const PROVIDER_PROPERTY: Self = Self(1 << 5); |
633 | pub const RESOURCE_CHANGE: Self = Self(1 << 6); |
634 | pub const LEASE: Self = Self(1 << 7); |
635 | } |
636 | impl From<NotifyMask> for u16 { |
637 | #[inline ] |
638 | fn from(input: NotifyMask) -> Self { |
639 | input.0 |
640 | } |
641 | } |
642 | impl From<NotifyMask> for Option<u16> { |
643 | #[inline ] |
644 | fn from(input: NotifyMask) -> Self { |
645 | Some(input.0) |
646 | } |
647 | } |
648 | impl From<NotifyMask> for u32 { |
649 | #[inline ] |
650 | fn from(input: NotifyMask) -> Self { |
651 | u32::from(input.0) |
652 | } |
653 | } |
654 | impl From<NotifyMask> for Option<u32> { |
655 | #[inline ] |
656 | fn from(input: NotifyMask) -> Self { |
657 | Some(u32::from(input.0)) |
658 | } |
659 | } |
660 | impl From<u8> for NotifyMask { |
661 | #[inline ] |
662 | fn from(value: u8) -> Self { |
663 | Self(value.into()) |
664 | } |
665 | } |
666 | impl From<u16> for NotifyMask { |
667 | #[inline ] |
668 | fn from(value: u16) -> Self { |
669 | Self(value) |
670 | } |
671 | } |
672 | impl core::fmt::Debug for NotifyMask { |
673 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
674 | let variants: [(u32, &str, &str); 8] = [ |
675 | (Self::SCREEN_CHANGE.0.into(), "SCREEN_CHANGE" , "ScreenChange" ), |
676 | (Self::CRTC_CHANGE.0.into(), "CRTC_CHANGE" , "CrtcChange" ), |
677 | (Self::OUTPUT_CHANGE.0.into(), "OUTPUT_CHANGE" , "OutputChange" ), |
678 | (Self::OUTPUT_PROPERTY.0.into(), "OUTPUT_PROPERTY" , "OutputProperty" ), |
679 | (Self::PROVIDER_CHANGE.0.into(), "PROVIDER_CHANGE" , "ProviderChange" ), |
680 | (Self::PROVIDER_PROPERTY.0.into(), "PROVIDER_PROPERTY" , "ProviderProperty" ), |
681 | (Self::RESOURCE_CHANGE.0.into(), "RESOURCE_CHANGE" , "ResourceChange" ), |
682 | (Self::LEASE.0.into(), "LEASE" , "Lease" ), |
683 | ]; |
684 | pretty_print_bitmask(fmt, self.0.into(), &variants) |
685 | } |
686 | } |
687 | bitmask_binop!(NotifyMask, u16); |
688 | |
689 | /// Opcode for the SelectInput request |
690 | pub const SELECT_INPUT_REQUEST: u8 = 4; |
691 | #[derive (Clone, Copy, Default)] |
692 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
693 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
694 | pub struct SelectInputRequest { |
695 | pub window: xproto::Window, |
696 | pub enable: NotifyMask, |
697 | } |
698 | impl_debug_if_no_extra_traits!(SelectInputRequest, "SelectInputRequest" ); |
699 | impl SelectInputRequest { |
700 | /// Serialize this request into bytes for the provided connection |
701 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
702 | let length_so_far = 0; |
703 | let window_bytes = self.window.serialize(); |
704 | let enable_bytes = u16::from(self.enable).serialize(); |
705 | let mut request0 = vec![ |
706 | major_opcode, |
707 | SELECT_INPUT_REQUEST, |
708 | 0, |
709 | 0, |
710 | window_bytes[0], |
711 | window_bytes[1], |
712 | window_bytes[2], |
713 | window_bytes[3], |
714 | enable_bytes[0], |
715 | enable_bytes[1], |
716 | 0, |
717 | 0, |
718 | ]; |
719 | let length_so_far = length_so_far + request0.len(); |
720 | assert_eq!(length_so_far % 4, 0); |
721 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
722 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
723 | ([request0.into()], vec![]) |
724 | } |
725 | /// Parse this request given its header, its body, and any fds that go along with it |
726 | #[cfg (feature = "request-parsing" )] |
727 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
728 | if header.minor_opcode != SELECT_INPUT_REQUEST { |
729 | return Err(ParseError::InvalidValue); |
730 | } |
731 | let (window, remaining) = xproto::Window::try_parse(value)?; |
732 | let (enable, remaining) = u16::try_parse(remaining)?; |
733 | let enable = enable.into(); |
734 | let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?; |
735 | let _ = remaining; |
736 | Ok(SelectInputRequest { |
737 | window, |
738 | enable, |
739 | }) |
740 | } |
741 | } |
742 | impl Request for SelectInputRequest { |
743 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
744 | |
745 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
746 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
747 | // Flatten the buffers into a single vector |
748 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
749 | (buf, fds) |
750 | } |
751 | } |
752 | impl crate::x11_utils::VoidRequest for SelectInputRequest { |
753 | } |
754 | |
755 | /// Opcode for the GetScreenInfo request |
756 | pub const GET_SCREEN_INFO_REQUEST: u8 = 5; |
757 | #[derive (Clone, Copy, Default)] |
758 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
759 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
760 | pub struct GetScreenInfoRequest { |
761 | pub window: xproto::Window, |
762 | } |
763 | impl_debug_if_no_extra_traits!(GetScreenInfoRequest, "GetScreenInfoRequest" ); |
764 | impl GetScreenInfoRequest { |
765 | /// Serialize this request into bytes for the provided connection |
766 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
767 | let length_so_far = 0; |
768 | let window_bytes = self.window.serialize(); |
769 | let mut request0 = vec![ |
770 | major_opcode, |
771 | GET_SCREEN_INFO_REQUEST, |
772 | 0, |
773 | 0, |
774 | window_bytes[0], |
775 | window_bytes[1], |
776 | window_bytes[2], |
777 | window_bytes[3], |
778 | ]; |
779 | let length_so_far = length_so_far + request0.len(); |
780 | assert_eq!(length_so_far % 4, 0); |
781 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
782 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
783 | ([request0.into()], vec![]) |
784 | } |
785 | /// Parse this request given its header, its body, and any fds that go along with it |
786 | #[cfg (feature = "request-parsing" )] |
787 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
788 | if header.minor_opcode != GET_SCREEN_INFO_REQUEST { |
789 | return Err(ParseError::InvalidValue); |
790 | } |
791 | let (window, remaining) = xproto::Window::try_parse(value)?; |
792 | let _ = remaining; |
793 | Ok(GetScreenInfoRequest { |
794 | window, |
795 | }) |
796 | } |
797 | } |
798 | impl Request for GetScreenInfoRequest { |
799 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
800 | |
801 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
802 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
803 | // Flatten the buffers into a single vector |
804 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
805 | (buf, fds) |
806 | } |
807 | } |
808 | impl crate::x11_utils::ReplyRequest for GetScreenInfoRequest { |
809 | type Reply = GetScreenInfoReply; |
810 | } |
811 | |
812 | #[derive (Clone, Default)] |
813 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
814 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
815 | pub struct GetScreenInfoReply { |
816 | pub rotations: Rotation, |
817 | pub sequence: u16, |
818 | pub length: u32, |
819 | pub root: xproto::Window, |
820 | pub timestamp: xproto::Timestamp, |
821 | pub config_timestamp: xproto::Timestamp, |
822 | pub size_id: u16, |
823 | pub rotation: Rotation, |
824 | pub rate: u16, |
825 | pub n_info: u16, |
826 | pub sizes: Vec<ScreenSize>, |
827 | pub rates: Vec<RefreshRates>, |
828 | } |
829 | impl_debug_if_no_extra_traits!(GetScreenInfoReply, "GetScreenInfoReply" ); |
830 | impl TryParse for GetScreenInfoReply { |
831 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
832 | let remaining = initial_value; |
833 | let (response_type, remaining) = u8::try_parse(remaining)?; |
834 | let (rotations, remaining) = u8::try_parse(remaining)?; |
835 | let (sequence, remaining) = u16::try_parse(remaining)?; |
836 | let (length, remaining) = u32::try_parse(remaining)?; |
837 | let (root, remaining) = xproto::Window::try_parse(remaining)?; |
838 | let (timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
839 | let (config_timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
840 | let (n_sizes, remaining) = u16::try_parse(remaining)?; |
841 | let (size_id, remaining) = u16::try_parse(remaining)?; |
842 | let (rotation, remaining) = u16::try_parse(remaining)?; |
843 | let (rate, remaining) = u16::try_parse(remaining)?; |
844 | let (n_info, remaining) = u16::try_parse(remaining)?; |
845 | let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?; |
846 | let (sizes, remaining) = crate::x11_utils::parse_list::<ScreenSize>(remaining, n_sizes.try_to_usize()?)?; |
847 | let (rates, remaining) = crate::x11_utils::parse_list::<RefreshRates>(remaining, u32::from(n_info).checked_sub(u32::from(n_sizes)).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?; |
848 | if response_type != 1 { |
849 | return Err(ParseError::InvalidValue); |
850 | } |
851 | let rotations = rotations.into(); |
852 | let rotation = rotation.into(); |
853 | let result = GetScreenInfoReply { rotations, sequence, length, root, timestamp, config_timestamp, size_id, rotation, rate, n_info, sizes, rates }; |
854 | let _ = remaining; |
855 | let remaining = initial_value.get(32 + length as usize * 4..) |
856 | .ok_or(ParseError::InsufficientData)?; |
857 | Ok((result, remaining)) |
858 | } |
859 | } |
860 | impl Serialize for GetScreenInfoReply { |
861 | type Bytes = Vec<u8>; |
862 | fn serialize(&self) -> Vec<u8> { |
863 | let mut result = Vec::new(); |
864 | self.serialize_into(&mut result); |
865 | result |
866 | } |
867 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
868 | bytes.reserve(32); |
869 | let response_type_bytes = &[1]; |
870 | bytes.push(response_type_bytes[0]); |
871 | (u16::from(self.rotations) as u8).serialize_into(bytes); |
872 | self.sequence.serialize_into(bytes); |
873 | self.length.serialize_into(bytes); |
874 | self.root.serialize_into(bytes); |
875 | self.timestamp.serialize_into(bytes); |
876 | self.config_timestamp.serialize_into(bytes); |
877 | let n_sizes = u16::try_from(self.sizes.len()).expect("`sizes` has too many elements" ); |
878 | n_sizes.serialize_into(bytes); |
879 | self.size_id.serialize_into(bytes); |
880 | u16::from(self.rotation).serialize_into(bytes); |
881 | self.rate.serialize_into(bytes); |
882 | self.n_info.serialize_into(bytes); |
883 | bytes.extend_from_slice(&[0; 2]); |
884 | self.sizes.serialize_into(bytes); |
885 | assert_eq!(self.rates.len(), usize::try_from(u32::from(self.n_info).checked_sub(u32::from(n_sizes)).unwrap()).unwrap(), "`rates` has an incorrect length" ); |
886 | self.rates.serialize_into(bytes); |
887 | } |
888 | } |
889 | impl GetScreenInfoReply { |
890 | /// Get the value of the `nSizes` field. |
891 | /// |
892 | /// The `nSizes` field is used as the length field of the `sizes` field. |
893 | /// This function computes the field's value again based on the length of the list. |
894 | /// |
895 | /// # Panics |
896 | /// |
897 | /// Panics if the value cannot be represented in the target type. This |
898 | /// cannot happen with values of the struct received from the X11 server. |
899 | pub fn n_sizes(&self) -> u16 { |
900 | self.sizes.len() |
901 | .try_into().unwrap() |
902 | } |
903 | } |
904 | |
905 | /// Opcode for the GetScreenSizeRange request |
906 | pub const GET_SCREEN_SIZE_RANGE_REQUEST: u8 = 6; |
907 | #[derive (Clone, Copy, Default)] |
908 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
909 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
910 | pub struct GetScreenSizeRangeRequest { |
911 | pub window: xproto::Window, |
912 | } |
913 | impl_debug_if_no_extra_traits!(GetScreenSizeRangeRequest, "GetScreenSizeRangeRequest" ); |
914 | impl GetScreenSizeRangeRequest { |
915 | /// Serialize this request into bytes for the provided connection |
916 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
917 | let length_so_far = 0; |
918 | let window_bytes = self.window.serialize(); |
919 | let mut request0 = vec![ |
920 | major_opcode, |
921 | GET_SCREEN_SIZE_RANGE_REQUEST, |
922 | 0, |
923 | 0, |
924 | window_bytes[0], |
925 | window_bytes[1], |
926 | window_bytes[2], |
927 | window_bytes[3], |
928 | ]; |
929 | let length_so_far = length_so_far + request0.len(); |
930 | assert_eq!(length_so_far % 4, 0); |
931 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
932 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
933 | ([request0.into()], vec![]) |
934 | } |
935 | /// Parse this request given its header, its body, and any fds that go along with it |
936 | #[cfg (feature = "request-parsing" )] |
937 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
938 | if header.minor_opcode != GET_SCREEN_SIZE_RANGE_REQUEST { |
939 | return Err(ParseError::InvalidValue); |
940 | } |
941 | let (window, remaining) = xproto::Window::try_parse(value)?; |
942 | let _ = remaining; |
943 | Ok(GetScreenSizeRangeRequest { |
944 | window, |
945 | }) |
946 | } |
947 | } |
948 | impl Request for GetScreenSizeRangeRequest { |
949 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
950 | |
951 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
952 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
953 | // Flatten the buffers into a single vector |
954 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
955 | (buf, fds) |
956 | } |
957 | } |
958 | impl crate::x11_utils::ReplyRequest for GetScreenSizeRangeRequest { |
959 | type Reply = GetScreenSizeRangeReply; |
960 | } |
961 | |
962 | #[derive (Clone, Copy, Default)] |
963 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
964 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
965 | pub struct GetScreenSizeRangeReply { |
966 | pub sequence: u16, |
967 | pub length: u32, |
968 | pub min_width: u16, |
969 | pub min_height: u16, |
970 | pub max_width: u16, |
971 | pub max_height: u16, |
972 | } |
973 | impl_debug_if_no_extra_traits!(GetScreenSizeRangeReply, "GetScreenSizeRangeReply" ); |
974 | impl TryParse for GetScreenSizeRangeReply { |
975 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
976 | let remaining: &[u8] = initial_value; |
977 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
978 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
979 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
980 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
981 | let (min_width: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
982 | let (min_height: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
983 | let (max_width: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
984 | let (max_height: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
985 | let remaining: &[u8] = remaining.get(16..).ok_or(err:ParseError::InsufficientData)?; |
986 | if response_type != 1 { |
987 | return Err(ParseError::InvalidValue); |
988 | } |
989 | let result: GetScreenSizeRangeReply = GetScreenSizeRangeReply { sequence, length, min_width, min_height, max_width, max_height }; |
990 | let _ = remaining; |
991 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
992 | .ok_or(err:ParseError::InsufficientData)?; |
993 | Ok((result, remaining)) |
994 | } |
995 | } |
996 | impl Serialize for GetScreenSizeRangeReply { |
997 | type Bytes = [u8; 32]; |
998 | fn serialize(&self) -> [u8; 32] { |
999 | let response_type_bytes = &[1]; |
1000 | let sequence_bytes = self.sequence.serialize(); |
1001 | let length_bytes = self.length.serialize(); |
1002 | let min_width_bytes = self.min_width.serialize(); |
1003 | let min_height_bytes = self.min_height.serialize(); |
1004 | let max_width_bytes = self.max_width.serialize(); |
1005 | let max_height_bytes = self.max_height.serialize(); |
1006 | [ |
1007 | response_type_bytes[0], |
1008 | 0, |
1009 | sequence_bytes[0], |
1010 | sequence_bytes[1], |
1011 | length_bytes[0], |
1012 | length_bytes[1], |
1013 | length_bytes[2], |
1014 | length_bytes[3], |
1015 | min_width_bytes[0], |
1016 | min_width_bytes[1], |
1017 | min_height_bytes[0], |
1018 | min_height_bytes[1], |
1019 | max_width_bytes[0], |
1020 | max_width_bytes[1], |
1021 | max_height_bytes[0], |
1022 | max_height_bytes[1], |
1023 | 0, |
1024 | 0, |
1025 | 0, |
1026 | 0, |
1027 | 0, |
1028 | 0, |
1029 | 0, |
1030 | 0, |
1031 | 0, |
1032 | 0, |
1033 | 0, |
1034 | 0, |
1035 | 0, |
1036 | 0, |
1037 | 0, |
1038 | 0, |
1039 | ] |
1040 | } |
1041 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
1042 | bytes.reserve(32); |
1043 | let response_type_bytes = &[1]; |
1044 | bytes.push(response_type_bytes[0]); |
1045 | bytes.extend_from_slice(&[0; 1]); |
1046 | self.sequence.serialize_into(bytes); |
1047 | self.length.serialize_into(bytes); |
1048 | self.min_width.serialize_into(bytes); |
1049 | self.min_height.serialize_into(bytes); |
1050 | self.max_width.serialize_into(bytes); |
1051 | self.max_height.serialize_into(bytes); |
1052 | bytes.extend_from_slice(&[0; 16]); |
1053 | } |
1054 | } |
1055 | |
1056 | /// Opcode for the SetScreenSize request |
1057 | pub const SET_SCREEN_SIZE_REQUEST: u8 = 7; |
1058 | #[derive (Clone, Copy, Default)] |
1059 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1060 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1061 | pub struct SetScreenSizeRequest { |
1062 | pub window: xproto::Window, |
1063 | pub width: u16, |
1064 | pub height: u16, |
1065 | pub mm_width: u32, |
1066 | pub mm_height: u32, |
1067 | } |
1068 | impl_debug_if_no_extra_traits!(SetScreenSizeRequest, "SetScreenSizeRequest" ); |
1069 | impl SetScreenSizeRequest { |
1070 | /// Serialize this request into bytes for the provided connection |
1071 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
1072 | let length_so_far = 0; |
1073 | let window_bytes = self.window.serialize(); |
1074 | let width_bytes = self.width.serialize(); |
1075 | let height_bytes = self.height.serialize(); |
1076 | let mm_width_bytes = self.mm_width.serialize(); |
1077 | let mm_height_bytes = self.mm_height.serialize(); |
1078 | let mut request0 = vec![ |
1079 | major_opcode, |
1080 | SET_SCREEN_SIZE_REQUEST, |
1081 | 0, |
1082 | 0, |
1083 | window_bytes[0], |
1084 | window_bytes[1], |
1085 | window_bytes[2], |
1086 | window_bytes[3], |
1087 | width_bytes[0], |
1088 | width_bytes[1], |
1089 | height_bytes[0], |
1090 | height_bytes[1], |
1091 | mm_width_bytes[0], |
1092 | mm_width_bytes[1], |
1093 | mm_width_bytes[2], |
1094 | mm_width_bytes[3], |
1095 | mm_height_bytes[0], |
1096 | mm_height_bytes[1], |
1097 | mm_height_bytes[2], |
1098 | mm_height_bytes[3], |
1099 | ]; |
1100 | let length_so_far = length_so_far + request0.len(); |
1101 | assert_eq!(length_so_far % 4, 0); |
1102 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
1103 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
1104 | ([request0.into()], vec![]) |
1105 | } |
1106 | /// Parse this request given its header, its body, and any fds that go along with it |
1107 | #[cfg (feature = "request-parsing" )] |
1108 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
1109 | if header.minor_opcode != SET_SCREEN_SIZE_REQUEST { |
1110 | return Err(ParseError::InvalidValue); |
1111 | } |
1112 | let (window, remaining) = xproto::Window::try_parse(value)?; |
1113 | let (width, remaining) = u16::try_parse(remaining)?; |
1114 | let (height, remaining) = u16::try_parse(remaining)?; |
1115 | let (mm_width, remaining) = u32::try_parse(remaining)?; |
1116 | let (mm_height, remaining) = u32::try_parse(remaining)?; |
1117 | let _ = remaining; |
1118 | Ok(SetScreenSizeRequest { |
1119 | window, |
1120 | width, |
1121 | height, |
1122 | mm_width, |
1123 | mm_height, |
1124 | }) |
1125 | } |
1126 | } |
1127 | impl Request for SetScreenSizeRequest { |
1128 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
1129 | |
1130 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
1131 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
1132 | // Flatten the buffers into a single vector |
1133 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
1134 | (buf, fds) |
1135 | } |
1136 | } |
1137 | impl crate::x11_utils::VoidRequest for SetScreenSizeRequest { |
1138 | } |
1139 | |
1140 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
1141 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1142 | pub struct ModeFlag(u32); |
1143 | impl ModeFlag { |
1144 | pub const HSYNC_POSITIVE: Self = Self(1 << 0); |
1145 | pub const HSYNC_NEGATIVE: Self = Self(1 << 1); |
1146 | pub const VSYNC_POSITIVE: Self = Self(1 << 2); |
1147 | pub const VSYNC_NEGATIVE: Self = Self(1 << 3); |
1148 | pub const INTERLACE: Self = Self(1 << 4); |
1149 | pub const DOUBLE_SCAN: Self = Self(1 << 5); |
1150 | pub const CSYNC: Self = Self(1 << 6); |
1151 | pub const CSYNC_POSITIVE: Self = Self(1 << 7); |
1152 | pub const CSYNC_NEGATIVE: Self = Self(1 << 8); |
1153 | pub const HSKEW_PRESENT: Self = Self(1 << 9); |
1154 | pub const BCAST: Self = Self(1 << 10); |
1155 | pub const PIXEL_MULTIPLEX: Self = Self(1 << 11); |
1156 | pub const DOUBLE_CLOCK: Self = Self(1 << 12); |
1157 | pub const HALVE_CLOCK: Self = Self(1 << 13); |
1158 | } |
1159 | impl From<ModeFlag> for u32 { |
1160 | #[inline ] |
1161 | fn from(input: ModeFlag) -> Self { |
1162 | input.0 |
1163 | } |
1164 | } |
1165 | impl From<ModeFlag> for Option<u32> { |
1166 | #[inline ] |
1167 | fn from(input: ModeFlag) -> Self { |
1168 | Some(input.0) |
1169 | } |
1170 | } |
1171 | impl From<u8> for ModeFlag { |
1172 | #[inline ] |
1173 | fn from(value: u8) -> Self { |
1174 | Self(value.into()) |
1175 | } |
1176 | } |
1177 | impl From<u16> for ModeFlag { |
1178 | #[inline ] |
1179 | fn from(value: u16) -> Self { |
1180 | Self(value.into()) |
1181 | } |
1182 | } |
1183 | impl From<u32> for ModeFlag { |
1184 | #[inline ] |
1185 | fn from(value: u32) -> Self { |
1186 | Self(value) |
1187 | } |
1188 | } |
1189 | impl core::fmt::Debug for ModeFlag { |
1190 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
1191 | let variants: [(u32, &str, &str); 14] = [ |
1192 | (Self::HSYNC_POSITIVE.0, "HSYNC_POSITIVE" , "HsyncPositive" ), |
1193 | (Self::HSYNC_NEGATIVE.0, "HSYNC_NEGATIVE" , "HsyncNegative" ), |
1194 | (Self::VSYNC_POSITIVE.0, "VSYNC_POSITIVE" , "VsyncPositive" ), |
1195 | (Self::VSYNC_NEGATIVE.0, "VSYNC_NEGATIVE" , "VsyncNegative" ), |
1196 | (Self::INTERLACE.0, "INTERLACE" , "Interlace" ), |
1197 | (Self::DOUBLE_SCAN.0, "DOUBLE_SCAN" , "DoubleScan" ), |
1198 | (Self::CSYNC.0, "CSYNC" , "Csync" ), |
1199 | (Self::CSYNC_POSITIVE.0, "CSYNC_POSITIVE" , "CsyncPositive" ), |
1200 | (Self::CSYNC_NEGATIVE.0, "CSYNC_NEGATIVE" , "CsyncNegative" ), |
1201 | (Self::HSKEW_PRESENT.0, "HSKEW_PRESENT" , "HskewPresent" ), |
1202 | (Self::BCAST.0, "BCAST" , "Bcast" ), |
1203 | (Self::PIXEL_MULTIPLEX.0, "PIXEL_MULTIPLEX" , "PixelMultiplex" ), |
1204 | (Self::DOUBLE_CLOCK.0, "DOUBLE_CLOCK" , "DoubleClock" ), |
1205 | (Self::HALVE_CLOCK.0, "HALVE_CLOCK" , "HalveClock" ), |
1206 | ]; |
1207 | pretty_print_bitmask(fmt, self.0, &variants) |
1208 | } |
1209 | } |
1210 | bitmask_binop!(ModeFlag, u32); |
1211 | |
1212 | #[derive (Clone, Copy, Default)] |
1213 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1214 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1215 | pub struct ModeInfo { |
1216 | pub id: u32, |
1217 | pub width: u16, |
1218 | pub height: u16, |
1219 | pub dot_clock: u32, |
1220 | pub hsync_start: u16, |
1221 | pub hsync_end: u16, |
1222 | pub htotal: u16, |
1223 | pub hskew: u16, |
1224 | pub vsync_start: u16, |
1225 | pub vsync_end: u16, |
1226 | pub vtotal: u16, |
1227 | pub name_len: u16, |
1228 | pub mode_flags: ModeFlag, |
1229 | } |
1230 | impl_debug_if_no_extra_traits!(ModeInfo, "ModeInfo" ); |
1231 | impl TryParse for ModeInfo { |
1232 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
1233 | let (id: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
1234 | let (width: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1235 | let (height: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1236 | let (dot_clock: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
1237 | let (hsync_start: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1238 | let (hsync_end: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1239 | let (htotal: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1240 | let (hskew: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1241 | let (vsync_start: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1242 | let (vsync_end: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1243 | let (vtotal: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1244 | let (name_len: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1245 | let (mode_flags: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
1246 | let mode_flags: ModeFlag = mode_flags.into(); |
1247 | let result: ModeInfo = ModeInfo { id, width, height, dot_clock, hsync_start, hsync_end, htotal, hskew, vsync_start, vsync_end, vtotal, name_len, mode_flags }; |
1248 | Ok((result, remaining)) |
1249 | } |
1250 | } |
1251 | impl Serialize for ModeInfo { |
1252 | type Bytes = [u8; 32]; |
1253 | fn serialize(&self) -> [u8; 32] { |
1254 | let id_bytes = self.id.serialize(); |
1255 | let width_bytes = self.width.serialize(); |
1256 | let height_bytes = self.height.serialize(); |
1257 | let dot_clock_bytes = self.dot_clock.serialize(); |
1258 | let hsync_start_bytes = self.hsync_start.serialize(); |
1259 | let hsync_end_bytes = self.hsync_end.serialize(); |
1260 | let htotal_bytes = self.htotal.serialize(); |
1261 | let hskew_bytes = self.hskew.serialize(); |
1262 | let vsync_start_bytes = self.vsync_start.serialize(); |
1263 | let vsync_end_bytes = self.vsync_end.serialize(); |
1264 | let vtotal_bytes = self.vtotal.serialize(); |
1265 | let name_len_bytes = self.name_len.serialize(); |
1266 | let mode_flags_bytes = u32::from(self.mode_flags).serialize(); |
1267 | [ |
1268 | id_bytes[0], |
1269 | id_bytes[1], |
1270 | id_bytes[2], |
1271 | id_bytes[3], |
1272 | width_bytes[0], |
1273 | width_bytes[1], |
1274 | height_bytes[0], |
1275 | height_bytes[1], |
1276 | dot_clock_bytes[0], |
1277 | dot_clock_bytes[1], |
1278 | dot_clock_bytes[2], |
1279 | dot_clock_bytes[3], |
1280 | hsync_start_bytes[0], |
1281 | hsync_start_bytes[1], |
1282 | hsync_end_bytes[0], |
1283 | hsync_end_bytes[1], |
1284 | htotal_bytes[0], |
1285 | htotal_bytes[1], |
1286 | hskew_bytes[0], |
1287 | hskew_bytes[1], |
1288 | vsync_start_bytes[0], |
1289 | vsync_start_bytes[1], |
1290 | vsync_end_bytes[0], |
1291 | vsync_end_bytes[1], |
1292 | vtotal_bytes[0], |
1293 | vtotal_bytes[1], |
1294 | name_len_bytes[0], |
1295 | name_len_bytes[1], |
1296 | mode_flags_bytes[0], |
1297 | mode_flags_bytes[1], |
1298 | mode_flags_bytes[2], |
1299 | mode_flags_bytes[3], |
1300 | ] |
1301 | } |
1302 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
1303 | bytes.reserve(32); |
1304 | self.id.serialize_into(bytes); |
1305 | self.width.serialize_into(bytes); |
1306 | self.height.serialize_into(bytes); |
1307 | self.dot_clock.serialize_into(bytes); |
1308 | self.hsync_start.serialize_into(bytes); |
1309 | self.hsync_end.serialize_into(bytes); |
1310 | self.htotal.serialize_into(bytes); |
1311 | self.hskew.serialize_into(bytes); |
1312 | self.vsync_start.serialize_into(bytes); |
1313 | self.vsync_end.serialize_into(bytes); |
1314 | self.vtotal.serialize_into(bytes); |
1315 | self.name_len.serialize_into(bytes); |
1316 | u32::from(self.mode_flags).serialize_into(bytes); |
1317 | } |
1318 | } |
1319 | |
1320 | /// Opcode for the GetScreenResources request |
1321 | pub const GET_SCREEN_RESOURCES_REQUEST: u8 = 8; |
1322 | #[derive (Clone, Copy, Default)] |
1323 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1324 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1325 | pub struct GetScreenResourcesRequest { |
1326 | pub window: xproto::Window, |
1327 | } |
1328 | impl_debug_if_no_extra_traits!(GetScreenResourcesRequest, "GetScreenResourcesRequest" ); |
1329 | impl GetScreenResourcesRequest { |
1330 | /// Serialize this request into bytes for the provided connection |
1331 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
1332 | let length_so_far = 0; |
1333 | let window_bytes = self.window.serialize(); |
1334 | let mut request0 = vec![ |
1335 | major_opcode, |
1336 | GET_SCREEN_RESOURCES_REQUEST, |
1337 | 0, |
1338 | 0, |
1339 | window_bytes[0], |
1340 | window_bytes[1], |
1341 | window_bytes[2], |
1342 | window_bytes[3], |
1343 | ]; |
1344 | let length_so_far = length_so_far + request0.len(); |
1345 | assert_eq!(length_so_far % 4, 0); |
1346 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
1347 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
1348 | ([request0.into()], vec![]) |
1349 | } |
1350 | /// Parse this request given its header, its body, and any fds that go along with it |
1351 | #[cfg (feature = "request-parsing" )] |
1352 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
1353 | if header.minor_opcode != GET_SCREEN_RESOURCES_REQUEST { |
1354 | return Err(ParseError::InvalidValue); |
1355 | } |
1356 | let (window, remaining) = xproto::Window::try_parse(value)?; |
1357 | let _ = remaining; |
1358 | Ok(GetScreenResourcesRequest { |
1359 | window, |
1360 | }) |
1361 | } |
1362 | } |
1363 | impl Request for GetScreenResourcesRequest { |
1364 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
1365 | |
1366 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
1367 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
1368 | // Flatten the buffers into a single vector |
1369 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
1370 | (buf, fds) |
1371 | } |
1372 | } |
1373 | impl crate::x11_utils::ReplyRequest for GetScreenResourcesRequest { |
1374 | type Reply = GetScreenResourcesReply; |
1375 | } |
1376 | |
1377 | #[derive (Clone, Default)] |
1378 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1379 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1380 | pub struct GetScreenResourcesReply { |
1381 | pub sequence: u16, |
1382 | pub length: u32, |
1383 | pub timestamp: xproto::Timestamp, |
1384 | pub config_timestamp: xproto::Timestamp, |
1385 | pub crtcs: Vec<Crtc>, |
1386 | pub outputs: Vec<Output>, |
1387 | pub modes: Vec<ModeInfo>, |
1388 | pub names: Vec<u8>, |
1389 | } |
1390 | impl_debug_if_no_extra_traits!(GetScreenResourcesReply, "GetScreenResourcesReply" ); |
1391 | impl TryParse for GetScreenResourcesReply { |
1392 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
1393 | let remaining = initial_value; |
1394 | let (response_type, remaining) = u8::try_parse(remaining)?; |
1395 | let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?; |
1396 | let (sequence, remaining) = u16::try_parse(remaining)?; |
1397 | let (length, remaining) = u32::try_parse(remaining)?; |
1398 | let (timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
1399 | let (config_timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
1400 | let (num_crtcs, remaining) = u16::try_parse(remaining)?; |
1401 | let (num_outputs, remaining) = u16::try_parse(remaining)?; |
1402 | let (num_modes, remaining) = u16::try_parse(remaining)?; |
1403 | let (names_len, remaining) = u16::try_parse(remaining)?; |
1404 | let remaining = remaining.get(8..).ok_or(ParseError::InsufficientData)?; |
1405 | let (crtcs, remaining) = crate::x11_utils::parse_list::<Crtc>(remaining, num_crtcs.try_to_usize()?)?; |
1406 | let (outputs, remaining) = crate::x11_utils::parse_list::<Output>(remaining, num_outputs.try_to_usize()?)?; |
1407 | let (modes, remaining) = crate::x11_utils::parse_list::<ModeInfo>(remaining, num_modes.try_to_usize()?)?; |
1408 | let (names, remaining) = crate::x11_utils::parse_u8_list(remaining, names_len.try_to_usize()?)?; |
1409 | let names = names.to_vec(); |
1410 | if response_type != 1 { |
1411 | return Err(ParseError::InvalidValue); |
1412 | } |
1413 | let result = GetScreenResourcesReply { sequence, length, timestamp, config_timestamp, crtcs, outputs, modes, names }; |
1414 | let _ = remaining; |
1415 | let remaining = initial_value.get(32 + length as usize * 4..) |
1416 | .ok_or(ParseError::InsufficientData)?; |
1417 | Ok((result, remaining)) |
1418 | } |
1419 | } |
1420 | impl Serialize for GetScreenResourcesReply { |
1421 | type Bytes = Vec<u8>; |
1422 | fn serialize(&self) -> Vec<u8> { |
1423 | let mut result = Vec::new(); |
1424 | self.serialize_into(&mut result); |
1425 | result |
1426 | } |
1427 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
1428 | bytes.reserve(32); |
1429 | let response_type_bytes = &[1]; |
1430 | bytes.push(response_type_bytes[0]); |
1431 | bytes.extend_from_slice(&[0; 1]); |
1432 | self.sequence.serialize_into(bytes); |
1433 | self.length.serialize_into(bytes); |
1434 | self.timestamp.serialize_into(bytes); |
1435 | self.config_timestamp.serialize_into(bytes); |
1436 | let num_crtcs = u16::try_from(self.crtcs.len()).expect("`crtcs` has too many elements" ); |
1437 | num_crtcs.serialize_into(bytes); |
1438 | let num_outputs = u16::try_from(self.outputs.len()).expect("`outputs` has too many elements" ); |
1439 | num_outputs.serialize_into(bytes); |
1440 | let num_modes = u16::try_from(self.modes.len()).expect("`modes` has too many elements" ); |
1441 | num_modes.serialize_into(bytes); |
1442 | let names_len = u16::try_from(self.names.len()).expect("`names` has too many elements" ); |
1443 | names_len.serialize_into(bytes); |
1444 | bytes.extend_from_slice(&[0; 8]); |
1445 | self.crtcs.serialize_into(bytes); |
1446 | self.outputs.serialize_into(bytes); |
1447 | self.modes.serialize_into(bytes); |
1448 | bytes.extend_from_slice(&self.names); |
1449 | } |
1450 | } |
1451 | impl GetScreenResourcesReply { |
1452 | /// Get the value of the `num_crtcs` field. |
1453 | /// |
1454 | /// The `num_crtcs` field is used as the length field of the `crtcs` field. |
1455 | /// This function computes the field's value again based on the length of the list. |
1456 | /// |
1457 | /// # Panics |
1458 | /// |
1459 | /// Panics if the value cannot be represented in the target type. This |
1460 | /// cannot happen with values of the struct received from the X11 server. |
1461 | pub fn num_crtcs(&self) -> u16 { |
1462 | self.crtcs.len() |
1463 | .try_into().unwrap() |
1464 | } |
1465 | /// Get the value of the `num_outputs` field. |
1466 | /// |
1467 | /// The `num_outputs` field is used as the length field of the `outputs` field. |
1468 | /// This function computes the field's value again based on the length of the list. |
1469 | /// |
1470 | /// # Panics |
1471 | /// |
1472 | /// Panics if the value cannot be represented in the target type. This |
1473 | /// cannot happen with values of the struct received from the X11 server. |
1474 | pub fn num_outputs(&self) -> u16 { |
1475 | self.outputs.len() |
1476 | .try_into().unwrap() |
1477 | } |
1478 | /// Get the value of the `num_modes` field. |
1479 | /// |
1480 | /// The `num_modes` field is used as the length field of the `modes` field. |
1481 | /// This function computes the field's value again based on the length of the list. |
1482 | /// |
1483 | /// # Panics |
1484 | /// |
1485 | /// Panics if the value cannot be represented in the target type. This |
1486 | /// cannot happen with values of the struct received from the X11 server. |
1487 | pub fn num_modes(&self) -> u16 { |
1488 | self.modes.len() |
1489 | .try_into().unwrap() |
1490 | } |
1491 | /// Get the value of the `names_len` field. |
1492 | /// |
1493 | /// The `names_len` field is used as the length field of the `names` field. |
1494 | /// This function computes the field's value again based on the length of the list. |
1495 | /// |
1496 | /// # Panics |
1497 | /// |
1498 | /// Panics if the value cannot be represented in the target type. This |
1499 | /// cannot happen with values of the struct received from the X11 server. |
1500 | pub fn names_len(&self) -> u16 { |
1501 | self.names.len() |
1502 | .try_into().unwrap() |
1503 | } |
1504 | } |
1505 | |
1506 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
1507 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1508 | pub struct Connection(u8); |
1509 | impl Connection { |
1510 | pub const CONNECTED: Self = Self(0); |
1511 | pub const DISCONNECTED: Self = Self(1); |
1512 | pub const UNKNOWN: Self = Self(2); |
1513 | } |
1514 | impl From<Connection> for u8 { |
1515 | #[inline ] |
1516 | fn from(input: Connection) -> Self { |
1517 | input.0 |
1518 | } |
1519 | } |
1520 | impl From<Connection> for Option<u8> { |
1521 | #[inline ] |
1522 | fn from(input: Connection) -> Self { |
1523 | Some(input.0) |
1524 | } |
1525 | } |
1526 | impl From<Connection> for u16 { |
1527 | #[inline ] |
1528 | fn from(input: Connection) -> Self { |
1529 | u16::from(input.0) |
1530 | } |
1531 | } |
1532 | impl From<Connection> for Option<u16> { |
1533 | #[inline ] |
1534 | fn from(input: Connection) -> Self { |
1535 | Some(u16::from(input.0)) |
1536 | } |
1537 | } |
1538 | impl From<Connection> for u32 { |
1539 | #[inline ] |
1540 | fn from(input: Connection) -> Self { |
1541 | u32::from(input.0) |
1542 | } |
1543 | } |
1544 | impl From<Connection> for Option<u32> { |
1545 | #[inline ] |
1546 | fn from(input: Connection) -> Self { |
1547 | Some(u32::from(input.0)) |
1548 | } |
1549 | } |
1550 | impl From<u8> for Connection { |
1551 | #[inline ] |
1552 | fn from(value: u8) -> Self { |
1553 | Self(value) |
1554 | } |
1555 | } |
1556 | impl core::fmt::Debug for Connection { |
1557 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
1558 | let variants: [(u32, &str, &str); 3] = [ |
1559 | (Self::CONNECTED.0.into(), "CONNECTED" , "Connected" ), |
1560 | (Self::DISCONNECTED.0.into(), "DISCONNECTED" , "Disconnected" ), |
1561 | (Self::UNKNOWN.0.into(), "UNKNOWN" , "Unknown" ), |
1562 | ]; |
1563 | pretty_print_enum(fmt, self.0.into(), &variants) |
1564 | } |
1565 | } |
1566 | |
1567 | /// Opcode for the GetOutputInfo request |
1568 | pub const GET_OUTPUT_INFO_REQUEST: u8 = 9; |
1569 | #[derive (Clone, Copy, Default)] |
1570 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1571 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1572 | pub struct GetOutputInfoRequest { |
1573 | pub output: Output, |
1574 | pub config_timestamp: xproto::Timestamp, |
1575 | } |
1576 | impl_debug_if_no_extra_traits!(GetOutputInfoRequest, "GetOutputInfoRequest" ); |
1577 | impl GetOutputInfoRequest { |
1578 | /// Serialize this request into bytes for the provided connection |
1579 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
1580 | let length_so_far = 0; |
1581 | let output_bytes = self.output.serialize(); |
1582 | let config_timestamp_bytes = self.config_timestamp.serialize(); |
1583 | let mut request0 = vec![ |
1584 | major_opcode, |
1585 | GET_OUTPUT_INFO_REQUEST, |
1586 | 0, |
1587 | 0, |
1588 | output_bytes[0], |
1589 | output_bytes[1], |
1590 | output_bytes[2], |
1591 | output_bytes[3], |
1592 | config_timestamp_bytes[0], |
1593 | config_timestamp_bytes[1], |
1594 | config_timestamp_bytes[2], |
1595 | config_timestamp_bytes[3], |
1596 | ]; |
1597 | let length_so_far = length_so_far + request0.len(); |
1598 | assert_eq!(length_so_far % 4, 0); |
1599 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
1600 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
1601 | ([request0.into()], vec![]) |
1602 | } |
1603 | /// Parse this request given its header, its body, and any fds that go along with it |
1604 | #[cfg (feature = "request-parsing" )] |
1605 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
1606 | if header.minor_opcode != GET_OUTPUT_INFO_REQUEST { |
1607 | return Err(ParseError::InvalidValue); |
1608 | } |
1609 | let (output, remaining) = Output::try_parse(value)?; |
1610 | let (config_timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
1611 | let _ = remaining; |
1612 | Ok(GetOutputInfoRequest { |
1613 | output, |
1614 | config_timestamp, |
1615 | }) |
1616 | } |
1617 | } |
1618 | impl Request for GetOutputInfoRequest { |
1619 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
1620 | |
1621 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
1622 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
1623 | // Flatten the buffers into a single vector |
1624 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
1625 | (buf, fds) |
1626 | } |
1627 | } |
1628 | impl crate::x11_utils::ReplyRequest for GetOutputInfoRequest { |
1629 | type Reply = GetOutputInfoReply; |
1630 | } |
1631 | |
1632 | #[derive (Clone, Default)] |
1633 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1634 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1635 | pub struct GetOutputInfoReply { |
1636 | pub status: SetConfig, |
1637 | pub sequence: u16, |
1638 | pub length: u32, |
1639 | pub timestamp: xproto::Timestamp, |
1640 | pub crtc: Crtc, |
1641 | pub mm_width: u32, |
1642 | pub mm_height: u32, |
1643 | pub connection: Connection, |
1644 | pub subpixel_order: render::SubPixel, |
1645 | pub num_preferred: u16, |
1646 | pub crtcs: Vec<Crtc>, |
1647 | pub modes: Vec<Mode>, |
1648 | pub clones: Vec<Output>, |
1649 | pub name: Vec<u8>, |
1650 | } |
1651 | impl_debug_if_no_extra_traits!(GetOutputInfoReply, "GetOutputInfoReply" ); |
1652 | impl TryParse for GetOutputInfoReply { |
1653 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
1654 | let remaining = initial_value; |
1655 | let (response_type, remaining) = u8::try_parse(remaining)?; |
1656 | let (status, remaining) = u8::try_parse(remaining)?; |
1657 | let (sequence, remaining) = u16::try_parse(remaining)?; |
1658 | let (length, remaining) = u32::try_parse(remaining)?; |
1659 | let (timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
1660 | let (crtc, remaining) = Crtc::try_parse(remaining)?; |
1661 | let (mm_width, remaining) = u32::try_parse(remaining)?; |
1662 | let (mm_height, remaining) = u32::try_parse(remaining)?; |
1663 | let (connection, remaining) = u8::try_parse(remaining)?; |
1664 | let (subpixel_order, remaining) = u8::try_parse(remaining)?; |
1665 | let (num_crtcs, remaining) = u16::try_parse(remaining)?; |
1666 | let (num_modes, remaining) = u16::try_parse(remaining)?; |
1667 | let (num_preferred, remaining) = u16::try_parse(remaining)?; |
1668 | let (num_clones, remaining) = u16::try_parse(remaining)?; |
1669 | let (name_len, remaining) = u16::try_parse(remaining)?; |
1670 | let (crtcs, remaining) = crate::x11_utils::parse_list::<Crtc>(remaining, num_crtcs.try_to_usize()?)?; |
1671 | let (modes, remaining) = crate::x11_utils::parse_list::<Mode>(remaining, num_modes.try_to_usize()?)?; |
1672 | let (clones, remaining) = crate::x11_utils::parse_list::<Output>(remaining, num_clones.try_to_usize()?)?; |
1673 | let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_len.try_to_usize()?)?; |
1674 | let name = name.to_vec(); |
1675 | if response_type != 1 { |
1676 | return Err(ParseError::InvalidValue); |
1677 | } |
1678 | let status = status.into(); |
1679 | let connection = connection.into(); |
1680 | let subpixel_order = subpixel_order.into(); |
1681 | let result = GetOutputInfoReply { status, sequence, length, timestamp, crtc, mm_width, mm_height, connection, subpixel_order, num_preferred, crtcs, modes, clones, name }; |
1682 | let _ = remaining; |
1683 | let remaining = initial_value.get(32 + length as usize * 4..) |
1684 | .ok_or(ParseError::InsufficientData)?; |
1685 | Ok((result, remaining)) |
1686 | } |
1687 | } |
1688 | impl Serialize for GetOutputInfoReply { |
1689 | type Bytes = Vec<u8>; |
1690 | fn serialize(&self) -> Vec<u8> { |
1691 | let mut result = Vec::new(); |
1692 | self.serialize_into(&mut result); |
1693 | result |
1694 | } |
1695 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
1696 | bytes.reserve(36); |
1697 | let response_type_bytes = &[1]; |
1698 | bytes.push(response_type_bytes[0]); |
1699 | u8::from(self.status).serialize_into(bytes); |
1700 | self.sequence.serialize_into(bytes); |
1701 | self.length.serialize_into(bytes); |
1702 | self.timestamp.serialize_into(bytes); |
1703 | self.crtc.serialize_into(bytes); |
1704 | self.mm_width.serialize_into(bytes); |
1705 | self.mm_height.serialize_into(bytes); |
1706 | u8::from(self.connection).serialize_into(bytes); |
1707 | (u32::from(self.subpixel_order) as u8).serialize_into(bytes); |
1708 | let num_crtcs = u16::try_from(self.crtcs.len()).expect("`crtcs` has too many elements" ); |
1709 | num_crtcs.serialize_into(bytes); |
1710 | let num_modes = u16::try_from(self.modes.len()).expect("`modes` has too many elements" ); |
1711 | num_modes.serialize_into(bytes); |
1712 | self.num_preferred.serialize_into(bytes); |
1713 | let num_clones = u16::try_from(self.clones.len()).expect("`clones` has too many elements" ); |
1714 | num_clones.serialize_into(bytes); |
1715 | let name_len = u16::try_from(self.name.len()).expect("`name` has too many elements" ); |
1716 | name_len.serialize_into(bytes); |
1717 | self.crtcs.serialize_into(bytes); |
1718 | self.modes.serialize_into(bytes); |
1719 | self.clones.serialize_into(bytes); |
1720 | bytes.extend_from_slice(&self.name); |
1721 | } |
1722 | } |
1723 | impl GetOutputInfoReply { |
1724 | /// Get the value of the `num_crtcs` field. |
1725 | /// |
1726 | /// The `num_crtcs` field is used as the length field of the `crtcs` field. |
1727 | /// This function computes the field's value again based on the length of the list. |
1728 | /// |
1729 | /// # Panics |
1730 | /// |
1731 | /// Panics if the value cannot be represented in the target type. This |
1732 | /// cannot happen with values of the struct received from the X11 server. |
1733 | pub fn num_crtcs(&self) -> u16 { |
1734 | self.crtcs.len() |
1735 | .try_into().unwrap() |
1736 | } |
1737 | /// Get the value of the `num_modes` field. |
1738 | /// |
1739 | /// The `num_modes` field is used as the length field of the `modes` field. |
1740 | /// This function computes the field's value again based on the length of the list. |
1741 | /// |
1742 | /// # Panics |
1743 | /// |
1744 | /// Panics if the value cannot be represented in the target type. This |
1745 | /// cannot happen with values of the struct received from the X11 server. |
1746 | pub fn num_modes(&self) -> u16 { |
1747 | self.modes.len() |
1748 | .try_into().unwrap() |
1749 | } |
1750 | /// Get the value of the `num_clones` field. |
1751 | /// |
1752 | /// The `num_clones` field is used as the length field of the `clones` field. |
1753 | /// This function computes the field's value again based on the length of the list. |
1754 | /// |
1755 | /// # Panics |
1756 | /// |
1757 | /// Panics if the value cannot be represented in the target type. This |
1758 | /// cannot happen with values of the struct received from the X11 server. |
1759 | pub fn num_clones(&self) -> u16 { |
1760 | self.clones.len() |
1761 | .try_into().unwrap() |
1762 | } |
1763 | /// Get the value of the `name_len` field. |
1764 | /// |
1765 | /// The `name_len` field is used as the length field of the `name` field. |
1766 | /// This function computes the field's value again based on the length of the list. |
1767 | /// |
1768 | /// # Panics |
1769 | /// |
1770 | /// Panics if the value cannot be represented in the target type. This |
1771 | /// cannot happen with values of the struct received from the X11 server. |
1772 | pub fn name_len(&self) -> u16 { |
1773 | self.name.len() |
1774 | .try_into().unwrap() |
1775 | } |
1776 | } |
1777 | |
1778 | /// Opcode for the ListOutputProperties request |
1779 | pub const LIST_OUTPUT_PROPERTIES_REQUEST: u8 = 10; |
1780 | #[derive (Clone, Copy, Default)] |
1781 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1782 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1783 | pub struct ListOutputPropertiesRequest { |
1784 | pub output: Output, |
1785 | } |
1786 | impl_debug_if_no_extra_traits!(ListOutputPropertiesRequest, "ListOutputPropertiesRequest" ); |
1787 | impl ListOutputPropertiesRequest { |
1788 | /// Serialize this request into bytes for the provided connection |
1789 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
1790 | let length_so_far = 0; |
1791 | let output_bytes = self.output.serialize(); |
1792 | let mut request0 = vec![ |
1793 | major_opcode, |
1794 | LIST_OUTPUT_PROPERTIES_REQUEST, |
1795 | 0, |
1796 | 0, |
1797 | output_bytes[0], |
1798 | output_bytes[1], |
1799 | output_bytes[2], |
1800 | output_bytes[3], |
1801 | ]; |
1802 | let length_so_far = length_so_far + request0.len(); |
1803 | assert_eq!(length_so_far % 4, 0); |
1804 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
1805 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
1806 | ([request0.into()], vec![]) |
1807 | } |
1808 | /// Parse this request given its header, its body, and any fds that go along with it |
1809 | #[cfg (feature = "request-parsing" )] |
1810 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
1811 | if header.minor_opcode != LIST_OUTPUT_PROPERTIES_REQUEST { |
1812 | return Err(ParseError::InvalidValue); |
1813 | } |
1814 | let (output, remaining) = Output::try_parse(value)?; |
1815 | let _ = remaining; |
1816 | Ok(ListOutputPropertiesRequest { |
1817 | output, |
1818 | }) |
1819 | } |
1820 | } |
1821 | impl Request for ListOutputPropertiesRequest { |
1822 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
1823 | |
1824 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
1825 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
1826 | // Flatten the buffers into a single vector |
1827 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
1828 | (buf, fds) |
1829 | } |
1830 | } |
1831 | impl crate::x11_utils::ReplyRequest for ListOutputPropertiesRequest { |
1832 | type Reply = ListOutputPropertiesReply; |
1833 | } |
1834 | |
1835 | #[derive (Clone, Default)] |
1836 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1837 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1838 | pub struct ListOutputPropertiesReply { |
1839 | pub sequence: u16, |
1840 | pub length: u32, |
1841 | pub atoms: Vec<xproto::Atom>, |
1842 | } |
1843 | impl_debug_if_no_extra_traits!(ListOutputPropertiesReply, "ListOutputPropertiesReply" ); |
1844 | impl TryParse for ListOutputPropertiesReply { |
1845 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
1846 | let remaining: &[u8] = initial_value; |
1847 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
1848 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
1849 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1850 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
1851 | let (num_atoms: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1852 | let remaining: &[u8] = remaining.get(22..).ok_or(err:ParseError::InsufficientData)?; |
1853 | let (atoms: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<xproto::Atom>(data:remaining, list_length:num_atoms.try_to_usize()?)?; |
1854 | if response_type != 1 { |
1855 | return Err(ParseError::InvalidValue); |
1856 | } |
1857 | let result: ListOutputPropertiesReply = ListOutputPropertiesReply { sequence, length, atoms }; |
1858 | let _ = remaining; |
1859 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
1860 | .ok_or(err:ParseError::InsufficientData)?; |
1861 | Ok((result, remaining)) |
1862 | } |
1863 | } |
1864 | impl Serialize for ListOutputPropertiesReply { |
1865 | type Bytes = Vec<u8>; |
1866 | fn serialize(&self) -> Vec<u8> { |
1867 | let mut result: Vec = Vec::new(); |
1868 | self.serialize_into(&mut result); |
1869 | result |
1870 | } |
1871 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
1872 | bytes.reserve(additional:32); |
1873 | let response_type_bytes: &[u8; 1] = &[1]; |
1874 | bytes.push(response_type_bytes[0]); |
1875 | bytes.extend_from_slice(&[0; 1]); |
1876 | self.sequence.serialize_into(bytes); |
1877 | self.length.serialize_into(bytes); |
1878 | let num_atoms: u16 = u16::try_from(self.atoms.len()).expect(msg:"`atoms` has too many elements" ); |
1879 | num_atoms.serialize_into(bytes); |
1880 | bytes.extend_from_slice(&[0; 22]); |
1881 | self.atoms.serialize_into(bytes); |
1882 | } |
1883 | } |
1884 | impl ListOutputPropertiesReply { |
1885 | /// Get the value of the `num_atoms` field. |
1886 | /// |
1887 | /// The `num_atoms` field is used as the length field of the `atoms` field. |
1888 | /// This function computes the field's value again based on the length of the list. |
1889 | /// |
1890 | /// # Panics |
1891 | /// |
1892 | /// Panics if the value cannot be represented in the target type. This |
1893 | /// cannot happen with values of the struct received from the X11 server. |
1894 | pub fn num_atoms(&self) -> u16 { |
1895 | self.atoms.len() |
1896 | .try_into().unwrap() |
1897 | } |
1898 | } |
1899 | |
1900 | /// Opcode for the QueryOutputProperty request |
1901 | pub const QUERY_OUTPUT_PROPERTY_REQUEST: u8 = 11; |
1902 | #[derive (Clone, Copy, Default)] |
1903 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1904 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1905 | pub struct QueryOutputPropertyRequest { |
1906 | pub output: Output, |
1907 | pub property: xproto::Atom, |
1908 | } |
1909 | impl_debug_if_no_extra_traits!(QueryOutputPropertyRequest, "QueryOutputPropertyRequest" ); |
1910 | impl QueryOutputPropertyRequest { |
1911 | /// Serialize this request into bytes for the provided connection |
1912 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
1913 | let length_so_far = 0; |
1914 | let output_bytes = self.output.serialize(); |
1915 | let property_bytes = self.property.serialize(); |
1916 | let mut request0 = vec![ |
1917 | major_opcode, |
1918 | QUERY_OUTPUT_PROPERTY_REQUEST, |
1919 | 0, |
1920 | 0, |
1921 | output_bytes[0], |
1922 | output_bytes[1], |
1923 | output_bytes[2], |
1924 | output_bytes[3], |
1925 | property_bytes[0], |
1926 | property_bytes[1], |
1927 | property_bytes[2], |
1928 | property_bytes[3], |
1929 | ]; |
1930 | let length_so_far = length_so_far + request0.len(); |
1931 | assert_eq!(length_so_far % 4, 0); |
1932 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
1933 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
1934 | ([request0.into()], vec![]) |
1935 | } |
1936 | /// Parse this request given its header, its body, and any fds that go along with it |
1937 | #[cfg (feature = "request-parsing" )] |
1938 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
1939 | if header.minor_opcode != QUERY_OUTPUT_PROPERTY_REQUEST { |
1940 | return Err(ParseError::InvalidValue); |
1941 | } |
1942 | let (output, remaining) = Output::try_parse(value)?; |
1943 | let (property, remaining) = xproto::Atom::try_parse(remaining)?; |
1944 | let _ = remaining; |
1945 | Ok(QueryOutputPropertyRequest { |
1946 | output, |
1947 | property, |
1948 | }) |
1949 | } |
1950 | } |
1951 | impl Request for QueryOutputPropertyRequest { |
1952 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
1953 | |
1954 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
1955 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
1956 | // Flatten the buffers into a single vector |
1957 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
1958 | (buf, fds) |
1959 | } |
1960 | } |
1961 | impl crate::x11_utils::ReplyRequest for QueryOutputPropertyRequest { |
1962 | type Reply = QueryOutputPropertyReply; |
1963 | } |
1964 | |
1965 | #[derive (Clone, Default)] |
1966 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1967 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1968 | pub struct QueryOutputPropertyReply { |
1969 | pub sequence: u16, |
1970 | pub pending: bool, |
1971 | pub range: bool, |
1972 | pub immutable: bool, |
1973 | pub valid_values: Vec<i32>, |
1974 | } |
1975 | impl_debug_if_no_extra_traits!(QueryOutputPropertyReply, "QueryOutputPropertyReply" ); |
1976 | impl TryParse for QueryOutputPropertyReply { |
1977 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
1978 | let remaining: &[u8] = initial_value; |
1979 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
1980 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
1981 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1982 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
1983 | let (pending: bool, remaining: &[u8]) = bool::try_parse(remaining)?; |
1984 | let (range: bool, remaining: &[u8]) = bool::try_parse(remaining)?; |
1985 | let (immutable: bool, remaining: &[u8]) = bool::try_parse(remaining)?; |
1986 | let remaining: &[u8] = remaining.get(21..).ok_or(err:ParseError::InsufficientData)?; |
1987 | let (valid_values: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<i32>(data:remaining, list_length:length.try_to_usize()?)?; |
1988 | if response_type != 1 { |
1989 | return Err(ParseError::InvalidValue); |
1990 | } |
1991 | let result: QueryOutputPropertyReply = QueryOutputPropertyReply { sequence, pending, range, immutable, valid_values }; |
1992 | let _ = remaining; |
1993 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
1994 | .ok_or(err:ParseError::InsufficientData)?; |
1995 | Ok((result, remaining)) |
1996 | } |
1997 | } |
1998 | impl Serialize for QueryOutputPropertyReply { |
1999 | type Bytes = Vec<u8>; |
2000 | fn serialize(&self) -> Vec<u8> { |
2001 | let mut result: Vec = Vec::new(); |
2002 | self.serialize_into(&mut result); |
2003 | result |
2004 | } |
2005 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
2006 | bytes.reserve(additional:32); |
2007 | let response_type_bytes: &[u8; 1] = &[1]; |
2008 | bytes.push(response_type_bytes[0]); |
2009 | bytes.extend_from_slice(&[0; 1]); |
2010 | self.sequence.serialize_into(bytes); |
2011 | let length: u32 = u32::try_from(self.valid_values.len()).expect(msg:"`valid_values` has too many elements" ); |
2012 | length.serialize_into(bytes); |
2013 | self.pending.serialize_into(bytes); |
2014 | self.range.serialize_into(bytes); |
2015 | self.immutable.serialize_into(bytes); |
2016 | bytes.extend_from_slice(&[0; 21]); |
2017 | self.valid_values.serialize_into(bytes); |
2018 | } |
2019 | } |
2020 | impl QueryOutputPropertyReply { |
2021 | /// Get the value of the `length` field. |
2022 | /// |
2023 | /// The `length` field is used as the length field of the `validValues` field. |
2024 | /// This function computes the field's value again based on the length of the list. |
2025 | /// |
2026 | /// # Panics |
2027 | /// |
2028 | /// Panics if the value cannot be represented in the target type. This |
2029 | /// cannot happen with values of the struct received from the X11 server. |
2030 | pub fn length(&self) -> u32 { |
2031 | self.valid_values.len() |
2032 | .try_into().unwrap() |
2033 | } |
2034 | } |
2035 | |
2036 | /// Opcode for the ConfigureOutputProperty request |
2037 | pub const CONFIGURE_OUTPUT_PROPERTY_REQUEST: u8 = 12; |
2038 | #[derive (Clone, Default)] |
2039 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2040 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2041 | pub struct ConfigureOutputPropertyRequest<'input> { |
2042 | pub output: Output, |
2043 | pub property: xproto::Atom, |
2044 | pub pending: bool, |
2045 | pub range: bool, |
2046 | pub values: Cow<'input, [i32]>, |
2047 | } |
2048 | impl_debug_if_no_extra_traits!(ConfigureOutputPropertyRequest<'_>, "ConfigureOutputPropertyRequest" ); |
2049 | impl<'input> ConfigureOutputPropertyRequest<'input> { |
2050 | /// Serialize this request into bytes for the provided connection |
2051 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
2052 | let length_so_far = 0; |
2053 | let output_bytes = self.output.serialize(); |
2054 | let property_bytes = self.property.serialize(); |
2055 | let pending_bytes = self.pending.serialize(); |
2056 | let range_bytes = self.range.serialize(); |
2057 | let mut request0 = vec![ |
2058 | major_opcode, |
2059 | CONFIGURE_OUTPUT_PROPERTY_REQUEST, |
2060 | 0, |
2061 | 0, |
2062 | output_bytes[0], |
2063 | output_bytes[1], |
2064 | output_bytes[2], |
2065 | output_bytes[3], |
2066 | property_bytes[0], |
2067 | property_bytes[1], |
2068 | property_bytes[2], |
2069 | property_bytes[3], |
2070 | pending_bytes[0], |
2071 | range_bytes[0], |
2072 | 0, |
2073 | 0, |
2074 | ]; |
2075 | let length_so_far = length_so_far + request0.len(); |
2076 | let values_bytes = self.values.serialize(); |
2077 | let length_so_far = length_so_far + values_bytes.len(); |
2078 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
2079 | let length_so_far = length_so_far + padding0.len(); |
2080 | assert_eq!(length_so_far % 4, 0); |
2081 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2082 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2083 | ([request0.into(), values_bytes.into(), padding0.into()], vec![]) |
2084 | } |
2085 | /// Parse this request given its header, its body, and any fds that go along with it |
2086 | #[cfg (feature = "request-parsing" )] |
2087 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
2088 | if header.minor_opcode != CONFIGURE_OUTPUT_PROPERTY_REQUEST { |
2089 | return Err(ParseError::InvalidValue); |
2090 | } |
2091 | let (output, remaining) = Output::try_parse(value)?; |
2092 | let (property, remaining) = xproto::Atom::try_parse(remaining)?; |
2093 | let (pending, remaining) = bool::try_parse(remaining)?; |
2094 | let (range, remaining) = bool::try_parse(remaining)?; |
2095 | let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?; |
2096 | let mut remaining = remaining; |
2097 | // Length is 'everything left in the input' |
2098 | let mut values = Vec::new(); |
2099 | while !remaining.is_empty() { |
2100 | let (v, new_remaining) = i32::try_parse(remaining)?; |
2101 | remaining = new_remaining; |
2102 | values.push(v); |
2103 | } |
2104 | let _ = remaining; |
2105 | Ok(ConfigureOutputPropertyRequest { |
2106 | output, |
2107 | property, |
2108 | pending, |
2109 | range, |
2110 | values: Cow::Owned(values), |
2111 | }) |
2112 | } |
2113 | /// Clone all borrowed data in this ConfigureOutputPropertyRequest. |
2114 | pub fn into_owned(self) -> ConfigureOutputPropertyRequest<'static> { |
2115 | ConfigureOutputPropertyRequest { |
2116 | output: self.output, |
2117 | property: self.property, |
2118 | pending: self.pending, |
2119 | range: self.range, |
2120 | values: Cow::Owned(self.values.into_owned()), |
2121 | } |
2122 | } |
2123 | } |
2124 | impl<'input> Request for ConfigureOutputPropertyRequest<'input> { |
2125 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
2126 | |
2127 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
2128 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
2129 | // Flatten the buffers into a single vector |
2130 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
2131 | (buf, fds) |
2132 | } |
2133 | } |
2134 | impl<'input> crate::x11_utils::VoidRequest for ConfigureOutputPropertyRequest<'input> { |
2135 | } |
2136 | |
2137 | /// Opcode for the ChangeOutputProperty request |
2138 | pub const CHANGE_OUTPUT_PROPERTY_REQUEST: u8 = 13; |
2139 | #[derive (Clone, Default)] |
2140 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2141 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2142 | pub struct ChangeOutputPropertyRequest<'input> { |
2143 | pub output: Output, |
2144 | pub property: xproto::Atom, |
2145 | pub type_: xproto::Atom, |
2146 | pub format: u8, |
2147 | pub mode: xproto::PropMode, |
2148 | pub num_units: u32, |
2149 | pub data: Cow<'input, [u8]>, |
2150 | } |
2151 | impl_debug_if_no_extra_traits!(ChangeOutputPropertyRequest<'_>, "ChangeOutputPropertyRequest" ); |
2152 | impl<'input> ChangeOutputPropertyRequest<'input> { |
2153 | /// Serialize this request into bytes for the provided connection |
2154 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
2155 | let length_so_far = 0; |
2156 | let output_bytes = self.output.serialize(); |
2157 | let property_bytes = self.property.serialize(); |
2158 | let type_bytes = self.type_.serialize(); |
2159 | let format_bytes = self.format.serialize(); |
2160 | let mode_bytes = u8::from(self.mode).serialize(); |
2161 | let num_units_bytes = self.num_units.serialize(); |
2162 | let mut request0 = vec![ |
2163 | major_opcode, |
2164 | CHANGE_OUTPUT_PROPERTY_REQUEST, |
2165 | 0, |
2166 | 0, |
2167 | output_bytes[0], |
2168 | output_bytes[1], |
2169 | output_bytes[2], |
2170 | output_bytes[3], |
2171 | property_bytes[0], |
2172 | property_bytes[1], |
2173 | property_bytes[2], |
2174 | property_bytes[3], |
2175 | type_bytes[0], |
2176 | type_bytes[1], |
2177 | type_bytes[2], |
2178 | type_bytes[3], |
2179 | format_bytes[0], |
2180 | mode_bytes[0], |
2181 | 0, |
2182 | 0, |
2183 | num_units_bytes[0], |
2184 | num_units_bytes[1], |
2185 | num_units_bytes[2], |
2186 | num_units_bytes[3], |
2187 | ]; |
2188 | let length_so_far = length_so_far + request0.len(); |
2189 | assert_eq!(self.data.len(), usize::try_from(u32::from(self.num_units).checked_mul(u32::from(self.format)).unwrap().checked_div(8u32).unwrap()).unwrap(), "`data` has an incorrect length" ); |
2190 | let length_so_far = length_so_far + self.data.len(); |
2191 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
2192 | let length_so_far = length_so_far + padding0.len(); |
2193 | assert_eq!(length_so_far % 4, 0); |
2194 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2195 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2196 | ([request0.into(), self.data, padding0.into()], vec![]) |
2197 | } |
2198 | /// Parse this request given its header, its body, and any fds that go along with it |
2199 | #[cfg (feature = "request-parsing" )] |
2200 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
2201 | if header.minor_opcode != CHANGE_OUTPUT_PROPERTY_REQUEST { |
2202 | return Err(ParseError::InvalidValue); |
2203 | } |
2204 | let (output, remaining) = Output::try_parse(value)?; |
2205 | let (property, remaining) = xproto::Atom::try_parse(remaining)?; |
2206 | let (type_, remaining) = xproto::Atom::try_parse(remaining)?; |
2207 | let (format, remaining) = u8::try_parse(remaining)?; |
2208 | let (mode, remaining) = u8::try_parse(remaining)?; |
2209 | let mode = mode.into(); |
2210 | let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?; |
2211 | let (num_units, remaining) = u32::try_parse(remaining)?; |
2212 | let (data, remaining) = crate::x11_utils::parse_u8_list(remaining, u32::from(num_units).checked_mul(u32::from(format)).ok_or(ParseError::InvalidExpression)?.checked_div(8u32).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?; |
2213 | let _ = remaining; |
2214 | Ok(ChangeOutputPropertyRequest { |
2215 | output, |
2216 | property, |
2217 | type_, |
2218 | format, |
2219 | mode, |
2220 | num_units, |
2221 | data: Cow::Borrowed(data), |
2222 | }) |
2223 | } |
2224 | /// Clone all borrowed data in this ChangeOutputPropertyRequest. |
2225 | pub fn into_owned(self) -> ChangeOutputPropertyRequest<'static> { |
2226 | ChangeOutputPropertyRequest { |
2227 | output: self.output, |
2228 | property: self.property, |
2229 | type_: self.type_, |
2230 | format: self.format, |
2231 | mode: self.mode, |
2232 | num_units: self.num_units, |
2233 | data: Cow::Owned(self.data.into_owned()), |
2234 | } |
2235 | } |
2236 | } |
2237 | impl<'input> Request for ChangeOutputPropertyRequest<'input> { |
2238 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
2239 | |
2240 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
2241 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
2242 | // Flatten the buffers into a single vector |
2243 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
2244 | (buf, fds) |
2245 | } |
2246 | } |
2247 | impl<'input> crate::x11_utils::VoidRequest for ChangeOutputPropertyRequest<'input> { |
2248 | } |
2249 | |
2250 | /// Opcode for the DeleteOutputProperty request |
2251 | pub const DELETE_OUTPUT_PROPERTY_REQUEST: u8 = 14; |
2252 | #[derive (Clone, Copy, Default)] |
2253 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2254 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2255 | pub struct DeleteOutputPropertyRequest { |
2256 | pub output: Output, |
2257 | pub property: xproto::Atom, |
2258 | } |
2259 | impl_debug_if_no_extra_traits!(DeleteOutputPropertyRequest, "DeleteOutputPropertyRequest" ); |
2260 | impl DeleteOutputPropertyRequest { |
2261 | /// Serialize this request into bytes for the provided connection |
2262 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
2263 | let length_so_far = 0; |
2264 | let output_bytes = self.output.serialize(); |
2265 | let property_bytes = self.property.serialize(); |
2266 | let mut request0 = vec![ |
2267 | major_opcode, |
2268 | DELETE_OUTPUT_PROPERTY_REQUEST, |
2269 | 0, |
2270 | 0, |
2271 | output_bytes[0], |
2272 | output_bytes[1], |
2273 | output_bytes[2], |
2274 | output_bytes[3], |
2275 | property_bytes[0], |
2276 | property_bytes[1], |
2277 | property_bytes[2], |
2278 | property_bytes[3], |
2279 | ]; |
2280 | let length_so_far = length_so_far + request0.len(); |
2281 | assert_eq!(length_so_far % 4, 0); |
2282 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2283 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2284 | ([request0.into()], vec![]) |
2285 | } |
2286 | /// Parse this request given its header, its body, and any fds that go along with it |
2287 | #[cfg (feature = "request-parsing" )] |
2288 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
2289 | if header.minor_opcode != DELETE_OUTPUT_PROPERTY_REQUEST { |
2290 | return Err(ParseError::InvalidValue); |
2291 | } |
2292 | let (output, remaining) = Output::try_parse(value)?; |
2293 | let (property, remaining) = xproto::Atom::try_parse(remaining)?; |
2294 | let _ = remaining; |
2295 | Ok(DeleteOutputPropertyRequest { |
2296 | output, |
2297 | property, |
2298 | }) |
2299 | } |
2300 | } |
2301 | impl Request for DeleteOutputPropertyRequest { |
2302 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
2303 | |
2304 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
2305 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
2306 | // Flatten the buffers into a single vector |
2307 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
2308 | (buf, fds) |
2309 | } |
2310 | } |
2311 | impl crate::x11_utils::VoidRequest for DeleteOutputPropertyRequest { |
2312 | } |
2313 | |
2314 | /// Opcode for the GetOutputProperty request |
2315 | pub const GET_OUTPUT_PROPERTY_REQUEST: u8 = 15; |
2316 | #[derive (Clone, Copy, Default)] |
2317 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2318 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2319 | pub struct GetOutputPropertyRequest { |
2320 | pub output: Output, |
2321 | pub property: xproto::Atom, |
2322 | pub type_: xproto::Atom, |
2323 | pub long_offset: u32, |
2324 | pub long_length: u32, |
2325 | pub delete: bool, |
2326 | pub pending: bool, |
2327 | } |
2328 | impl_debug_if_no_extra_traits!(GetOutputPropertyRequest, "GetOutputPropertyRequest" ); |
2329 | impl GetOutputPropertyRequest { |
2330 | /// Serialize this request into bytes for the provided connection |
2331 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
2332 | let length_so_far = 0; |
2333 | let output_bytes = self.output.serialize(); |
2334 | let property_bytes = self.property.serialize(); |
2335 | let type_bytes = self.type_.serialize(); |
2336 | let long_offset_bytes = self.long_offset.serialize(); |
2337 | let long_length_bytes = self.long_length.serialize(); |
2338 | let delete_bytes = self.delete.serialize(); |
2339 | let pending_bytes = self.pending.serialize(); |
2340 | let mut request0 = vec![ |
2341 | major_opcode, |
2342 | GET_OUTPUT_PROPERTY_REQUEST, |
2343 | 0, |
2344 | 0, |
2345 | output_bytes[0], |
2346 | output_bytes[1], |
2347 | output_bytes[2], |
2348 | output_bytes[3], |
2349 | property_bytes[0], |
2350 | property_bytes[1], |
2351 | property_bytes[2], |
2352 | property_bytes[3], |
2353 | type_bytes[0], |
2354 | type_bytes[1], |
2355 | type_bytes[2], |
2356 | type_bytes[3], |
2357 | long_offset_bytes[0], |
2358 | long_offset_bytes[1], |
2359 | long_offset_bytes[2], |
2360 | long_offset_bytes[3], |
2361 | long_length_bytes[0], |
2362 | long_length_bytes[1], |
2363 | long_length_bytes[2], |
2364 | long_length_bytes[3], |
2365 | delete_bytes[0], |
2366 | pending_bytes[0], |
2367 | 0, |
2368 | 0, |
2369 | ]; |
2370 | let length_so_far = length_so_far + request0.len(); |
2371 | assert_eq!(length_so_far % 4, 0); |
2372 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2373 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2374 | ([request0.into()], vec![]) |
2375 | } |
2376 | /// Parse this request given its header, its body, and any fds that go along with it |
2377 | #[cfg (feature = "request-parsing" )] |
2378 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
2379 | if header.minor_opcode != GET_OUTPUT_PROPERTY_REQUEST { |
2380 | return Err(ParseError::InvalidValue); |
2381 | } |
2382 | let (output, remaining) = Output::try_parse(value)?; |
2383 | let (property, remaining) = xproto::Atom::try_parse(remaining)?; |
2384 | let (type_, remaining) = xproto::Atom::try_parse(remaining)?; |
2385 | let (long_offset, remaining) = u32::try_parse(remaining)?; |
2386 | let (long_length, remaining) = u32::try_parse(remaining)?; |
2387 | let (delete, remaining) = bool::try_parse(remaining)?; |
2388 | let (pending, remaining) = bool::try_parse(remaining)?; |
2389 | let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?; |
2390 | let _ = remaining; |
2391 | Ok(GetOutputPropertyRequest { |
2392 | output, |
2393 | property, |
2394 | type_, |
2395 | long_offset, |
2396 | long_length, |
2397 | delete, |
2398 | pending, |
2399 | }) |
2400 | } |
2401 | } |
2402 | impl Request for GetOutputPropertyRequest { |
2403 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
2404 | |
2405 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
2406 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
2407 | // Flatten the buffers into a single vector |
2408 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
2409 | (buf, fds) |
2410 | } |
2411 | } |
2412 | impl crate::x11_utils::ReplyRequest for GetOutputPropertyRequest { |
2413 | type Reply = GetOutputPropertyReply; |
2414 | } |
2415 | |
2416 | #[derive (Clone, Default)] |
2417 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2418 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2419 | pub struct GetOutputPropertyReply { |
2420 | pub format: u8, |
2421 | pub sequence: u16, |
2422 | pub length: u32, |
2423 | pub type_: xproto::Atom, |
2424 | pub bytes_after: u32, |
2425 | pub num_items: u32, |
2426 | pub data: Vec<u8>, |
2427 | } |
2428 | impl_debug_if_no_extra_traits!(GetOutputPropertyReply, "GetOutputPropertyReply" ); |
2429 | impl TryParse for GetOutputPropertyReply { |
2430 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
2431 | let remaining: &[u8] = initial_value; |
2432 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
2433 | let (format: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
2434 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
2435 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
2436 | let (type_: u32, remaining: &[u8]) = xproto::Atom::try_parse(remaining)?; |
2437 | let (bytes_after: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
2438 | let (num_items: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
2439 | let remaining: &[u8] = remaining.get(12..).ok_or(err:ParseError::InsufficientData)?; |
2440 | let (data: &[u8], remaining: &[u8]) = crate::x11_utils::parse_u8_list(data:remaining, list_length:u32::from(num_items).checked_mul(u32::from(format).checked_div(8u32).ok_or(ParseError::InvalidExpression)?).ok_or(err:ParseError::InvalidExpression)?.try_to_usize()?)?; |
2441 | let data: Vec = data.to_vec(); |
2442 | if response_type != 1 { |
2443 | return Err(ParseError::InvalidValue); |
2444 | } |
2445 | let result: GetOutputPropertyReply = GetOutputPropertyReply { format, sequence, length, type_, bytes_after, num_items, data }; |
2446 | let _ = remaining; |
2447 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
2448 | .ok_or(err:ParseError::InsufficientData)?; |
2449 | Ok((result, remaining)) |
2450 | } |
2451 | } |
2452 | impl Serialize for GetOutputPropertyReply { |
2453 | type Bytes = Vec<u8>; |
2454 | fn serialize(&self) -> Vec<u8> { |
2455 | let mut result: Vec = Vec::new(); |
2456 | self.serialize_into(&mut result); |
2457 | result |
2458 | } |
2459 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
2460 | bytes.reserve(additional:32); |
2461 | let response_type_bytes: &[u8; 1] = &[1]; |
2462 | bytes.push(response_type_bytes[0]); |
2463 | self.format.serialize_into(bytes); |
2464 | self.sequence.serialize_into(bytes); |
2465 | self.length.serialize_into(bytes); |
2466 | self.type_.serialize_into(bytes); |
2467 | self.bytes_after.serialize_into(bytes); |
2468 | self.num_items.serialize_into(bytes); |
2469 | bytes.extend_from_slice(&[0; 12]); |
2470 | assert_eq!(self.data.len(), usize::try_from(u32::from(self.num_items).checked_mul(u32::from(self.format).checked_div(8u32).unwrap()).unwrap()).unwrap(), "`data` has an incorrect length" ); |
2471 | bytes.extend_from_slice(&self.data); |
2472 | } |
2473 | } |
2474 | |
2475 | /// Opcode for the CreateMode request |
2476 | pub const CREATE_MODE_REQUEST: u8 = 16; |
2477 | #[derive (Clone, Default)] |
2478 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2479 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2480 | pub struct CreateModeRequest<'input> { |
2481 | pub window: xproto::Window, |
2482 | pub mode_info: ModeInfo, |
2483 | pub name: Cow<'input, [u8]>, |
2484 | } |
2485 | impl_debug_if_no_extra_traits!(CreateModeRequest<'_>, "CreateModeRequest" ); |
2486 | impl<'input> CreateModeRequest<'input> { |
2487 | /// Serialize this request into bytes for the provided connection |
2488 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
2489 | let length_so_far = 0; |
2490 | let window_bytes = self.window.serialize(); |
2491 | let mode_info_bytes = self.mode_info.serialize(); |
2492 | let mut request0 = vec![ |
2493 | major_opcode, |
2494 | CREATE_MODE_REQUEST, |
2495 | 0, |
2496 | 0, |
2497 | window_bytes[0], |
2498 | window_bytes[1], |
2499 | window_bytes[2], |
2500 | window_bytes[3], |
2501 | mode_info_bytes[0], |
2502 | mode_info_bytes[1], |
2503 | mode_info_bytes[2], |
2504 | mode_info_bytes[3], |
2505 | mode_info_bytes[4], |
2506 | mode_info_bytes[5], |
2507 | mode_info_bytes[6], |
2508 | mode_info_bytes[7], |
2509 | mode_info_bytes[8], |
2510 | mode_info_bytes[9], |
2511 | mode_info_bytes[10], |
2512 | mode_info_bytes[11], |
2513 | mode_info_bytes[12], |
2514 | mode_info_bytes[13], |
2515 | mode_info_bytes[14], |
2516 | mode_info_bytes[15], |
2517 | mode_info_bytes[16], |
2518 | mode_info_bytes[17], |
2519 | mode_info_bytes[18], |
2520 | mode_info_bytes[19], |
2521 | mode_info_bytes[20], |
2522 | mode_info_bytes[21], |
2523 | mode_info_bytes[22], |
2524 | mode_info_bytes[23], |
2525 | mode_info_bytes[24], |
2526 | mode_info_bytes[25], |
2527 | mode_info_bytes[26], |
2528 | mode_info_bytes[27], |
2529 | mode_info_bytes[28], |
2530 | mode_info_bytes[29], |
2531 | mode_info_bytes[30], |
2532 | mode_info_bytes[31], |
2533 | ]; |
2534 | let length_so_far = length_so_far + request0.len(); |
2535 | let length_so_far = length_so_far + self.name.len(); |
2536 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
2537 | let length_so_far = length_so_far + padding0.len(); |
2538 | assert_eq!(length_so_far % 4, 0); |
2539 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2540 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2541 | ([request0.into(), self.name, padding0.into()], vec![]) |
2542 | } |
2543 | /// Parse this request given its header, its body, and any fds that go along with it |
2544 | #[cfg (feature = "request-parsing" )] |
2545 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
2546 | if header.minor_opcode != CREATE_MODE_REQUEST { |
2547 | return Err(ParseError::InvalidValue); |
2548 | } |
2549 | let (window, remaining) = xproto::Window::try_parse(value)?; |
2550 | let (mode_info, remaining) = ModeInfo::try_parse(remaining)?; |
2551 | let (name, remaining) = remaining.split_at(remaining.len()); |
2552 | let _ = remaining; |
2553 | Ok(CreateModeRequest { |
2554 | window, |
2555 | mode_info, |
2556 | name: Cow::Borrowed(name), |
2557 | }) |
2558 | } |
2559 | /// Clone all borrowed data in this CreateModeRequest. |
2560 | pub fn into_owned(self) -> CreateModeRequest<'static> { |
2561 | CreateModeRequest { |
2562 | window: self.window, |
2563 | mode_info: self.mode_info, |
2564 | name: Cow::Owned(self.name.into_owned()), |
2565 | } |
2566 | } |
2567 | } |
2568 | impl<'input> Request for CreateModeRequest<'input> { |
2569 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
2570 | |
2571 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
2572 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
2573 | // Flatten the buffers into a single vector |
2574 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
2575 | (buf, fds) |
2576 | } |
2577 | } |
2578 | impl<'input> crate::x11_utils::ReplyRequest for CreateModeRequest<'input> { |
2579 | type Reply = CreateModeReply; |
2580 | } |
2581 | |
2582 | #[derive (Clone, Copy, Default)] |
2583 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2584 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2585 | pub struct CreateModeReply { |
2586 | pub sequence: u16, |
2587 | pub length: u32, |
2588 | pub mode: Mode, |
2589 | } |
2590 | impl_debug_if_no_extra_traits!(CreateModeReply, "CreateModeReply" ); |
2591 | impl TryParse for CreateModeReply { |
2592 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
2593 | let remaining: &[u8] = initial_value; |
2594 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
2595 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
2596 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
2597 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
2598 | let (mode: u32, remaining: &[u8]) = Mode::try_parse(remaining)?; |
2599 | let remaining: &[u8] = remaining.get(20..).ok_or(err:ParseError::InsufficientData)?; |
2600 | if response_type != 1 { |
2601 | return Err(ParseError::InvalidValue); |
2602 | } |
2603 | let result: CreateModeReply = CreateModeReply { sequence, length, mode }; |
2604 | let _ = remaining; |
2605 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
2606 | .ok_or(err:ParseError::InsufficientData)?; |
2607 | Ok((result, remaining)) |
2608 | } |
2609 | } |
2610 | impl Serialize for CreateModeReply { |
2611 | type Bytes = [u8; 32]; |
2612 | fn serialize(&self) -> [u8; 32] { |
2613 | let response_type_bytes = &[1]; |
2614 | let sequence_bytes = self.sequence.serialize(); |
2615 | let length_bytes = self.length.serialize(); |
2616 | let mode_bytes = self.mode.serialize(); |
2617 | [ |
2618 | response_type_bytes[0], |
2619 | 0, |
2620 | sequence_bytes[0], |
2621 | sequence_bytes[1], |
2622 | length_bytes[0], |
2623 | length_bytes[1], |
2624 | length_bytes[2], |
2625 | length_bytes[3], |
2626 | mode_bytes[0], |
2627 | mode_bytes[1], |
2628 | mode_bytes[2], |
2629 | mode_bytes[3], |
2630 | 0, |
2631 | 0, |
2632 | 0, |
2633 | 0, |
2634 | 0, |
2635 | 0, |
2636 | 0, |
2637 | 0, |
2638 | 0, |
2639 | 0, |
2640 | 0, |
2641 | 0, |
2642 | 0, |
2643 | 0, |
2644 | 0, |
2645 | 0, |
2646 | 0, |
2647 | 0, |
2648 | 0, |
2649 | 0, |
2650 | ] |
2651 | } |
2652 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
2653 | bytes.reserve(32); |
2654 | let response_type_bytes = &[1]; |
2655 | bytes.push(response_type_bytes[0]); |
2656 | bytes.extend_from_slice(&[0; 1]); |
2657 | self.sequence.serialize_into(bytes); |
2658 | self.length.serialize_into(bytes); |
2659 | self.mode.serialize_into(bytes); |
2660 | bytes.extend_from_slice(&[0; 20]); |
2661 | } |
2662 | } |
2663 | |
2664 | /// Opcode for the DestroyMode request |
2665 | pub const DESTROY_MODE_REQUEST: u8 = 17; |
2666 | #[derive (Clone, Copy, Default)] |
2667 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2668 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2669 | pub struct DestroyModeRequest { |
2670 | pub mode: Mode, |
2671 | } |
2672 | impl_debug_if_no_extra_traits!(DestroyModeRequest, "DestroyModeRequest" ); |
2673 | impl DestroyModeRequest { |
2674 | /// Serialize this request into bytes for the provided connection |
2675 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
2676 | let length_so_far = 0; |
2677 | let mode_bytes = self.mode.serialize(); |
2678 | let mut request0 = vec![ |
2679 | major_opcode, |
2680 | DESTROY_MODE_REQUEST, |
2681 | 0, |
2682 | 0, |
2683 | mode_bytes[0], |
2684 | mode_bytes[1], |
2685 | mode_bytes[2], |
2686 | mode_bytes[3], |
2687 | ]; |
2688 | let length_so_far = length_so_far + request0.len(); |
2689 | assert_eq!(length_so_far % 4, 0); |
2690 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2691 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2692 | ([request0.into()], vec![]) |
2693 | } |
2694 | /// Parse this request given its header, its body, and any fds that go along with it |
2695 | #[cfg (feature = "request-parsing" )] |
2696 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
2697 | if header.minor_opcode != DESTROY_MODE_REQUEST { |
2698 | return Err(ParseError::InvalidValue); |
2699 | } |
2700 | let (mode, remaining) = Mode::try_parse(value)?; |
2701 | let _ = remaining; |
2702 | Ok(DestroyModeRequest { |
2703 | mode, |
2704 | }) |
2705 | } |
2706 | } |
2707 | impl Request for DestroyModeRequest { |
2708 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
2709 | |
2710 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
2711 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
2712 | // Flatten the buffers into a single vector |
2713 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
2714 | (buf, fds) |
2715 | } |
2716 | } |
2717 | impl crate::x11_utils::VoidRequest for DestroyModeRequest { |
2718 | } |
2719 | |
2720 | /// Opcode for the AddOutputMode request |
2721 | pub const ADD_OUTPUT_MODE_REQUEST: u8 = 18; |
2722 | #[derive (Clone, Copy, Default)] |
2723 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2724 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2725 | pub struct AddOutputModeRequest { |
2726 | pub output: Output, |
2727 | pub mode: Mode, |
2728 | } |
2729 | impl_debug_if_no_extra_traits!(AddOutputModeRequest, "AddOutputModeRequest" ); |
2730 | impl AddOutputModeRequest { |
2731 | /// Serialize this request into bytes for the provided connection |
2732 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
2733 | let length_so_far = 0; |
2734 | let output_bytes = self.output.serialize(); |
2735 | let mode_bytes = self.mode.serialize(); |
2736 | let mut request0 = vec![ |
2737 | major_opcode, |
2738 | ADD_OUTPUT_MODE_REQUEST, |
2739 | 0, |
2740 | 0, |
2741 | output_bytes[0], |
2742 | output_bytes[1], |
2743 | output_bytes[2], |
2744 | output_bytes[3], |
2745 | mode_bytes[0], |
2746 | mode_bytes[1], |
2747 | mode_bytes[2], |
2748 | mode_bytes[3], |
2749 | ]; |
2750 | let length_so_far = length_so_far + request0.len(); |
2751 | assert_eq!(length_so_far % 4, 0); |
2752 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2753 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2754 | ([request0.into()], vec![]) |
2755 | } |
2756 | /// Parse this request given its header, its body, and any fds that go along with it |
2757 | #[cfg (feature = "request-parsing" )] |
2758 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
2759 | if header.minor_opcode != ADD_OUTPUT_MODE_REQUEST { |
2760 | return Err(ParseError::InvalidValue); |
2761 | } |
2762 | let (output, remaining) = Output::try_parse(value)?; |
2763 | let (mode, remaining) = Mode::try_parse(remaining)?; |
2764 | let _ = remaining; |
2765 | Ok(AddOutputModeRequest { |
2766 | output, |
2767 | mode, |
2768 | }) |
2769 | } |
2770 | } |
2771 | impl Request for AddOutputModeRequest { |
2772 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
2773 | |
2774 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
2775 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
2776 | // Flatten the buffers into a single vector |
2777 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
2778 | (buf, fds) |
2779 | } |
2780 | } |
2781 | impl crate::x11_utils::VoidRequest for AddOutputModeRequest { |
2782 | } |
2783 | |
2784 | /// Opcode for the DeleteOutputMode request |
2785 | pub const DELETE_OUTPUT_MODE_REQUEST: u8 = 19; |
2786 | #[derive (Clone, Copy, Default)] |
2787 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2788 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2789 | pub struct DeleteOutputModeRequest { |
2790 | pub output: Output, |
2791 | pub mode: Mode, |
2792 | } |
2793 | impl_debug_if_no_extra_traits!(DeleteOutputModeRequest, "DeleteOutputModeRequest" ); |
2794 | impl DeleteOutputModeRequest { |
2795 | /// Serialize this request into bytes for the provided connection |
2796 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
2797 | let length_so_far = 0; |
2798 | let output_bytes = self.output.serialize(); |
2799 | let mode_bytes = self.mode.serialize(); |
2800 | let mut request0 = vec![ |
2801 | major_opcode, |
2802 | DELETE_OUTPUT_MODE_REQUEST, |
2803 | 0, |
2804 | 0, |
2805 | output_bytes[0], |
2806 | output_bytes[1], |
2807 | output_bytes[2], |
2808 | output_bytes[3], |
2809 | mode_bytes[0], |
2810 | mode_bytes[1], |
2811 | mode_bytes[2], |
2812 | mode_bytes[3], |
2813 | ]; |
2814 | let length_so_far = length_so_far + request0.len(); |
2815 | assert_eq!(length_so_far % 4, 0); |
2816 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2817 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2818 | ([request0.into()], vec![]) |
2819 | } |
2820 | /// Parse this request given its header, its body, and any fds that go along with it |
2821 | #[cfg (feature = "request-parsing" )] |
2822 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
2823 | if header.minor_opcode != DELETE_OUTPUT_MODE_REQUEST { |
2824 | return Err(ParseError::InvalidValue); |
2825 | } |
2826 | let (output, remaining) = Output::try_parse(value)?; |
2827 | let (mode, remaining) = Mode::try_parse(remaining)?; |
2828 | let _ = remaining; |
2829 | Ok(DeleteOutputModeRequest { |
2830 | output, |
2831 | mode, |
2832 | }) |
2833 | } |
2834 | } |
2835 | impl Request for DeleteOutputModeRequest { |
2836 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
2837 | |
2838 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
2839 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
2840 | // Flatten the buffers into a single vector |
2841 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
2842 | (buf, fds) |
2843 | } |
2844 | } |
2845 | impl crate::x11_utils::VoidRequest for DeleteOutputModeRequest { |
2846 | } |
2847 | |
2848 | /// Opcode for the GetCrtcInfo request |
2849 | pub const GET_CRTC_INFO_REQUEST: u8 = 20; |
2850 | #[derive (Clone, Copy, Default)] |
2851 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2852 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2853 | pub struct GetCrtcInfoRequest { |
2854 | pub crtc: Crtc, |
2855 | pub config_timestamp: xproto::Timestamp, |
2856 | } |
2857 | impl_debug_if_no_extra_traits!(GetCrtcInfoRequest, "GetCrtcInfoRequest" ); |
2858 | impl GetCrtcInfoRequest { |
2859 | /// Serialize this request into bytes for the provided connection |
2860 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
2861 | let length_so_far = 0; |
2862 | let crtc_bytes = self.crtc.serialize(); |
2863 | let config_timestamp_bytes = self.config_timestamp.serialize(); |
2864 | let mut request0 = vec![ |
2865 | major_opcode, |
2866 | GET_CRTC_INFO_REQUEST, |
2867 | 0, |
2868 | 0, |
2869 | crtc_bytes[0], |
2870 | crtc_bytes[1], |
2871 | crtc_bytes[2], |
2872 | crtc_bytes[3], |
2873 | config_timestamp_bytes[0], |
2874 | config_timestamp_bytes[1], |
2875 | config_timestamp_bytes[2], |
2876 | config_timestamp_bytes[3], |
2877 | ]; |
2878 | let length_so_far = length_so_far + request0.len(); |
2879 | assert_eq!(length_so_far % 4, 0); |
2880 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2881 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2882 | ([request0.into()], vec![]) |
2883 | } |
2884 | /// Parse this request given its header, its body, and any fds that go along with it |
2885 | #[cfg (feature = "request-parsing" )] |
2886 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
2887 | if header.minor_opcode != GET_CRTC_INFO_REQUEST { |
2888 | return Err(ParseError::InvalidValue); |
2889 | } |
2890 | let (crtc, remaining) = Crtc::try_parse(value)?; |
2891 | let (config_timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
2892 | let _ = remaining; |
2893 | Ok(GetCrtcInfoRequest { |
2894 | crtc, |
2895 | config_timestamp, |
2896 | }) |
2897 | } |
2898 | } |
2899 | impl Request for GetCrtcInfoRequest { |
2900 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
2901 | |
2902 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
2903 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
2904 | // Flatten the buffers into a single vector |
2905 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
2906 | (buf, fds) |
2907 | } |
2908 | } |
2909 | impl crate::x11_utils::ReplyRequest for GetCrtcInfoRequest { |
2910 | type Reply = GetCrtcInfoReply; |
2911 | } |
2912 | |
2913 | #[derive (Clone, Default)] |
2914 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2915 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2916 | pub struct GetCrtcInfoReply { |
2917 | pub status: SetConfig, |
2918 | pub sequence: u16, |
2919 | pub length: u32, |
2920 | pub timestamp: xproto::Timestamp, |
2921 | pub x: i16, |
2922 | pub y: i16, |
2923 | pub width: u16, |
2924 | pub height: u16, |
2925 | pub mode: Mode, |
2926 | pub rotation: Rotation, |
2927 | pub rotations: Rotation, |
2928 | pub outputs: Vec<Output>, |
2929 | pub possible: Vec<Output>, |
2930 | } |
2931 | impl_debug_if_no_extra_traits!(GetCrtcInfoReply, "GetCrtcInfoReply" ); |
2932 | impl TryParse for GetCrtcInfoReply { |
2933 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
2934 | let remaining = initial_value; |
2935 | let (response_type, remaining) = u8::try_parse(remaining)?; |
2936 | let (status, remaining) = u8::try_parse(remaining)?; |
2937 | let (sequence, remaining) = u16::try_parse(remaining)?; |
2938 | let (length, remaining) = u32::try_parse(remaining)?; |
2939 | let (timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
2940 | let (x, remaining) = i16::try_parse(remaining)?; |
2941 | let (y, remaining) = i16::try_parse(remaining)?; |
2942 | let (width, remaining) = u16::try_parse(remaining)?; |
2943 | let (height, remaining) = u16::try_parse(remaining)?; |
2944 | let (mode, remaining) = Mode::try_parse(remaining)?; |
2945 | let (rotation, remaining) = u16::try_parse(remaining)?; |
2946 | let (rotations, remaining) = u16::try_parse(remaining)?; |
2947 | let (num_outputs, remaining) = u16::try_parse(remaining)?; |
2948 | let (num_possible_outputs, remaining) = u16::try_parse(remaining)?; |
2949 | let (outputs, remaining) = crate::x11_utils::parse_list::<Output>(remaining, num_outputs.try_to_usize()?)?; |
2950 | let (possible, remaining) = crate::x11_utils::parse_list::<Output>(remaining, num_possible_outputs.try_to_usize()?)?; |
2951 | if response_type != 1 { |
2952 | return Err(ParseError::InvalidValue); |
2953 | } |
2954 | let status = status.into(); |
2955 | let rotation = rotation.into(); |
2956 | let rotations = rotations.into(); |
2957 | let result = GetCrtcInfoReply { status, sequence, length, timestamp, x, y, width, height, mode, rotation, rotations, outputs, possible }; |
2958 | let _ = remaining; |
2959 | let remaining = initial_value.get(32 + length as usize * 4..) |
2960 | .ok_or(ParseError::InsufficientData)?; |
2961 | Ok((result, remaining)) |
2962 | } |
2963 | } |
2964 | impl Serialize for GetCrtcInfoReply { |
2965 | type Bytes = Vec<u8>; |
2966 | fn serialize(&self) -> Vec<u8> { |
2967 | let mut result = Vec::new(); |
2968 | self.serialize_into(&mut result); |
2969 | result |
2970 | } |
2971 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
2972 | bytes.reserve(32); |
2973 | let response_type_bytes = &[1]; |
2974 | bytes.push(response_type_bytes[0]); |
2975 | u8::from(self.status).serialize_into(bytes); |
2976 | self.sequence.serialize_into(bytes); |
2977 | self.length.serialize_into(bytes); |
2978 | self.timestamp.serialize_into(bytes); |
2979 | self.x.serialize_into(bytes); |
2980 | self.y.serialize_into(bytes); |
2981 | self.width.serialize_into(bytes); |
2982 | self.height.serialize_into(bytes); |
2983 | self.mode.serialize_into(bytes); |
2984 | u16::from(self.rotation).serialize_into(bytes); |
2985 | u16::from(self.rotations).serialize_into(bytes); |
2986 | let num_outputs = u16::try_from(self.outputs.len()).expect("`outputs` has too many elements" ); |
2987 | num_outputs.serialize_into(bytes); |
2988 | let num_possible_outputs = u16::try_from(self.possible.len()).expect("`possible` has too many elements" ); |
2989 | num_possible_outputs.serialize_into(bytes); |
2990 | self.outputs.serialize_into(bytes); |
2991 | self.possible.serialize_into(bytes); |
2992 | } |
2993 | } |
2994 | impl GetCrtcInfoReply { |
2995 | /// Get the value of the `num_outputs` field. |
2996 | /// |
2997 | /// The `num_outputs` field is used as the length field of the `outputs` field. |
2998 | /// This function computes the field's value again based on the length of the list. |
2999 | /// |
3000 | /// # Panics |
3001 | /// |
3002 | /// Panics if the value cannot be represented in the target type. This |
3003 | /// cannot happen with values of the struct received from the X11 server. |
3004 | pub fn num_outputs(&self) -> u16 { |
3005 | self.outputs.len() |
3006 | .try_into().unwrap() |
3007 | } |
3008 | /// Get the value of the `num_possible_outputs` field. |
3009 | /// |
3010 | /// The `num_possible_outputs` field is used as the length field of the `possible` field. |
3011 | /// This function computes the field's value again based on the length of the list. |
3012 | /// |
3013 | /// # Panics |
3014 | /// |
3015 | /// Panics if the value cannot be represented in the target type. This |
3016 | /// cannot happen with values of the struct received from the X11 server. |
3017 | pub fn num_possible_outputs(&self) -> u16 { |
3018 | self.possible.len() |
3019 | .try_into().unwrap() |
3020 | } |
3021 | } |
3022 | |
3023 | /// Opcode for the SetCrtcConfig request |
3024 | pub const SET_CRTC_CONFIG_REQUEST: u8 = 21; |
3025 | #[derive (Clone, Default)] |
3026 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3027 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3028 | pub struct SetCrtcConfigRequest<'input> { |
3029 | pub crtc: Crtc, |
3030 | pub timestamp: xproto::Timestamp, |
3031 | pub config_timestamp: xproto::Timestamp, |
3032 | pub x: i16, |
3033 | pub y: i16, |
3034 | pub mode: Mode, |
3035 | pub rotation: Rotation, |
3036 | pub outputs: Cow<'input, [Output]>, |
3037 | } |
3038 | impl_debug_if_no_extra_traits!(SetCrtcConfigRequest<'_>, "SetCrtcConfigRequest" ); |
3039 | impl<'input> SetCrtcConfigRequest<'input> { |
3040 | /// Serialize this request into bytes for the provided connection |
3041 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
3042 | let length_so_far = 0; |
3043 | let crtc_bytes = self.crtc.serialize(); |
3044 | let timestamp_bytes = self.timestamp.serialize(); |
3045 | let config_timestamp_bytes = self.config_timestamp.serialize(); |
3046 | let x_bytes = self.x.serialize(); |
3047 | let y_bytes = self.y.serialize(); |
3048 | let mode_bytes = self.mode.serialize(); |
3049 | let rotation_bytes = u16::from(self.rotation).serialize(); |
3050 | let mut request0 = vec![ |
3051 | major_opcode, |
3052 | SET_CRTC_CONFIG_REQUEST, |
3053 | 0, |
3054 | 0, |
3055 | crtc_bytes[0], |
3056 | crtc_bytes[1], |
3057 | crtc_bytes[2], |
3058 | crtc_bytes[3], |
3059 | timestamp_bytes[0], |
3060 | timestamp_bytes[1], |
3061 | timestamp_bytes[2], |
3062 | timestamp_bytes[3], |
3063 | config_timestamp_bytes[0], |
3064 | config_timestamp_bytes[1], |
3065 | config_timestamp_bytes[2], |
3066 | config_timestamp_bytes[3], |
3067 | x_bytes[0], |
3068 | x_bytes[1], |
3069 | y_bytes[0], |
3070 | y_bytes[1], |
3071 | mode_bytes[0], |
3072 | mode_bytes[1], |
3073 | mode_bytes[2], |
3074 | mode_bytes[3], |
3075 | rotation_bytes[0], |
3076 | rotation_bytes[1], |
3077 | 0, |
3078 | 0, |
3079 | ]; |
3080 | let length_so_far = length_so_far + request0.len(); |
3081 | let outputs_bytes = self.outputs.serialize(); |
3082 | let length_so_far = length_so_far + outputs_bytes.len(); |
3083 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
3084 | let length_so_far = length_so_far + padding0.len(); |
3085 | assert_eq!(length_so_far % 4, 0); |
3086 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3087 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3088 | ([request0.into(), outputs_bytes.into(), padding0.into()], vec![]) |
3089 | } |
3090 | /// Parse this request given its header, its body, and any fds that go along with it |
3091 | #[cfg (feature = "request-parsing" )] |
3092 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
3093 | if header.minor_opcode != SET_CRTC_CONFIG_REQUEST { |
3094 | return Err(ParseError::InvalidValue); |
3095 | } |
3096 | let (crtc, remaining) = Crtc::try_parse(value)?; |
3097 | let (timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
3098 | let (config_timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
3099 | let (x, remaining) = i16::try_parse(remaining)?; |
3100 | let (y, remaining) = i16::try_parse(remaining)?; |
3101 | let (mode, remaining) = Mode::try_parse(remaining)?; |
3102 | let (rotation, remaining) = u16::try_parse(remaining)?; |
3103 | let rotation = rotation.into(); |
3104 | let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?; |
3105 | let mut remaining = remaining; |
3106 | // Length is 'everything left in the input' |
3107 | let mut outputs = Vec::new(); |
3108 | while !remaining.is_empty() { |
3109 | let (v, new_remaining) = Output::try_parse(remaining)?; |
3110 | remaining = new_remaining; |
3111 | outputs.push(v); |
3112 | } |
3113 | let _ = remaining; |
3114 | Ok(SetCrtcConfigRequest { |
3115 | crtc, |
3116 | timestamp, |
3117 | config_timestamp, |
3118 | x, |
3119 | y, |
3120 | mode, |
3121 | rotation, |
3122 | outputs: Cow::Owned(outputs), |
3123 | }) |
3124 | } |
3125 | /// Clone all borrowed data in this SetCrtcConfigRequest. |
3126 | pub fn into_owned(self) -> SetCrtcConfigRequest<'static> { |
3127 | SetCrtcConfigRequest { |
3128 | crtc: self.crtc, |
3129 | timestamp: self.timestamp, |
3130 | config_timestamp: self.config_timestamp, |
3131 | x: self.x, |
3132 | y: self.y, |
3133 | mode: self.mode, |
3134 | rotation: self.rotation, |
3135 | outputs: Cow::Owned(self.outputs.into_owned()), |
3136 | } |
3137 | } |
3138 | } |
3139 | impl<'input> Request for SetCrtcConfigRequest<'input> { |
3140 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3141 | |
3142 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3143 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
3144 | // Flatten the buffers into a single vector |
3145 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3146 | (buf, fds) |
3147 | } |
3148 | } |
3149 | impl<'input> crate::x11_utils::ReplyRequest for SetCrtcConfigRequest<'input> { |
3150 | type Reply = SetCrtcConfigReply; |
3151 | } |
3152 | |
3153 | #[derive (Clone, Copy, Default)] |
3154 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3155 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3156 | pub struct SetCrtcConfigReply { |
3157 | pub status: SetConfig, |
3158 | pub sequence: u16, |
3159 | pub length: u32, |
3160 | pub timestamp: xproto::Timestamp, |
3161 | } |
3162 | impl_debug_if_no_extra_traits!(SetCrtcConfigReply, "SetCrtcConfigReply" ); |
3163 | impl TryParse for SetCrtcConfigReply { |
3164 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
3165 | let remaining: &[u8] = initial_value; |
3166 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
3167 | let (status: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
3168 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
3169 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
3170 | let (timestamp: u32, remaining: &[u8]) = xproto::Timestamp::try_parse(remaining)?; |
3171 | let remaining: &[u8] = remaining.get(20..).ok_or(err:ParseError::InsufficientData)?; |
3172 | if response_type != 1 { |
3173 | return Err(ParseError::InvalidValue); |
3174 | } |
3175 | let status: SetConfig = status.into(); |
3176 | let result: SetCrtcConfigReply = SetCrtcConfigReply { status, sequence, length, timestamp }; |
3177 | let _ = remaining; |
3178 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
3179 | .ok_or(err:ParseError::InsufficientData)?; |
3180 | Ok((result, remaining)) |
3181 | } |
3182 | } |
3183 | impl Serialize for SetCrtcConfigReply { |
3184 | type Bytes = [u8; 32]; |
3185 | fn serialize(&self) -> [u8; 32] { |
3186 | let response_type_bytes = &[1]; |
3187 | let status_bytes = u8::from(self.status).serialize(); |
3188 | let sequence_bytes = self.sequence.serialize(); |
3189 | let length_bytes = self.length.serialize(); |
3190 | let timestamp_bytes = self.timestamp.serialize(); |
3191 | [ |
3192 | response_type_bytes[0], |
3193 | status_bytes[0], |
3194 | sequence_bytes[0], |
3195 | sequence_bytes[1], |
3196 | length_bytes[0], |
3197 | length_bytes[1], |
3198 | length_bytes[2], |
3199 | length_bytes[3], |
3200 | timestamp_bytes[0], |
3201 | timestamp_bytes[1], |
3202 | timestamp_bytes[2], |
3203 | timestamp_bytes[3], |
3204 | 0, |
3205 | 0, |
3206 | 0, |
3207 | 0, |
3208 | 0, |
3209 | 0, |
3210 | 0, |
3211 | 0, |
3212 | 0, |
3213 | 0, |
3214 | 0, |
3215 | 0, |
3216 | 0, |
3217 | 0, |
3218 | 0, |
3219 | 0, |
3220 | 0, |
3221 | 0, |
3222 | 0, |
3223 | 0, |
3224 | ] |
3225 | } |
3226 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
3227 | bytes.reserve(32); |
3228 | let response_type_bytes = &[1]; |
3229 | bytes.push(response_type_bytes[0]); |
3230 | u8::from(self.status).serialize_into(bytes); |
3231 | self.sequence.serialize_into(bytes); |
3232 | self.length.serialize_into(bytes); |
3233 | self.timestamp.serialize_into(bytes); |
3234 | bytes.extend_from_slice(&[0; 20]); |
3235 | } |
3236 | } |
3237 | |
3238 | /// Opcode for the GetCrtcGammaSize request |
3239 | pub const GET_CRTC_GAMMA_SIZE_REQUEST: u8 = 22; |
3240 | #[derive (Clone, Copy, Default)] |
3241 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3242 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3243 | pub struct GetCrtcGammaSizeRequest { |
3244 | pub crtc: Crtc, |
3245 | } |
3246 | impl_debug_if_no_extra_traits!(GetCrtcGammaSizeRequest, "GetCrtcGammaSizeRequest" ); |
3247 | impl GetCrtcGammaSizeRequest { |
3248 | /// Serialize this request into bytes for the provided connection |
3249 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
3250 | let length_so_far = 0; |
3251 | let crtc_bytes = self.crtc.serialize(); |
3252 | let mut request0 = vec![ |
3253 | major_opcode, |
3254 | GET_CRTC_GAMMA_SIZE_REQUEST, |
3255 | 0, |
3256 | 0, |
3257 | crtc_bytes[0], |
3258 | crtc_bytes[1], |
3259 | crtc_bytes[2], |
3260 | crtc_bytes[3], |
3261 | ]; |
3262 | let length_so_far = length_so_far + request0.len(); |
3263 | assert_eq!(length_so_far % 4, 0); |
3264 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3265 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3266 | ([request0.into()], vec![]) |
3267 | } |
3268 | /// Parse this request given its header, its body, and any fds that go along with it |
3269 | #[cfg (feature = "request-parsing" )] |
3270 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
3271 | if header.minor_opcode != GET_CRTC_GAMMA_SIZE_REQUEST { |
3272 | return Err(ParseError::InvalidValue); |
3273 | } |
3274 | let (crtc, remaining) = Crtc::try_parse(value)?; |
3275 | let _ = remaining; |
3276 | Ok(GetCrtcGammaSizeRequest { |
3277 | crtc, |
3278 | }) |
3279 | } |
3280 | } |
3281 | impl Request for GetCrtcGammaSizeRequest { |
3282 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3283 | |
3284 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3285 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
3286 | // Flatten the buffers into a single vector |
3287 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3288 | (buf, fds) |
3289 | } |
3290 | } |
3291 | impl crate::x11_utils::ReplyRequest for GetCrtcGammaSizeRequest { |
3292 | type Reply = GetCrtcGammaSizeReply; |
3293 | } |
3294 | |
3295 | #[derive (Clone, Copy, Default)] |
3296 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3297 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3298 | pub struct GetCrtcGammaSizeReply { |
3299 | pub sequence: u16, |
3300 | pub length: u32, |
3301 | pub size: u16, |
3302 | } |
3303 | impl_debug_if_no_extra_traits!(GetCrtcGammaSizeReply, "GetCrtcGammaSizeReply" ); |
3304 | impl TryParse for GetCrtcGammaSizeReply { |
3305 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
3306 | let remaining: &[u8] = initial_value; |
3307 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
3308 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
3309 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
3310 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
3311 | let (size: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
3312 | let remaining: &[u8] = remaining.get(22..).ok_or(err:ParseError::InsufficientData)?; |
3313 | if response_type != 1 { |
3314 | return Err(ParseError::InvalidValue); |
3315 | } |
3316 | let result: GetCrtcGammaSizeReply = GetCrtcGammaSizeReply { sequence, length, size }; |
3317 | let _ = remaining; |
3318 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
3319 | .ok_or(err:ParseError::InsufficientData)?; |
3320 | Ok((result, remaining)) |
3321 | } |
3322 | } |
3323 | impl Serialize for GetCrtcGammaSizeReply { |
3324 | type Bytes = [u8; 32]; |
3325 | fn serialize(&self) -> [u8; 32] { |
3326 | let response_type_bytes = &[1]; |
3327 | let sequence_bytes = self.sequence.serialize(); |
3328 | let length_bytes = self.length.serialize(); |
3329 | let size_bytes = self.size.serialize(); |
3330 | [ |
3331 | response_type_bytes[0], |
3332 | 0, |
3333 | sequence_bytes[0], |
3334 | sequence_bytes[1], |
3335 | length_bytes[0], |
3336 | length_bytes[1], |
3337 | length_bytes[2], |
3338 | length_bytes[3], |
3339 | size_bytes[0], |
3340 | size_bytes[1], |
3341 | 0, |
3342 | 0, |
3343 | 0, |
3344 | 0, |
3345 | 0, |
3346 | 0, |
3347 | 0, |
3348 | 0, |
3349 | 0, |
3350 | 0, |
3351 | 0, |
3352 | 0, |
3353 | 0, |
3354 | 0, |
3355 | 0, |
3356 | 0, |
3357 | 0, |
3358 | 0, |
3359 | 0, |
3360 | 0, |
3361 | 0, |
3362 | 0, |
3363 | ] |
3364 | } |
3365 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
3366 | bytes.reserve(32); |
3367 | let response_type_bytes = &[1]; |
3368 | bytes.push(response_type_bytes[0]); |
3369 | bytes.extend_from_slice(&[0; 1]); |
3370 | self.sequence.serialize_into(bytes); |
3371 | self.length.serialize_into(bytes); |
3372 | self.size.serialize_into(bytes); |
3373 | bytes.extend_from_slice(&[0; 22]); |
3374 | } |
3375 | } |
3376 | |
3377 | /// Opcode for the GetCrtcGamma request |
3378 | pub const GET_CRTC_GAMMA_REQUEST: u8 = 23; |
3379 | #[derive (Clone, Copy, Default)] |
3380 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3381 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3382 | pub struct GetCrtcGammaRequest { |
3383 | pub crtc: Crtc, |
3384 | } |
3385 | impl_debug_if_no_extra_traits!(GetCrtcGammaRequest, "GetCrtcGammaRequest" ); |
3386 | impl GetCrtcGammaRequest { |
3387 | /// Serialize this request into bytes for the provided connection |
3388 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
3389 | let length_so_far = 0; |
3390 | let crtc_bytes = self.crtc.serialize(); |
3391 | let mut request0 = vec![ |
3392 | major_opcode, |
3393 | GET_CRTC_GAMMA_REQUEST, |
3394 | 0, |
3395 | 0, |
3396 | crtc_bytes[0], |
3397 | crtc_bytes[1], |
3398 | crtc_bytes[2], |
3399 | crtc_bytes[3], |
3400 | ]; |
3401 | let length_so_far = length_so_far + request0.len(); |
3402 | assert_eq!(length_so_far % 4, 0); |
3403 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3404 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3405 | ([request0.into()], vec![]) |
3406 | } |
3407 | /// Parse this request given its header, its body, and any fds that go along with it |
3408 | #[cfg (feature = "request-parsing" )] |
3409 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
3410 | if header.minor_opcode != GET_CRTC_GAMMA_REQUEST { |
3411 | return Err(ParseError::InvalidValue); |
3412 | } |
3413 | let (crtc, remaining) = Crtc::try_parse(value)?; |
3414 | let _ = remaining; |
3415 | Ok(GetCrtcGammaRequest { |
3416 | crtc, |
3417 | }) |
3418 | } |
3419 | } |
3420 | impl Request for GetCrtcGammaRequest { |
3421 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3422 | |
3423 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3424 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
3425 | // Flatten the buffers into a single vector |
3426 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3427 | (buf, fds) |
3428 | } |
3429 | } |
3430 | impl crate::x11_utils::ReplyRequest for GetCrtcGammaRequest { |
3431 | type Reply = GetCrtcGammaReply; |
3432 | } |
3433 | |
3434 | #[derive (Clone, Default)] |
3435 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3436 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3437 | pub struct GetCrtcGammaReply { |
3438 | pub sequence: u16, |
3439 | pub length: u32, |
3440 | pub red: Vec<u16>, |
3441 | pub green: Vec<u16>, |
3442 | pub blue: Vec<u16>, |
3443 | } |
3444 | impl_debug_if_no_extra_traits!(GetCrtcGammaReply, "GetCrtcGammaReply" ); |
3445 | impl TryParse for GetCrtcGammaReply { |
3446 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
3447 | let remaining: &[u8] = initial_value; |
3448 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
3449 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
3450 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
3451 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
3452 | let (size: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
3453 | let remaining: &[u8] = remaining.get(22..).ok_or(err:ParseError::InsufficientData)?; |
3454 | let (red: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<u16>(data:remaining, list_length:size.try_to_usize()?)?; |
3455 | let (green: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<u16>(data:remaining, list_length:size.try_to_usize()?)?; |
3456 | let (blue: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<u16>(data:remaining, list_length:size.try_to_usize()?)?; |
3457 | if response_type != 1 { |
3458 | return Err(ParseError::InvalidValue); |
3459 | } |
3460 | let result: GetCrtcGammaReply = GetCrtcGammaReply { sequence, length, red, green, blue }; |
3461 | let _ = remaining; |
3462 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
3463 | .ok_or(err:ParseError::InsufficientData)?; |
3464 | Ok((result, remaining)) |
3465 | } |
3466 | } |
3467 | impl Serialize for GetCrtcGammaReply { |
3468 | type Bytes = Vec<u8>; |
3469 | fn serialize(&self) -> Vec<u8> { |
3470 | let mut result: Vec = Vec::new(); |
3471 | self.serialize_into(&mut result); |
3472 | result |
3473 | } |
3474 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
3475 | bytes.reserve(additional:32); |
3476 | let response_type_bytes: &[u8; 1] = &[1]; |
3477 | bytes.push(response_type_bytes[0]); |
3478 | bytes.extend_from_slice(&[0; 1]); |
3479 | self.sequence.serialize_into(bytes); |
3480 | self.length.serialize_into(bytes); |
3481 | let size: u16 = u16::try_from(self.red.len()).expect(msg:"`red` has too many elements" ); |
3482 | size.serialize_into(bytes); |
3483 | bytes.extend_from_slice(&[0; 22]); |
3484 | self.red.serialize_into(bytes); |
3485 | assert_eq!(self.green.len(), usize::try_from(size).unwrap(), "`green` has an incorrect length" ); |
3486 | self.green.serialize_into(bytes); |
3487 | assert_eq!(self.blue.len(), usize::try_from(size).unwrap(), "`blue` has an incorrect length" ); |
3488 | self.blue.serialize_into(bytes); |
3489 | } |
3490 | } |
3491 | impl GetCrtcGammaReply { |
3492 | /// Get the value of the `size` field. |
3493 | /// |
3494 | /// The `size` field is used as the length field of the `red` field. |
3495 | /// This function computes the field's value again based on the length of the list. |
3496 | /// |
3497 | /// # Panics |
3498 | /// |
3499 | /// Panics if the value cannot be represented in the target type. This |
3500 | /// cannot happen with values of the struct received from the X11 server. |
3501 | pub fn size(&self) -> u16 { |
3502 | self.red.len() |
3503 | .try_into().unwrap() |
3504 | } |
3505 | } |
3506 | |
3507 | /// Opcode for the SetCrtcGamma request |
3508 | pub const SET_CRTC_GAMMA_REQUEST: u8 = 24; |
3509 | #[derive (Clone, Default)] |
3510 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3511 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3512 | pub struct SetCrtcGammaRequest<'input> { |
3513 | pub crtc: Crtc, |
3514 | pub red: Cow<'input, [u16]>, |
3515 | pub green: Cow<'input, [u16]>, |
3516 | pub blue: Cow<'input, [u16]>, |
3517 | } |
3518 | impl_debug_if_no_extra_traits!(SetCrtcGammaRequest<'_>, "SetCrtcGammaRequest" ); |
3519 | impl<'input> SetCrtcGammaRequest<'input> { |
3520 | /// Serialize this request into bytes for the provided connection |
3521 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 5]> { |
3522 | let length_so_far = 0; |
3523 | let crtc_bytes = self.crtc.serialize(); |
3524 | let size = u16::try_from(self.red.len()).expect("`red` has too many elements" ); |
3525 | let size_bytes = size.serialize(); |
3526 | let mut request0 = vec![ |
3527 | major_opcode, |
3528 | SET_CRTC_GAMMA_REQUEST, |
3529 | 0, |
3530 | 0, |
3531 | crtc_bytes[0], |
3532 | crtc_bytes[1], |
3533 | crtc_bytes[2], |
3534 | crtc_bytes[3], |
3535 | size_bytes[0], |
3536 | size_bytes[1], |
3537 | 0, |
3538 | 0, |
3539 | ]; |
3540 | let length_so_far = length_so_far + request0.len(); |
3541 | let red_bytes = self.red.serialize(); |
3542 | let length_so_far = length_so_far + red_bytes.len(); |
3543 | assert_eq!(self.green.len(), usize::try_from(size).unwrap(), "`green` has an incorrect length" ); |
3544 | let green_bytes = self.green.serialize(); |
3545 | let length_so_far = length_so_far + green_bytes.len(); |
3546 | assert_eq!(self.blue.len(), usize::try_from(size).unwrap(), "`blue` has an incorrect length" ); |
3547 | let blue_bytes = self.blue.serialize(); |
3548 | let length_so_far = length_so_far + blue_bytes.len(); |
3549 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
3550 | let length_so_far = length_so_far + padding0.len(); |
3551 | assert_eq!(length_so_far % 4, 0); |
3552 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3553 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3554 | ([request0.into(), red_bytes.into(), green_bytes.into(), blue_bytes.into(), padding0.into()], vec![]) |
3555 | } |
3556 | /// Parse this request given its header, its body, and any fds that go along with it |
3557 | #[cfg (feature = "request-parsing" )] |
3558 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
3559 | if header.minor_opcode != SET_CRTC_GAMMA_REQUEST { |
3560 | return Err(ParseError::InvalidValue); |
3561 | } |
3562 | let (crtc, remaining) = Crtc::try_parse(value)?; |
3563 | let (size, remaining) = u16::try_parse(remaining)?; |
3564 | let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?; |
3565 | let (red, remaining) = crate::x11_utils::parse_list::<u16>(remaining, size.try_to_usize()?)?; |
3566 | let (green, remaining) = crate::x11_utils::parse_list::<u16>(remaining, size.try_to_usize()?)?; |
3567 | let (blue, remaining) = crate::x11_utils::parse_list::<u16>(remaining, size.try_to_usize()?)?; |
3568 | let _ = remaining; |
3569 | Ok(SetCrtcGammaRequest { |
3570 | crtc, |
3571 | red: Cow::Owned(red), |
3572 | green: Cow::Owned(green), |
3573 | blue: Cow::Owned(blue), |
3574 | }) |
3575 | } |
3576 | /// Clone all borrowed data in this SetCrtcGammaRequest. |
3577 | pub fn into_owned(self) -> SetCrtcGammaRequest<'static> { |
3578 | SetCrtcGammaRequest { |
3579 | crtc: self.crtc, |
3580 | red: Cow::Owned(self.red.into_owned()), |
3581 | green: Cow::Owned(self.green.into_owned()), |
3582 | blue: Cow::Owned(self.blue.into_owned()), |
3583 | } |
3584 | } |
3585 | } |
3586 | impl<'input> Request for SetCrtcGammaRequest<'input> { |
3587 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3588 | |
3589 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3590 | let (bufs: [Cow<'_, [u8]>; 5], fds: Vec) = self.serialize(major_opcode); |
3591 | // Flatten the buffers into a single vector |
3592 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3593 | (buf, fds) |
3594 | } |
3595 | } |
3596 | impl<'input> crate::x11_utils::VoidRequest for SetCrtcGammaRequest<'input> { |
3597 | } |
3598 | |
3599 | /// Opcode for the GetScreenResourcesCurrent request |
3600 | pub const GET_SCREEN_RESOURCES_CURRENT_REQUEST: u8 = 25; |
3601 | #[derive (Clone, Copy, Default)] |
3602 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3603 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3604 | pub struct GetScreenResourcesCurrentRequest { |
3605 | pub window: xproto::Window, |
3606 | } |
3607 | impl_debug_if_no_extra_traits!(GetScreenResourcesCurrentRequest, "GetScreenResourcesCurrentRequest" ); |
3608 | impl GetScreenResourcesCurrentRequest { |
3609 | /// Serialize this request into bytes for the provided connection |
3610 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
3611 | let length_so_far = 0; |
3612 | let window_bytes = self.window.serialize(); |
3613 | let mut request0 = vec![ |
3614 | major_opcode, |
3615 | GET_SCREEN_RESOURCES_CURRENT_REQUEST, |
3616 | 0, |
3617 | 0, |
3618 | window_bytes[0], |
3619 | window_bytes[1], |
3620 | window_bytes[2], |
3621 | window_bytes[3], |
3622 | ]; |
3623 | let length_so_far = length_so_far + request0.len(); |
3624 | assert_eq!(length_so_far % 4, 0); |
3625 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3626 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3627 | ([request0.into()], vec![]) |
3628 | } |
3629 | /// Parse this request given its header, its body, and any fds that go along with it |
3630 | #[cfg (feature = "request-parsing" )] |
3631 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
3632 | if header.minor_opcode != GET_SCREEN_RESOURCES_CURRENT_REQUEST { |
3633 | return Err(ParseError::InvalidValue); |
3634 | } |
3635 | let (window, remaining) = xproto::Window::try_parse(value)?; |
3636 | let _ = remaining; |
3637 | Ok(GetScreenResourcesCurrentRequest { |
3638 | window, |
3639 | }) |
3640 | } |
3641 | } |
3642 | impl Request for GetScreenResourcesCurrentRequest { |
3643 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3644 | |
3645 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3646 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
3647 | // Flatten the buffers into a single vector |
3648 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3649 | (buf, fds) |
3650 | } |
3651 | } |
3652 | impl crate::x11_utils::ReplyRequest for GetScreenResourcesCurrentRequest { |
3653 | type Reply = GetScreenResourcesCurrentReply; |
3654 | } |
3655 | |
3656 | #[derive (Clone, Default)] |
3657 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3658 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3659 | pub struct GetScreenResourcesCurrentReply { |
3660 | pub sequence: u16, |
3661 | pub length: u32, |
3662 | pub timestamp: xproto::Timestamp, |
3663 | pub config_timestamp: xproto::Timestamp, |
3664 | pub crtcs: Vec<Crtc>, |
3665 | pub outputs: Vec<Output>, |
3666 | pub modes: Vec<ModeInfo>, |
3667 | pub names: Vec<u8>, |
3668 | } |
3669 | impl_debug_if_no_extra_traits!(GetScreenResourcesCurrentReply, "GetScreenResourcesCurrentReply" ); |
3670 | impl TryParse for GetScreenResourcesCurrentReply { |
3671 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
3672 | let remaining = initial_value; |
3673 | let (response_type, remaining) = u8::try_parse(remaining)?; |
3674 | let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?; |
3675 | let (sequence, remaining) = u16::try_parse(remaining)?; |
3676 | let (length, remaining) = u32::try_parse(remaining)?; |
3677 | let (timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
3678 | let (config_timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
3679 | let (num_crtcs, remaining) = u16::try_parse(remaining)?; |
3680 | let (num_outputs, remaining) = u16::try_parse(remaining)?; |
3681 | let (num_modes, remaining) = u16::try_parse(remaining)?; |
3682 | let (names_len, remaining) = u16::try_parse(remaining)?; |
3683 | let remaining = remaining.get(8..).ok_or(ParseError::InsufficientData)?; |
3684 | let (crtcs, remaining) = crate::x11_utils::parse_list::<Crtc>(remaining, num_crtcs.try_to_usize()?)?; |
3685 | let (outputs, remaining) = crate::x11_utils::parse_list::<Output>(remaining, num_outputs.try_to_usize()?)?; |
3686 | let (modes, remaining) = crate::x11_utils::parse_list::<ModeInfo>(remaining, num_modes.try_to_usize()?)?; |
3687 | let (names, remaining) = crate::x11_utils::parse_u8_list(remaining, names_len.try_to_usize()?)?; |
3688 | let names = names.to_vec(); |
3689 | if response_type != 1 { |
3690 | return Err(ParseError::InvalidValue); |
3691 | } |
3692 | let result = GetScreenResourcesCurrentReply { sequence, length, timestamp, config_timestamp, crtcs, outputs, modes, names }; |
3693 | let _ = remaining; |
3694 | let remaining = initial_value.get(32 + length as usize * 4..) |
3695 | .ok_or(ParseError::InsufficientData)?; |
3696 | Ok((result, remaining)) |
3697 | } |
3698 | } |
3699 | impl Serialize for GetScreenResourcesCurrentReply { |
3700 | type Bytes = Vec<u8>; |
3701 | fn serialize(&self) -> Vec<u8> { |
3702 | let mut result = Vec::new(); |
3703 | self.serialize_into(&mut result); |
3704 | result |
3705 | } |
3706 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
3707 | bytes.reserve(32); |
3708 | let response_type_bytes = &[1]; |
3709 | bytes.push(response_type_bytes[0]); |
3710 | bytes.extend_from_slice(&[0; 1]); |
3711 | self.sequence.serialize_into(bytes); |
3712 | self.length.serialize_into(bytes); |
3713 | self.timestamp.serialize_into(bytes); |
3714 | self.config_timestamp.serialize_into(bytes); |
3715 | let num_crtcs = u16::try_from(self.crtcs.len()).expect("`crtcs` has too many elements" ); |
3716 | num_crtcs.serialize_into(bytes); |
3717 | let num_outputs = u16::try_from(self.outputs.len()).expect("`outputs` has too many elements" ); |
3718 | num_outputs.serialize_into(bytes); |
3719 | let num_modes = u16::try_from(self.modes.len()).expect("`modes` has too many elements" ); |
3720 | num_modes.serialize_into(bytes); |
3721 | let names_len = u16::try_from(self.names.len()).expect("`names` has too many elements" ); |
3722 | names_len.serialize_into(bytes); |
3723 | bytes.extend_from_slice(&[0; 8]); |
3724 | self.crtcs.serialize_into(bytes); |
3725 | self.outputs.serialize_into(bytes); |
3726 | self.modes.serialize_into(bytes); |
3727 | bytes.extend_from_slice(&self.names); |
3728 | } |
3729 | } |
3730 | impl GetScreenResourcesCurrentReply { |
3731 | /// Get the value of the `num_crtcs` field. |
3732 | /// |
3733 | /// The `num_crtcs` field is used as the length field of the `crtcs` field. |
3734 | /// This function computes the field's value again based on the length of the list. |
3735 | /// |
3736 | /// # Panics |
3737 | /// |
3738 | /// Panics if the value cannot be represented in the target type. This |
3739 | /// cannot happen with values of the struct received from the X11 server. |
3740 | pub fn num_crtcs(&self) -> u16 { |
3741 | self.crtcs.len() |
3742 | .try_into().unwrap() |
3743 | } |
3744 | /// Get the value of the `num_outputs` field. |
3745 | /// |
3746 | /// The `num_outputs` field is used as the length field of the `outputs` field. |
3747 | /// This function computes the field's value again based on the length of the list. |
3748 | /// |
3749 | /// # Panics |
3750 | /// |
3751 | /// Panics if the value cannot be represented in the target type. This |
3752 | /// cannot happen with values of the struct received from the X11 server. |
3753 | pub fn num_outputs(&self) -> u16 { |
3754 | self.outputs.len() |
3755 | .try_into().unwrap() |
3756 | } |
3757 | /// Get the value of the `num_modes` field. |
3758 | /// |
3759 | /// The `num_modes` field is used as the length field of the `modes` field. |
3760 | /// This function computes the field's value again based on the length of the list. |
3761 | /// |
3762 | /// # Panics |
3763 | /// |
3764 | /// Panics if the value cannot be represented in the target type. This |
3765 | /// cannot happen with values of the struct received from the X11 server. |
3766 | pub fn num_modes(&self) -> u16 { |
3767 | self.modes.len() |
3768 | .try_into().unwrap() |
3769 | } |
3770 | /// Get the value of the `names_len` field. |
3771 | /// |
3772 | /// The `names_len` field is used as the length field of the `names` field. |
3773 | /// This function computes the field's value again based on the length of the list. |
3774 | /// |
3775 | /// # Panics |
3776 | /// |
3777 | /// Panics if the value cannot be represented in the target type. This |
3778 | /// cannot happen with values of the struct received from the X11 server. |
3779 | pub fn names_len(&self) -> u16 { |
3780 | self.names.len() |
3781 | .try_into().unwrap() |
3782 | } |
3783 | } |
3784 | |
3785 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
3786 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3787 | pub struct Transform(u8); |
3788 | impl Transform { |
3789 | pub const UNIT: Self = Self(1 << 0); |
3790 | pub const SCALE_UP: Self = Self(1 << 1); |
3791 | pub const SCALE_DOWN: Self = Self(1 << 2); |
3792 | pub const PROJECTIVE: Self = Self(1 << 3); |
3793 | } |
3794 | impl From<Transform> for u8 { |
3795 | #[inline ] |
3796 | fn from(input: Transform) -> Self { |
3797 | input.0 |
3798 | } |
3799 | } |
3800 | impl From<Transform> for Option<u8> { |
3801 | #[inline ] |
3802 | fn from(input: Transform) -> Self { |
3803 | Some(input.0) |
3804 | } |
3805 | } |
3806 | impl From<Transform> for u16 { |
3807 | #[inline ] |
3808 | fn from(input: Transform) -> Self { |
3809 | u16::from(input.0) |
3810 | } |
3811 | } |
3812 | impl From<Transform> for Option<u16> { |
3813 | #[inline ] |
3814 | fn from(input: Transform) -> Self { |
3815 | Some(u16::from(input.0)) |
3816 | } |
3817 | } |
3818 | impl From<Transform> for u32 { |
3819 | #[inline ] |
3820 | fn from(input: Transform) -> Self { |
3821 | u32::from(input.0) |
3822 | } |
3823 | } |
3824 | impl From<Transform> for Option<u32> { |
3825 | #[inline ] |
3826 | fn from(input: Transform) -> Self { |
3827 | Some(u32::from(input.0)) |
3828 | } |
3829 | } |
3830 | impl From<u8> for Transform { |
3831 | #[inline ] |
3832 | fn from(value: u8) -> Self { |
3833 | Self(value) |
3834 | } |
3835 | } |
3836 | impl core::fmt::Debug for Transform { |
3837 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
3838 | let variants: [(u32, &str, &str); 4] = [ |
3839 | (Self::UNIT.0.into(), "UNIT" , "Unit" ), |
3840 | (Self::SCALE_UP.0.into(), "SCALE_UP" , "ScaleUp" ), |
3841 | (Self::SCALE_DOWN.0.into(), "SCALE_DOWN" , "ScaleDown" ), |
3842 | (Self::PROJECTIVE.0.into(), "PROJECTIVE" , "Projective" ), |
3843 | ]; |
3844 | pretty_print_bitmask(fmt, self.0.into(), &variants) |
3845 | } |
3846 | } |
3847 | bitmask_binop!(Transform, u8); |
3848 | |
3849 | /// Opcode for the SetCrtcTransform request |
3850 | pub const SET_CRTC_TRANSFORM_REQUEST: u8 = 26; |
3851 | #[derive (Clone, Default)] |
3852 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3853 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3854 | pub struct SetCrtcTransformRequest<'input> { |
3855 | pub crtc: Crtc, |
3856 | pub transform: render::Transform, |
3857 | pub filter_name: Cow<'input, [u8]>, |
3858 | pub filter_params: Cow<'input, [render::Fixed]>, |
3859 | } |
3860 | impl_debug_if_no_extra_traits!(SetCrtcTransformRequest<'_>, "SetCrtcTransformRequest" ); |
3861 | impl<'input> SetCrtcTransformRequest<'input> { |
3862 | /// Serialize this request into bytes for the provided connection |
3863 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 5]> { |
3864 | let length_so_far = 0; |
3865 | let crtc_bytes = self.crtc.serialize(); |
3866 | let transform_bytes = self.transform.serialize(); |
3867 | let filter_len = u16::try_from(self.filter_name.len()).expect("`filter_name` has too many elements" ); |
3868 | let filter_len_bytes = filter_len.serialize(); |
3869 | let mut request0 = vec![ |
3870 | major_opcode, |
3871 | SET_CRTC_TRANSFORM_REQUEST, |
3872 | 0, |
3873 | 0, |
3874 | crtc_bytes[0], |
3875 | crtc_bytes[1], |
3876 | crtc_bytes[2], |
3877 | crtc_bytes[3], |
3878 | transform_bytes[0], |
3879 | transform_bytes[1], |
3880 | transform_bytes[2], |
3881 | transform_bytes[3], |
3882 | transform_bytes[4], |
3883 | transform_bytes[5], |
3884 | transform_bytes[6], |
3885 | transform_bytes[7], |
3886 | transform_bytes[8], |
3887 | transform_bytes[9], |
3888 | transform_bytes[10], |
3889 | transform_bytes[11], |
3890 | transform_bytes[12], |
3891 | transform_bytes[13], |
3892 | transform_bytes[14], |
3893 | transform_bytes[15], |
3894 | transform_bytes[16], |
3895 | transform_bytes[17], |
3896 | transform_bytes[18], |
3897 | transform_bytes[19], |
3898 | transform_bytes[20], |
3899 | transform_bytes[21], |
3900 | transform_bytes[22], |
3901 | transform_bytes[23], |
3902 | transform_bytes[24], |
3903 | transform_bytes[25], |
3904 | transform_bytes[26], |
3905 | transform_bytes[27], |
3906 | transform_bytes[28], |
3907 | transform_bytes[29], |
3908 | transform_bytes[30], |
3909 | transform_bytes[31], |
3910 | transform_bytes[32], |
3911 | transform_bytes[33], |
3912 | transform_bytes[34], |
3913 | transform_bytes[35], |
3914 | filter_len_bytes[0], |
3915 | filter_len_bytes[1], |
3916 | 0, |
3917 | 0, |
3918 | ]; |
3919 | let length_so_far = length_so_far + request0.len(); |
3920 | let length_so_far = length_so_far + self.filter_name.len(); |
3921 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
3922 | let length_so_far = length_so_far + padding0.len(); |
3923 | let filter_params_bytes = self.filter_params.serialize(); |
3924 | let length_so_far = length_so_far + filter_params_bytes.len(); |
3925 | let padding1 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
3926 | let length_so_far = length_so_far + padding1.len(); |
3927 | assert_eq!(length_so_far % 4, 0); |
3928 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3929 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3930 | ([request0.into(), self.filter_name, padding0.into(), filter_params_bytes.into(), padding1.into()], vec![]) |
3931 | } |
3932 | /// Parse this request given its header, its body, and any fds that go along with it |
3933 | #[cfg (feature = "request-parsing" )] |
3934 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
3935 | if header.minor_opcode != SET_CRTC_TRANSFORM_REQUEST { |
3936 | return Err(ParseError::InvalidValue); |
3937 | } |
3938 | let (crtc, remaining) = Crtc::try_parse(value)?; |
3939 | let (transform, remaining) = render::Transform::try_parse(remaining)?; |
3940 | let (filter_len, remaining) = u16::try_parse(remaining)?; |
3941 | let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?; |
3942 | let (filter_name, remaining) = crate::x11_utils::parse_u8_list(remaining, filter_len.try_to_usize()?)?; |
3943 | // Align offset to multiple of 4 |
3944 | let offset = remaining.as_ptr() as usize - value.as_ptr() as usize; |
3945 | let misalignment = (4 - (offset % 4)) % 4; |
3946 | let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?; |
3947 | let mut remaining = remaining; |
3948 | // Length is 'everything left in the input' |
3949 | let mut filter_params = Vec::new(); |
3950 | while !remaining.is_empty() { |
3951 | let (v, new_remaining) = render::Fixed::try_parse(remaining)?; |
3952 | remaining = new_remaining; |
3953 | filter_params.push(v); |
3954 | } |
3955 | let _ = remaining; |
3956 | Ok(SetCrtcTransformRequest { |
3957 | crtc, |
3958 | transform, |
3959 | filter_name: Cow::Borrowed(filter_name), |
3960 | filter_params: Cow::Owned(filter_params), |
3961 | }) |
3962 | } |
3963 | /// Clone all borrowed data in this SetCrtcTransformRequest. |
3964 | pub fn into_owned(self) -> SetCrtcTransformRequest<'static> { |
3965 | SetCrtcTransformRequest { |
3966 | crtc: self.crtc, |
3967 | transform: self.transform, |
3968 | filter_name: Cow::Owned(self.filter_name.into_owned()), |
3969 | filter_params: Cow::Owned(self.filter_params.into_owned()), |
3970 | } |
3971 | } |
3972 | } |
3973 | impl<'input> Request for SetCrtcTransformRequest<'input> { |
3974 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3975 | |
3976 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3977 | let (bufs: [Cow<'_, [u8]>; 5], fds: Vec) = self.serialize(major_opcode); |
3978 | // Flatten the buffers into a single vector |
3979 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3980 | (buf, fds) |
3981 | } |
3982 | } |
3983 | impl<'input> crate::x11_utils::VoidRequest for SetCrtcTransformRequest<'input> { |
3984 | } |
3985 | |
3986 | /// Opcode for the GetCrtcTransform request |
3987 | pub const GET_CRTC_TRANSFORM_REQUEST: u8 = 27; |
3988 | #[derive (Clone, Copy, Default)] |
3989 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3990 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3991 | pub struct GetCrtcTransformRequest { |
3992 | pub crtc: Crtc, |
3993 | } |
3994 | impl_debug_if_no_extra_traits!(GetCrtcTransformRequest, "GetCrtcTransformRequest" ); |
3995 | impl GetCrtcTransformRequest { |
3996 | /// Serialize this request into bytes for the provided connection |
3997 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
3998 | let length_so_far = 0; |
3999 | let crtc_bytes = self.crtc.serialize(); |
4000 | let mut request0 = vec![ |
4001 | major_opcode, |
4002 | GET_CRTC_TRANSFORM_REQUEST, |
4003 | 0, |
4004 | 0, |
4005 | crtc_bytes[0], |
4006 | crtc_bytes[1], |
4007 | crtc_bytes[2], |
4008 | crtc_bytes[3], |
4009 | ]; |
4010 | let length_so_far = length_so_far + request0.len(); |
4011 | assert_eq!(length_so_far % 4, 0); |
4012 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
4013 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
4014 | ([request0.into()], vec![]) |
4015 | } |
4016 | /// Parse this request given its header, its body, and any fds that go along with it |
4017 | #[cfg (feature = "request-parsing" )] |
4018 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
4019 | if header.minor_opcode != GET_CRTC_TRANSFORM_REQUEST { |
4020 | return Err(ParseError::InvalidValue); |
4021 | } |
4022 | let (crtc, remaining) = Crtc::try_parse(value)?; |
4023 | let _ = remaining; |
4024 | Ok(GetCrtcTransformRequest { |
4025 | crtc, |
4026 | }) |
4027 | } |
4028 | } |
4029 | impl Request for GetCrtcTransformRequest { |
4030 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
4031 | |
4032 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
4033 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
4034 | // Flatten the buffers into a single vector |
4035 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
4036 | (buf, fds) |
4037 | } |
4038 | } |
4039 | impl crate::x11_utils::ReplyRequest for GetCrtcTransformRequest { |
4040 | type Reply = GetCrtcTransformReply; |
4041 | } |
4042 | |
4043 | #[derive (Clone, Default)] |
4044 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4045 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4046 | pub struct GetCrtcTransformReply { |
4047 | pub sequence: u16, |
4048 | pub length: u32, |
4049 | pub pending_transform: render::Transform, |
4050 | pub has_transforms: bool, |
4051 | pub current_transform: render::Transform, |
4052 | pub pending_filter_name: Vec<u8>, |
4053 | pub pending_params: Vec<render::Fixed>, |
4054 | pub current_filter_name: Vec<u8>, |
4055 | pub current_params: Vec<render::Fixed>, |
4056 | } |
4057 | impl_debug_if_no_extra_traits!(GetCrtcTransformReply, "GetCrtcTransformReply" ); |
4058 | impl TryParse for GetCrtcTransformReply { |
4059 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
4060 | let remaining = initial_value; |
4061 | let value = remaining; |
4062 | let (response_type, remaining) = u8::try_parse(remaining)?; |
4063 | let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?; |
4064 | let (sequence, remaining) = u16::try_parse(remaining)?; |
4065 | let (length, remaining) = u32::try_parse(remaining)?; |
4066 | let (pending_transform, remaining) = render::Transform::try_parse(remaining)?; |
4067 | let (has_transforms, remaining) = bool::try_parse(remaining)?; |
4068 | let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?; |
4069 | let (current_transform, remaining) = render::Transform::try_parse(remaining)?; |
4070 | let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?; |
4071 | let (pending_len, remaining) = u16::try_parse(remaining)?; |
4072 | let (pending_nparams, remaining) = u16::try_parse(remaining)?; |
4073 | let (current_len, remaining) = u16::try_parse(remaining)?; |
4074 | let (current_nparams, remaining) = u16::try_parse(remaining)?; |
4075 | let (pending_filter_name, remaining) = crate::x11_utils::parse_u8_list(remaining, pending_len.try_to_usize()?)?; |
4076 | let pending_filter_name = pending_filter_name.to_vec(); |
4077 | // Align offset to multiple of 4 |
4078 | let offset = remaining.as_ptr() as usize - value.as_ptr() as usize; |
4079 | let misalignment = (4 - (offset % 4)) % 4; |
4080 | let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?; |
4081 | let (pending_params, remaining) = crate::x11_utils::parse_list::<render::Fixed>(remaining, pending_nparams.try_to_usize()?)?; |
4082 | let (current_filter_name, remaining) = crate::x11_utils::parse_u8_list(remaining, current_len.try_to_usize()?)?; |
4083 | let current_filter_name = current_filter_name.to_vec(); |
4084 | // Align offset to multiple of 4 |
4085 | let offset = remaining.as_ptr() as usize - value.as_ptr() as usize; |
4086 | let misalignment = (4 - (offset % 4)) % 4; |
4087 | let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?; |
4088 | let (current_params, remaining) = crate::x11_utils::parse_list::<render::Fixed>(remaining, current_nparams.try_to_usize()?)?; |
4089 | if response_type != 1 { |
4090 | return Err(ParseError::InvalidValue); |
4091 | } |
4092 | let result = GetCrtcTransformReply { sequence, length, pending_transform, has_transforms, current_transform, pending_filter_name, pending_params, current_filter_name, current_params }; |
4093 | let _ = remaining; |
4094 | let remaining = initial_value.get(32 + length as usize * 4..) |
4095 | .ok_or(ParseError::InsufficientData)?; |
4096 | Ok((result, remaining)) |
4097 | } |
4098 | } |
4099 | impl Serialize for GetCrtcTransformReply { |
4100 | type Bytes = Vec<u8>; |
4101 | fn serialize(&self) -> Vec<u8> { |
4102 | let mut result = Vec::new(); |
4103 | self.serialize_into(&mut result); |
4104 | result |
4105 | } |
4106 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
4107 | bytes.reserve(96); |
4108 | let response_type_bytes = &[1]; |
4109 | bytes.push(response_type_bytes[0]); |
4110 | bytes.extend_from_slice(&[0; 1]); |
4111 | self.sequence.serialize_into(bytes); |
4112 | self.length.serialize_into(bytes); |
4113 | self.pending_transform.serialize_into(bytes); |
4114 | self.has_transforms.serialize_into(bytes); |
4115 | bytes.extend_from_slice(&[0; 3]); |
4116 | self.current_transform.serialize_into(bytes); |
4117 | bytes.extend_from_slice(&[0; 4]); |
4118 | let pending_len = u16::try_from(self.pending_filter_name.len()).expect("`pending_filter_name` has too many elements" ); |
4119 | pending_len.serialize_into(bytes); |
4120 | let pending_nparams = u16::try_from(self.pending_params.len()).expect("`pending_params` has too many elements" ); |
4121 | pending_nparams.serialize_into(bytes); |
4122 | let current_len = u16::try_from(self.current_filter_name.len()).expect("`current_filter_name` has too many elements" ); |
4123 | current_len.serialize_into(bytes); |
4124 | let current_nparams = u16::try_from(self.current_params.len()).expect("`current_params` has too many elements" ); |
4125 | current_nparams.serialize_into(bytes); |
4126 | bytes.extend_from_slice(&self.pending_filter_name); |
4127 | bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]); |
4128 | self.pending_params.serialize_into(bytes); |
4129 | bytes.extend_from_slice(&self.current_filter_name); |
4130 | bytes.extend_from_slice(&[0; 3][..(4 - (bytes.len() % 4)) % 4]); |
4131 | self.current_params.serialize_into(bytes); |
4132 | } |
4133 | } |
4134 | impl GetCrtcTransformReply { |
4135 | /// Get the value of the `pending_len` field. |
4136 | /// |
4137 | /// The `pending_len` field is used as the length field of the `pending_filter_name` field. |
4138 | /// This function computes the field's value again based on the length of the list. |
4139 | /// |
4140 | /// # Panics |
4141 | /// |
4142 | /// Panics if the value cannot be represented in the target type. This |
4143 | /// cannot happen with values of the struct received from the X11 server. |
4144 | pub fn pending_len(&self) -> u16 { |
4145 | self.pending_filter_name.len() |
4146 | .try_into().unwrap() |
4147 | } |
4148 | /// Get the value of the `pending_nparams` field. |
4149 | /// |
4150 | /// The `pending_nparams` field is used as the length field of the `pending_params` field. |
4151 | /// This function computes the field's value again based on the length of the list. |
4152 | /// |
4153 | /// # Panics |
4154 | /// |
4155 | /// Panics if the value cannot be represented in the target type. This |
4156 | /// cannot happen with values of the struct received from the X11 server. |
4157 | pub fn pending_nparams(&self) -> u16 { |
4158 | self.pending_params.len() |
4159 | .try_into().unwrap() |
4160 | } |
4161 | /// Get the value of the `current_len` field. |
4162 | /// |
4163 | /// The `current_len` field is used as the length field of the `current_filter_name` field. |
4164 | /// This function computes the field's value again based on the length of the list. |
4165 | /// |
4166 | /// # Panics |
4167 | /// |
4168 | /// Panics if the value cannot be represented in the target type. This |
4169 | /// cannot happen with values of the struct received from the X11 server. |
4170 | pub fn current_len(&self) -> u16 { |
4171 | self.current_filter_name.len() |
4172 | .try_into().unwrap() |
4173 | } |
4174 | /// Get the value of the `current_nparams` field. |
4175 | /// |
4176 | /// The `current_nparams` field is used as the length field of the `current_params` field. |
4177 | /// This function computes the field's value again based on the length of the list. |
4178 | /// |
4179 | /// # Panics |
4180 | /// |
4181 | /// Panics if the value cannot be represented in the target type. This |
4182 | /// cannot happen with values of the struct received from the X11 server. |
4183 | pub fn current_nparams(&self) -> u16 { |
4184 | self.current_params.len() |
4185 | .try_into().unwrap() |
4186 | } |
4187 | } |
4188 | |
4189 | /// Opcode for the GetPanning request |
4190 | pub const GET_PANNING_REQUEST: u8 = 28; |
4191 | #[derive (Clone, Copy, Default)] |
4192 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4193 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4194 | pub struct GetPanningRequest { |
4195 | pub crtc: Crtc, |
4196 | } |
4197 | impl_debug_if_no_extra_traits!(GetPanningRequest, "GetPanningRequest" ); |
4198 | impl GetPanningRequest { |
4199 | /// Serialize this request into bytes for the provided connection |
4200 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
4201 | let length_so_far = 0; |
4202 | let crtc_bytes = self.crtc.serialize(); |
4203 | let mut request0 = vec![ |
4204 | major_opcode, |
4205 | GET_PANNING_REQUEST, |
4206 | 0, |
4207 | 0, |
4208 | crtc_bytes[0], |
4209 | crtc_bytes[1], |
4210 | crtc_bytes[2], |
4211 | crtc_bytes[3], |
4212 | ]; |
4213 | let length_so_far = length_so_far + request0.len(); |
4214 | assert_eq!(length_so_far % 4, 0); |
4215 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
4216 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
4217 | ([request0.into()], vec![]) |
4218 | } |
4219 | /// Parse this request given its header, its body, and any fds that go along with it |
4220 | #[cfg (feature = "request-parsing" )] |
4221 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
4222 | if header.minor_opcode != GET_PANNING_REQUEST { |
4223 | return Err(ParseError::InvalidValue); |
4224 | } |
4225 | let (crtc, remaining) = Crtc::try_parse(value)?; |
4226 | let _ = remaining; |
4227 | Ok(GetPanningRequest { |
4228 | crtc, |
4229 | }) |
4230 | } |
4231 | } |
4232 | impl Request for GetPanningRequest { |
4233 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
4234 | |
4235 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
4236 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
4237 | // Flatten the buffers into a single vector |
4238 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
4239 | (buf, fds) |
4240 | } |
4241 | } |
4242 | impl crate::x11_utils::ReplyRequest for GetPanningRequest { |
4243 | type Reply = GetPanningReply; |
4244 | } |
4245 | |
4246 | #[derive (Clone, Copy, Default)] |
4247 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4248 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4249 | pub struct GetPanningReply { |
4250 | pub status: SetConfig, |
4251 | pub sequence: u16, |
4252 | pub length: u32, |
4253 | pub timestamp: xproto::Timestamp, |
4254 | pub left: u16, |
4255 | pub top: u16, |
4256 | pub width: u16, |
4257 | pub height: u16, |
4258 | pub track_left: u16, |
4259 | pub track_top: u16, |
4260 | pub track_width: u16, |
4261 | pub track_height: u16, |
4262 | pub border_left: i16, |
4263 | pub border_top: i16, |
4264 | pub border_right: i16, |
4265 | pub border_bottom: i16, |
4266 | } |
4267 | impl_debug_if_no_extra_traits!(GetPanningReply, "GetPanningReply" ); |
4268 | impl TryParse for GetPanningReply { |
4269 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
4270 | let remaining = initial_value; |
4271 | let (response_type, remaining) = u8::try_parse(remaining)?; |
4272 | let (status, remaining) = u8::try_parse(remaining)?; |
4273 | let (sequence, remaining) = u16::try_parse(remaining)?; |
4274 | let (length, remaining) = u32::try_parse(remaining)?; |
4275 | let (timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
4276 | let (left, remaining) = u16::try_parse(remaining)?; |
4277 | let (top, remaining) = u16::try_parse(remaining)?; |
4278 | let (width, remaining) = u16::try_parse(remaining)?; |
4279 | let (height, remaining) = u16::try_parse(remaining)?; |
4280 | let (track_left, remaining) = u16::try_parse(remaining)?; |
4281 | let (track_top, remaining) = u16::try_parse(remaining)?; |
4282 | let (track_width, remaining) = u16::try_parse(remaining)?; |
4283 | let (track_height, remaining) = u16::try_parse(remaining)?; |
4284 | let (border_left, remaining) = i16::try_parse(remaining)?; |
4285 | let (border_top, remaining) = i16::try_parse(remaining)?; |
4286 | let (border_right, remaining) = i16::try_parse(remaining)?; |
4287 | let (border_bottom, remaining) = i16::try_parse(remaining)?; |
4288 | if response_type != 1 { |
4289 | return Err(ParseError::InvalidValue); |
4290 | } |
4291 | let status = status.into(); |
4292 | let result = GetPanningReply { status, sequence, length, timestamp, left, top, width, height, track_left, track_top, track_width, track_height, border_left, border_top, border_right, border_bottom }; |
4293 | let _ = remaining; |
4294 | let remaining = initial_value.get(32 + length as usize * 4..) |
4295 | .ok_or(ParseError::InsufficientData)?; |
4296 | Ok((result, remaining)) |
4297 | } |
4298 | } |
4299 | impl Serialize for GetPanningReply { |
4300 | type Bytes = [u8; 36]; |
4301 | fn serialize(&self) -> [u8; 36] { |
4302 | let response_type_bytes = &[1]; |
4303 | let status_bytes = u8::from(self.status).serialize(); |
4304 | let sequence_bytes = self.sequence.serialize(); |
4305 | let length_bytes = self.length.serialize(); |
4306 | let timestamp_bytes = self.timestamp.serialize(); |
4307 | let left_bytes = self.left.serialize(); |
4308 | let top_bytes = self.top.serialize(); |
4309 | let width_bytes = self.width.serialize(); |
4310 | let height_bytes = self.height.serialize(); |
4311 | let track_left_bytes = self.track_left.serialize(); |
4312 | let track_top_bytes = self.track_top.serialize(); |
4313 | let track_width_bytes = self.track_width.serialize(); |
4314 | let track_height_bytes = self.track_height.serialize(); |
4315 | let border_left_bytes = self.border_left.serialize(); |
4316 | let border_top_bytes = self.border_top.serialize(); |
4317 | let border_right_bytes = self.border_right.serialize(); |
4318 | let border_bottom_bytes = self.border_bottom.serialize(); |
4319 | [ |
4320 | response_type_bytes[0], |
4321 | status_bytes[0], |
4322 | sequence_bytes[0], |
4323 | sequence_bytes[1], |
4324 | length_bytes[0], |
4325 | length_bytes[1], |
4326 | length_bytes[2], |
4327 | length_bytes[3], |
4328 | timestamp_bytes[0], |
4329 | timestamp_bytes[1], |
4330 | timestamp_bytes[2], |
4331 | timestamp_bytes[3], |
4332 | left_bytes[0], |
4333 | left_bytes[1], |
4334 | top_bytes[0], |
4335 | top_bytes[1], |
4336 | width_bytes[0], |
4337 | width_bytes[1], |
4338 | height_bytes[0], |
4339 | height_bytes[1], |
4340 | track_left_bytes[0], |
4341 | track_left_bytes[1], |
4342 | track_top_bytes[0], |
4343 | track_top_bytes[1], |
4344 | track_width_bytes[0], |
4345 | track_width_bytes[1], |
4346 | track_height_bytes[0], |
4347 | track_height_bytes[1], |
4348 | border_left_bytes[0], |
4349 | border_left_bytes[1], |
4350 | border_top_bytes[0], |
4351 | border_top_bytes[1], |
4352 | border_right_bytes[0], |
4353 | border_right_bytes[1], |
4354 | border_bottom_bytes[0], |
4355 | border_bottom_bytes[1], |
4356 | ] |
4357 | } |
4358 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
4359 | bytes.reserve(36); |
4360 | let response_type_bytes = &[1]; |
4361 | bytes.push(response_type_bytes[0]); |
4362 | u8::from(self.status).serialize_into(bytes); |
4363 | self.sequence.serialize_into(bytes); |
4364 | self.length.serialize_into(bytes); |
4365 | self.timestamp.serialize_into(bytes); |
4366 | self.left.serialize_into(bytes); |
4367 | self.top.serialize_into(bytes); |
4368 | self.width.serialize_into(bytes); |
4369 | self.height.serialize_into(bytes); |
4370 | self.track_left.serialize_into(bytes); |
4371 | self.track_top.serialize_into(bytes); |
4372 | self.track_width.serialize_into(bytes); |
4373 | self.track_height.serialize_into(bytes); |
4374 | self.border_left.serialize_into(bytes); |
4375 | self.border_top.serialize_into(bytes); |
4376 | self.border_right.serialize_into(bytes); |
4377 | self.border_bottom.serialize_into(bytes); |
4378 | } |
4379 | } |
4380 | |
4381 | /// Opcode for the SetPanning request |
4382 | pub const SET_PANNING_REQUEST: u8 = 29; |
4383 | #[derive (Clone, Copy, Default)] |
4384 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4385 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4386 | pub struct SetPanningRequest { |
4387 | pub crtc: Crtc, |
4388 | pub timestamp: xproto::Timestamp, |
4389 | pub left: u16, |
4390 | pub top: u16, |
4391 | pub width: u16, |
4392 | pub height: u16, |
4393 | pub track_left: u16, |
4394 | pub track_top: u16, |
4395 | pub track_width: u16, |
4396 | pub track_height: u16, |
4397 | pub border_left: i16, |
4398 | pub border_top: i16, |
4399 | pub border_right: i16, |
4400 | pub border_bottom: i16, |
4401 | } |
4402 | impl_debug_if_no_extra_traits!(SetPanningRequest, "SetPanningRequest" ); |
4403 | impl SetPanningRequest { |
4404 | /// Serialize this request into bytes for the provided connection |
4405 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
4406 | let length_so_far = 0; |
4407 | let crtc_bytes = self.crtc.serialize(); |
4408 | let timestamp_bytes = self.timestamp.serialize(); |
4409 | let left_bytes = self.left.serialize(); |
4410 | let top_bytes = self.top.serialize(); |
4411 | let width_bytes = self.width.serialize(); |
4412 | let height_bytes = self.height.serialize(); |
4413 | let track_left_bytes = self.track_left.serialize(); |
4414 | let track_top_bytes = self.track_top.serialize(); |
4415 | let track_width_bytes = self.track_width.serialize(); |
4416 | let track_height_bytes = self.track_height.serialize(); |
4417 | let border_left_bytes = self.border_left.serialize(); |
4418 | let border_top_bytes = self.border_top.serialize(); |
4419 | let border_right_bytes = self.border_right.serialize(); |
4420 | let border_bottom_bytes = self.border_bottom.serialize(); |
4421 | let mut request0 = vec![ |
4422 | major_opcode, |
4423 | SET_PANNING_REQUEST, |
4424 | 0, |
4425 | 0, |
4426 | crtc_bytes[0], |
4427 | crtc_bytes[1], |
4428 | crtc_bytes[2], |
4429 | crtc_bytes[3], |
4430 | timestamp_bytes[0], |
4431 | timestamp_bytes[1], |
4432 | timestamp_bytes[2], |
4433 | timestamp_bytes[3], |
4434 | left_bytes[0], |
4435 | left_bytes[1], |
4436 | top_bytes[0], |
4437 | top_bytes[1], |
4438 | width_bytes[0], |
4439 | width_bytes[1], |
4440 | height_bytes[0], |
4441 | height_bytes[1], |
4442 | track_left_bytes[0], |
4443 | track_left_bytes[1], |
4444 | track_top_bytes[0], |
4445 | track_top_bytes[1], |
4446 | track_width_bytes[0], |
4447 | track_width_bytes[1], |
4448 | track_height_bytes[0], |
4449 | track_height_bytes[1], |
4450 | border_left_bytes[0], |
4451 | border_left_bytes[1], |
4452 | border_top_bytes[0], |
4453 | border_top_bytes[1], |
4454 | border_right_bytes[0], |
4455 | border_right_bytes[1], |
4456 | border_bottom_bytes[0], |
4457 | border_bottom_bytes[1], |
4458 | ]; |
4459 | let length_so_far = length_so_far + request0.len(); |
4460 | assert_eq!(length_so_far % 4, 0); |
4461 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
4462 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
4463 | ([request0.into()], vec![]) |
4464 | } |
4465 | /// Parse this request given its header, its body, and any fds that go along with it |
4466 | #[cfg (feature = "request-parsing" )] |
4467 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
4468 | if header.minor_opcode != SET_PANNING_REQUEST { |
4469 | return Err(ParseError::InvalidValue); |
4470 | } |
4471 | let (crtc, remaining) = Crtc::try_parse(value)?; |
4472 | let (timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
4473 | let (left, remaining) = u16::try_parse(remaining)?; |
4474 | let (top, remaining) = u16::try_parse(remaining)?; |
4475 | let (width, remaining) = u16::try_parse(remaining)?; |
4476 | let (height, remaining) = u16::try_parse(remaining)?; |
4477 | let (track_left, remaining) = u16::try_parse(remaining)?; |
4478 | let (track_top, remaining) = u16::try_parse(remaining)?; |
4479 | let (track_width, remaining) = u16::try_parse(remaining)?; |
4480 | let (track_height, remaining) = u16::try_parse(remaining)?; |
4481 | let (border_left, remaining) = i16::try_parse(remaining)?; |
4482 | let (border_top, remaining) = i16::try_parse(remaining)?; |
4483 | let (border_right, remaining) = i16::try_parse(remaining)?; |
4484 | let (border_bottom, remaining) = i16::try_parse(remaining)?; |
4485 | let _ = remaining; |
4486 | Ok(SetPanningRequest { |
4487 | crtc, |
4488 | timestamp, |
4489 | left, |
4490 | top, |
4491 | width, |
4492 | height, |
4493 | track_left, |
4494 | track_top, |
4495 | track_width, |
4496 | track_height, |
4497 | border_left, |
4498 | border_top, |
4499 | border_right, |
4500 | border_bottom, |
4501 | }) |
4502 | } |
4503 | } |
4504 | impl Request for SetPanningRequest { |
4505 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
4506 | |
4507 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
4508 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
4509 | // Flatten the buffers into a single vector |
4510 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
4511 | (buf, fds) |
4512 | } |
4513 | } |
4514 | impl crate::x11_utils::ReplyRequest for SetPanningRequest { |
4515 | type Reply = SetPanningReply; |
4516 | } |
4517 | |
4518 | #[derive (Clone, Copy, Default)] |
4519 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4520 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4521 | pub struct SetPanningReply { |
4522 | pub status: SetConfig, |
4523 | pub sequence: u16, |
4524 | pub length: u32, |
4525 | pub timestamp: xproto::Timestamp, |
4526 | } |
4527 | impl_debug_if_no_extra_traits!(SetPanningReply, "SetPanningReply" ); |
4528 | impl TryParse for SetPanningReply { |
4529 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
4530 | let remaining: &[u8] = initial_value; |
4531 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
4532 | let (status: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
4533 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
4534 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
4535 | let (timestamp: u32, remaining: &[u8]) = xproto::Timestamp::try_parse(remaining)?; |
4536 | if response_type != 1 { |
4537 | return Err(ParseError::InvalidValue); |
4538 | } |
4539 | let status: SetConfig = status.into(); |
4540 | let result: SetPanningReply = SetPanningReply { status, sequence, length, timestamp }; |
4541 | let _ = remaining; |
4542 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
4543 | .ok_or(err:ParseError::InsufficientData)?; |
4544 | Ok((result, remaining)) |
4545 | } |
4546 | } |
4547 | impl Serialize for SetPanningReply { |
4548 | type Bytes = [u8; 12]; |
4549 | fn serialize(&self) -> [u8; 12] { |
4550 | let response_type_bytes = &[1]; |
4551 | let status_bytes = u8::from(self.status).serialize(); |
4552 | let sequence_bytes = self.sequence.serialize(); |
4553 | let length_bytes = self.length.serialize(); |
4554 | let timestamp_bytes = self.timestamp.serialize(); |
4555 | [ |
4556 | response_type_bytes[0], |
4557 | status_bytes[0], |
4558 | sequence_bytes[0], |
4559 | sequence_bytes[1], |
4560 | length_bytes[0], |
4561 | length_bytes[1], |
4562 | length_bytes[2], |
4563 | length_bytes[3], |
4564 | timestamp_bytes[0], |
4565 | timestamp_bytes[1], |
4566 | timestamp_bytes[2], |
4567 | timestamp_bytes[3], |
4568 | ] |
4569 | } |
4570 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
4571 | bytes.reserve(12); |
4572 | let response_type_bytes = &[1]; |
4573 | bytes.push(response_type_bytes[0]); |
4574 | u8::from(self.status).serialize_into(bytes); |
4575 | self.sequence.serialize_into(bytes); |
4576 | self.length.serialize_into(bytes); |
4577 | self.timestamp.serialize_into(bytes); |
4578 | } |
4579 | } |
4580 | |
4581 | /// Opcode for the SetOutputPrimary request |
4582 | pub const SET_OUTPUT_PRIMARY_REQUEST: u8 = 30; |
4583 | #[derive (Clone, Copy, Default)] |
4584 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4585 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4586 | pub struct SetOutputPrimaryRequest { |
4587 | pub window: xproto::Window, |
4588 | pub output: Output, |
4589 | } |
4590 | impl_debug_if_no_extra_traits!(SetOutputPrimaryRequest, "SetOutputPrimaryRequest" ); |
4591 | impl SetOutputPrimaryRequest { |
4592 | /// Serialize this request into bytes for the provided connection |
4593 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
4594 | let length_so_far = 0; |
4595 | let window_bytes = self.window.serialize(); |
4596 | let output_bytes = self.output.serialize(); |
4597 | let mut request0 = vec![ |
4598 | major_opcode, |
4599 | SET_OUTPUT_PRIMARY_REQUEST, |
4600 | 0, |
4601 | 0, |
4602 | window_bytes[0], |
4603 | window_bytes[1], |
4604 | window_bytes[2], |
4605 | window_bytes[3], |
4606 | output_bytes[0], |
4607 | output_bytes[1], |
4608 | output_bytes[2], |
4609 | output_bytes[3], |
4610 | ]; |
4611 | let length_so_far = length_so_far + request0.len(); |
4612 | assert_eq!(length_so_far % 4, 0); |
4613 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
4614 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
4615 | ([request0.into()], vec![]) |
4616 | } |
4617 | /// Parse this request given its header, its body, and any fds that go along with it |
4618 | #[cfg (feature = "request-parsing" )] |
4619 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
4620 | if header.minor_opcode != SET_OUTPUT_PRIMARY_REQUEST { |
4621 | return Err(ParseError::InvalidValue); |
4622 | } |
4623 | let (window, remaining) = xproto::Window::try_parse(value)?; |
4624 | let (output, remaining) = Output::try_parse(remaining)?; |
4625 | let _ = remaining; |
4626 | Ok(SetOutputPrimaryRequest { |
4627 | window, |
4628 | output, |
4629 | }) |
4630 | } |
4631 | } |
4632 | impl Request for SetOutputPrimaryRequest { |
4633 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
4634 | |
4635 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
4636 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
4637 | // Flatten the buffers into a single vector |
4638 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
4639 | (buf, fds) |
4640 | } |
4641 | } |
4642 | impl crate::x11_utils::VoidRequest for SetOutputPrimaryRequest { |
4643 | } |
4644 | |
4645 | /// Opcode for the GetOutputPrimary request |
4646 | pub const GET_OUTPUT_PRIMARY_REQUEST: u8 = 31; |
4647 | #[derive (Clone, Copy, Default)] |
4648 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4649 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4650 | pub struct GetOutputPrimaryRequest { |
4651 | pub window: xproto::Window, |
4652 | } |
4653 | impl_debug_if_no_extra_traits!(GetOutputPrimaryRequest, "GetOutputPrimaryRequest" ); |
4654 | impl GetOutputPrimaryRequest { |
4655 | /// Serialize this request into bytes for the provided connection |
4656 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
4657 | let length_so_far = 0; |
4658 | let window_bytes = self.window.serialize(); |
4659 | let mut request0 = vec![ |
4660 | major_opcode, |
4661 | GET_OUTPUT_PRIMARY_REQUEST, |
4662 | 0, |
4663 | 0, |
4664 | window_bytes[0], |
4665 | window_bytes[1], |
4666 | window_bytes[2], |
4667 | window_bytes[3], |
4668 | ]; |
4669 | let length_so_far = length_so_far + request0.len(); |
4670 | assert_eq!(length_so_far % 4, 0); |
4671 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
4672 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
4673 | ([request0.into()], vec![]) |
4674 | } |
4675 | /// Parse this request given its header, its body, and any fds that go along with it |
4676 | #[cfg (feature = "request-parsing" )] |
4677 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
4678 | if header.minor_opcode != GET_OUTPUT_PRIMARY_REQUEST { |
4679 | return Err(ParseError::InvalidValue); |
4680 | } |
4681 | let (window, remaining) = xproto::Window::try_parse(value)?; |
4682 | let _ = remaining; |
4683 | Ok(GetOutputPrimaryRequest { |
4684 | window, |
4685 | }) |
4686 | } |
4687 | } |
4688 | impl Request for GetOutputPrimaryRequest { |
4689 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
4690 | |
4691 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
4692 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
4693 | // Flatten the buffers into a single vector |
4694 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
4695 | (buf, fds) |
4696 | } |
4697 | } |
4698 | impl crate::x11_utils::ReplyRequest for GetOutputPrimaryRequest { |
4699 | type Reply = GetOutputPrimaryReply; |
4700 | } |
4701 | |
4702 | #[derive (Clone, Copy, Default)] |
4703 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4704 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4705 | pub struct GetOutputPrimaryReply { |
4706 | pub sequence: u16, |
4707 | pub length: u32, |
4708 | pub output: Output, |
4709 | } |
4710 | impl_debug_if_no_extra_traits!(GetOutputPrimaryReply, "GetOutputPrimaryReply" ); |
4711 | impl TryParse for GetOutputPrimaryReply { |
4712 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
4713 | let remaining: &[u8] = initial_value; |
4714 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
4715 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
4716 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
4717 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
4718 | let (output: u32, remaining: &[u8]) = Output::try_parse(remaining)?; |
4719 | if response_type != 1 { |
4720 | return Err(ParseError::InvalidValue); |
4721 | } |
4722 | let result: GetOutputPrimaryReply = GetOutputPrimaryReply { sequence, length, output }; |
4723 | let _ = remaining; |
4724 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
4725 | .ok_or(err:ParseError::InsufficientData)?; |
4726 | Ok((result, remaining)) |
4727 | } |
4728 | } |
4729 | impl Serialize for GetOutputPrimaryReply { |
4730 | type Bytes = [u8; 12]; |
4731 | fn serialize(&self) -> [u8; 12] { |
4732 | let response_type_bytes = &[1]; |
4733 | let sequence_bytes = self.sequence.serialize(); |
4734 | let length_bytes = self.length.serialize(); |
4735 | let output_bytes = self.output.serialize(); |
4736 | [ |
4737 | response_type_bytes[0], |
4738 | 0, |
4739 | sequence_bytes[0], |
4740 | sequence_bytes[1], |
4741 | length_bytes[0], |
4742 | length_bytes[1], |
4743 | length_bytes[2], |
4744 | length_bytes[3], |
4745 | output_bytes[0], |
4746 | output_bytes[1], |
4747 | output_bytes[2], |
4748 | output_bytes[3], |
4749 | ] |
4750 | } |
4751 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
4752 | bytes.reserve(12); |
4753 | let response_type_bytes = &[1]; |
4754 | bytes.push(response_type_bytes[0]); |
4755 | bytes.extend_from_slice(&[0; 1]); |
4756 | self.sequence.serialize_into(bytes); |
4757 | self.length.serialize_into(bytes); |
4758 | self.output.serialize_into(bytes); |
4759 | } |
4760 | } |
4761 | |
4762 | /// Opcode for the GetProviders request |
4763 | pub const GET_PROVIDERS_REQUEST: u8 = 32; |
4764 | #[derive (Clone, Copy, Default)] |
4765 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4766 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4767 | pub struct GetProvidersRequest { |
4768 | pub window: xproto::Window, |
4769 | } |
4770 | impl_debug_if_no_extra_traits!(GetProvidersRequest, "GetProvidersRequest" ); |
4771 | impl GetProvidersRequest { |
4772 | /// Serialize this request into bytes for the provided connection |
4773 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
4774 | let length_so_far = 0; |
4775 | let window_bytes = self.window.serialize(); |
4776 | let mut request0 = vec![ |
4777 | major_opcode, |
4778 | GET_PROVIDERS_REQUEST, |
4779 | 0, |
4780 | 0, |
4781 | window_bytes[0], |
4782 | window_bytes[1], |
4783 | window_bytes[2], |
4784 | window_bytes[3], |
4785 | ]; |
4786 | let length_so_far = length_so_far + request0.len(); |
4787 | assert_eq!(length_so_far % 4, 0); |
4788 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
4789 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
4790 | ([request0.into()], vec![]) |
4791 | } |
4792 | /// Parse this request given its header, its body, and any fds that go along with it |
4793 | #[cfg (feature = "request-parsing" )] |
4794 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
4795 | if header.minor_opcode != GET_PROVIDERS_REQUEST { |
4796 | return Err(ParseError::InvalidValue); |
4797 | } |
4798 | let (window, remaining) = xproto::Window::try_parse(value)?; |
4799 | let _ = remaining; |
4800 | Ok(GetProvidersRequest { |
4801 | window, |
4802 | }) |
4803 | } |
4804 | } |
4805 | impl Request for GetProvidersRequest { |
4806 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
4807 | |
4808 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
4809 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
4810 | // Flatten the buffers into a single vector |
4811 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
4812 | (buf, fds) |
4813 | } |
4814 | } |
4815 | impl crate::x11_utils::ReplyRequest for GetProvidersRequest { |
4816 | type Reply = GetProvidersReply; |
4817 | } |
4818 | |
4819 | #[derive (Clone, Default)] |
4820 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4821 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4822 | pub struct GetProvidersReply { |
4823 | pub sequence: u16, |
4824 | pub length: u32, |
4825 | pub timestamp: xproto::Timestamp, |
4826 | pub providers: Vec<Provider>, |
4827 | } |
4828 | impl_debug_if_no_extra_traits!(GetProvidersReply, "GetProvidersReply" ); |
4829 | impl TryParse for GetProvidersReply { |
4830 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
4831 | let remaining: &[u8] = initial_value; |
4832 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
4833 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
4834 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
4835 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
4836 | let (timestamp: u32, remaining: &[u8]) = xproto::Timestamp::try_parse(remaining)?; |
4837 | let (num_providers: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
4838 | let remaining: &[u8] = remaining.get(18..).ok_or(err:ParseError::InsufficientData)?; |
4839 | let (providers: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<Provider>(data:remaining, list_length:num_providers.try_to_usize()?)?; |
4840 | if response_type != 1 { |
4841 | return Err(ParseError::InvalidValue); |
4842 | } |
4843 | let result: GetProvidersReply = GetProvidersReply { sequence, length, timestamp, providers }; |
4844 | let _ = remaining; |
4845 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
4846 | .ok_or(err:ParseError::InsufficientData)?; |
4847 | Ok((result, remaining)) |
4848 | } |
4849 | } |
4850 | impl Serialize for GetProvidersReply { |
4851 | type Bytes = Vec<u8>; |
4852 | fn serialize(&self) -> Vec<u8> { |
4853 | let mut result: Vec = Vec::new(); |
4854 | self.serialize_into(&mut result); |
4855 | result |
4856 | } |
4857 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
4858 | bytes.reserve(additional:32); |
4859 | let response_type_bytes: &[u8; 1] = &[1]; |
4860 | bytes.push(response_type_bytes[0]); |
4861 | bytes.extend_from_slice(&[0; 1]); |
4862 | self.sequence.serialize_into(bytes); |
4863 | self.length.serialize_into(bytes); |
4864 | self.timestamp.serialize_into(bytes); |
4865 | let num_providers: u16 = u16::try_from(self.providers.len()).expect(msg:"`providers` has too many elements" ); |
4866 | num_providers.serialize_into(bytes); |
4867 | bytes.extend_from_slice(&[0; 18]); |
4868 | self.providers.serialize_into(bytes); |
4869 | } |
4870 | } |
4871 | impl GetProvidersReply { |
4872 | /// Get the value of the `num_providers` field. |
4873 | /// |
4874 | /// The `num_providers` field is used as the length field of the `providers` field. |
4875 | /// This function computes the field's value again based on the length of the list. |
4876 | /// |
4877 | /// # Panics |
4878 | /// |
4879 | /// Panics if the value cannot be represented in the target type. This |
4880 | /// cannot happen with values of the struct received from the X11 server. |
4881 | pub fn num_providers(&self) -> u16 { |
4882 | self.providers.len() |
4883 | .try_into().unwrap() |
4884 | } |
4885 | } |
4886 | |
4887 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
4888 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4889 | pub struct ProviderCapability(u32); |
4890 | impl ProviderCapability { |
4891 | pub const SOURCE_OUTPUT: Self = Self(1 << 0); |
4892 | pub const SINK_OUTPUT: Self = Self(1 << 1); |
4893 | pub const SOURCE_OFFLOAD: Self = Self(1 << 2); |
4894 | pub const SINK_OFFLOAD: Self = Self(1 << 3); |
4895 | } |
4896 | impl From<ProviderCapability> for u32 { |
4897 | #[inline ] |
4898 | fn from(input: ProviderCapability) -> Self { |
4899 | input.0 |
4900 | } |
4901 | } |
4902 | impl From<ProviderCapability> for Option<u32> { |
4903 | #[inline ] |
4904 | fn from(input: ProviderCapability) -> Self { |
4905 | Some(input.0) |
4906 | } |
4907 | } |
4908 | impl From<u8> for ProviderCapability { |
4909 | #[inline ] |
4910 | fn from(value: u8) -> Self { |
4911 | Self(value.into()) |
4912 | } |
4913 | } |
4914 | impl From<u16> for ProviderCapability { |
4915 | #[inline ] |
4916 | fn from(value: u16) -> Self { |
4917 | Self(value.into()) |
4918 | } |
4919 | } |
4920 | impl From<u32> for ProviderCapability { |
4921 | #[inline ] |
4922 | fn from(value: u32) -> Self { |
4923 | Self(value) |
4924 | } |
4925 | } |
4926 | impl core::fmt::Debug for ProviderCapability { |
4927 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
4928 | let variants: [(u32, &str, &str); 4] = [ |
4929 | (Self::SOURCE_OUTPUT.0, "SOURCE_OUTPUT" , "SourceOutput" ), |
4930 | (Self::SINK_OUTPUT.0, "SINK_OUTPUT" , "SinkOutput" ), |
4931 | (Self::SOURCE_OFFLOAD.0, "SOURCE_OFFLOAD" , "SourceOffload" ), |
4932 | (Self::SINK_OFFLOAD.0, "SINK_OFFLOAD" , "SinkOffload" ), |
4933 | ]; |
4934 | pretty_print_bitmask(fmt, self.0, &variants) |
4935 | } |
4936 | } |
4937 | bitmask_binop!(ProviderCapability, u32); |
4938 | |
4939 | /// Opcode for the GetProviderInfo request |
4940 | pub const GET_PROVIDER_INFO_REQUEST: u8 = 33; |
4941 | #[derive (Clone, Copy, Default)] |
4942 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4943 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4944 | pub struct GetProviderInfoRequest { |
4945 | pub provider: Provider, |
4946 | pub config_timestamp: xproto::Timestamp, |
4947 | } |
4948 | impl_debug_if_no_extra_traits!(GetProviderInfoRequest, "GetProviderInfoRequest" ); |
4949 | impl GetProviderInfoRequest { |
4950 | /// Serialize this request into bytes for the provided connection |
4951 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
4952 | let length_so_far = 0; |
4953 | let provider_bytes = self.provider.serialize(); |
4954 | let config_timestamp_bytes = self.config_timestamp.serialize(); |
4955 | let mut request0 = vec![ |
4956 | major_opcode, |
4957 | GET_PROVIDER_INFO_REQUEST, |
4958 | 0, |
4959 | 0, |
4960 | provider_bytes[0], |
4961 | provider_bytes[1], |
4962 | provider_bytes[2], |
4963 | provider_bytes[3], |
4964 | config_timestamp_bytes[0], |
4965 | config_timestamp_bytes[1], |
4966 | config_timestamp_bytes[2], |
4967 | config_timestamp_bytes[3], |
4968 | ]; |
4969 | let length_so_far = length_so_far + request0.len(); |
4970 | assert_eq!(length_so_far % 4, 0); |
4971 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
4972 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
4973 | ([request0.into()], vec![]) |
4974 | } |
4975 | /// Parse this request given its header, its body, and any fds that go along with it |
4976 | #[cfg (feature = "request-parsing" )] |
4977 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
4978 | if header.minor_opcode != GET_PROVIDER_INFO_REQUEST { |
4979 | return Err(ParseError::InvalidValue); |
4980 | } |
4981 | let (provider, remaining) = Provider::try_parse(value)?; |
4982 | let (config_timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
4983 | let _ = remaining; |
4984 | Ok(GetProviderInfoRequest { |
4985 | provider, |
4986 | config_timestamp, |
4987 | }) |
4988 | } |
4989 | } |
4990 | impl Request for GetProviderInfoRequest { |
4991 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
4992 | |
4993 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
4994 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
4995 | // Flatten the buffers into a single vector |
4996 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
4997 | (buf, fds) |
4998 | } |
4999 | } |
5000 | impl crate::x11_utils::ReplyRequest for GetProviderInfoRequest { |
5001 | type Reply = GetProviderInfoReply; |
5002 | } |
5003 | |
5004 | #[derive (Clone, Default)] |
5005 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
5006 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
5007 | pub struct GetProviderInfoReply { |
5008 | pub status: u8, |
5009 | pub sequence: u16, |
5010 | pub length: u32, |
5011 | pub timestamp: xproto::Timestamp, |
5012 | pub capabilities: ProviderCapability, |
5013 | pub crtcs: Vec<Crtc>, |
5014 | pub outputs: Vec<Output>, |
5015 | pub associated_providers: Vec<Provider>, |
5016 | pub associated_capability: Vec<u32>, |
5017 | pub name: Vec<u8>, |
5018 | } |
5019 | impl_debug_if_no_extra_traits!(GetProviderInfoReply, "GetProviderInfoReply" ); |
5020 | impl TryParse for GetProviderInfoReply { |
5021 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
5022 | let remaining = initial_value; |
5023 | let (response_type, remaining) = u8::try_parse(remaining)?; |
5024 | let (status, remaining) = u8::try_parse(remaining)?; |
5025 | let (sequence, remaining) = u16::try_parse(remaining)?; |
5026 | let (length, remaining) = u32::try_parse(remaining)?; |
5027 | let (timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
5028 | let (capabilities, remaining) = u32::try_parse(remaining)?; |
5029 | let (num_crtcs, remaining) = u16::try_parse(remaining)?; |
5030 | let (num_outputs, remaining) = u16::try_parse(remaining)?; |
5031 | let (num_associated_providers, remaining) = u16::try_parse(remaining)?; |
5032 | let (name_len, remaining) = u16::try_parse(remaining)?; |
5033 | let remaining = remaining.get(8..).ok_or(ParseError::InsufficientData)?; |
5034 | let (crtcs, remaining) = crate::x11_utils::parse_list::<Crtc>(remaining, num_crtcs.try_to_usize()?)?; |
5035 | let (outputs, remaining) = crate::x11_utils::parse_list::<Output>(remaining, num_outputs.try_to_usize()?)?; |
5036 | let (associated_providers, remaining) = crate::x11_utils::parse_list::<Provider>(remaining, num_associated_providers.try_to_usize()?)?; |
5037 | let (associated_capability, remaining) = crate::x11_utils::parse_list::<u32>(remaining, num_associated_providers.try_to_usize()?)?; |
5038 | let (name, remaining) = crate::x11_utils::parse_u8_list(remaining, name_len.try_to_usize()?)?; |
5039 | let name = name.to_vec(); |
5040 | if response_type != 1 { |
5041 | return Err(ParseError::InvalidValue); |
5042 | } |
5043 | let capabilities = capabilities.into(); |
5044 | let result = GetProviderInfoReply { status, sequence, length, timestamp, capabilities, crtcs, outputs, associated_providers, associated_capability, name }; |
5045 | let _ = remaining; |
5046 | let remaining = initial_value.get(32 + length as usize * 4..) |
5047 | .ok_or(ParseError::InsufficientData)?; |
5048 | Ok((result, remaining)) |
5049 | } |
5050 | } |
5051 | impl Serialize for GetProviderInfoReply { |
5052 | type Bytes = Vec<u8>; |
5053 | fn serialize(&self) -> Vec<u8> { |
5054 | let mut result = Vec::new(); |
5055 | self.serialize_into(&mut result); |
5056 | result |
5057 | } |
5058 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
5059 | bytes.reserve(32); |
5060 | let response_type_bytes = &[1]; |
5061 | bytes.push(response_type_bytes[0]); |
5062 | self.status.serialize_into(bytes); |
5063 | self.sequence.serialize_into(bytes); |
5064 | self.length.serialize_into(bytes); |
5065 | self.timestamp.serialize_into(bytes); |
5066 | u32::from(self.capabilities).serialize_into(bytes); |
5067 | let num_crtcs = u16::try_from(self.crtcs.len()).expect("`crtcs` has too many elements" ); |
5068 | num_crtcs.serialize_into(bytes); |
5069 | let num_outputs = u16::try_from(self.outputs.len()).expect("`outputs` has too many elements" ); |
5070 | num_outputs.serialize_into(bytes); |
5071 | let num_associated_providers = u16::try_from(self.associated_providers.len()).expect("`associated_providers` has too many elements" ); |
5072 | num_associated_providers.serialize_into(bytes); |
5073 | let name_len = u16::try_from(self.name.len()).expect("`name` has too many elements" ); |
5074 | name_len.serialize_into(bytes); |
5075 | bytes.extend_from_slice(&[0; 8]); |
5076 | self.crtcs.serialize_into(bytes); |
5077 | self.outputs.serialize_into(bytes); |
5078 | self.associated_providers.serialize_into(bytes); |
5079 | assert_eq!(self.associated_capability.len(), usize::try_from(num_associated_providers).unwrap(), "`associated_capability` has an incorrect length" ); |
5080 | self.associated_capability.serialize_into(bytes); |
5081 | bytes.extend_from_slice(&self.name); |
5082 | } |
5083 | } |
5084 | impl GetProviderInfoReply { |
5085 | /// Get the value of the `num_crtcs` field. |
5086 | /// |
5087 | /// The `num_crtcs` field is used as the length field of the `crtcs` field. |
5088 | /// This function computes the field's value again based on the length of the list. |
5089 | /// |
5090 | /// # Panics |
5091 | /// |
5092 | /// Panics if the value cannot be represented in the target type. This |
5093 | /// cannot happen with values of the struct received from the X11 server. |
5094 | pub fn num_crtcs(&self) -> u16 { |
5095 | self.crtcs.len() |
5096 | .try_into().unwrap() |
5097 | } |
5098 | /// Get the value of the `num_outputs` field. |
5099 | /// |
5100 | /// The `num_outputs` field is used as the length field of the `outputs` field. |
5101 | /// This function computes the field's value again based on the length of the list. |
5102 | /// |
5103 | /// # Panics |
5104 | /// |
5105 | /// Panics if the value cannot be represented in the target type. This |
5106 | /// cannot happen with values of the struct received from the X11 server. |
5107 | pub fn num_outputs(&self) -> u16 { |
5108 | self.outputs.len() |
5109 | .try_into().unwrap() |
5110 | } |
5111 | /// Get the value of the `num_associated_providers` field. |
5112 | /// |
5113 | /// The `num_associated_providers` field is used as the length field of the `associated_providers` field. |
5114 | /// This function computes the field's value again based on the length of the list. |
5115 | /// |
5116 | /// # Panics |
5117 | /// |
5118 | /// Panics if the value cannot be represented in the target type. This |
5119 | /// cannot happen with values of the struct received from the X11 server. |
5120 | pub fn num_associated_providers(&self) -> u16 { |
5121 | self.associated_providers.len() |
5122 | .try_into().unwrap() |
5123 | } |
5124 | /// Get the value of the `name_len` field. |
5125 | /// |
5126 | /// The `name_len` field is used as the length field of the `name` field. |
5127 | /// This function computes the field's value again based on the length of the list. |
5128 | /// |
5129 | /// # Panics |
5130 | /// |
5131 | /// Panics if the value cannot be represented in the target type. This |
5132 | /// cannot happen with values of the struct received from the X11 server. |
5133 | pub fn name_len(&self) -> u16 { |
5134 | self.name.len() |
5135 | .try_into().unwrap() |
5136 | } |
5137 | } |
5138 | |
5139 | /// Opcode for the SetProviderOffloadSink request |
5140 | pub const SET_PROVIDER_OFFLOAD_SINK_REQUEST: u8 = 34; |
5141 | #[derive (Clone, Copy, Default)] |
5142 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
5143 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
5144 | pub struct SetProviderOffloadSinkRequest { |
5145 | pub provider: Provider, |
5146 | pub sink_provider: Provider, |
5147 | pub config_timestamp: xproto::Timestamp, |
5148 | } |
5149 | impl_debug_if_no_extra_traits!(SetProviderOffloadSinkRequest, "SetProviderOffloadSinkRequest" ); |
5150 | impl SetProviderOffloadSinkRequest { |
5151 | /// Serialize this request into bytes for the provided connection |
5152 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
5153 | let length_so_far = 0; |
5154 | let provider_bytes = self.provider.serialize(); |
5155 | let sink_provider_bytes = self.sink_provider.serialize(); |
5156 | let config_timestamp_bytes = self.config_timestamp.serialize(); |
5157 | let mut request0 = vec![ |
5158 | major_opcode, |
5159 | SET_PROVIDER_OFFLOAD_SINK_REQUEST, |
5160 | 0, |
5161 | 0, |
5162 | provider_bytes[0], |
5163 | provider_bytes[1], |
5164 | provider_bytes[2], |
5165 | provider_bytes[3], |
5166 | sink_provider_bytes[0], |
5167 | sink_provider_bytes[1], |
5168 | sink_provider_bytes[2], |
5169 | sink_provider_bytes[3], |
5170 | config_timestamp_bytes[0], |
5171 | config_timestamp_bytes[1], |
5172 | config_timestamp_bytes[2], |
5173 | config_timestamp_bytes[3], |
5174 | ]; |
5175 | let length_so_far = length_so_far + request0.len(); |
5176 | assert_eq!(length_so_far % 4, 0); |
5177 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
5178 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
5179 | ([request0.into()], vec![]) |
5180 | } |
5181 | /// Parse this request given its header, its body, and any fds that go along with it |
5182 | #[cfg (feature = "request-parsing" )] |
5183 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
5184 | if header.minor_opcode != SET_PROVIDER_OFFLOAD_SINK_REQUEST { |
5185 | return Err(ParseError::InvalidValue); |
5186 | } |
5187 | let (provider, remaining) = Provider::try_parse(value)?; |
5188 | let (sink_provider, remaining) = Provider::try_parse(remaining)?; |
5189 | let (config_timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
5190 | let _ = remaining; |
5191 | Ok(SetProviderOffloadSinkRequest { |
5192 | provider, |
5193 | sink_provider, |
5194 | config_timestamp, |
5195 | }) |
5196 | } |
5197 | } |
5198 | impl Request for SetProviderOffloadSinkRequest { |
5199 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
5200 | |
5201 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
5202 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
5203 | // Flatten the buffers into a single vector |
5204 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
5205 | (buf, fds) |
5206 | } |
5207 | } |
5208 | impl crate::x11_utils::VoidRequest for SetProviderOffloadSinkRequest { |
5209 | } |
5210 | |
5211 | /// Opcode for the SetProviderOutputSource request |
5212 | pub const SET_PROVIDER_OUTPUT_SOURCE_REQUEST: u8 = 35; |
5213 | #[derive (Clone, Copy, Default)] |
5214 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
5215 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
5216 | pub struct SetProviderOutputSourceRequest { |
5217 | pub provider: Provider, |
5218 | pub source_provider: Provider, |
5219 | pub config_timestamp: xproto::Timestamp, |
5220 | } |
5221 | impl_debug_if_no_extra_traits!(SetProviderOutputSourceRequest, "SetProviderOutputSourceRequest" ); |
5222 | impl SetProviderOutputSourceRequest { |
5223 | /// Serialize this request into bytes for the provided connection |
5224 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
5225 | let length_so_far = 0; |
5226 | let provider_bytes = self.provider.serialize(); |
5227 | let source_provider_bytes = self.source_provider.serialize(); |
5228 | let config_timestamp_bytes = self.config_timestamp.serialize(); |
5229 | let mut request0 = vec![ |
5230 | major_opcode, |
5231 | SET_PROVIDER_OUTPUT_SOURCE_REQUEST, |
5232 | 0, |
5233 | 0, |
5234 | provider_bytes[0], |
5235 | provider_bytes[1], |
5236 | provider_bytes[2], |
5237 | provider_bytes[3], |
5238 | source_provider_bytes[0], |
5239 | source_provider_bytes[1], |
5240 | source_provider_bytes[2], |
5241 | source_provider_bytes[3], |
5242 | config_timestamp_bytes[0], |
5243 | config_timestamp_bytes[1], |
5244 | config_timestamp_bytes[2], |
5245 | config_timestamp_bytes[3], |
5246 | ]; |
5247 | let length_so_far = length_so_far + request0.len(); |
5248 | assert_eq!(length_so_far % 4, 0); |
5249 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
5250 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
5251 | ([request0.into()], vec![]) |
5252 | } |
5253 | /// Parse this request given its header, its body, and any fds that go along with it |
5254 | #[cfg (feature = "request-parsing" )] |
5255 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
5256 | if header.minor_opcode != SET_PROVIDER_OUTPUT_SOURCE_REQUEST { |
5257 | return Err(ParseError::InvalidValue); |
5258 | } |
5259 | let (provider, remaining) = Provider::try_parse(value)?; |
5260 | let (source_provider, remaining) = Provider::try_parse(remaining)?; |
5261 | let (config_timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
5262 | let _ = remaining; |
5263 | Ok(SetProviderOutputSourceRequest { |
5264 | provider, |
5265 | source_provider, |
5266 | config_timestamp, |
5267 | }) |
5268 | } |
5269 | } |
5270 | impl Request for SetProviderOutputSourceRequest { |
5271 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
5272 | |
5273 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
5274 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
5275 | // Flatten the buffers into a single vector |
5276 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
5277 | (buf, fds) |
5278 | } |
5279 | } |
5280 | impl crate::x11_utils::VoidRequest for SetProviderOutputSourceRequest { |
5281 | } |
5282 | |
5283 | /// Opcode for the ListProviderProperties request |
5284 | pub const LIST_PROVIDER_PROPERTIES_REQUEST: u8 = 36; |
5285 | #[derive (Clone, Copy, Default)] |
5286 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
5287 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
5288 | pub struct ListProviderPropertiesRequest { |
5289 | pub provider: Provider, |
5290 | } |
5291 | impl_debug_if_no_extra_traits!(ListProviderPropertiesRequest, "ListProviderPropertiesRequest" ); |
5292 | impl ListProviderPropertiesRequest { |
5293 | /// Serialize this request into bytes for the provided connection |
5294 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
5295 | let length_so_far = 0; |
5296 | let provider_bytes = self.provider.serialize(); |
5297 | let mut request0 = vec![ |
5298 | major_opcode, |
5299 | LIST_PROVIDER_PROPERTIES_REQUEST, |
5300 | 0, |
5301 | 0, |
5302 | provider_bytes[0], |
5303 | provider_bytes[1], |
5304 | provider_bytes[2], |
5305 | provider_bytes[3], |
5306 | ]; |
5307 | let length_so_far = length_so_far + request0.len(); |
5308 | assert_eq!(length_so_far % 4, 0); |
5309 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
5310 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
5311 | ([request0.into()], vec![]) |
5312 | } |
5313 | /// Parse this request given its header, its body, and any fds that go along with it |
5314 | #[cfg (feature = "request-parsing" )] |
5315 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
5316 | if header.minor_opcode != LIST_PROVIDER_PROPERTIES_REQUEST { |
5317 | return Err(ParseError::InvalidValue); |
5318 | } |
5319 | let (provider, remaining) = Provider::try_parse(value)?; |
5320 | let _ = remaining; |
5321 | Ok(ListProviderPropertiesRequest { |
5322 | provider, |
5323 | }) |
5324 | } |
5325 | } |
5326 | impl Request for ListProviderPropertiesRequest { |
5327 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
5328 | |
5329 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
5330 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
5331 | // Flatten the buffers into a single vector |
5332 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
5333 | (buf, fds) |
5334 | } |
5335 | } |
5336 | impl crate::x11_utils::ReplyRequest for ListProviderPropertiesRequest { |
5337 | type Reply = ListProviderPropertiesReply; |
5338 | } |
5339 | |
5340 | #[derive (Clone, Default)] |
5341 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
5342 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
5343 | pub struct ListProviderPropertiesReply { |
5344 | pub sequence: u16, |
5345 | pub length: u32, |
5346 | pub atoms: Vec<xproto::Atom>, |
5347 | } |
5348 | impl_debug_if_no_extra_traits!(ListProviderPropertiesReply, "ListProviderPropertiesReply" ); |
5349 | impl TryParse for ListProviderPropertiesReply { |
5350 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
5351 | let remaining: &[u8] = initial_value; |
5352 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
5353 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
5354 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
5355 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
5356 | let (num_atoms: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
5357 | let remaining: &[u8] = remaining.get(22..).ok_or(err:ParseError::InsufficientData)?; |
5358 | let (atoms: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<xproto::Atom>(data:remaining, list_length:num_atoms.try_to_usize()?)?; |
5359 | if response_type != 1 { |
5360 | return Err(ParseError::InvalidValue); |
5361 | } |
5362 | let result: ListProviderPropertiesReply = ListProviderPropertiesReply { sequence, length, atoms }; |
5363 | let _ = remaining; |
5364 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
5365 | .ok_or(err:ParseError::InsufficientData)?; |
5366 | Ok((result, remaining)) |
5367 | } |
5368 | } |
5369 | impl Serialize for ListProviderPropertiesReply { |
5370 | type Bytes = Vec<u8>; |
5371 | fn serialize(&self) -> Vec<u8> { |
5372 | let mut result: Vec = Vec::new(); |
5373 | self.serialize_into(&mut result); |
5374 | result |
5375 | } |
5376 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
5377 | bytes.reserve(additional:32); |
5378 | let response_type_bytes: &[u8; 1] = &[1]; |
5379 | bytes.push(response_type_bytes[0]); |
5380 | bytes.extend_from_slice(&[0; 1]); |
5381 | self.sequence.serialize_into(bytes); |
5382 | self.length.serialize_into(bytes); |
5383 | let num_atoms: u16 = u16::try_from(self.atoms.len()).expect(msg:"`atoms` has too many elements" ); |
5384 | num_atoms.serialize_into(bytes); |
5385 | bytes.extend_from_slice(&[0; 22]); |
5386 | self.atoms.serialize_into(bytes); |
5387 | } |
5388 | } |
5389 | impl ListProviderPropertiesReply { |
5390 | /// Get the value of the `num_atoms` field. |
5391 | /// |
5392 | /// The `num_atoms` field is used as the length field of the `atoms` field. |
5393 | /// This function computes the field's value again based on the length of the list. |
5394 | /// |
5395 | /// # Panics |
5396 | /// |
5397 | /// Panics if the value cannot be represented in the target type. This |
5398 | /// cannot happen with values of the struct received from the X11 server. |
5399 | pub fn num_atoms(&self) -> u16 { |
5400 | self.atoms.len() |
5401 | .try_into().unwrap() |
5402 | } |
5403 | } |
5404 | |
5405 | /// Opcode for the QueryProviderProperty request |
5406 | pub const QUERY_PROVIDER_PROPERTY_REQUEST: u8 = 37; |
5407 | #[derive (Clone, Copy, Default)] |
5408 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
5409 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
5410 | pub struct QueryProviderPropertyRequest { |
5411 | pub provider: Provider, |
5412 | pub property: xproto::Atom, |
5413 | } |
5414 | impl_debug_if_no_extra_traits!(QueryProviderPropertyRequest, "QueryProviderPropertyRequest" ); |
5415 | impl QueryProviderPropertyRequest { |
5416 | /// Serialize this request into bytes for the provided connection |
5417 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
5418 | let length_so_far = 0; |
5419 | let provider_bytes = self.provider.serialize(); |
5420 | let property_bytes = self.property.serialize(); |
5421 | let mut request0 = vec![ |
5422 | major_opcode, |
5423 | QUERY_PROVIDER_PROPERTY_REQUEST, |
5424 | 0, |
5425 | 0, |
5426 | provider_bytes[0], |
5427 | provider_bytes[1], |
5428 | provider_bytes[2], |
5429 | provider_bytes[3], |
5430 | property_bytes[0], |
5431 | property_bytes[1], |
5432 | property_bytes[2], |
5433 | property_bytes[3], |
5434 | ]; |
5435 | let length_so_far = length_so_far + request0.len(); |
5436 | assert_eq!(length_so_far % 4, 0); |
5437 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
5438 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
5439 | ([request0.into()], vec![]) |
5440 | } |
5441 | /// Parse this request given its header, its body, and any fds that go along with it |
5442 | #[cfg (feature = "request-parsing" )] |
5443 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
5444 | if header.minor_opcode != QUERY_PROVIDER_PROPERTY_REQUEST { |
5445 | return Err(ParseError::InvalidValue); |
5446 | } |
5447 | let (provider, remaining) = Provider::try_parse(value)?; |
5448 | let (property, remaining) = xproto::Atom::try_parse(remaining)?; |
5449 | let _ = remaining; |
5450 | Ok(QueryProviderPropertyRequest { |
5451 | provider, |
5452 | property, |
5453 | }) |
5454 | } |
5455 | } |
5456 | impl Request for QueryProviderPropertyRequest { |
5457 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
5458 | |
5459 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
5460 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
5461 | // Flatten the buffers into a single vector |
5462 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
5463 | (buf, fds) |
5464 | } |
5465 | } |
5466 | impl crate::x11_utils::ReplyRequest for QueryProviderPropertyRequest { |
5467 | type Reply = QueryProviderPropertyReply; |
5468 | } |
5469 | |
5470 | #[derive (Clone, Default)] |
5471 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
5472 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
5473 | pub struct QueryProviderPropertyReply { |
5474 | pub sequence: u16, |
5475 | pub pending: bool, |
5476 | pub range: bool, |
5477 | pub immutable: bool, |
5478 | pub valid_values: Vec<i32>, |
5479 | } |
5480 | impl_debug_if_no_extra_traits!(QueryProviderPropertyReply, "QueryProviderPropertyReply" ); |
5481 | impl TryParse for QueryProviderPropertyReply { |
5482 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
5483 | let remaining: &[u8] = initial_value; |
5484 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
5485 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
5486 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
5487 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
5488 | let (pending: bool, remaining: &[u8]) = bool::try_parse(remaining)?; |
5489 | let (range: bool, remaining: &[u8]) = bool::try_parse(remaining)?; |
5490 | let (immutable: bool, remaining: &[u8]) = bool::try_parse(remaining)?; |
5491 | let remaining: &[u8] = remaining.get(21..).ok_or(err:ParseError::InsufficientData)?; |
5492 | let (valid_values: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<i32>(data:remaining, list_length:length.try_to_usize()?)?; |
5493 | if response_type != 1 { |
5494 | return Err(ParseError::InvalidValue); |
5495 | } |
5496 | let result: QueryProviderPropertyReply = QueryProviderPropertyReply { sequence, pending, range, immutable, valid_values }; |
5497 | let _ = remaining; |
5498 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
5499 | .ok_or(err:ParseError::InsufficientData)?; |
5500 | Ok((result, remaining)) |
5501 | } |
5502 | } |
5503 | impl Serialize for QueryProviderPropertyReply { |
5504 | type Bytes = Vec<u8>; |
5505 | fn serialize(&self) -> Vec<u8> { |
5506 | let mut result: Vec = Vec::new(); |
5507 | self.serialize_into(&mut result); |
5508 | result |
5509 | } |
5510 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
5511 | bytes.reserve(additional:32); |
5512 | let response_type_bytes: &[u8; 1] = &[1]; |
5513 | bytes.push(response_type_bytes[0]); |
5514 | bytes.extend_from_slice(&[0; 1]); |
5515 | self.sequence.serialize_into(bytes); |
5516 | let length: u32 = u32::try_from(self.valid_values.len()).expect(msg:"`valid_values` has too many elements" ); |
5517 | length.serialize_into(bytes); |
5518 | self.pending.serialize_into(bytes); |
5519 | self.range.serialize_into(bytes); |
5520 | self.immutable.serialize_into(bytes); |
5521 | bytes.extend_from_slice(&[0; 21]); |
5522 | self.valid_values.serialize_into(bytes); |
5523 | } |
5524 | } |
5525 | impl QueryProviderPropertyReply { |
5526 | /// Get the value of the `length` field. |
5527 | /// |
5528 | /// The `length` field is used as the length field of the `valid_values` field. |
5529 | /// This function computes the field's value again based on the length of the list. |
5530 | /// |
5531 | /// # Panics |
5532 | /// |
5533 | /// Panics if the value cannot be represented in the target type. This |
5534 | /// cannot happen with values of the struct received from the X11 server. |
5535 | pub fn length(&self) -> u32 { |
5536 | self.valid_values.len() |
5537 | .try_into().unwrap() |
5538 | } |
5539 | } |
5540 | |
5541 | /// Opcode for the ConfigureProviderProperty request |
5542 | pub const CONFIGURE_PROVIDER_PROPERTY_REQUEST: u8 = 38; |
5543 | #[derive (Clone, Default)] |
5544 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
5545 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
5546 | pub struct ConfigureProviderPropertyRequest<'input> { |
5547 | pub provider: Provider, |
5548 | pub property: xproto::Atom, |
5549 | pub pending: bool, |
5550 | pub range: bool, |
5551 | pub values: Cow<'input, [i32]>, |
5552 | } |
5553 | impl_debug_if_no_extra_traits!(ConfigureProviderPropertyRequest<'_>, "ConfigureProviderPropertyRequest" ); |
5554 | impl<'input> ConfigureProviderPropertyRequest<'input> { |
5555 | /// Serialize this request into bytes for the provided connection |
5556 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
5557 | let length_so_far = 0; |
5558 | let provider_bytes = self.provider.serialize(); |
5559 | let property_bytes = self.property.serialize(); |
5560 | let pending_bytes = self.pending.serialize(); |
5561 | let range_bytes = self.range.serialize(); |
5562 | let mut request0 = vec![ |
5563 | major_opcode, |
5564 | CONFIGURE_PROVIDER_PROPERTY_REQUEST, |
5565 | 0, |
5566 | 0, |
5567 | provider_bytes[0], |
5568 | provider_bytes[1], |
5569 | provider_bytes[2], |
5570 | provider_bytes[3], |
5571 | property_bytes[0], |
5572 | property_bytes[1], |
5573 | property_bytes[2], |
5574 | property_bytes[3], |
5575 | pending_bytes[0], |
5576 | range_bytes[0], |
5577 | 0, |
5578 | 0, |
5579 | ]; |
5580 | let length_so_far = length_so_far + request0.len(); |
5581 | let values_bytes = self.values.serialize(); |
5582 | let length_so_far = length_so_far + values_bytes.len(); |
5583 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
5584 | let length_so_far = length_so_far + padding0.len(); |
5585 | assert_eq!(length_so_far % 4, 0); |
5586 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
5587 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
5588 | ([request0.into(), values_bytes.into(), padding0.into()], vec![]) |
5589 | } |
5590 | /// Parse this request given its header, its body, and any fds that go along with it |
5591 | #[cfg (feature = "request-parsing" )] |
5592 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
5593 | if header.minor_opcode != CONFIGURE_PROVIDER_PROPERTY_REQUEST { |
5594 | return Err(ParseError::InvalidValue); |
5595 | } |
5596 | let (provider, remaining) = Provider::try_parse(value)?; |
5597 | let (property, remaining) = xproto::Atom::try_parse(remaining)?; |
5598 | let (pending, remaining) = bool::try_parse(remaining)?; |
5599 | let (range, remaining) = bool::try_parse(remaining)?; |
5600 | let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?; |
5601 | let mut remaining = remaining; |
5602 | // Length is 'everything left in the input' |
5603 | let mut values = Vec::new(); |
5604 | while !remaining.is_empty() { |
5605 | let (v, new_remaining) = i32::try_parse(remaining)?; |
5606 | remaining = new_remaining; |
5607 | values.push(v); |
5608 | } |
5609 | let _ = remaining; |
5610 | Ok(ConfigureProviderPropertyRequest { |
5611 | provider, |
5612 | property, |
5613 | pending, |
5614 | range, |
5615 | values: Cow::Owned(values), |
5616 | }) |
5617 | } |
5618 | /// Clone all borrowed data in this ConfigureProviderPropertyRequest. |
5619 | pub fn into_owned(self) -> ConfigureProviderPropertyRequest<'static> { |
5620 | ConfigureProviderPropertyRequest { |
5621 | provider: self.provider, |
5622 | property: self.property, |
5623 | pending: self.pending, |
5624 | range: self.range, |
5625 | values: Cow::Owned(self.values.into_owned()), |
5626 | } |
5627 | } |
5628 | } |
5629 | impl<'input> Request for ConfigureProviderPropertyRequest<'input> { |
5630 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
5631 | |
5632 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
5633 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
5634 | // Flatten the buffers into a single vector |
5635 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
5636 | (buf, fds) |
5637 | } |
5638 | } |
5639 | impl<'input> crate::x11_utils::VoidRequest for ConfigureProviderPropertyRequest<'input> { |
5640 | } |
5641 | |
5642 | /// Opcode for the ChangeProviderProperty request |
5643 | pub const CHANGE_PROVIDER_PROPERTY_REQUEST: u8 = 39; |
5644 | #[derive (Clone, Default)] |
5645 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
5646 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
5647 | pub struct ChangeProviderPropertyRequest<'input> { |
5648 | pub provider: Provider, |
5649 | pub property: xproto::Atom, |
5650 | pub type_: xproto::Atom, |
5651 | pub format: u8, |
5652 | pub mode: u8, |
5653 | pub num_items: u32, |
5654 | pub data: Cow<'input, [u8]>, |
5655 | } |
5656 | impl_debug_if_no_extra_traits!(ChangeProviderPropertyRequest<'_>, "ChangeProviderPropertyRequest" ); |
5657 | impl<'input> ChangeProviderPropertyRequest<'input> { |
5658 | /// Serialize this request into bytes for the provided connection |
5659 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
5660 | let length_so_far = 0; |
5661 | let provider_bytes = self.provider.serialize(); |
5662 | let property_bytes = self.property.serialize(); |
5663 | let type_bytes = self.type_.serialize(); |
5664 | let format_bytes = self.format.serialize(); |
5665 | let mode_bytes = self.mode.serialize(); |
5666 | let num_items_bytes = self.num_items.serialize(); |
5667 | let mut request0 = vec![ |
5668 | major_opcode, |
5669 | CHANGE_PROVIDER_PROPERTY_REQUEST, |
5670 | 0, |
5671 | 0, |
5672 | provider_bytes[0], |
5673 | provider_bytes[1], |
5674 | provider_bytes[2], |
5675 | provider_bytes[3], |
5676 | property_bytes[0], |
5677 | property_bytes[1], |
5678 | property_bytes[2], |
5679 | property_bytes[3], |
5680 | type_bytes[0], |
5681 | type_bytes[1], |
5682 | type_bytes[2], |
5683 | type_bytes[3], |
5684 | format_bytes[0], |
5685 | mode_bytes[0], |
5686 | 0, |
5687 | 0, |
5688 | num_items_bytes[0], |
5689 | num_items_bytes[1], |
5690 | num_items_bytes[2], |
5691 | num_items_bytes[3], |
5692 | ]; |
5693 | let length_so_far = length_so_far + request0.len(); |
5694 | assert_eq!(self.data.len(), usize::try_from(u32::from(self.num_items).checked_mul(u32::from(self.format).checked_div(8u32).unwrap()).unwrap()).unwrap(), "`data` has an incorrect length" ); |
5695 | let length_so_far = length_so_far + self.data.len(); |
5696 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
5697 | let length_so_far = length_so_far + padding0.len(); |
5698 | assert_eq!(length_so_far % 4, 0); |
5699 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
5700 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
5701 | ([request0.into(), self.data, padding0.into()], vec![]) |
5702 | } |
5703 | /// Parse this request given its header, its body, and any fds that go along with it |
5704 | #[cfg (feature = "request-parsing" )] |
5705 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
5706 | if header.minor_opcode != CHANGE_PROVIDER_PROPERTY_REQUEST { |
5707 | return Err(ParseError::InvalidValue); |
5708 | } |
5709 | let (provider, remaining) = Provider::try_parse(value)?; |
5710 | let (property, remaining) = xproto::Atom::try_parse(remaining)?; |
5711 | let (type_, remaining) = xproto::Atom::try_parse(remaining)?; |
5712 | let (format, remaining) = u8::try_parse(remaining)?; |
5713 | let (mode, remaining) = u8::try_parse(remaining)?; |
5714 | let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?; |
5715 | let (num_items, remaining) = u32::try_parse(remaining)?; |
5716 | let (data, remaining) = crate::x11_utils::parse_u8_list(remaining, u32::from(num_items).checked_mul(u32::from(format).checked_div(8u32).ok_or(ParseError::InvalidExpression)?).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?; |
5717 | let _ = remaining; |
5718 | Ok(ChangeProviderPropertyRequest { |
5719 | provider, |
5720 | property, |
5721 | type_, |
5722 | format, |
5723 | mode, |
5724 | num_items, |
5725 | data: Cow::Borrowed(data), |
5726 | }) |
5727 | } |
5728 | /// Clone all borrowed data in this ChangeProviderPropertyRequest. |
5729 | pub fn into_owned(self) -> ChangeProviderPropertyRequest<'static> { |
5730 | ChangeProviderPropertyRequest { |
5731 | provider: self.provider, |
5732 | property: self.property, |
5733 | type_: self.type_, |
5734 | format: self.format, |
5735 | mode: self.mode, |
5736 | num_items: self.num_items, |
5737 | data: Cow::Owned(self.data.into_owned()), |
5738 | } |
5739 | } |
5740 | } |
5741 | impl<'input> Request for ChangeProviderPropertyRequest<'input> { |
5742 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
5743 | |
5744 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
5745 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
5746 | // Flatten the buffers into a single vector |
5747 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
5748 | (buf, fds) |
5749 | } |
5750 | } |
5751 | impl<'input> crate::x11_utils::VoidRequest for ChangeProviderPropertyRequest<'input> { |
5752 | } |
5753 | |
5754 | /// Opcode for the DeleteProviderProperty request |
5755 | pub const DELETE_PROVIDER_PROPERTY_REQUEST: u8 = 40; |
5756 | #[derive (Clone, Copy, Default)] |
5757 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
5758 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
5759 | pub struct DeleteProviderPropertyRequest { |
5760 | pub provider: Provider, |
5761 | pub property: xproto::Atom, |
5762 | } |
5763 | impl_debug_if_no_extra_traits!(DeleteProviderPropertyRequest, "DeleteProviderPropertyRequest" ); |
5764 | impl DeleteProviderPropertyRequest { |
5765 | /// Serialize this request into bytes for the provided connection |
5766 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
5767 | let length_so_far = 0; |
5768 | let provider_bytes = self.provider.serialize(); |
5769 | let property_bytes = self.property.serialize(); |
5770 | let mut request0 = vec![ |
5771 | major_opcode, |
5772 | DELETE_PROVIDER_PROPERTY_REQUEST, |
5773 | 0, |
5774 | 0, |
5775 | provider_bytes[0], |
5776 | provider_bytes[1], |
5777 | provider_bytes[2], |
5778 | provider_bytes[3], |
5779 | property_bytes[0], |
5780 | property_bytes[1], |
5781 | property_bytes[2], |
5782 | property_bytes[3], |
5783 | ]; |
5784 | let length_so_far = length_so_far + request0.len(); |
5785 | assert_eq!(length_so_far % 4, 0); |
5786 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
5787 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
5788 | ([request0.into()], vec![]) |
5789 | } |
5790 | /// Parse this request given its header, its body, and any fds that go along with it |
5791 | #[cfg (feature = "request-parsing" )] |
5792 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
5793 | if header.minor_opcode != DELETE_PROVIDER_PROPERTY_REQUEST { |
5794 | return Err(ParseError::InvalidValue); |
5795 | } |
5796 | let (provider, remaining) = Provider::try_parse(value)?; |
5797 | let (property, remaining) = xproto::Atom::try_parse(remaining)?; |
5798 | let _ = remaining; |
5799 | Ok(DeleteProviderPropertyRequest { |
5800 | provider, |
5801 | property, |
5802 | }) |
5803 | } |
5804 | } |
5805 | impl Request for DeleteProviderPropertyRequest { |
5806 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
5807 | |
5808 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
5809 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
5810 | // Flatten the buffers into a single vector |
5811 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
5812 | (buf, fds) |
5813 | } |
5814 | } |
5815 | impl crate::x11_utils::VoidRequest for DeleteProviderPropertyRequest { |
5816 | } |
5817 | |
5818 | /// Opcode for the GetProviderProperty request |
5819 | pub const GET_PROVIDER_PROPERTY_REQUEST: u8 = 41; |
5820 | #[derive (Clone, Copy, Default)] |
5821 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
5822 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
5823 | pub struct GetProviderPropertyRequest { |
5824 | pub provider: Provider, |
5825 | pub property: xproto::Atom, |
5826 | pub type_: xproto::Atom, |
5827 | pub long_offset: u32, |
5828 | pub long_length: u32, |
5829 | pub delete: bool, |
5830 | pub pending: bool, |
5831 | } |
5832 | impl_debug_if_no_extra_traits!(GetProviderPropertyRequest, "GetProviderPropertyRequest" ); |
5833 | impl GetProviderPropertyRequest { |
5834 | /// Serialize this request into bytes for the provided connection |
5835 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
5836 | let length_so_far = 0; |
5837 | let provider_bytes = self.provider.serialize(); |
5838 | let property_bytes = self.property.serialize(); |
5839 | let type_bytes = self.type_.serialize(); |
5840 | let long_offset_bytes = self.long_offset.serialize(); |
5841 | let long_length_bytes = self.long_length.serialize(); |
5842 | let delete_bytes = self.delete.serialize(); |
5843 | let pending_bytes = self.pending.serialize(); |
5844 | let mut request0 = vec![ |
5845 | major_opcode, |
5846 | GET_PROVIDER_PROPERTY_REQUEST, |
5847 | 0, |
5848 | 0, |
5849 | provider_bytes[0], |
5850 | provider_bytes[1], |
5851 | provider_bytes[2], |
5852 | provider_bytes[3], |
5853 | property_bytes[0], |
5854 | property_bytes[1], |
5855 | property_bytes[2], |
5856 | property_bytes[3], |
5857 | type_bytes[0], |
5858 | type_bytes[1], |
5859 | type_bytes[2], |
5860 | type_bytes[3], |
5861 | long_offset_bytes[0], |
5862 | long_offset_bytes[1], |
5863 | long_offset_bytes[2], |
5864 | long_offset_bytes[3], |
5865 | long_length_bytes[0], |
5866 | long_length_bytes[1], |
5867 | long_length_bytes[2], |
5868 | long_length_bytes[3], |
5869 | delete_bytes[0], |
5870 | pending_bytes[0], |
5871 | 0, |
5872 | 0, |
5873 | ]; |
5874 | let length_so_far = length_so_far + request0.len(); |
5875 | assert_eq!(length_so_far % 4, 0); |
5876 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
5877 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
5878 | ([request0.into()], vec![]) |
5879 | } |
5880 | /// Parse this request given its header, its body, and any fds that go along with it |
5881 | #[cfg (feature = "request-parsing" )] |
5882 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
5883 | if header.minor_opcode != GET_PROVIDER_PROPERTY_REQUEST { |
5884 | return Err(ParseError::InvalidValue); |
5885 | } |
5886 | let (provider, remaining) = Provider::try_parse(value)?; |
5887 | let (property, remaining) = xproto::Atom::try_parse(remaining)?; |
5888 | let (type_, remaining) = xproto::Atom::try_parse(remaining)?; |
5889 | let (long_offset, remaining) = u32::try_parse(remaining)?; |
5890 | let (long_length, remaining) = u32::try_parse(remaining)?; |
5891 | let (delete, remaining) = bool::try_parse(remaining)?; |
5892 | let (pending, remaining) = bool::try_parse(remaining)?; |
5893 | let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?; |
5894 | let _ = remaining; |
5895 | Ok(GetProviderPropertyRequest { |
5896 | provider, |
5897 | property, |
5898 | type_, |
5899 | long_offset, |
5900 | long_length, |
5901 | delete, |
5902 | pending, |
5903 | }) |
5904 | } |
5905 | } |
5906 | impl Request for GetProviderPropertyRequest { |
5907 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
5908 | |
5909 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
5910 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
5911 | // Flatten the buffers into a single vector |
5912 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
5913 | (buf, fds) |
5914 | } |
5915 | } |
5916 | impl crate::x11_utils::ReplyRequest for GetProviderPropertyRequest { |
5917 | type Reply = GetProviderPropertyReply; |
5918 | } |
5919 | |
5920 | #[derive (Clone, Default)] |
5921 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
5922 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
5923 | pub struct GetProviderPropertyReply { |
5924 | pub format: u8, |
5925 | pub sequence: u16, |
5926 | pub length: u32, |
5927 | pub type_: xproto::Atom, |
5928 | pub bytes_after: u32, |
5929 | pub num_items: u32, |
5930 | pub data: Vec<u8>, |
5931 | } |
5932 | impl_debug_if_no_extra_traits!(GetProviderPropertyReply, "GetProviderPropertyReply" ); |
5933 | impl TryParse for GetProviderPropertyReply { |
5934 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
5935 | let remaining: &[u8] = initial_value; |
5936 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
5937 | let (format: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
5938 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
5939 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
5940 | let (type_: u32, remaining: &[u8]) = xproto::Atom::try_parse(remaining)?; |
5941 | let (bytes_after: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
5942 | let (num_items: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
5943 | let remaining: &[u8] = remaining.get(12..).ok_or(err:ParseError::InsufficientData)?; |
5944 | let (data: &[u8], remaining: &[u8]) = crate::x11_utils::parse_u8_list(data:remaining, list_length:u32::from(num_items).checked_mul(u32::from(format).checked_div(8u32).ok_or(ParseError::InvalidExpression)?).ok_or(err:ParseError::InvalidExpression)?.try_to_usize()?)?; |
5945 | let data: Vec = data.to_vec(); |
5946 | if response_type != 1 { |
5947 | return Err(ParseError::InvalidValue); |
5948 | } |
5949 | let result: GetProviderPropertyReply = GetProviderPropertyReply { format, sequence, length, type_, bytes_after, num_items, data }; |
5950 | let _ = remaining; |
5951 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
5952 | .ok_or(err:ParseError::InsufficientData)?; |
5953 | Ok((result, remaining)) |
5954 | } |
5955 | } |
5956 | impl Serialize for GetProviderPropertyReply { |
5957 | type Bytes = Vec<u8>; |
5958 | fn serialize(&self) -> Vec<u8> { |
5959 | let mut result: Vec = Vec::new(); |
5960 | self.serialize_into(&mut result); |
5961 | result |
5962 | } |
5963 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
5964 | bytes.reserve(additional:32); |
5965 | let response_type_bytes: &[u8; 1] = &[1]; |
5966 | bytes.push(response_type_bytes[0]); |
5967 | self.format.serialize_into(bytes); |
5968 | self.sequence.serialize_into(bytes); |
5969 | self.length.serialize_into(bytes); |
5970 | self.type_.serialize_into(bytes); |
5971 | self.bytes_after.serialize_into(bytes); |
5972 | self.num_items.serialize_into(bytes); |
5973 | bytes.extend_from_slice(&[0; 12]); |
5974 | assert_eq!(self.data.len(), usize::try_from(u32::from(self.num_items).checked_mul(u32::from(self.format).checked_div(8u32).unwrap()).unwrap()).unwrap(), "`data` has an incorrect length" ); |
5975 | bytes.extend_from_slice(&self.data); |
5976 | } |
5977 | } |
5978 | |
5979 | /// Opcode for the ScreenChangeNotify event |
5980 | pub const SCREEN_CHANGE_NOTIFY_EVENT: u8 = 0; |
5981 | #[derive (Clone, Copy, Default)] |
5982 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
5983 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
5984 | pub struct ScreenChangeNotifyEvent { |
5985 | pub response_type: u8, |
5986 | pub rotation: Rotation, |
5987 | pub sequence: u16, |
5988 | pub timestamp: xproto::Timestamp, |
5989 | pub config_timestamp: xproto::Timestamp, |
5990 | pub root: xproto::Window, |
5991 | pub request_window: xproto::Window, |
5992 | pub size_id: u16, |
5993 | pub subpixel_order: render::SubPixel, |
5994 | pub width: u16, |
5995 | pub height: u16, |
5996 | pub mwidth: u16, |
5997 | pub mheight: u16, |
5998 | } |
5999 | impl_debug_if_no_extra_traits!(ScreenChangeNotifyEvent, "ScreenChangeNotifyEvent" ); |
6000 | impl TryParse for ScreenChangeNotifyEvent { |
6001 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
6002 | let remaining = initial_value; |
6003 | let (response_type, remaining) = u8::try_parse(remaining)?; |
6004 | let (rotation, remaining) = u8::try_parse(remaining)?; |
6005 | let (sequence, remaining) = u16::try_parse(remaining)?; |
6006 | let (timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
6007 | let (config_timestamp, remaining) = xproto::Timestamp::try_parse(remaining)?; |
6008 | let (root, remaining) = xproto::Window::try_parse(remaining)?; |
6009 | let (request_window, remaining) = xproto::Window::try_parse(remaining)?; |
6010 | let (size_id, remaining) = u16::try_parse(remaining)?; |
6011 | let (subpixel_order, remaining) = u16::try_parse(remaining)?; |
6012 | let (width, remaining) = u16::try_parse(remaining)?; |
6013 | let (height, remaining) = u16::try_parse(remaining)?; |
6014 | let (mwidth, remaining) = u16::try_parse(remaining)?; |
6015 | let (mheight, remaining) = u16::try_parse(remaining)?; |
6016 | let rotation = rotation.into(); |
6017 | let subpixel_order = subpixel_order.into(); |
6018 | let result = ScreenChangeNotifyEvent { response_type, rotation, sequence, timestamp, config_timestamp, root, request_window, size_id, subpixel_order, width, height, mwidth, mheight }; |
6019 | let _ = remaining; |
6020 | let remaining = initial_value.get(32..) |
6021 | .ok_or(ParseError::InsufficientData)?; |
6022 | Ok((result, remaining)) |
6023 | } |
6024 | } |
6025 | impl Serialize for ScreenChangeNotifyEvent { |
6026 | type Bytes = [u8; 32]; |
6027 | fn serialize(&self) -> [u8; 32] { |
6028 | let response_type_bytes = self.response_type.serialize(); |
6029 | let rotation_bytes = (u16::from(self.rotation) as u8).serialize(); |
6030 | let sequence_bytes = self.sequence.serialize(); |
6031 | let timestamp_bytes = self.timestamp.serialize(); |
6032 | let config_timestamp_bytes = self.config_timestamp.serialize(); |
6033 | let root_bytes = self.root.serialize(); |
6034 | let request_window_bytes = self.request_window.serialize(); |
6035 | let size_id_bytes = self.size_id.serialize(); |
6036 | let subpixel_order_bytes = (u32::from(self.subpixel_order) as u16).serialize(); |
6037 | let width_bytes = self.width.serialize(); |
6038 | let height_bytes = self.height.serialize(); |
6039 | let mwidth_bytes = self.mwidth.serialize(); |
6040 | let mheight_bytes = self.mheight.serialize(); |
6041 | [ |
6042 | response_type_bytes[0], |
6043 | rotation_bytes[0], |
6044 | sequence_bytes[0], |
6045 | sequence_bytes[1], |
6046 | timestamp_bytes[0], |
6047 | timestamp_bytes[1], |
6048 | timestamp_bytes[2], |
6049 | timestamp_bytes[3], |
6050 | config_timestamp_bytes[0], |
6051 | config_timestamp_bytes[1], |
6052 | config_timestamp_bytes[2], |
6053 | config_timestamp_bytes[3], |
6054 | root_bytes[0], |
6055 | root_bytes[1], |
6056 | root_bytes[2], |
6057 | root_bytes[3], |
6058 | request_window_bytes[0], |
6059 | request_window_bytes[1], |
6060 | request_window_bytes[2], |
6061 | request_window_bytes[3], |
6062 | size_id_bytes[0], |
6063 | size_id_bytes[1], |
6064 | subpixel_order_bytes[0], |
6065 | subpixel_order_bytes[1], |
6066 | width_bytes[0], |
6067 | width_bytes[1], |
6068 | height_bytes[0], |
6069 | height_bytes[1], |
6070 | mwidth_bytes[0], |
6071 | mwidth_bytes[1], |
6072 | mheight_bytes[0], |
6073 | mheight_bytes[1], |
6074 | ] |
6075 | } |
6076 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
6077 | bytes.reserve(32); |
6078 | self.response_type.serialize_into(bytes); |
6079 | (u16::from(self.rotation) as u8).serialize_into(bytes); |
6080 | self.sequence.serialize_into(bytes); |
6081 | self.timestamp.serialize_into(bytes); |
6082 | self.config_timestamp.serialize_into(bytes); |
6083 | self.root.serialize_into(bytes); |
6084 | self.request_window.serialize_into(bytes); |
6085 | self.size_id.serialize_into(bytes); |
6086 | (u32::from(self.subpixel_order) as u16).serialize_into(bytes); |
6087 | self.width.serialize_into(bytes); |
6088 | self.height.serialize_into(bytes); |
6089 | self.mwidth.serialize_into(bytes); |
6090 | self.mheight.serialize_into(bytes); |
6091 | } |
6092 | } |
6093 | impl From<&ScreenChangeNotifyEvent> for [u8; 32] { |
6094 | fn from(input: &ScreenChangeNotifyEvent) -> Self { |
6095 | let response_type_bytes = input.response_type.serialize(); |
6096 | let rotation_bytes = (u16::from(input.rotation) as u8).serialize(); |
6097 | let sequence_bytes = input.sequence.serialize(); |
6098 | let timestamp_bytes = input.timestamp.serialize(); |
6099 | let config_timestamp_bytes = input.config_timestamp.serialize(); |
6100 | let root_bytes = input.root.serialize(); |
6101 | let request_window_bytes = input.request_window.serialize(); |
6102 | let size_id_bytes = input.size_id.serialize(); |
6103 | let subpixel_order_bytes = (u32::from(input.subpixel_order) as u16).serialize(); |
6104 | let width_bytes = input.width.serialize(); |
6105 | let height_bytes = input.height.serialize(); |
6106 | let mwidth_bytes = input.mwidth.serialize(); |
6107 | let mheight_bytes = input.mheight.serialize(); |
6108 | [ |
6109 | response_type_bytes[0], |
6110 | rotation_bytes[0], |
6111 | sequence_bytes[0], |
6112 | sequence_bytes[1], |
6113 | timestamp_bytes[0], |
6114 | timestamp_bytes[1], |
6115 | timestamp_bytes[2], |
6116 | timestamp_bytes[3], |
6117 | config_timestamp_bytes[0], |
6118 | config_timestamp_bytes[1], |
6119 | config_timestamp_bytes[2], |
6120 | config_timestamp_bytes[3], |
6121 | root_bytes[0], |
6122 | root_bytes[1], |
6123 | root_bytes[2], |
6124 | root_bytes[3], |
6125 | request_window_bytes[0], |
6126 | request_window_bytes[1], |
6127 | request_window_bytes[2], |
6128 | request_window_bytes[3], |
6129 | size_id_bytes[0], |
6130 | size_id_bytes[1], |
6131 | subpixel_order_bytes[0], |
6132 | subpixel_order_bytes[1], |
6133 | width_bytes[0], |
6134 | width_bytes[1], |
6135 | height_bytes[0], |
6136 | height_bytes[1], |
6137 | mwidth_bytes[0], |
6138 | mwidth_bytes[1], |
6139 | mheight_bytes[0], |
6140 | mheight_bytes[1], |
6141 | ] |
6142 | } |
6143 | } |
6144 | impl From<ScreenChangeNotifyEvent> for [u8; 32] { |
6145 | fn from(input: ScreenChangeNotifyEvent) -> Self { |
6146 | Self::from(&input) |
6147 | } |
6148 | } |
6149 | |
6150 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
6151 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
6152 | pub struct Notify(u8); |
6153 | impl Notify { |
6154 | pub const CRTC_CHANGE: Self = Self(0); |
6155 | pub const OUTPUT_CHANGE: Self = Self(1); |
6156 | pub const OUTPUT_PROPERTY: Self = Self(2); |
6157 | pub const PROVIDER_CHANGE: Self = Self(3); |
6158 | pub const PROVIDER_PROPERTY: Self = Self(4); |
6159 | pub const RESOURCE_CHANGE: Self = Self(5); |
6160 | pub const LEASE: Self = Self(6); |
6161 | } |
6162 | impl From<Notify> for u8 { |
6163 | #[inline ] |
6164 | fn from(input: Notify) -> Self { |
6165 | input.0 |
6166 | } |
6167 | } |
6168 | impl From<Notify> for Option<u8> { |
6169 | #[inline ] |
6170 | fn from(input: Notify) -> Self { |
6171 | Some(input.0) |
6172 | } |
6173 | } |
6174 | impl From<Notify> for u16 { |
6175 | #[inline ] |
6176 | fn from(input: Notify) -> Self { |
6177 | u16::from(input.0) |
6178 | } |
6179 | } |
6180 | impl From<Notify> for Option<u16> { |
6181 | #[inline ] |
6182 | fn from(input: Notify) -> Self { |
6183 | Some(u16::from(input.0)) |
6184 | } |
6185 | } |
6186 | impl From<Notify> for u32 { |
6187 | #[inline ] |
6188 | fn from(input: Notify) -> Self { |
6189 | u32::from(input.0) |
6190 | } |
6191 | } |
6192 | impl From<Notify> for Option<u32> { |
6193 | #[inline ] |
6194 | fn from(input: Notify) -> Self { |
6195 | Some(u32::from(input.0)) |
6196 | } |
6197 | } |
6198 | impl From<u8> for Notify { |
6199 | #[inline ] |
6200 | fn from(value: u8) -> Self { |
6201 | Self(value) |
6202 | } |
6203 | } |
6204 | impl core::fmt::Debug for Notify { |
6205 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
6206 | let variants: [(u32, &str, &str); 7] = [ |
6207 | (Self::CRTC_CHANGE.0.into(), "CRTC_CHANGE" , "CrtcChange" ), |
6208 | (Self::OUTPUT_CHANGE.0.into(), "OUTPUT_CHANGE" , "OutputChange" ), |
6209 | (Self::OUTPUT_PROPERTY.0.into(), "OUTPUT_PROPERTY" , "OutputProperty" ), |
6210 | (Self::PROVIDER_CHANGE.0.into(), "PROVIDER_CHANGE" , "ProviderChange" ), |
6211 | (Self::PROVIDER_PROPERTY.0.into(), "PROVIDER_PROPERTY" , "ProviderProperty" ), |
6212 | (Self::RESOURCE_CHANGE.0.into(), "RESOURCE_CHANGE" , "ResourceChange" ), |
6213 | (Self::LEASE.0.into(), "LEASE" , "Lease" ), |
6214 | ]; |
6215 | pretty_print_enum(fmt, self.0.into(), &variants) |
6216 | } |
6217 | } |
6218 | |
6219 | #[derive (Clone, Copy, Default)] |
6220 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
6221 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
6222 | pub struct CrtcChange { |
6223 | pub timestamp: xproto::Timestamp, |
6224 | pub window: xproto::Window, |
6225 | pub crtc: Crtc, |
6226 | pub mode: Mode, |
6227 | pub rotation: Rotation, |
6228 | pub x: i16, |
6229 | pub y: i16, |
6230 | pub width: u16, |
6231 | pub height: u16, |
6232 | } |
6233 | impl_debug_if_no_extra_traits!(CrtcChange, "CrtcChange" ); |
6234 | impl TryParse for CrtcChange { |
6235 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
6236 | let (timestamp: u32, remaining: &[u8]) = xproto::Timestamp::try_parse(remaining)?; |
6237 | let (window: u32, remaining: &[u8]) = xproto::Window::try_parse(remaining)?; |
6238 | let (crtc: u32, remaining: &[u8]) = Crtc::try_parse(remaining)?; |
6239 | let (mode: u32, remaining: &[u8]) = Mode::try_parse(remaining)?; |
6240 | let (rotation: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
6241 | let remaining: &[u8] = remaining.get(2..).ok_or(err:ParseError::InsufficientData)?; |
6242 | let (x: i16, remaining: &[u8]) = i16::try_parse(remaining)?; |
6243 | let (y: i16, remaining: &[u8]) = i16::try_parse(remaining)?; |
6244 | let (width: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
6245 | let (height: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
6246 | let rotation: Rotation = rotation.into(); |
6247 | let result: CrtcChange = CrtcChange { timestamp, window, crtc, mode, rotation, x, y, width, height }; |
6248 | Ok((result, remaining)) |
6249 | } |
6250 | } |
6251 | impl Serialize for CrtcChange { |
6252 | type Bytes = [u8; 28]; |
6253 | fn serialize(&self) -> [u8; 28] { |
6254 | let timestamp_bytes = self.timestamp.serialize(); |
6255 | let window_bytes = self.window.serialize(); |
6256 | let crtc_bytes = self.crtc.serialize(); |
6257 | let mode_bytes = self.mode.serialize(); |
6258 | let rotation_bytes = u16::from(self.rotation).serialize(); |
6259 | let x_bytes = self.x.serialize(); |
6260 | let y_bytes = self.y.serialize(); |
6261 | let width_bytes = self.width.serialize(); |
6262 | let height_bytes = self.height.serialize(); |
6263 | [ |
6264 | timestamp_bytes[0], |
6265 | timestamp_bytes[1], |
6266 | timestamp_bytes[2], |
6267 | timestamp_bytes[3], |
6268 | window_bytes[0], |
6269 | window_bytes[1], |
6270 | window_bytes[2], |
6271 | window_bytes[3], |
6272 | crtc_bytes[0], |
6273 | crtc_bytes[1], |
6274 | crtc_bytes[2], |
6275 | crtc_bytes[3], |
6276 | mode_bytes[0], |
6277 | mode_bytes[1], |
6278 | mode_bytes[2], |
6279 | mode_bytes[3], |
6280 | rotation_bytes[0], |
6281 | rotation_bytes[1], |
6282 | 0, |
6283 | 0, |
6284 | x_bytes[0], |
6285 | x_bytes[1], |
6286 | y_bytes[0], |
6287 | y_bytes[1], |
6288 | width_bytes[0], |
6289 | width_bytes[1], |
6290 | height_bytes[0], |
6291 | height_bytes[1], |
6292 | ] |
6293 | } |
6294 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
6295 | bytes.reserve(28); |
6296 | self.timestamp.serialize_into(bytes); |
6297 | self.window.serialize_into(bytes); |
6298 | self.crtc.serialize_into(bytes); |
6299 | self.mode.serialize_into(bytes); |
6300 | u16::from(self.rotation).serialize_into(bytes); |
6301 | bytes.extend_from_slice(&[0; 2]); |
6302 | self.x.serialize_into(bytes); |
6303 | self.y.serialize_into(bytes); |
6304 | self.width.serialize_into(bytes); |
6305 | self.height.serialize_into(bytes); |
6306 | } |
6307 | } |
6308 | |
6309 | #[derive (Clone, Copy, Default)] |
6310 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
6311 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
6312 | pub struct OutputChange { |
6313 | pub timestamp: xproto::Timestamp, |
6314 | pub config_timestamp: xproto::Timestamp, |
6315 | pub window: xproto::Window, |
6316 | pub output: Output, |
6317 | pub crtc: Crtc, |
6318 | pub mode: Mode, |
6319 | pub rotation: Rotation, |
6320 | pub connection: Connection, |
6321 | pub subpixel_order: render::SubPixel, |
6322 | } |
6323 | impl_debug_if_no_extra_traits!(OutputChange, "OutputChange" ); |
6324 | impl TryParse for OutputChange { |
6325 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
6326 | let (timestamp: u32, remaining: &[u8]) = xproto::Timestamp::try_parse(remaining)?; |
6327 | let (config_timestamp: u32, remaining: &[u8]) = xproto::Timestamp::try_parse(remaining)?; |
6328 | let (window: u32, remaining: &[u8]) = xproto::Window::try_parse(remaining)?; |
6329 | let (output: u32, remaining: &[u8]) = Output::try_parse(remaining)?; |
6330 | let (crtc: u32, remaining: &[u8]) = Crtc::try_parse(remaining)?; |
6331 | let (mode: u32, remaining: &[u8]) = Mode::try_parse(remaining)?; |
6332 | let (rotation: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
6333 | let (connection: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
6334 | let (subpixel_order: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
6335 | let rotation: Rotation = rotation.into(); |
6336 | let connection: Connection = connection.into(); |
6337 | let subpixel_order: SubPixel = subpixel_order.into(); |
6338 | let result: OutputChange = OutputChange { timestamp, config_timestamp, window, output, crtc, mode, rotation, connection, subpixel_order }; |
6339 | Ok((result, remaining)) |
6340 | } |
6341 | } |
6342 | impl Serialize for OutputChange { |
6343 | type Bytes = [u8; 28]; |
6344 | fn serialize(&self) -> [u8; 28] { |
6345 | let timestamp_bytes = self.timestamp.serialize(); |
6346 | let config_timestamp_bytes = self.config_timestamp.serialize(); |
6347 | let window_bytes = self.window.serialize(); |
6348 | let output_bytes = self.output.serialize(); |
6349 | let crtc_bytes = self.crtc.serialize(); |
6350 | let mode_bytes = self.mode.serialize(); |
6351 | let rotation_bytes = u16::from(self.rotation).serialize(); |
6352 | let connection_bytes = u8::from(self.connection).serialize(); |
6353 | let subpixel_order_bytes = (u32::from(self.subpixel_order) as u8).serialize(); |
6354 | [ |
6355 | timestamp_bytes[0], |
6356 | timestamp_bytes[1], |
6357 | timestamp_bytes[2], |
6358 | timestamp_bytes[3], |
6359 | config_timestamp_bytes[0], |
6360 | config_timestamp_bytes[1], |
6361 | config_timestamp_bytes[2], |
6362 | config_timestamp_bytes[3], |
6363 | window_bytes[0], |
6364 | window_bytes[1], |
6365 | window_bytes[2], |
6366 | window_bytes[3], |
6367 | output_bytes[0], |
6368 | output_bytes[1], |
6369 | output_bytes[2], |
6370 | output_bytes[3], |
6371 | crtc_bytes[0], |
6372 | crtc_bytes[1], |
6373 | crtc_bytes[2], |
6374 | crtc_bytes[3], |
6375 | mode_bytes[0], |
6376 | mode_bytes[1], |
6377 | mode_bytes[2], |
6378 | mode_bytes[3], |
6379 | rotation_bytes[0], |
6380 | rotation_bytes[1], |
6381 | connection_bytes[0], |
6382 | subpixel_order_bytes[0], |
6383 | ] |
6384 | } |
6385 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
6386 | bytes.reserve(28); |
6387 | self.timestamp.serialize_into(bytes); |
6388 | self.config_timestamp.serialize_into(bytes); |
6389 | self.window.serialize_into(bytes); |
6390 | self.output.serialize_into(bytes); |
6391 | self.crtc.serialize_into(bytes); |
6392 | self.mode.serialize_into(bytes); |
6393 | u16::from(self.rotation).serialize_into(bytes); |
6394 | u8::from(self.connection).serialize_into(bytes); |
6395 | (u32::from(self.subpixel_order) as u8).serialize_into(bytes); |
6396 | } |
6397 | } |
6398 | |
6399 | #[derive (Clone, Copy, Default)] |
6400 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
6401 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
6402 | pub struct OutputProperty { |
6403 | pub window: xproto::Window, |
6404 | pub output: Output, |
6405 | pub atom: xproto::Atom, |
6406 | pub timestamp: xproto::Timestamp, |
6407 | pub status: xproto::Property, |
6408 | } |
6409 | impl_debug_if_no_extra_traits!(OutputProperty, "OutputProperty" ); |
6410 | impl TryParse for OutputProperty { |
6411 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
6412 | let (window: u32, remaining: &[u8]) = xproto::Window::try_parse(remaining)?; |
6413 | let (output: u32, remaining: &[u8]) = Output::try_parse(remaining)?; |
6414 | let (atom: u32, remaining: &[u8]) = xproto::Atom::try_parse(remaining)?; |
6415 | let (timestamp: u32, remaining: &[u8]) = xproto::Timestamp::try_parse(remaining)?; |
6416 | let (status: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
6417 | let remaining: &[u8] = remaining.get(11..).ok_or(err:ParseError::InsufficientData)?; |
6418 | let status: Property = status.into(); |
6419 | let result: OutputProperty = OutputProperty { window, output, atom, timestamp, status }; |
6420 | Ok((result, remaining)) |
6421 | } |
6422 | } |
6423 | impl Serialize for OutputProperty { |
6424 | type Bytes = [u8; 28]; |
6425 | fn serialize(&self) -> [u8; 28] { |
6426 | let window_bytes = self.window.serialize(); |
6427 | let output_bytes = self.output.serialize(); |
6428 | let atom_bytes = self.atom.serialize(); |
6429 | let timestamp_bytes = self.timestamp.serialize(); |
6430 | let status_bytes = u8::from(self.status).serialize(); |
6431 | [ |
6432 | window_bytes[0], |
6433 | window_bytes[1], |
6434 | window_bytes[2], |
6435 | window_bytes[3], |
6436 | output_bytes[0], |
6437 | output_bytes[1], |
6438 | output_bytes[2], |
6439 | output_bytes[3], |
6440 | atom_bytes[0], |
6441 | atom_bytes[1], |
6442 | atom_bytes[2], |
6443 | atom_bytes[3], |
6444 | timestamp_bytes[0], |
6445 | timestamp_bytes[1], |
6446 | timestamp_bytes[2], |
6447 | timestamp_bytes[3], |
6448 | status_bytes[0], |
6449 | 0, |
6450 | 0, |
6451 | 0, |
6452 | 0, |
6453 | 0, |
6454 | 0, |
6455 | 0, |
6456 | 0, |
6457 | 0, |
6458 | 0, |
6459 | 0, |
6460 | ] |
6461 | } |
6462 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
6463 | bytes.reserve(28); |
6464 | self.window.serialize_into(bytes); |
6465 | self.output.serialize_into(bytes); |
6466 | self.atom.serialize_into(bytes); |
6467 | self.timestamp.serialize_into(bytes); |
6468 | u8::from(self.status).serialize_into(bytes); |
6469 | bytes.extend_from_slice(&[0; 11]); |
6470 | } |
6471 | } |
6472 | |
6473 | #[derive (Clone, Copy, Default)] |
6474 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
6475 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
6476 | pub struct ProviderChange { |
6477 | pub timestamp: xproto::Timestamp, |
6478 | pub window: xproto::Window, |
6479 | pub provider: Provider, |
6480 | } |
6481 | impl_debug_if_no_extra_traits!(ProviderChange, "ProviderChange" ); |
6482 | impl TryParse for ProviderChange { |
6483 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
6484 | let (timestamp: u32, remaining: &[u8]) = xproto::Timestamp::try_parse(remaining)?; |
6485 | let (window: u32, remaining: &[u8]) = xproto::Window::try_parse(remaining)?; |
6486 | let (provider: u32, remaining: &[u8]) = Provider::try_parse(remaining)?; |
6487 | let remaining: &[u8] = remaining.get(16..).ok_or(err:ParseError::InsufficientData)?; |
6488 | let result: ProviderChange = ProviderChange { timestamp, window, provider }; |
6489 | Ok((result, remaining)) |
6490 | } |
6491 | } |
6492 | impl Serialize for ProviderChange { |
6493 | type Bytes = [u8; 28]; |
6494 | fn serialize(&self) -> [u8; 28] { |
6495 | let timestamp_bytes = self.timestamp.serialize(); |
6496 | let window_bytes = self.window.serialize(); |
6497 | let provider_bytes = self.provider.serialize(); |
6498 | [ |
6499 | timestamp_bytes[0], |
6500 | timestamp_bytes[1], |
6501 | timestamp_bytes[2], |
6502 | timestamp_bytes[3], |
6503 | window_bytes[0], |
6504 | window_bytes[1], |
6505 | window_bytes[2], |
6506 | window_bytes[3], |
6507 | provider_bytes[0], |
6508 | provider_bytes[1], |
6509 | provider_bytes[2], |
6510 | provider_bytes[3], |
6511 | 0, |
6512 | 0, |
6513 | 0, |
6514 | 0, |
6515 | 0, |
6516 | 0, |
6517 | 0, |
6518 | 0, |
6519 | 0, |
6520 | 0, |
6521 | 0, |
6522 | 0, |
6523 | 0, |
6524 | 0, |
6525 | 0, |
6526 | 0, |
6527 | ] |
6528 | } |
6529 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
6530 | bytes.reserve(28); |
6531 | self.timestamp.serialize_into(bytes); |
6532 | self.window.serialize_into(bytes); |
6533 | self.provider.serialize_into(bytes); |
6534 | bytes.extend_from_slice(&[0; 16]); |
6535 | } |
6536 | } |
6537 | |
6538 | #[derive (Clone, Copy, Default)] |
6539 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
6540 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
6541 | pub struct ProviderProperty { |
6542 | pub window: xproto::Window, |
6543 | pub provider: Provider, |
6544 | pub atom: xproto::Atom, |
6545 | pub timestamp: xproto::Timestamp, |
6546 | pub state: u8, |
6547 | } |
6548 | impl_debug_if_no_extra_traits!(ProviderProperty, "ProviderProperty" ); |
6549 | impl TryParse for ProviderProperty { |
6550 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
6551 | let (window: u32, remaining: &[u8]) = xproto::Window::try_parse(remaining)?; |
6552 | let (provider: u32, remaining: &[u8]) = Provider::try_parse(remaining)?; |
6553 | let (atom: u32, remaining: &[u8]) = xproto::Atom::try_parse(remaining)?; |
6554 | let (timestamp: u32, remaining: &[u8]) = xproto::Timestamp::try_parse(remaining)?; |
6555 | let (state: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
6556 | let remaining: &[u8] = remaining.get(11..).ok_or(err:ParseError::InsufficientData)?; |
6557 | let result: ProviderProperty = ProviderProperty { window, provider, atom, timestamp, state }; |
6558 | Ok((result, remaining)) |
6559 | } |
6560 | } |
6561 | impl Serialize for ProviderProperty { |
6562 | type Bytes = [u8; 28]; |
6563 | fn serialize(&self) -> [u8; 28] { |
6564 | let window_bytes = self.window.serialize(); |
6565 | let provider_bytes = self.provider.serialize(); |
6566 | let atom_bytes = self.atom.serialize(); |
6567 | let timestamp_bytes = self.timestamp.serialize(); |
6568 | let state_bytes = self.state.serialize(); |
6569 | [ |
6570 | window_bytes[0], |
6571 | window_bytes[1], |
6572 | window_bytes[2], |
6573 | window_bytes[3], |
6574 | provider_bytes[0], |
6575 | provider_bytes[1], |
6576 | provider_bytes[2], |
6577 | provider_bytes[3], |
6578 | atom_bytes[0], |
6579 | atom_bytes[1], |
6580 | atom_bytes[2], |
6581 | atom_bytes[3], |
6582 | timestamp_bytes[0], |
6583 | timestamp_bytes[1], |
6584 | timestamp_bytes[2], |
6585 | timestamp_bytes[3], |
6586 | state_bytes[0], |
6587 | 0, |
6588 | 0, |
6589 | 0, |
6590 | 0, |
6591 | 0, |
6592 | 0, |
6593 | 0, |
6594 | 0, |
6595 | 0, |
6596 | 0, |
6597 | 0, |
6598 | ] |
6599 | } |
6600 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
6601 | bytes.reserve(28); |
6602 | self.window.serialize_into(bytes); |
6603 | self.provider.serialize_into(bytes); |
6604 | self.atom.serialize_into(bytes); |
6605 | self.timestamp.serialize_into(bytes); |
6606 | self.state.serialize_into(bytes); |
6607 | bytes.extend_from_slice(&[0; 11]); |
6608 | } |
6609 | } |
6610 | |
6611 | #[derive (Clone, Copy, Default)] |
6612 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
6613 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
6614 | pub struct ResourceChange { |
6615 | pub timestamp: xproto::Timestamp, |
6616 | pub window: xproto::Window, |
6617 | } |
6618 | impl_debug_if_no_extra_traits!(ResourceChange, "ResourceChange" ); |
6619 | impl TryParse for ResourceChange { |
6620 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
6621 | let (timestamp: u32, remaining: &[u8]) = xproto::Timestamp::try_parse(remaining)?; |
6622 | let (window: u32, remaining: &[u8]) = xproto::Window::try_parse(remaining)?; |
6623 | let remaining: &[u8] = remaining.get(20..).ok_or(err:ParseError::InsufficientData)?; |
6624 | let result: ResourceChange = ResourceChange { timestamp, window }; |
6625 | Ok((result, remaining)) |
6626 | } |
6627 | } |
6628 | impl Serialize for ResourceChange { |
6629 | type Bytes = [u8; 28]; |
6630 | fn serialize(&self) -> [u8; 28] { |
6631 | let timestamp_bytes = self.timestamp.serialize(); |
6632 | let window_bytes = self.window.serialize(); |
6633 | [ |
6634 | timestamp_bytes[0], |
6635 | timestamp_bytes[1], |
6636 | timestamp_bytes[2], |
6637 | timestamp_bytes[3], |
6638 | window_bytes[0], |
6639 | window_bytes[1], |
6640 | window_bytes[2], |
6641 | window_bytes[3], |
6642 | 0, |
6643 | 0, |
6644 | 0, |
6645 | 0, |
6646 | 0, |
6647 | 0, |
6648 | 0, |
6649 | 0, |
6650 | 0, |
6651 | 0, |
6652 | 0, |
6653 | 0, |
6654 | 0, |
6655 | 0, |
6656 | 0, |
6657 | 0, |
6658 | 0, |
6659 | 0, |
6660 | 0, |
6661 | 0, |
6662 | ] |
6663 | } |
6664 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
6665 | bytes.reserve(28); |
6666 | self.timestamp.serialize_into(bytes); |
6667 | self.window.serialize_into(bytes); |
6668 | bytes.extend_from_slice(&[0; 20]); |
6669 | } |
6670 | } |
6671 | |
6672 | #[derive (Clone, Default)] |
6673 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
6674 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
6675 | pub struct MonitorInfo { |
6676 | pub name: xproto::Atom, |
6677 | pub primary: bool, |
6678 | pub automatic: bool, |
6679 | pub x: i16, |
6680 | pub y: i16, |
6681 | pub width: u16, |
6682 | pub height: u16, |
6683 | pub width_in_millimeters: u32, |
6684 | pub height_in_millimeters: u32, |
6685 | pub outputs: Vec<Output>, |
6686 | } |
6687 | impl_debug_if_no_extra_traits!(MonitorInfo, "MonitorInfo" ); |
6688 | impl TryParse for MonitorInfo { |
6689 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
6690 | let (name: u32, remaining: &[u8]) = xproto::Atom::try_parse(remaining)?; |
6691 | let (primary: bool, remaining: &[u8]) = bool::try_parse(remaining)?; |
6692 | let (automatic: bool, remaining: &[u8]) = bool::try_parse(remaining)?; |
6693 | let (n_output: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
6694 | let (x: i16, remaining: &[u8]) = i16::try_parse(remaining)?; |
6695 | let (y: i16, remaining: &[u8]) = i16::try_parse(remaining)?; |
6696 | let (width: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
6697 | let (height: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
6698 | let (width_in_millimeters: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
6699 | let (height_in_millimeters: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
6700 | let (outputs: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<Output>(data:remaining, list_length:n_output.try_to_usize()?)?; |
6701 | let result: MonitorInfo = MonitorInfo { name, primary, automatic, x, y, width, height, width_in_millimeters, height_in_millimeters, outputs }; |
6702 | Ok((result, remaining)) |
6703 | } |
6704 | } |
6705 | impl Serialize for MonitorInfo { |
6706 | type Bytes = Vec<u8>; |
6707 | fn serialize(&self) -> Vec<u8> { |
6708 | let mut result: Vec = Vec::new(); |
6709 | self.serialize_into(&mut result); |
6710 | result |
6711 | } |
6712 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
6713 | bytes.reserve(additional:24); |
6714 | self.name.serialize_into(bytes); |
6715 | self.primary.serialize_into(bytes); |
6716 | self.automatic.serialize_into(bytes); |
6717 | let n_output: u16 = u16::try_from(self.outputs.len()).expect(msg:"`outputs` has too many elements" ); |
6718 | n_output.serialize_into(bytes); |
6719 | self.x.serialize_into(bytes); |
6720 | self.y.serialize_into(bytes); |
6721 | self.width.serialize_into(bytes); |
6722 | self.height.serialize_into(bytes); |
6723 | self.width_in_millimeters.serialize_into(bytes); |
6724 | self.height_in_millimeters.serialize_into(bytes); |
6725 | self.outputs.serialize_into(bytes); |
6726 | } |
6727 | } |
6728 | impl MonitorInfo { |
6729 | /// Get the value of the `nOutput` field. |
6730 | /// |
6731 | /// The `nOutput` field is used as the length field of the `outputs` field. |
6732 | /// This function computes the field's value again based on the length of the list. |
6733 | /// |
6734 | /// # Panics |
6735 | /// |
6736 | /// Panics if the value cannot be represented in the target type. This |
6737 | /// cannot happen with values of the struct received from the X11 server. |
6738 | pub fn n_output(&self) -> u16 { |
6739 | self.outputs.len() |
6740 | .try_into().unwrap() |
6741 | } |
6742 | } |
6743 | |
6744 | /// Opcode for the GetMonitors request |
6745 | pub const GET_MONITORS_REQUEST: u8 = 42; |
6746 | #[derive (Clone, Copy, Default)] |
6747 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
6748 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
6749 | pub struct GetMonitorsRequest { |
6750 | pub window: xproto::Window, |
6751 | pub get_active: bool, |
6752 | } |
6753 | impl_debug_if_no_extra_traits!(GetMonitorsRequest, "GetMonitorsRequest" ); |
6754 | impl GetMonitorsRequest { |
6755 | /// Serialize this request into bytes for the provided connection |
6756 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
6757 | let length_so_far = 0; |
6758 | let window_bytes = self.window.serialize(); |
6759 | let get_active_bytes = self.get_active.serialize(); |
6760 | let mut request0 = vec![ |
6761 | major_opcode, |
6762 | GET_MONITORS_REQUEST, |
6763 | 0, |
6764 | 0, |
6765 | window_bytes[0], |
6766 | window_bytes[1], |
6767 | window_bytes[2], |
6768 | window_bytes[3], |
6769 | get_active_bytes[0], |
6770 | 0, |
6771 | 0, |
6772 | 0, |
6773 | ]; |
6774 | let length_so_far = length_so_far + request0.len(); |
6775 | assert_eq!(length_so_far % 4, 0); |
6776 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
6777 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
6778 | ([request0.into()], vec![]) |
6779 | } |
6780 | /// Parse this request given its header, its body, and any fds that go along with it |
6781 | #[cfg (feature = "request-parsing" )] |
6782 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
6783 | if header.minor_opcode != GET_MONITORS_REQUEST { |
6784 | return Err(ParseError::InvalidValue); |
6785 | } |
6786 | let (window, remaining) = xproto::Window::try_parse(value)?; |
6787 | let (get_active, remaining) = bool::try_parse(remaining)?; |
6788 | let _ = remaining; |
6789 | Ok(GetMonitorsRequest { |
6790 | window, |
6791 | get_active, |
6792 | }) |
6793 | } |
6794 | } |
6795 | impl Request for GetMonitorsRequest { |
6796 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
6797 | |
6798 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
6799 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
6800 | // Flatten the buffers into a single vector |
6801 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
6802 | (buf, fds) |
6803 | } |
6804 | } |
6805 | impl crate::x11_utils::ReplyRequest for GetMonitorsRequest { |
6806 | type Reply = GetMonitorsReply; |
6807 | } |
6808 | |
6809 | #[derive (Clone, Default)] |
6810 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
6811 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
6812 | pub struct GetMonitorsReply { |
6813 | pub sequence: u16, |
6814 | pub length: u32, |
6815 | pub timestamp: xproto::Timestamp, |
6816 | pub n_outputs: u32, |
6817 | pub monitors: Vec<MonitorInfo>, |
6818 | } |
6819 | impl_debug_if_no_extra_traits!(GetMonitorsReply, "GetMonitorsReply" ); |
6820 | impl TryParse for GetMonitorsReply { |
6821 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
6822 | let remaining: &[u8] = initial_value; |
6823 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
6824 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
6825 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
6826 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
6827 | let (timestamp: u32, remaining: &[u8]) = xproto::Timestamp::try_parse(remaining)?; |
6828 | let (n_monitors: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
6829 | let (n_outputs: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
6830 | let remaining: &[u8] = remaining.get(12..).ok_or(err:ParseError::InsufficientData)?; |
6831 | let (monitors: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<MonitorInfo>(data:remaining, list_length:n_monitors.try_to_usize()?)?; |
6832 | if response_type != 1 { |
6833 | return Err(ParseError::InvalidValue); |
6834 | } |
6835 | let result: GetMonitorsReply = GetMonitorsReply { sequence, length, timestamp, n_outputs, monitors }; |
6836 | let _ = remaining; |
6837 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
6838 | .ok_or(err:ParseError::InsufficientData)?; |
6839 | Ok((result, remaining)) |
6840 | } |
6841 | } |
6842 | impl Serialize for GetMonitorsReply { |
6843 | type Bytes = Vec<u8>; |
6844 | fn serialize(&self) -> Vec<u8> { |
6845 | let mut result: Vec = Vec::new(); |
6846 | self.serialize_into(&mut result); |
6847 | result |
6848 | } |
6849 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
6850 | bytes.reserve(additional:32); |
6851 | let response_type_bytes: &[u8; 1] = &[1]; |
6852 | bytes.push(response_type_bytes[0]); |
6853 | bytes.extend_from_slice(&[0; 1]); |
6854 | self.sequence.serialize_into(bytes); |
6855 | self.length.serialize_into(bytes); |
6856 | self.timestamp.serialize_into(bytes); |
6857 | let n_monitors: u32 = u32::try_from(self.monitors.len()).expect(msg:"`monitors` has too many elements" ); |
6858 | n_monitors.serialize_into(bytes); |
6859 | self.n_outputs.serialize_into(bytes); |
6860 | bytes.extend_from_slice(&[0; 12]); |
6861 | self.monitors.serialize_into(bytes); |
6862 | } |
6863 | } |
6864 | impl GetMonitorsReply { |
6865 | /// Get the value of the `nMonitors` field. |
6866 | /// |
6867 | /// The `nMonitors` field is used as the length field of the `monitors` field. |
6868 | /// This function computes the field's value again based on the length of the list. |
6869 | /// |
6870 | /// # Panics |
6871 | /// |
6872 | /// Panics if the value cannot be represented in the target type. This |
6873 | /// cannot happen with values of the struct received from the X11 server. |
6874 | pub fn n_monitors(&self) -> u32 { |
6875 | self.monitors.len() |
6876 | .try_into().unwrap() |
6877 | } |
6878 | } |
6879 | |
6880 | /// Opcode for the SetMonitor request |
6881 | pub const SET_MONITOR_REQUEST: u8 = 43; |
6882 | #[derive (Clone, Default)] |
6883 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
6884 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
6885 | pub struct SetMonitorRequest { |
6886 | pub window: xproto::Window, |
6887 | pub monitorinfo: MonitorInfo, |
6888 | } |
6889 | impl_debug_if_no_extra_traits!(SetMonitorRequest, "SetMonitorRequest" ); |
6890 | impl SetMonitorRequest { |
6891 | /// Serialize this request into bytes for the provided connection |
6892 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 3]> { |
6893 | let length_so_far = 0; |
6894 | let window_bytes = self.window.serialize(); |
6895 | let mut request0 = vec![ |
6896 | major_opcode, |
6897 | SET_MONITOR_REQUEST, |
6898 | 0, |
6899 | 0, |
6900 | window_bytes[0], |
6901 | window_bytes[1], |
6902 | window_bytes[2], |
6903 | window_bytes[3], |
6904 | ]; |
6905 | let length_so_far = length_so_far + request0.len(); |
6906 | let monitorinfo_bytes = self.monitorinfo.serialize(); |
6907 | let length_so_far = length_so_far + monitorinfo_bytes.len(); |
6908 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
6909 | let length_so_far = length_so_far + padding0.len(); |
6910 | assert_eq!(length_so_far % 4, 0); |
6911 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
6912 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
6913 | ([request0.into(), monitorinfo_bytes.into(), padding0.into()], vec![]) |
6914 | } |
6915 | /// Parse this request given its header, its body, and any fds that go along with it |
6916 | #[cfg (feature = "request-parsing" )] |
6917 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
6918 | if header.minor_opcode != SET_MONITOR_REQUEST { |
6919 | return Err(ParseError::InvalidValue); |
6920 | } |
6921 | let (window, remaining) = xproto::Window::try_parse(value)?; |
6922 | let (monitorinfo, remaining) = MonitorInfo::try_parse(remaining)?; |
6923 | let _ = remaining; |
6924 | Ok(SetMonitorRequest { |
6925 | window, |
6926 | monitorinfo, |
6927 | }) |
6928 | } |
6929 | } |
6930 | impl Request for SetMonitorRequest { |
6931 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
6932 | |
6933 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
6934 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
6935 | // Flatten the buffers into a single vector |
6936 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
6937 | (buf, fds) |
6938 | } |
6939 | } |
6940 | impl crate::x11_utils::VoidRequest for SetMonitorRequest { |
6941 | } |
6942 | |
6943 | /// Opcode for the DeleteMonitor request |
6944 | pub const DELETE_MONITOR_REQUEST: u8 = 44; |
6945 | #[derive (Clone, Copy, Default)] |
6946 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
6947 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
6948 | pub struct DeleteMonitorRequest { |
6949 | pub window: xproto::Window, |
6950 | pub name: xproto::Atom, |
6951 | } |
6952 | impl_debug_if_no_extra_traits!(DeleteMonitorRequest, "DeleteMonitorRequest" ); |
6953 | impl DeleteMonitorRequest { |
6954 | /// Serialize this request into bytes for the provided connection |
6955 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
6956 | let length_so_far = 0; |
6957 | let window_bytes = self.window.serialize(); |
6958 | let name_bytes = self.name.serialize(); |
6959 | let mut request0 = vec![ |
6960 | major_opcode, |
6961 | DELETE_MONITOR_REQUEST, |
6962 | 0, |
6963 | 0, |
6964 | window_bytes[0], |
6965 | window_bytes[1], |
6966 | window_bytes[2], |
6967 | window_bytes[3], |
6968 | name_bytes[0], |
6969 | name_bytes[1], |
6970 | name_bytes[2], |
6971 | name_bytes[3], |
6972 | ]; |
6973 | let length_so_far = length_so_far + request0.len(); |
6974 | assert_eq!(length_so_far % 4, 0); |
6975 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
6976 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
6977 | ([request0.into()], vec![]) |
6978 | } |
6979 | /// Parse this request given its header, its body, and any fds that go along with it |
6980 | #[cfg (feature = "request-parsing" )] |
6981 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
6982 | if header.minor_opcode != DELETE_MONITOR_REQUEST { |
6983 | return Err(ParseError::InvalidValue); |
6984 | } |
6985 | let (window, remaining) = xproto::Window::try_parse(value)?; |
6986 | let (name, remaining) = xproto::Atom::try_parse(remaining)?; |
6987 | let _ = remaining; |
6988 | Ok(DeleteMonitorRequest { |
6989 | window, |
6990 | name, |
6991 | }) |
6992 | } |
6993 | } |
6994 | impl Request for DeleteMonitorRequest { |
6995 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
6996 | |
6997 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
6998 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
6999 | // Flatten the buffers into a single vector |
7000 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
7001 | (buf, fds) |
7002 | } |
7003 | } |
7004 | impl crate::x11_utils::VoidRequest for DeleteMonitorRequest { |
7005 | } |
7006 | |
7007 | /// Opcode for the CreateLease request |
7008 | pub const CREATE_LEASE_REQUEST: u8 = 45; |
7009 | #[derive (Clone, Default)] |
7010 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
7011 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
7012 | pub struct CreateLeaseRequest<'input> { |
7013 | pub window: xproto::Window, |
7014 | pub lid: Lease, |
7015 | pub crtcs: Cow<'input, [Crtc]>, |
7016 | pub outputs: Cow<'input, [Output]>, |
7017 | } |
7018 | impl_debug_if_no_extra_traits!(CreateLeaseRequest<'_>, "CreateLeaseRequest" ); |
7019 | impl<'input> CreateLeaseRequest<'input> { |
7020 | /// Serialize this request into bytes for the provided connection |
7021 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 4]> { |
7022 | let length_so_far = 0; |
7023 | let window_bytes = self.window.serialize(); |
7024 | let lid_bytes = self.lid.serialize(); |
7025 | let num_crtcs = u16::try_from(self.crtcs.len()).expect("`crtcs` has too many elements" ); |
7026 | let num_crtcs_bytes = num_crtcs.serialize(); |
7027 | let num_outputs = u16::try_from(self.outputs.len()).expect("`outputs` has too many elements" ); |
7028 | let num_outputs_bytes = num_outputs.serialize(); |
7029 | let mut request0 = vec![ |
7030 | major_opcode, |
7031 | CREATE_LEASE_REQUEST, |
7032 | 0, |
7033 | 0, |
7034 | window_bytes[0], |
7035 | window_bytes[1], |
7036 | window_bytes[2], |
7037 | window_bytes[3], |
7038 | lid_bytes[0], |
7039 | lid_bytes[1], |
7040 | lid_bytes[2], |
7041 | lid_bytes[3], |
7042 | num_crtcs_bytes[0], |
7043 | num_crtcs_bytes[1], |
7044 | num_outputs_bytes[0], |
7045 | num_outputs_bytes[1], |
7046 | ]; |
7047 | let length_so_far = length_so_far + request0.len(); |
7048 | let crtcs_bytes = self.crtcs.serialize(); |
7049 | let length_so_far = length_so_far + crtcs_bytes.len(); |
7050 | let outputs_bytes = self.outputs.serialize(); |
7051 | let length_so_far = length_so_far + outputs_bytes.len(); |
7052 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
7053 | let length_so_far = length_so_far + padding0.len(); |
7054 | assert_eq!(length_so_far % 4, 0); |
7055 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
7056 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
7057 | ([request0.into(), crtcs_bytes.into(), outputs_bytes.into(), padding0.into()], vec![]) |
7058 | } |
7059 | /// Parse this request given its header, its body, and any fds that go along with it |
7060 | #[cfg (feature = "request-parsing" )] |
7061 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
7062 | if header.minor_opcode != CREATE_LEASE_REQUEST { |
7063 | return Err(ParseError::InvalidValue); |
7064 | } |
7065 | let (window, remaining) = xproto::Window::try_parse(value)?; |
7066 | let (lid, remaining) = Lease::try_parse(remaining)?; |
7067 | let (num_crtcs, remaining) = u16::try_parse(remaining)?; |
7068 | let (num_outputs, remaining) = u16::try_parse(remaining)?; |
7069 | let (crtcs, remaining) = crate::x11_utils::parse_list::<Crtc>(remaining, num_crtcs.try_to_usize()?)?; |
7070 | let (outputs, remaining) = crate::x11_utils::parse_list::<Output>(remaining, num_outputs.try_to_usize()?)?; |
7071 | let _ = remaining; |
7072 | Ok(CreateLeaseRequest { |
7073 | window, |
7074 | lid, |
7075 | crtcs: Cow::Owned(crtcs), |
7076 | outputs: Cow::Owned(outputs), |
7077 | }) |
7078 | } |
7079 | /// Clone all borrowed data in this CreateLeaseRequest. |
7080 | pub fn into_owned(self) -> CreateLeaseRequest<'static> { |
7081 | CreateLeaseRequest { |
7082 | window: self.window, |
7083 | lid: self.lid, |
7084 | crtcs: Cow::Owned(self.crtcs.into_owned()), |
7085 | outputs: Cow::Owned(self.outputs.into_owned()), |
7086 | } |
7087 | } |
7088 | } |
7089 | impl<'input> Request for CreateLeaseRequest<'input> { |
7090 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
7091 | |
7092 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
7093 | let (bufs: [Cow<'_, [u8]>; 4], fds: Vec) = self.serialize(major_opcode); |
7094 | // Flatten the buffers into a single vector |
7095 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
7096 | (buf, fds) |
7097 | } |
7098 | } |
7099 | impl<'input> crate::x11_utils::ReplyFDsRequest for CreateLeaseRequest<'input> { |
7100 | type Reply = CreateLeaseReply; |
7101 | } |
7102 | |
7103 | #[cfg_attr (feature = "extra-traits" , derive(Debug))] |
7104 | pub struct CreateLeaseReply { |
7105 | pub nfd: u8, |
7106 | pub sequence: u16, |
7107 | pub length: u32, |
7108 | pub master_fd: RawFdContainer, |
7109 | } |
7110 | impl_debug_if_no_extra_traits!(CreateLeaseReply, "CreateLeaseReply" ); |
7111 | impl TryParseFd for CreateLeaseReply { |
7112 | fn try_parse_fd<'a>(initial_value: &'a [u8], fds: &mut Vec<RawFdContainer>) -> Result<(Self, &'a [u8]), ParseError> { |
7113 | let remaining: &[u8] = initial_value; |
7114 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
7115 | let (nfd: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
7116 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
7117 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
7118 | if fds.is_empty() { return Err(ParseError::MissingFileDescriptors) } |
7119 | let master_fd: OwnedFd = fds.remove(index:0); |
7120 | let remaining: &[u8] = remaining.get(24..).ok_or(err:ParseError::InsufficientData)?; |
7121 | if response_type != 1 { |
7122 | return Err(ParseError::InvalidValue); |
7123 | } |
7124 | let result: CreateLeaseReply = CreateLeaseReply { nfd, sequence, length, master_fd }; |
7125 | let _ = remaining; |
7126 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
7127 | .ok_or(err:ParseError::InsufficientData)?; |
7128 | Ok((result, remaining)) |
7129 | } |
7130 | } |
7131 | impl Serialize for CreateLeaseReply { |
7132 | type Bytes = [u8; 32]; |
7133 | fn serialize(&self) -> [u8; 32] { |
7134 | let response_type_bytes = &[1]; |
7135 | let nfd_bytes = self.nfd.serialize(); |
7136 | let sequence_bytes = self.sequence.serialize(); |
7137 | let length_bytes = self.length.serialize(); |
7138 | [ |
7139 | response_type_bytes[0], |
7140 | nfd_bytes[0], |
7141 | sequence_bytes[0], |
7142 | sequence_bytes[1], |
7143 | length_bytes[0], |
7144 | length_bytes[1], |
7145 | length_bytes[2], |
7146 | length_bytes[3], |
7147 | 0, |
7148 | 0, |
7149 | 0, |
7150 | 0, |
7151 | 0, |
7152 | 0, |
7153 | 0, |
7154 | 0, |
7155 | 0, |
7156 | 0, |
7157 | 0, |
7158 | 0, |
7159 | 0, |
7160 | 0, |
7161 | 0, |
7162 | 0, |
7163 | 0, |
7164 | 0, |
7165 | 0, |
7166 | 0, |
7167 | 0, |
7168 | 0, |
7169 | 0, |
7170 | 0, |
7171 | ] |
7172 | } |
7173 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
7174 | bytes.reserve(32); |
7175 | let response_type_bytes = &[1]; |
7176 | bytes.push(response_type_bytes[0]); |
7177 | self.nfd.serialize_into(bytes); |
7178 | self.sequence.serialize_into(bytes); |
7179 | self.length.serialize_into(bytes); |
7180 | bytes.extend_from_slice(&[0; 24]); |
7181 | } |
7182 | } |
7183 | |
7184 | /// Opcode for the FreeLease request |
7185 | pub const FREE_LEASE_REQUEST: u8 = 46; |
7186 | #[derive (Clone, Copy, Default)] |
7187 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
7188 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
7189 | pub struct FreeLeaseRequest { |
7190 | pub lid: Lease, |
7191 | pub terminate: u8, |
7192 | } |
7193 | impl_debug_if_no_extra_traits!(FreeLeaseRequest, "FreeLeaseRequest" ); |
7194 | impl FreeLeaseRequest { |
7195 | /// Serialize this request into bytes for the provided connection |
7196 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
7197 | let length_so_far = 0; |
7198 | let lid_bytes = self.lid.serialize(); |
7199 | let terminate_bytes = self.terminate.serialize(); |
7200 | let mut request0 = vec![ |
7201 | major_opcode, |
7202 | FREE_LEASE_REQUEST, |
7203 | 0, |
7204 | 0, |
7205 | lid_bytes[0], |
7206 | lid_bytes[1], |
7207 | lid_bytes[2], |
7208 | lid_bytes[3], |
7209 | terminate_bytes[0], |
7210 | 0, |
7211 | 0, |
7212 | 0, |
7213 | ]; |
7214 | let length_so_far = length_so_far + request0.len(); |
7215 | assert_eq!(length_so_far % 4, 0); |
7216 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
7217 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
7218 | ([request0.into()], vec![]) |
7219 | } |
7220 | /// Parse this request given its header, its body, and any fds that go along with it |
7221 | #[cfg (feature = "request-parsing" )] |
7222 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
7223 | if header.minor_opcode != FREE_LEASE_REQUEST { |
7224 | return Err(ParseError::InvalidValue); |
7225 | } |
7226 | let (lid, remaining) = Lease::try_parse(value)?; |
7227 | let (terminate, remaining) = u8::try_parse(remaining)?; |
7228 | let _ = remaining; |
7229 | Ok(FreeLeaseRequest { |
7230 | lid, |
7231 | terminate, |
7232 | }) |
7233 | } |
7234 | } |
7235 | impl Request for FreeLeaseRequest { |
7236 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
7237 | |
7238 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
7239 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
7240 | // Flatten the buffers into a single vector |
7241 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
7242 | (buf, fds) |
7243 | } |
7244 | } |
7245 | impl crate::x11_utils::VoidRequest for FreeLeaseRequest { |
7246 | } |
7247 | |
7248 | #[derive (Clone, Copy, Default)] |
7249 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
7250 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
7251 | pub struct LeaseNotify { |
7252 | pub timestamp: xproto::Timestamp, |
7253 | pub window: xproto::Window, |
7254 | pub lease: Lease, |
7255 | pub created: u8, |
7256 | } |
7257 | impl_debug_if_no_extra_traits!(LeaseNotify, "LeaseNotify" ); |
7258 | impl TryParse for LeaseNotify { |
7259 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
7260 | let (timestamp: u32, remaining: &[u8]) = xproto::Timestamp::try_parse(remaining)?; |
7261 | let (window: u32, remaining: &[u8]) = xproto::Window::try_parse(remaining)?; |
7262 | let (lease: u32, remaining: &[u8]) = Lease::try_parse(remaining)?; |
7263 | let (created: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
7264 | let remaining: &[u8] = remaining.get(15..).ok_or(err:ParseError::InsufficientData)?; |
7265 | let result: LeaseNotify = LeaseNotify { timestamp, window, lease, created }; |
7266 | Ok((result, remaining)) |
7267 | } |
7268 | } |
7269 | impl Serialize for LeaseNotify { |
7270 | type Bytes = [u8; 28]; |
7271 | fn serialize(&self) -> [u8; 28] { |
7272 | let timestamp_bytes = self.timestamp.serialize(); |
7273 | let window_bytes = self.window.serialize(); |
7274 | let lease_bytes = self.lease.serialize(); |
7275 | let created_bytes = self.created.serialize(); |
7276 | [ |
7277 | timestamp_bytes[0], |
7278 | timestamp_bytes[1], |
7279 | timestamp_bytes[2], |
7280 | timestamp_bytes[3], |
7281 | window_bytes[0], |
7282 | window_bytes[1], |
7283 | window_bytes[2], |
7284 | window_bytes[3], |
7285 | lease_bytes[0], |
7286 | lease_bytes[1], |
7287 | lease_bytes[2], |
7288 | lease_bytes[3], |
7289 | created_bytes[0], |
7290 | 0, |
7291 | 0, |
7292 | 0, |
7293 | 0, |
7294 | 0, |
7295 | 0, |
7296 | 0, |
7297 | 0, |
7298 | 0, |
7299 | 0, |
7300 | 0, |
7301 | 0, |
7302 | 0, |
7303 | 0, |
7304 | 0, |
7305 | ] |
7306 | } |
7307 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
7308 | bytes.reserve(28); |
7309 | self.timestamp.serialize_into(bytes); |
7310 | self.window.serialize_into(bytes); |
7311 | self.lease.serialize_into(bytes); |
7312 | self.created.serialize_into(bytes); |
7313 | bytes.extend_from_slice(&[0; 15]); |
7314 | } |
7315 | } |
7316 | |
7317 | #[derive (Debug, Copy, Clone)] |
7318 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
7319 | pub struct NotifyData([u8; 28]); |
7320 | impl NotifyData { |
7321 | pub fn as_cc(&self) -> CrtcChange { |
7322 | fn do_the_parse(remaining: &[u8]) -> Result<CrtcChange, ParseError> { |
7323 | let (cc, remaining) = CrtcChange::try_parse(remaining)?; |
7324 | let _ = remaining; |
7325 | Ok(cc) |
7326 | } |
7327 | do_the_parse(&self.0).unwrap() |
7328 | } |
7329 | pub fn as_oc(&self) -> OutputChange { |
7330 | fn do_the_parse(remaining: &[u8]) -> Result<OutputChange, ParseError> { |
7331 | let (oc, remaining) = OutputChange::try_parse(remaining)?; |
7332 | let _ = remaining; |
7333 | Ok(oc) |
7334 | } |
7335 | do_the_parse(&self.0).unwrap() |
7336 | } |
7337 | pub fn as_op(&self) -> OutputProperty { |
7338 | fn do_the_parse(remaining: &[u8]) -> Result<OutputProperty, ParseError> { |
7339 | let (op, remaining) = OutputProperty::try_parse(remaining)?; |
7340 | let _ = remaining; |
7341 | Ok(op) |
7342 | } |
7343 | do_the_parse(&self.0).unwrap() |
7344 | } |
7345 | pub fn as_pc(&self) -> ProviderChange { |
7346 | fn do_the_parse(remaining: &[u8]) -> Result<ProviderChange, ParseError> { |
7347 | let (pc, remaining) = ProviderChange::try_parse(remaining)?; |
7348 | let _ = remaining; |
7349 | Ok(pc) |
7350 | } |
7351 | do_the_parse(&self.0).unwrap() |
7352 | } |
7353 | pub fn as_pp(&self) -> ProviderProperty { |
7354 | fn do_the_parse(remaining: &[u8]) -> Result<ProviderProperty, ParseError> { |
7355 | let (pp, remaining) = ProviderProperty::try_parse(remaining)?; |
7356 | let _ = remaining; |
7357 | Ok(pp) |
7358 | } |
7359 | do_the_parse(&self.0).unwrap() |
7360 | } |
7361 | pub fn as_rc(&self) -> ResourceChange { |
7362 | fn do_the_parse(remaining: &[u8]) -> Result<ResourceChange, ParseError> { |
7363 | let (rc, remaining) = ResourceChange::try_parse(remaining)?; |
7364 | let _ = remaining; |
7365 | Ok(rc) |
7366 | } |
7367 | do_the_parse(&self.0).unwrap() |
7368 | } |
7369 | pub fn as_lc(&self) -> LeaseNotify { |
7370 | fn do_the_parse(remaining: &[u8]) -> Result<LeaseNotify, ParseError> { |
7371 | let (lc, remaining) = LeaseNotify::try_parse(remaining)?; |
7372 | let _ = remaining; |
7373 | Ok(lc) |
7374 | } |
7375 | do_the_parse(&self.0).unwrap() |
7376 | } |
7377 | } |
7378 | impl Serialize for NotifyData { |
7379 | type Bytes = [u8; 28]; |
7380 | fn serialize(&self) -> [u8; 28] { |
7381 | self.0 |
7382 | } |
7383 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
7384 | bytes.extend_from_slice(&self.0); |
7385 | } |
7386 | } |
7387 | impl TryParse for NotifyData { |
7388 | fn try_parse(value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
7389 | let inner: [u8; 28] = valueResult<[u8; 28], TryFromSliceError>.get(..28) |
7390 | .ok_or(err:ParseError::InsufficientData)? |
7391 | .try_into() |
7392 | .unwrap(); |
7393 | let result: NotifyData = NotifyData(inner); |
7394 | Ok((result, &value[28..])) |
7395 | } |
7396 | } |
7397 | impl From<CrtcChange> for NotifyData { |
7398 | fn from(cc: CrtcChange) -> Self { |
7399 | let cc_bytes: [u8; 28] = cc.serialize(); |
7400 | Self(cc_bytes) |
7401 | } |
7402 | } |
7403 | impl From<OutputChange> for NotifyData { |
7404 | fn from(oc: OutputChange) -> Self { |
7405 | let oc_bytes: [u8; 28] = oc.serialize(); |
7406 | Self(oc_bytes) |
7407 | } |
7408 | } |
7409 | impl From<OutputProperty> for NotifyData { |
7410 | fn from(op: OutputProperty) -> Self { |
7411 | let op_bytes: [u8; 28] = op.serialize(); |
7412 | Self(op_bytes) |
7413 | } |
7414 | } |
7415 | impl From<ProviderChange> for NotifyData { |
7416 | fn from(pc: ProviderChange) -> Self { |
7417 | let pc_bytes: [u8; 28] = pc.serialize(); |
7418 | Self(pc_bytes) |
7419 | } |
7420 | } |
7421 | impl From<ProviderProperty> for NotifyData { |
7422 | fn from(pp: ProviderProperty) -> Self { |
7423 | let pp_bytes: [u8; 28] = pp.serialize(); |
7424 | Self(pp_bytes) |
7425 | } |
7426 | } |
7427 | impl From<ResourceChange> for NotifyData { |
7428 | fn from(rc: ResourceChange) -> Self { |
7429 | let rc_bytes: [u8; 28] = rc.serialize(); |
7430 | Self(rc_bytes) |
7431 | } |
7432 | } |
7433 | impl From<LeaseNotify> for NotifyData { |
7434 | fn from(lc: LeaseNotify) -> Self { |
7435 | let lc_bytes: [u8; 28] = lc.serialize(); |
7436 | Self(lc_bytes) |
7437 | } |
7438 | } |
7439 | |
7440 | /// Opcode for the Notify event |
7441 | pub const NOTIFY_EVENT: u8 = 1; |
7442 | #[derive (Clone, Copy)] |
7443 | #[cfg_attr (feature = "extra-traits" , derive(Debug))] |
7444 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
7445 | pub struct NotifyEvent { |
7446 | pub response_type: u8, |
7447 | pub sub_code: Notify, |
7448 | pub sequence: u16, |
7449 | pub u: NotifyData, |
7450 | } |
7451 | impl_debug_if_no_extra_traits!(NotifyEvent, "NotifyEvent" ); |
7452 | impl TryParse for NotifyEvent { |
7453 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
7454 | let remaining: &[u8] = initial_value; |
7455 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
7456 | let (sub_code: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
7457 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
7458 | let (u: NotifyData, remaining: &[u8]) = NotifyData::try_parse(remaining)?; |
7459 | let sub_code: Notify = sub_code.into(); |
7460 | let result: NotifyEvent = NotifyEvent { response_type, sub_code, sequence, u }; |
7461 | let _ = remaining; |
7462 | let remaining: &[u8] = initial_value.get(32..) |
7463 | .ok_or(err:ParseError::InsufficientData)?; |
7464 | Ok((result, remaining)) |
7465 | } |
7466 | } |
7467 | impl Serialize for NotifyEvent { |
7468 | type Bytes = [u8; 32]; |
7469 | fn serialize(&self) -> [u8; 32] { |
7470 | let response_type_bytes = self.response_type.serialize(); |
7471 | let sub_code_bytes = u8::from(self.sub_code).serialize(); |
7472 | let sequence_bytes = self.sequence.serialize(); |
7473 | let u_bytes = self.u.serialize(); |
7474 | [ |
7475 | response_type_bytes[0], |
7476 | sub_code_bytes[0], |
7477 | sequence_bytes[0], |
7478 | sequence_bytes[1], |
7479 | u_bytes[0], |
7480 | u_bytes[1], |
7481 | u_bytes[2], |
7482 | u_bytes[3], |
7483 | u_bytes[4], |
7484 | u_bytes[5], |
7485 | u_bytes[6], |
7486 | u_bytes[7], |
7487 | u_bytes[8], |
7488 | u_bytes[9], |
7489 | u_bytes[10], |
7490 | u_bytes[11], |
7491 | u_bytes[12], |
7492 | u_bytes[13], |
7493 | u_bytes[14], |
7494 | u_bytes[15], |
7495 | u_bytes[16], |
7496 | u_bytes[17], |
7497 | u_bytes[18], |
7498 | u_bytes[19], |
7499 | u_bytes[20], |
7500 | u_bytes[21], |
7501 | u_bytes[22], |
7502 | u_bytes[23], |
7503 | u_bytes[24], |
7504 | u_bytes[25], |
7505 | u_bytes[26], |
7506 | u_bytes[27], |
7507 | ] |
7508 | } |
7509 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
7510 | bytes.reserve(32); |
7511 | self.response_type.serialize_into(bytes); |
7512 | u8::from(self.sub_code).serialize_into(bytes); |
7513 | self.sequence.serialize_into(bytes); |
7514 | self.u.serialize_into(bytes); |
7515 | } |
7516 | } |
7517 | impl From<&NotifyEvent> for [u8; 32] { |
7518 | fn from(input: &NotifyEvent) -> Self { |
7519 | let response_type_bytes = input.response_type.serialize(); |
7520 | let sub_code_bytes = u8::from(input.sub_code).serialize(); |
7521 | let sequence_bytes = input.sequence.serialize(); |
7522 | let u_bytes = input.u.serialize(); |
7523 | [ |
7524 | response_type_bytes[0], |
7525 | sub_code_bytes[0], |
7526 | sequence_bytes[0], |
7527 | sequence_bytes[1], |
7528 | u_bytes[0], |
7529 | u_bytes[1], |
7530 | u_bytes[2], |
7531 | u_bytes[3], |
7532 | u_bytes[4], |
7533 | u_bytes[5], |
7534 | u_bytes[6], |
7535 | u_bytes[7], |
7536 | u_bytes[8], |
7537 | u_bytes[9], |
7538 | u_bytes[10], |
7539 | u_bytes[11], |
7540 | u_bytes[12], |
7541 | u_bytes[13], |
7542 | u_bytes[14], |
7543 | u_bytes[15], |
7544 | u_bytes[16], |
7545 | u_bytes[17], |
7546 | u_bytes[18], |
7547 | u_bytes[19], |
7548 | u_bytes[20], |
7549 | u_bytes[21], |
7550 | u_bytes[22], |
7551 | u_bytes[23], |
7552 | u_bytes[24], |
7553 | u_bytes[25], |
7554 | u_bytes[26], |
7555 | u_bytes[27], |
7556 | ] |
7557 | } |
7558 | } |
7559 | impl From<NotifyEvent> for [u8; 32] { |
7560 | fn from(input: NotifyEvent) -> Self { |
7561 | Self::from(&input) |
7562 | } |
7563 | } |
7564 | |
7565 | |