1 | // This file contains generated code. Do not edit directly. |
2 | // To regenerate this, run 'make'. |
3 | |
4 | //! Bindings to the `Render` 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::xproto; |
27 | |
28 | /// The X11 name of the extension for QueryExtension |
29 | pub const X11_EXTENSION_NAME: &str = "RENDER" ; |
30 | |
31 | /// The version number of this extension that this client library supports. |
32 | /// |
33 | /// This constant contains the version number of this extension that is supported |
34 | /// by this build of x11rb. For most things, it does not make sense to use this |
35 | /// information. If you need to send a `QueryVersion`, it is recommended to instead |
36 | /// send the maximum version of the extension that you need. |
37 | pub const X11_XML_VERSION: (u32, u32) = (0, 11); |
38 | |
39 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
40 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
41 | pub struct PictType(u8); |
42 | impl PictType { |
43 | pub const INDEXED: Self = Self(0); |
44 | pub const DIRECT: Self = Self(1); |
45 | } |
46 | impl From<PictType> for u8 { |
47 | #[inline ] |
48 | fn from(input: PictType) -> Self { |
49 | input.0 |
50 | } |
51 | } |
52 | impl From<PictType> for Option<u8> { |
53 | #[inline ] |
54 | fn from(input: PictType) -> Self { |
55 | Some(input.0) |
56 | } |
57 | } |
58 | impl From<PictType> for u16 { |
59 | #[inline ] |
60 | fn from(input: PictType) -> Self { |
61 | u16::from(input.0) |
62 | } |
63 | } |
64 | impl From<PictType> for Option<u16> { |
65 | #[inline ] |
66 | fn from(input: PictType) -> Self { |
67 | Some(u16::from(input.0)) |
68 | } |
69 | } |
70 | impl From<PictType> for u32 { |
71 | #[inline ] |
72 | fn from(input: PictType) -> Self { |
73 | u32::from(input.0) |
74 | } |
75 | } |
76 | impl From<PictType> for Option<u32> { |
77 | #[inline ] |
78 | fn from(input: PictType) -> Self { |
79 | Some(u32::from(input.0)) |
80 | } |
81 | } |
82 | impl From<u8> for PictType { |
83 | #[inline ] |
84 | fn from(value: u8) -> Self { |
85 | Self(value) |
86 | } |
87 | } |
88 | impl core::fmt::Debug for PictType { |
89 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
90 | let variants: [(u32, &str, &str); 2] = [ |
91 | (Self::INDEXED.0.into(), "INDEXED" , "Indexed" ), |
92 | (Self::DIRECT.0.into(), "DIRECT" , "Direct" ), |
93 | ]; |
94 | pretty_print_enum(fmt, self.0.into(), &variants) |
95 | } |
96 | } |
97 | |
98 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
99 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
100 | pub struct PictureEnum(u8); |
101 | impl PictureEnum { |
102 | pub const NONE: Self = Self(0); |
103 | } |
104 | impl From<PictureEnum> for u8 { |
105 | #[inline ] |
106 | fn from(input: PictureEnum) -> Self { |
107 | input.0 |
108 | } |
109 | } |
110 | impl From<PictureEnum> for Option<u8> { |
111 | #[inline ] |
112 | fn from(input: PictureEnum) -> Self { |
113 | Some(input.0) |
114 | } |
115 | } |
116 | impl From<PictureEnum> for u16 { |
117 | #[inline ] |
118 | fn from(input: PictureEnum) -> Self { |
119 | u16::from(input.0) |
120 | } |
121 | } |
122 | impl From<PictureEnum> for Option<u16> { |
123 | #[inline ] |
124 | fn from(input: PictureEnum) -> Self { |
125 | Some(u16::from(input.0)) |
126 | } |
127 | } |
128 | impl From<PictureEnum> for u32 { |
129 | #[inline ] |
130 | fn from(input: PictureEnum) -> Self { |
131 | u32::from(input.0) |
132 | } |
133 | } |
134 | impl From<PictureEnum> for Option<u32> { |
135 | #[inline ] |
136 | fn from(input: PictureEnum) -> Self { |
137 | Some(u32::from(input.0)) |
138 | } |
139 | } |
140 | impl From<u8> for PictureEnum { |
141 | #[inline ] |
142 | fn from(value: u8) -> Self { |
143 | Self(value) |
144 | } |
145 | } |
146 | impl core::fmt::Debug for PictureEnum { |
147 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
148 | let variants: [(u32, &str, &str); 1] = [ |
149 | (Self::NONE.0.into(), "NONE" , "None" ), |
150 | ]; |
151 | pretty_print_enum(fmt, self.0.into(), &variants) |
152 | } |
153 | } |
154 | |
155 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
156 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
157 | pub struct PictOp(u8); |
158 | impl PictOp { |
159 | pub const CLEAR: Self = Self(0); |
160 | pub const SRC: Self = Self(1); |
161 | pub const DST: Self = Self(2); |
162 | pub const OVER: Self = Self(3); |
163 | pub const OVER_REVERSE: Self = Self(4); |
164 | pub const IN: Self = Self(5); |
165 | pub const IN_REVERSE: Self = Self(6); |
166 | pub const OUT: Self = Self(7); |
167 | pub const OUT_REVERSE: Self = Self(8); |
168 | pub const ATOP: Self = Self(9); |
169 | pub const ATOP_REVERSE: Self = Self(10); |
170 | pub const XOR: Self = Self(11); |
171 | pub const ADD: Self = Self(12); |
172 | pub const SATURATE: Self = Self(13); |
173 | pub const DISJOINT_CLEAR: Self = Self(16); |
174 | pub const DISJOINT_SRC: Self = Self(17); |
175 | pub const DISJOINT_DST: Self = Self(18); |
176 | pub const DISJOINT_OVER: Self = Self(19); |
177 | pub const DISJOINT_OVER_REVERSE: Self = Self(20); |
178 | pub const DISJOINT_IN: Self = Self(21); |
179 | pub const DISJOINT_IN_REVERSE: Self = Self(22); |
180 | pub const DISJOINT_OUT: Self = Self(23); |
181 | pub const DISJOINT_OUT_REVERSE: Self = Self(24); |
182 | pub const DISJOINT_ATOP: Self = Self(25); |
183 | pub const DISJOINT_ATOP_REVERSE: Self = Self(26); |
184 | pub const DISJOINT_XOR: Self = Self(27); |
185 | pub const CONJOINT_CLEAR: Self = Self(32); |
186 | pub const CONJOINT_SRC: Self = Self(33); |
187 | pub const CONJOINT_DST: Self = Self(34); |
188 | pub const CONJOINT_OVER: Self = Self(35); |
189 | pub const CONJOINT_OVER_REVERSE: Self = Self(36); |
190 | pub const CONJOINT_IN: Self = Self(37); |
191 | pub const CONJOINT_IN_REVERSE: Self = Self(38); |
192 | pub const CONJOINT_OUT: Self = Self(39); |
193 | pub const CONJOINT_OUT_REVERSE: Self = Self(40); |
194 | pub const CONJOINT_ATOP: Self = Self(41); |
195 | pub const CONJOINT_ATOP_REVERSE: Self = Self(42); |
196 | pub const CONJOINT_XOR: Self = Self(43); |
197 | pub const MULTIPLY: Self = Self(48); |
198 | pub const SCREEN: Self = Self(49); |
199 | pub const OVERLAY: Self = Self(50); |
200 | pub const DARKEN: Self = Self(51); |
201 | pub const LIGHTEN: Self = Self(52); |
202 | pub const COLOR_DODGE: Self = Self(53); |
203 | pub const COLOR_BURN: Self = Self(54); |
204 | pub const HARD_LIGHT: Self = Self(55); |
205 | pub const SOFT_LIGHT: Self = Self(56); |
206 | pub const DIFFERENCE: Self = Self(57); |
207 | pub const EXCLUSION: Self = Self(58); |
208 | pub const HSL_HUE: Self = Self(59); |
209 | pub const HSL_SATURATION: Self = Self(60); |
210 | pub const HSL_COLOR: Self = Self(61); |
211 | pub const HSL_LUMINOSITY: Self = Self(62); |
212 | } |
213 | impl From<PictOp> for u8 { |
214 | #[inline ] |
215 | fn from(input: PictOp) -> Self { |
216 | input.0 |
217 | } |
218 | } |
219 | impl From<PictOp> for Option<u8> { |
220 | #[inline ] |
221 | fn from(input: PictOp) -> Self { |
222 | Some(input.0) |
223 | } |
224 | } |
225 | impl From<PictOp> for u16 { |
226 | #[inline ] |
227 | fn from(input: PictOp) -> Self { |
228 | u16::from(input.0) |
229 | } |
230 | } |
231 | impl From<PictOp> for Option<u16> { |
232 | #[inline ] |
233 | fn from(input: PictOp) -> Self { |
234 | Some(u16::from(input.0)) |
235 | } |
236 | } |
237 | impl From<PictOp> for u32 { |
238 | #[inline ] |
239 | fn from(input: PictOp) -> Self { |
240 | u32::from(input.0) |
241 | } |
242 | } |
243 | impl From<PictOp> for Option<u32> { |
244 | #[inline ] |
245 | fn from(input: PictOp) -> Self { |
246 | Some(u32::from(input.0)) |
247 | } |
248 | } |
249 | impl From<u8> for PictOp { |
250 | #[inline ] |
251 | fn from(value: u8) -> Self { |
252 | Self(value) |
253 | } |
254 | } |
255 | impl core::fmt::Debug for PictOp { |
256 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
257 | let variants = [ |
258 | (Self::CLEAR.0.into(), "CLEAR" , "Clear" ), |
259 | (Self::SRC.0.into(), "SRC" , "Src" ), |
260 | (Self::DST.0.into(), "DST" , "Dst" ), |
261 | (Self::OVER.0.into(), "OVER" , "Over" ), |
262 | (Self::OVER_REVERSE.0.into(), "OVER_REVERSE" , "OverReverse" ), |
263 | (Self::IN.0.into(), "IN" , "In" ), |
264 | (Self::IN_REVERSE.0.into(), "IN_REVERSE" , "InReverse" ), |
265 | (Self::OUT.0.into(), "OUT" , "Out" ), |
266 | (Self::OUT_REVERSE.0.into(), "OUT_REVERSE" , "OutReverse" ), |
267 | (Self::ATOP.0.into(), "ATOP" , "Atop" ), |
268 | (Self::ATOP_REVERSE.0.into(), "ATOP_REVERSE" , "AtopReverse" ), |
269 | (Self::XOR.0.into(), "XOR" , "Xor" ), |
270 | (Self::ADD.0.into(), "ADD" , "Add" ), |
271 | (Self::SATURATE.0.into(), "SATURATE" , "Saturate" ), |
272 | (Self::DISJOINT_CLEAR.0.into(), "DISJOINT_CLEAR" , "DisjointClear" ), |
273 | (Self::DISJOINT_SRC.0.into(), "DISJOINT_SRC" , "DisjointSrc" ), |
274 | (Self::DISJOINT_DST.0.into(), "DISJOINT_DST" , "DisjointDst" ), |
275 | (Self::DISJOINT_OVER.0.into(), "DISJOINT_OVER" , "DisjointOver" ), |
276 | (Self::DISJOINT_OVER_REVERSE.0.into(), "DISJOINT_OVER_REVERSE" , "DisjointOverReverse" ), |
277 | (Self::DISJOINT_IN.0.into(), "DISJOINT_IN" , "DisjointIn" ), |
278 | (Self::DISJOINT_IN_REVERSE.0.into(), "DISJOINT_IN_REVERSE" , "DisjointInReverse" ), |
279 | (Self::DISJOINT_OUT.0.into(), "DISJOINT_OUT" , "DisjointOut" ), |
280 | (Self::DISJOINT_OUT_REVERSE.0.into(), "DISJOINT_OUT_REVERSE" , "DisjointOutReverse" ), |
281 | (Self::DISJOINT_ATOP.0.into(), "DISJOINT_ATOP" , "DisjointAtop" ), |
282 | (Self::DISJOINT_ATOP_REVERSE.0.into(), "DISJOINT_ATOP_REVERSE" , "DisjointAtopReverse" ), |
283 | (Self::DISJOINT_XOR.0.into(), "DISJOINT_XOR" , "DisjointXor" ), |
284 | (Self::CONJOINT_CLEAR.0.into(), "CONJOINT_CLEAR" , "ConjointClear" ), |
285 | (Self::CONJOINT_SRC.0.into(), "CONJOINT_SRC" , "ConjointSrc" ), |
286 | (Self::CONJOINT_DST.0.into(), "CONJOINT_DST" , "ConjointDst" ), |
287 | (Self::CONJOINT_OVER.0.into(), "CONJOINT_OVER" , "ConjointOver" ), |
288 | (Self::CONJOINT_OVER_REVERSE.0.into(), "CONJOINT_OVER_REVERSE" , "ConjointOverReverse" ), |
289 | (Self::CONJOINT_IN.0.into(), "CONJOINT_IN" , "ConjointIn" ), |
290 | (Self::CONJOINT_IN_REVERSE.0.into(), "CONJOINT_IN_REVERSE" , "ConjointInReverse" ), |
291 | (Self::CONJOINT_OUT.0.into(), "CONJOINT_OUT" , "ConjointOut" ), |
292 | (Self::CONJOINT_OUT_REVERSE.0.into(), "CONJOINT_OUT_REVERSE" , "ConjointOutReverse" ), |
293 | (Self::CONJOINT_ATOP.0.into(), "CONJOINT_ATOP" , "ConjointAtop" ), |
294 | (Self::CONJOINT_ATOP_REVERSE.0.into(), "CONJOINT_ATOP_REVERSE" , "ConjointAtopReverse" ), |
295 | (Self::CONJOINT_XOR.0.into(), "CONJOINT_XOR" , "ConjointXor" ), |
296 | (Self::MULTIPLY.0.into(), "MULTIPLY" , "Multiply" ), |
297 | (Self::SCREEN.0.into(), "SCREEN" , "Screen" ), |
298 | (Self::OVERLAY.0.into(), "OVERLAY" , "Overlay" ), |
299 | (Self::DARKEN.0.into(), "DARKEN" , "Darken" ), |
300 | (Self::LIGHTEN.0.into(), "LIGHTEN" , "Lighten" ), |
301 | (Self::COLOR_DODGE.0.into(), "COLOR_DODGE" , "ColorDodge" ), |
302 | (Self::COLOR_BURN.0.into(), "COLOR_BURN" , "ColorBurn" ), |
303 | (Self::HARD_LIGHT.0.into(), "HARD_LIGHT" , "HardLight" ), |
304 | (Self::SOFT_LIGHT.0.into(), "SOFT_LIGHT" , "SoftLight" ), |
305 | (Self::DIFFERENCE.0.into(), "DIFFERENCE" , "Difference" ), |
306 | (Self::EXCLUSION.0.into(), "EXCLUSION" , "Exclusion" ), |
307 | (Self::HSL_HUE.0.into(), "HSL_HUE" , "HSLHue" ), |
308 | (Self::HSL_SATURATION.0.into(), "HSL_SATURATION" , "HSLSaturation" ), |
309 | (Self::HSL_COLOR.0.into(), "HSL_COLOR" , "HSLColor" ), |
310 | (Self::HSL_LUMINOSITY.0.into(), "HSL_LUMINOSITY" , "HSLLuminosity" ), |
311 | ]; |
312 | pretty_print_enum(fmt, self.0.into(), &variants) |
313 | } |
314 | } |
315 | |
316 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
317 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
318 | pub struct PolyEdge(u32); |
319 | impl PolyEdge { |
320 | pub const SHARP: Self = Self(0); |
321 | pub const SMOOTH: Self = Self(1); |
322 | } |
323 | impl From<PolyEdge> for u32 { |
324 | #[inline ] |
325 | fn from(input: PolyEdge) -> Self { |
326 | input.0 |
327 | } |
328 | } |
329 | impl From<PolyEdge> for Option<u32> { |
330 | #[inline ] |
331 | fn from(input: PolyEdge) -> Self { |
332 | Some(input.0) |
333 | } |
334 | } |
335 | impl From<u8> for PolyEdge { |
336 | #[inline ] |
337 | fn from(value: u8) -> Self { |
338 | Self(value.into()) |
339 | } |
340 | } |
341 | impl From<u16> for PolyEdge { |
342 | #[inline ] |
343 | fn from(value: u16) -> Self { |
344 | Self(value.into()) |
345 | } |
346 | } |
347 | impl From<u32> for PolyEdge { |
348 | #[inline ] |
349 | fn from(value: u32) -> Self { |
350 | Self(value) |
351 | } |
352 | } |
353 | impl core::fmt::Debug for PolyEdge { |
354 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
355 | let variants: [(u32, &str, &str); 2] = [ |
356 | (Self::SHARP.0, "SHARP" , "Sharp" ), |
357 | (Self::SMOOTH.0, "SMOOTH" , "Smooth" ), |
358 | ]; |
359 | pretty_print_enum(fmt, self.0, &variants) |
360 | } |
361 | } |
362 | |
363 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
364 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
365 | pub struct PolyMode(u32); |
366 | impl PolyMode { |
367 | pub const PRECISE: Self = Self(0); |
368 | pub const IMPRECISE: Self = Self(1); |
369 | } |
370 | impl From<PolyMode> for u32 { |
371 | #[inline ] |
372 | fn from(input: PolyMode) -> Self { |
373 | input.0 |
374 | } |
375 | } |
376 | impl From<PolyMode> for Option<u32> { |
377 | #[inline ] |
378 | fn from(input: PolyMode) -> Self { |
379 | Some(input.0) |
380 | } |
381 | } |
382 | impl From<u8> for PolyMode { |
383 | #[inline ] |
384 | fn from(value: u8) -> Self { |
385 | Self(value.into()) |
386 | } |
387 | } |
388 | impl From<u16> for PolyMode { |
389 | #[inline ] |
390 | fn from(value: u16) -> Self { |
391 | Self(value.into()) |
392 | } |
393 | } |
394 | impl From<u32> for PolyMode { |
395 | #[inline ] |
396 | fn from(value: u32) -> Self { |
397 | Self(value) |
398 | } |
399 | } |
400 | impl core::fmt::Debug for PolyMode { |
401 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
402 | let variants: [(u32, &str, &str); 2] = [ |
403 | (Self::PRECISE.0, "PRECISE" , "Precise" ), |
404 | (Self::IMPRECISE.0, "IMPRECISE" , "Imprecise" ), |
405 | ]; |
406 | pretty_print_enum(fmt, self.0, &variants) |
407 | } |
408 | } |
409 | |
410 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
411 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
412 | pub struct CP(u32); |
413 | impl CP { |
414 | pub const REPEAT: Self = Self(1 << 0); |
415 | pub const ALPHA_MAP: Self = Self(1 << 1); |
416 | pub const ALPHA_X_ORIGIN: Self = Self(1 << 2); |
417 | pub const ALPHA_Y_ORIGIN: Self = Self(1 << 3); |
418 | pub const CLIP_X_ORIGIN: Self = Self(1 << 4); |
419 | pub const CLIP_Y_ORIGIN: Self = Self(1 << 5); |
420 | pub const CLIP_MASK: Self = Self(1 << 6); |
421 | pub const GRAPHICS_EXPOSURE: Self = Self(1 << 7); |
422 | pub const SUBWINDOW_MODE: Self = Self(1 << 8); |
423 | pub const POLY_EDGE: Self = Self(1 << 9); |
424 | pub const POLY_MODE: Self = Self(1 << 10); |
425 | pub const DITHER: Self = Self(1 << 11); |
426 | pub const COMPONENT_ALPHA: Self = Self(1 << 12); |
427 | } |
428 | impl From<CP> for u32 { |
429 | #[inline ] |
430 | fn from(input: CP) -> Self { |
431 | input.0 |
432 | } |
433 | } |
434 | impl From<CP> for Option<u32> { |
435 | #[inline ] |
436 | fn from(input: CP) -> Self { |
437 | Some(input.0) |
438 | } |
439 | } |
440 | impl From<u8> for CP { |
441 | #[inline ] |
442 | fn from(value: u8) -> Self { |
443 | Self(value.into()) |
444 | } |
445 | } |
446 | impl From<u16> for CP { |
447 | #[inline ] |
448 | fn from(value: u16) -> Self { |
449 | Self(value.into()) |
450 | } |
451 | } |
452 | impl From<u32> for CP { |
453 | #[inline ] |
454 | fn from(value: u32) -> Self { |
455 | Self(value) |
456 | } |
457 | } |
458 | impl core::fmt::Debug for CP { |
459 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
460 | let variants: [(u32, &str, &str); 13] = [ |
461 | (Self::REPEAT.0, "REPEAT" , "Repeat" ), |
462 | (Self::ALPHA_MAP.0, "ALPHA_MAP" , "AlphaMap" ), |
463 | (Self::ALPHA_X_ORIGIN.0, "ALPHA_X_ORIGIN" , "AlphaXOrigin" ), |
464 | (Self::ALPHA_Y_ORIGIN.0, "ALPHA_Y_ORIGIN" , "AlphaYOrigin" ), |
465 | (Self::CLIP_X_ORIGIN.0, "CLIP_X_ORIGIN" , "ClipXOrigin" ), |
466 | (Self::CLIP_Y_ORIGIN.0, "CLIP_Y_ORIGIN" , "ClipYOrigin" ), |
467 | (Self::CLIP_MASK.0, "CLIP_MASK" , "ClipMask" ), |
468 | (Self::GRAPHICS_EXPOSURE.0, "GRAPHICS_EXPOSURE" , "GraphicsExposure" ), |
469 | (Self::SUBWINDOW_MODE.0, "SUBWINDOW_MODE" , "SubwindowMode" ), |
470 | (Self::POLY_EDGE.0, "POLY_EDGE" , "PolyEdge" ), |
471 | (Self::POLY_MODE.0, "POLY_MODE" , "PolyMode" ), |
472 | (Self::DITHER.0, "DITHER" , "Dither" ), |
473 | (Self::COMPONENT_ALPHA.0, "COMPONENT_ALPHA" , "ComponentAlpha" ), |
474 | ]; |
475 | pretty_print_bitmask(fmt, self.0, &variants) |
476 | } |
477 | } |
478 | bitmask_binop!(CP, u32); |
479 | |
480 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
481 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
482 | pub struct SubPixel(u32); |
483 | impl SubPixel { |
484 | pub const UNKNOWN: Self = Self(0); |
485 | pub const HORIZONTAL_RGB: Self = Self(1); |
486 | pub const HORIZONTAL_BGR: Self = Self(2); |
487 | pub const VERTICAL_RGB: Self = Self(3); |
488 | pub const VERTICAL_BGR: Self = Self(4); |
489 | pub const NONE: Self = Self(5); |
490 | } |
491 | impl From<SubPixel> for u32 { |
492 | #[inline ] |
493 | fn from(input: SubPixel) -> Self { |
494 | input.0 |
495 | } |
496 | } |
497 | impl From<SubPixel> for Option<u32> { |
498 | #[inline ] |
499 | fn from(input: SubPixel) -> Self { |
500 | Some(input.0) |
501 | } |
502 | } |
503 | impl From<u8> for SubPixel { |
504 | #[inline ] |
505 | fn from(value: u8) -> Self { |
506 | Self(value.into()) |
507 | } |
508 | } |
509 | impl From<u16> for SubPixel { |
510 | #[inline ] |
511 | fn from(value: u16) -> Self { |
512 | Self(value.into()) |
513 | } |
514 | } |
515 | impl From<u32> for SubPixel { |
516 | #[inline ] |
517 | fn from(value: u32) -> Self { |
518 | Self(value) |
519 | } |
520 | } |
521 | impl core::fmt::Debug for SubPixel { |
522 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
523 | let variants: [(u32, &str, &str); 6] = [ |
524 | (Self::UNKNOWN.0, "UNKNOWN" , "Unknown" ), |
525 | (Self::HORIZONTAL_RGB.0, "HORIZONTAL_RGB" , "HorizontalRGB" ), |
526 | (Self::HORIZONTAL_BGR.0, "HORIZONTAL_BGR" , "HorizontalBGR" ), |
527 | (Self::VERTICAL_RGB.0, "VERTICAL_RGB" , "VerticalRGB" ), |
528 | (Self::VERTICAL_BGR.0, "VERTICAL_BGR" , "VerticalBGR" ), |
529 | (Self::NONE.0, "NONE" , "None" ), |
530 | ]; |
531 | pretty_print_enum(fmt, self.0, &variants) |
532 | } |
533 | } |
534 | |
535 | #[derive (Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] |
536 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
537 | pub struct Repeat(u32); |
538 | impl Repeat { |
539 | pub const NONE: Self = Self(0); |
540 | pub const NORMAL: Self = Self(1); |
541 | pub const PAD: Self = Self(2); |
542 | pub const REFLECT: Self = Self(3); |
543 | } |
544 | impl From<Repeat> for u32 { |
545 | #[inline ] |
546 | fn from(input: Repeat) -> Self { |
547 | input.0 |
548 | } |
549 | } |
550 | impl From<Repeat> for Option<u32> { |
551 | #[inline ] |
552 | fn from(input: Repeat) -> Self { |
553 | Some(input.0) |
554 | } |
555 | } |
556 | impl From<u8> for Repeat { |
557 | #[inline ] |
558 | fn from(value: u8) -> Self { |
559 | Self(value.into()) |
560 | } |
561 | } |
562 | impl From<u16> for Repeat { |
563 | #[inline ] |
564 | fn from(value: u16) -> Self { |
565 | Self(value.into()) |
566 | } |
567 | } |
568 | impl From<u32> for Repeat { |
569 | #[inline ] |
570 | fn from(value: u32) -> Self { |
571 | Self(value) |
572 | } |
573 | } |
574 | impl core::fmt::Debug for Repeat { |
575 | fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { |
576 | let variants: [(u32, &str, &str); 4] = [ |
577 | (Self::NONE.0, "NONE" , "None" ), |
578 | (Self::NORMAL.0, "NORMAL" , "Normal" ), |
579 | (Self::PAD.0, "PAD" , "Pad" ), |
580 | (Self::REFLECT.0, "REFLECT" , "Reflect" ), |
581 | ]; |
582 | pretty_print_enum(fmt, self.0, &variants) |
583 | } |
584 | } |
585 | |
586 | pub type Glyph = u32; |
587 | |
588 | pub type Glyphset = u32; |
589 | |
590 | pub type Picture = u32; |
591 | |
592 | pub type Pictformat = u32; |
593 | |
594 | pub type Fixed = i32; |
595 | |
596 | /// Opcode for the PictFormat error |
597 | pub const PICT_FORMAT_ERROR: u8 = 0; |
598 | |
599 | /// Opcode for the Picture error |
600 | pub const PICTURE_ERROR: u8 = 1; |
601 | |
602 | /// Opcode for the PictOp error |
603 | pub const PICT_OP_ERROR: u8 = 2; |
604 | |
605 | /// Opcode for the GlyphSet error |
606 | pub const GLYPH_SET_ERROR: u8 = 3; |
607 | |
608 | /// Opcode for the Glyph error |
609 | pub const GLYPH_ERROR: u8 = 4; |
610 | |
611 | #[derive (Clone, Copy, Default)] |
612 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
613 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
614 | pub struct Directformat { |
615 | pub red_shift: u16, |
616 | pub red_mask: u16, |
617 | pub green_shift: u16, |
618 | pub green_mask: u16, |
619 | pub blue_shift: u16, |
620 | pub blue_mask: u16, |
621 | pub alpha_shift: u16, |
622 | pub alpha_mask: u16, |
623 | } |
624 | impl_debug_if_no_extra_traits!(Directformat, "Directformat" ); |
625 | impl TryParse for Directformat { |
626 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
627 | let (red_shift: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
628 | let (red_mask: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
629 | let (green_shift: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
630 | let (green_mask: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
631 | let (blue_shift: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
632 | let (blue_mask: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
633 | let (alpha_shift: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
634 | let (alpha_mask: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
635 | let result: Directformat = Directformat { red_shift, red_mask, green_shift, green_mask, blue_shift, blue_mask, alpha_shift, alpha_mask }; |
636 | Ok((result, remaining)) |
637 | } |
638 | } |
639 | impl Serialize for Directformat { |
640 | type Bytes = [u8; 16]; |
641 | fn serialize(&self) -> [u8; 16] { |
642 | let red_shift_bytes = self.red_shift.serialize(); |
643 | let red_mask_bytes = self.red_mask.serialize(); |
644 | let green_shift_bytes = self.green_shift.serialize(); |
645 | let green_mask_bytes = self.green_mask.serialize(); |
646 | let blue_shift_bytes = self.blue_shift.serialize(); |
647 | let blue_mask_bytes = self.blue_mask.serialize(); |
648 | let alpha_shift_bytes = self.alpha_shift.serialize(); |
649 | let alpha_mask_bytes = self.alpha_mask.serialize(); |
650 | [ |
651 | red_shift_bytes[0], |
652 | red_shift_bytes[1], |
653 | red_mask_bytes[0], |
654 | red_mask_bytes[1], |
655 | green_shift_bytes[0], |
656 | green_shift_bytes[1], |
657 | green_mask_bytes[0], |
658 | green_mask_bytes[1], |
659 | blue_shift_bytes[0], |
660 | blue_shift_bytes[1], |
661 | blue_mask_bytes[0], |
662 | blue_mask_bytes[1], |
663 | alpha_shift_bytes[0], |
664 | alpha_shift_bytes[1], |
665 | alpha_mask_bytes[0], |
666 | alpha_mask_bytes[1], |
667 | ] |
668 | } |
669 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
670 | bytes.reserve(16); |
671 | self.red_shift.serialize_into(bytes); |
672 | self.red_mask.serialize_into(bytes); |
673 | self.green_shift.serialize_into(bytes); |
674 | self.green_mask.serialize_into(bytes); |
675 | self.blue_shift.serialize_into(bytes); |
676 | self.blue_mask.serialize_into(bytes); |
677 | self.alpha_shift.serialize_into(bytes); |
678 | self.alpha_mask.serialize_into(bytes); |
679 | } |
680 | } |
681 | |
682 | #[derive (Clone, Copy, Default)] |
683 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
684 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
685 | pub struct Pictforminfo { |
686 | pub id: Pictformat, |
687 | pub type_: PictType, |
688 | pub depth: u8, |
689 | pub direct: Directformat, |
690 | pub colormap: xproto::Colormap, |
691 | } |
692 | impl_debug_if_no_extra_traits!(Pictforminfo, "Pictforminfo" ); |
693 | impl TryParse for Pictforminfo { |
694 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
695 | let (id: u32, remaining: &[u8]) = Pictformat::try_parse(remaining)?; |
696 | let (type_: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
697 | let (depth: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
698 | let remaining: &[u8] = remaining.get(2..).ok_or(err:ParseError::InsufficientData)?; |
699 | let (direct: Directformat, remaining: &[u8]) = Directformat::try_parse(remaining)?; |
700 | let (colormap: u32, remaining: &[u8]) = xproto::Colormap::try_parse(remaining)?; |
701 | let type_: PictType = type_.into(); |
702 | let result: Pictforminfo = Pictforminfo { id, type_, depth, direct, colormap }; |
703 | Ok((result, remaining)) |
704 | } |
705 | } |
706 | impl Serialize for Pictforminfo { |
707 | type Bytes = [u8; 28]; |
708 | fn serialize(&self) -> [u8; 28] { |
709 | let id_bytes = self.id.serialize(); |
710 | let type_bytes = u8::from(self.type_).serialize(); |
711 | let depth_bytes = self.depth.serialize(); |
712 | let direct_bytes = self.direct.serialize(); |
713 | let colormap_bytes = self.colormap.serialize(); |
714 | [ |
715 | id_bytes[0], |
716 | id_bytes[1], |
717 | id_bytes[2], |
718 | id_bytes[3], |
719 | type_bytes[0], |
720 | depth_bytes[0], |
721 | 0, |
722 | 0, |
723 | direct_bytes[0], |
724 | direct_bytes[1], |
725 | direct_bytes[2], |
726 | direct_bytes[3], |
727 | direct_bytes[4], |
728 | direct_bytes[5], |
729 | direct_bytes[6], |
730 | direct_bytes[7], |
731 | direct_bytes[8], |
732 | direct_bytes[9], |
733 | direct_bytes[10], |
734 | direct_bytes[11], |
735 | direct_bytes[12], |
736 | direct_bytes[13], |
737 | direct_bytes[14], |
738 | direct_bytes[15], |
739 | colormap_bytes[0], |
740 | colormap_bytes[1], |
741 | colormap_bytes[2], |
742 | colormap_bytes[3], |
743 | ] |
744 | } |
745 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
746 | bytes.reserve(28); |
747 | self.id.serialize_into(bytes); |
748 | u8::from(self.type_).serialize_into(bytes); |
749 | self.depth.serialize_into(bytes); |
750 | bytes.extend_from_slice(&[0; 2]); |
751 | self.direct.serialize_into(bytes); |
752 | self.colormap.serialize_into(bytes); |
753 | } |
754 | } |
755 | |
756 | #[derive (Clone, Copy, Default)] |
757 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
758 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
759 | pub struct Pictvisual { |
760 | pub visual: xproto::Visualid, |
761 | pub format: Pictformat, |
762 | } |
763 | impl_debug_if_no_extra_traits!(Pictvisual, "Pictvisual" ); |
764 | impl TryParse for Pictvisual { |
765 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
766 | let (visual: u32, remaining: &[u8]) = xproto::Visualid::try_parse(remaining)?; |
767 | let (format: u32, remaining: &[u8]) = Pictformat::try_parse(remaining)?; |
768 | let result: Pictvisual = Pictvisual { visual, format }; |
769 | Ok((result, remaining)) |
770 | } |
771 | } |
772 | impl Serialize for Pictvisual { |
773 | type Bytes = [u8; 8]; |
774 | fn serialize(&self) -> [u8; 8] { |
775 | let visual_bytes: [u8; 4] = self.visual.serialize(); |
776 | let format_bytes: [u8; 4] = self.format.serialize(); |
777 | [ |
778 | visual_bytes[0], |
779 | visual_bytes[1], |
780 | visual_bytes[2], |
781 | visual_bytes[3], |
782 | format_bytes[0], |
783 | format_bytes[1], |
784 | format_bytes[2], |
785 | format_bytes[3], |
786 | ] |
787 | } |
788 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
789 | bytes.reserve(additional:8); |
790 | self.visual.serialize_into(bytes); |
791 | self.format.serialize_into(bytes); |
792 | } |
793 | } |
794 | |
795 | #[derive (Clone, Default)] |
796 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
797 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
798 | pub struct Pictdepth { |
799 | pub depth: u8, |
800 | pub visuals: Vec<Pictvisual>, |
801 | } |
802 | impl_debug_if_no_extra_traits!(Pictdepth, "Pictdepth" ); |
803 | impl TryParse for Pictdepth { |
804 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
805 | let (depth: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
806 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
807 | let (num_visuals: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
808 | let remaining: &[u8] = remaining.get(4..).ok_or(err:ParseError::InsufficientData)?; |
809 | let (visuals: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<Pictvisual>(data:remaining, list_length:num_visuals.try_to_usize()?)?; |
810 | let result: Pictdepth = Pictdepth { depth, visuals }; |
811 | Ok((result, remaining)) |
812 | } |
813 | } |
814 | impl Serialize for Pictdepth { |
815 | type Bytes = Vec<u8>; |
816 | fn serialize(&self) -> Vec<u8> { |
817 | let mut result: Vec = Vec::new(); |
818 | self.serialize_into(&mut result); |
819 | result |
820 | } |
821 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
822 | bytes.reserve(additional:8); |
823 | self.depth.serialize_into(bytes); |
824 | bytes.extend_from_slice(&[0; 1]); |
825 | let num_visuals: u16 = u16::try_from(self.visuals.len()).expect(msg:"`visuals` has too many elements" ); |
826 | num_visuals.serialize_into(bytes); |
827 | bytes.extend_from_slice(&[0; 4]); |
828 | self.visuals.serialize_into(bytes); |
829 | } |
830 | } |
831 | impl Pictdepth { |
832 | /// Get the value of the `num_visuals` field. |
833 | /// |
834 | /// The `num_visuals` field is used as the length field of the `visuals` field. |
835 | /// This function computes the field's value again based on the length of the list. |
836 | /// |
837 | /// # Panics |
838 | /// |
839 | /// Panics if the value cannot be represented in the target type. This |
840 | /// cannot happen with values of the struct received from the X11 server. |
841 | pub fn num_visuals(&self) -> u16 { |
842 | self.visuals.len() |
843 | .try_into().unwrap() |
844 | } |
845 | } |
846 | |
847 | #[derive (Clone, Default)] |
848 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
849 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
850 | pub struct Pictscreen { |
851 | pub fallback: Pictformat, |
852 | pub depths: Vec<Pictdepth>, |
853 | } |
854 | impl_debug_if_no_extra_traits!(Pictscreen, "Pictscreen" ); |
855 | impl TryParse for Pictscreen { |
856 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
857 | let (num_depths: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
858 | let (fallback: u32, remaining: &[u8]) = Pictformat::try_parse(remaining)?; |
859 | let (depths: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<Pictdepth>(data:remaining, list_length:num_depths.try_to_usize()?)?; |
860 | let result: Pictscreen = Pictscreen { fallback, depths }; |
861 | Ok((result, remaining)) |
862 | } |
863 | } |
864 | impl Serialize for Pictscreen { |
865 | type Bytes = Vec<u8>; |
866 | fn serialize(&self) -> Vec<u8> { |
867 | let mut result: Vec = Vec::new(); |
868 | self.serialize_into(&mut result); |
869 | result |
870 | } |
871 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
872 | bytes.reserve(additional:8); |
873 | let num_depths: u32 = u32::try_from(self.depths.len()).expect(msg:"`depths` has too many elements" ); |
874 | num_depths.serialize_into(bytes); |
875 | self.fallback.serialize_into(bytes); |
876 | self.depths.serialize_into(bytes); |
877 | } |
878 | } |
879 | impl Pictscreen { |
880 | /// Get the value of the `num_depths` field. |
881 | /// |
882 | /// The `num_depths` field is used as the length field of the `depths` field. |
883 | /// This function computes the field's value again based on the length of the list. |
884 | /// |
885 | /// # Panics |
886 | /// |
887 | /// Panics if the value cannot be represented in the target type. This |
888 | /// cannot happen with values of the struct received from the X11 server. |
889 | pub fn num_depths(&self) -> u32 { |
890 | self.depths.len() |
891 | .try_into().unwrap() |
892 | } |
893 | } |
894 | |
895 | #[derive (Clone, Copy, Default)] |
896 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
897 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
898 | pub struct Indexvalue { |
899 | pub pixel: u32, |
900 | pub red: u16, |
901 | pub green: u16, |
902 | pub blue: u16, |
903 | pub alpha: u16, |
904 | } |
905 | impl_debug_if_no_extra_traits!(Indexvalue, "Indexvalue" ); |
906 | impl TryParse for Indexvalue { |
907 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
908 | let (pixel: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
909 | let (red: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
910 | let (green: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
911 | let (blue: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
912 | let (alpha: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
913 | let result: Indexvalue = Indexvalue { pixel, red, green, blue, alpha }; |
914 | Ok((result, remaining)) |
915 | } |
916 | } |
917 | impl Serialize for Indexvalue { |
918 | type Bytes = [u8; 12]; |
919 | fn serialize(&self) -> [u8; 12] { |
920 | let pixel_bytes = self.pixel.serialize(); |
921 | let red_bytes = self.red.serialize(); |
922 | let green_bytes = self.green.serialize(); |
923 | let blue_bytes = self.blue.serialize(); |
924 | let alpha_bytes = self.alpha.serialize(); |
925 | [ |
926 | pixel_bytes[0], |
927 | pixel_bytes[1], |
928 | pixel_bytes[2], |
929 | pixel_bytes[3], |
930 | red_bytes[0], |
931 | red_bytes[1], |
932 | green_bytes[0], |
933 | green_bytes[1], |
934 | blue_bytes[0], |
935 | blue_bytes[1], |
936 | alpha_bytes[0], |
937 | alpha_bytes[1], |
938 | ] |
939 | } |
940 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
941 | bytes.reserve(12); |
942 | self.pixel.serialize_into(bytes); |
943 | self.red.serialize_into(bytes); |
944 | self.green.serialize_into(bytes); |
945 | self.blue.serialize_into(bytes); |
946 | self.alpha.serialize_into(bytes); |
947 | } |
948 | } |
949 | |
950 | #[derive (Clone, Copy, Default)] |
951 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
952 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
953 | pub struct Color { |
954 | pub red: u16, |
955 | pub green: u16, |
956 | pub blue: u16, |
957 | pub alpha: u16, |
958 | } |
959 | impl_debug_if_no_extra_traits!(Color, "Color" ); |
960 | impl TryParse for Color { |
961 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
962 | let (red: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
963 | let (green: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
964 | let (blue: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
965 | let (alpha: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
966 | let result: Color = Color { red, green, blue, alpha }; |
967 | Ok((result, remaining)) |
968 | } |
969 | } |
970 | impl Serialize for Color { |
971 | type Bytes = [u8; 8]; |
972 | fn serialize(&self) -> [u8; 8] { |
973 | let red_bytes = self.red.serialize(); |
974 | let green_bytes = self.green.serialize(); |
975 | let blue_bytes = self.blue.serialize(); |
976 | let alpha_bytes = self.alpha.serialize(); |
977 | [ |
978 | red_bytes[0], |
979 | red_bytes[1], |
980 | green_bytes[0], |
981 | green_bytes[1], |
982 | blue_bytes[0], |
983 | blue_bytes[1], |
984 | alpha_bytes[0], |
985 | alpha_bytes[1], |
986 | ] |
987 | } |
988 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
989 | bytes.reserve(8); |
990 | self.red.serialize_into(bytes); |
991 | self.green.serialize_into(bytes); |
992 | self.blue.serialize_into(bytes); |
993 | self.alpha.serialize_into(bytes); |
994 | } |
995 | } |
996 | |
997 | #[derive (Clone, Copy, Default)] |
998 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
999 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1000 | pub struct Pointfix { |
1001 | pub x: Fixed, |
1002 | pub y: Fixed, |
1003 | } |
1004 | impl_debug_if_no_extra_traits!(Pointfix, "Pointfix" ); |
1005 | impl TryParse for Pointfix { |
1006 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
1007 | let (x: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
1008 | let (y: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
1009 | let result: Pointfix = Pointfix { x, y }; |
1010 | Ok((result, remaining)) |
1011 | } |
1012 | } |
1013 | impl Serialize for Pointfix { |
1014 | type Bytes = [u8; 8]; |
1015 | fn serialize(&self) -> [u8; 8] { |
1016 | let x_bytes: [u8; 4] = self.x.serialize(); |
1017 | let y_bytes: [u8; 4] = self.y.serialize(); |
1018 | [ |
1019 | x_bytes[0], |
1020 | x_bytes[1], |
1021 | x_bytes[2], |
1022 | x_bytes[3], |
1023 | y_bytes[0], |
1024 | y_bytes[1], |
1025 | y_bytes[2], |
1026 | y_bytes[3], |
1027 | ] |
1028 | } |
1029 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
1030 | bytes.reserve(additional:8); |
1031 | self.x.serialize_into(bytes); |
1032 | self.y.serialize_into(bytes); |
1033 | } |
1034 | } |
1035 | |
1036 | #[derive (Clone, Copy, Default)] |
1037 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1038 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1039 | pub struct Linefix { |
1040 | pub p1: Pointfix, |
1041 | pub p2: Pointfix, |
1042 | } |
1043 | impl_debug_if_no_extra_traits!(Linefix, "Linefix" ); |
1044 | impl TryParse for Linefix { |
1045 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
1046 | let (p1: Pointfix, remaining: &[u8]) = Pointfix::try_parse(remaining)?; |
1047 | let (p2: Pointfix, remaining: &[u8]) = Pointfix::try_parse(remaining)?; |
1048 | let result: Linefix = Linefix { p1, p2 }; |
1049 | Ok((result, remaining)) |
1050 | } |
1051 | } |
1052 | impl Serialize for Linefix { |
1053 | type Bytes = [u8; 16]; |
1054 | fn serialize(&self) -> [u8; 16] { |
1055 | let p1_bytes = self.p1.serialize(); |
1056 | let p2_bytes = self.p2.serialize(); |
1057 | [ |
1058 | p1_bytes[0], |
1059 | p1_bytes[1], |
1060 | p1_bytes[2], |
1061 | p1_bytes[3], |
1062 | p1_bytes[4], |
1063 | p1_bytes[5], |
1064 | p1_bytes[6], |
1065 | p1_bytes[7], |
1066 | p2_bytes[0], |
1067 | p2_bytes[1], |
1068 | p2_bytes[2], |
1069 | p2_bytes[3], |
1070 | p2_bytes[4], |
1071 | p2_bytes[5], |
1072 | p2_bytes[6], |
1073 | p2_bytes[7], |
1074 | ] |
1075 | } |
1076 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
1077 | bytes.reserve(16); |
1078 | self.p1.serialize_into(bytes); |
1079 | self.p2.serialize_into(bytes); |
1080 | } |
1081 | } |
1082 | |
1083 | #[derive (Clone, Copy, Default)] |
1084 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1085 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1086 | pub struct Triangle { |
1087 | pub p1: Pointfix, |
1088 | pub p2: Pointfix, |
1089 | pub p3: Pointfix, |
1090 | } |
1091 | impl_debug_if_no_extra_traits!(Triangle, "Triangle" ); |
1092 | impl TryParse for Triangle { |
1093 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
1094 | let (p1: Pointfix, remaining: &[u8]) = Pointfix::try_parse(remaining)?; |
1095 | let (p2: Pointfix, remaining: &[u8]) = Pointfix::try_parse(remaining)?; |
1096 | let (p3: Pointfix, remaining: &[u8]) = Pointfix::try_parse(remaining)?; |
1097 | let result: Triangle = Triangle { p1, p2, p3 }; |
1098 | Ok((result, remaining)) |
1099 | } |
1100 | } |
1101 | impl Serialize for Triangle { |
1102 | type Bytes = [u8; 24]; |
1103 | fn serialize(&self) -> [u8; 24] { |
1104 | let p1_bytes = self.p1.serialize(); |
1105 | let p2_bytes = self.p2.serialize(); |
1106 | let p3_bytes = self.p3.serialize(); |
1107 | [ |
1108 | p1_bytes[0], |
1109 | p1_bytes[1], |
1110 | p1_bytes[2], |
1111 | p1_bytes[3], |
1112 | p1_bytes[4], |
1113 | p1_bytes[5], |
1114 | p1_bytes[6], |
1115 | p1_bytes[7], |
1116 | p2_bytes[0], |
1117 | p2_bytes[1], |
1118 | p2_bytes[2], |
1119 | p2_bytes[3], |
1120 | p2_bytes[4], |
1121 | p2_bytes[5], |
1122 | p2_bytes[6], |
1123 | p2_bytes[7], |
1124 | p3_bytes[0], |
1125 | p3_bytes[1], |
1126 | p3_bytes[2], |
1127 | p3_bytes[3], |
1128 | p3_bytes[4], |
1129 | p3_bytes[5], |
1130 | p3_bytes[6], |
1131 | p3_bytes[7], |
1132 | ] |
1133 | } |
1134 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
1135 | bytes.reserve(24); |
1136 | self.p1.serialize_into(bytes); |
1137 | self.p2.serialize_into(bytes); |
1138 | self.p3.serialize_into(bytes); |
1139 | } |
1140 | } |
1141 | |
1142 | #[derive (Clone, Copy, Default)] |
1143 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1144 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1145 | pub struct Trapezoid { |
1146 | pub top: Fixed, |
1147 | pub bottom: Fixed, |
1148 | pub left: Linefix, |
1149 | pub right: Linefix, |
1150 | } |
1151 | impl_debug_if_no_extra_traits!(Trapezoid, "Trapezoid" ); |
1152 | impl TryParse for Trapezoid { |
1153 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
1154 | let (top: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
1155 | let (bottom: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
1156 | let (left: Linefix, remaining: &[u8]) = Linefix::try_parse(remaining)?; |
1157 | let (right: Linefix, remaining: &[u8]) = Linefix::try_parse(remaining)?; |
1158 | let result: Trapezoid = Trapezoid { top, bottom, left, right }; |
1159 | Ok((result, remaining)) |
1160 | } |
1161 | } |
1162 | impl Serialize for Trapezoid { |
1163 | type Bytes = [u8; 40]; |
1164 | fn serialize(&self) -> [u8; 40] { |
1165 | let top_bytes = self.top.serialize(); |
1166 | let bottom_bytes = self.bottom.serialize(); |
1167 | let left_bytes = self.left.serialize(); |
1168 | let right_bytes = self.right.serialize(); |
1169 | [ |
1170 | top_bytes[0], |
1171 | top_bytes[1], |
1172 | top_bytes[2], |
1173 | top_bytes[3], |
1174 | bottom_bytes[0], |
1175 | bottom_bytes[1], |
1176 | bottom_bytes[2], |
1177 | bottom_bytes[3], |
1178 | left_bytes[0], |
1179 | left_bytes[1], |
1180 | left_bytes[2], |
1181 | left_bytes[3], |
1182 | left_bytes[4], |
1183 | left_bytes[5], |
1184 | left_bytes[6], |
1185 | left_bytes[7], |
1186 | left_bytes[8], |
1187 | left_bytes[9], |
1188 | left_bytes[10], |
1189 | left_bytes[11], |
1190 | left_bytes[12], |
1191 | left_bytes[13], |
1192 | left_bytes[14], |
1193 | left_bytes[15], |
1194 | right_bytes[0], |
1195 | right_bytes[1], |
1196 | right_bytes[2], |
1197 | right_bytes[3], |
1198 | right_bytes[4], |
1199 | right_bytes[5], |
1200 | right_bytes[6], |
1201 | right_bytes[7], |
1202 | right_bytes[8], |
1203 | right_bytes[9], |
1204 | right_bytes[10], |
1205 | right_bytes[11], |
1206 | right_bytes[12], |
1207 | right_bytes[13], |
1208 | right_bytes[14], |
1209 | right_bytes[15], |
1210 | ] |
1211 | } |
1212 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
1213 | bytes.reserve(40); |
1214 | self.top.serialize_into(bytes); |
1215 | self.bottom.serialize_into(bytes); |
1216 | self.left.serialize_into(bytes); |
1217 | self.right.serialize_into(bytes); |
1218 | } |
1219 | } |
1220 | |
1221 | #[derive (Clone, Copy, Default)] |
1222 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1223 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1224 | pub struct Glyphinfo { |
1225 | pub width: u16, |
1226 | pub height: u16, |
1227 | pub x: i16, |
1228 | pub y: i16, |
1229 | pub x_off: i16, |
1230 | pub y_off: i16, |
1231 | } |
1232 | impl_debug_if_no_extra_traits!(Glyphinfo, "Glyphinfo" ); |
1233 | impl TryParse for Glyphinfo { |
1234 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
1235 | let (width: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1236 | let (height: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1237 | let (x: i16, remaining: &[u8]) = i16::try_parse(remaining)?; |
1238 | let (y: i16, remaining: &[u8]) = i16::try_parse(remaining)?; |
1239 | let (x_off: i16, remaining: &[u8]) = i16::try_parse(remaining)?; |
1240 | let (y_off: i16, remaining: &[u8]) = i16::try_parse(remaining)?; |
1241 | let result: Glyphinfo = Glyphinfo { width, height, x, y, x_off, y_off }; |
1242 | Ok((result, remaining)) |
1243 | } |
1244 | } |
1245 | impl Serialize for Glyphinfo { |
1246 | type Bytes = [u8; 12]; |
1247 | fn serialize(&self) -> [u8; 12] { |
1248 | let width_bytes = self.width.serialize(); |
1249 | let height_bytes = self.height.serialize(); |
1250 | let x_bytes = self.x.serialize(); |
1251 | let y_bytes = self.y.serialize(); |
1252 | let x_off_bytes = self.x_off.serialize(); |
1253 | let y_off_bytes = self.y_off.serialize(); |
1254 | [ |
1255 | width_bytes[0], |
1256 | width_bytes[1], |
1257 | height_bytes[0], |
1258 | height_bytes[1], |
1259 | x_bytes[0], |
1260 | x_bytes[1], |
1261 | y_bytes[0], |
1262 | y_bytes[1], |
1263 | x_off_bytes[0], |
1264 | x_off_bytes[1], |
1265 | y_off_bytes[0], |
1266 | y_off_bytes[1], |
1267 | ] |
1268 | } |
1269 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
1270 | bytes.reserve(12); |
1271 | self.width.serialize_into(bytes); |
1272 | self.height.serialize_into(bytes); |
1273 | self.x.serialize_into(bytes); |
1274 | self.y.serialize_into(bytes); |
1275 | self.x_off.serialize_into(bytes); |
1276 | self.y_off.serialize_into(bytes); |
1277 | } |
1278 | } |
1279 | |
1280 | /// Opcode for the QueryVersion request |
1281 | pub const QUERY_VERSION_REQUEST: u8 = 0; |
1282 | #[derive (Clone, Copy, Default)] |
1283 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1284 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1285 | pub struct QueryVersionRequest { |
1286 | pub client_major_version: u32, |
1287 | pub client_minor_version: u32, |
1288 | } |
1289 | impl_debug_if_no_extra_traits!(QueryVersionRequest, "QueryVersionRequest" ); |
1290 | impl QueryVersionRequest { |
1291 | /// Serialize this request into bytes for the provided connection |
1292 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
1293 | let length_so_far = 0; |
1294 | let client_major_version_bytes = self.client_major_version.serialize(); |
1295 | let client_minor_version_bytes = self.client_minor_version.serialize(); |
1296 | let mut request0 = vec![ |
1297 | major_opcode, |
1298 | QUERY_VERSION_REQUEST, |
1299 | 0, |
1300 | 0, |
1301 | client_major_version_bytes[0], |
1302 | client_major_version_bytes[1], |
1303 | client_major_version_bytes[2], |
1304 | client_major_version_bytes[3], |
1305 | client_minor_version_bytes[0], |
1306 | client_minor_version_bytes[1], |
1307 | client_minor_version_bytes[2], |
1308 | client_minor_version_bytes[3], |
1309 | ]; |
1310 | let length_so_far = length_so_far + request0.len(); |
1311 | assert_eq!(length_so_far % 4, 0); |
1312 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
1313 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
1314 | ([request0.into()], vec![]) |
1315 | } |
1316 | /// Parse this request given its header, its body, and any fds that go along with it |
1317 | #[cfg (feature = "request-parsing" )] |
1318 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
1319 | if header.minor_opcode != QUERY_VERSION_REQUEST { |
1320 | return Err(ParseError::InvalidValue); |
1321 | } |
1322 | let (client_major_version, remaining) = u32::try_parse(value)?; |
1323 | let (client_minor_version, remaining) = u32::try_parse(remaining)?; |
1324 | let _ = remaining; |
1325 | Ok(QueryVersionRequest { |
1326 | client_major_version, |
1327 | client_minor_version, |
1328 | }) |
1329 | } |
1330 | } |
1331 | impl Request for QueryVersionRequest { |
1332 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
1333 | |
1334 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
1335 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
1336 | // Flatten the buffers into a single vector |
1337 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
1338 | (buf, fds) |
1339 | } |
1340 | } |
1341 | impl crate::x11_utils::ReplyRequest for QueryVersionRequest { |
1342 | type Reply = QueryVersionReply; |
1343 | } |
1344 | |
1345 | #[derive (Clone, Copy, Default)] |
1346 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1347 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1348 | pub struct QueryVersionReply { |
1349 | pub sequence: u16, |
1350 | pub length: u32, |
1351 | pub major_version: u32, |
1352 | pub minor_version: u32, |
1353 | } |
1354 | impl_debug_if_no_extra_traits!(QueryVersionReply, "QueryVersionReply" ); |
1355 | impl TryParse for QueryVersionReply { |
1356 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
1357 | let remaining: &[u8] = initial_value; |
1358 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
1359 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
1360 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1361 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
1362 | let (major_version: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
1363 | let (minor_version: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
1364 | let remaining: &[u8] = remaining.get(16..).ok_or(err:ParseError::InsufficientData)?; |
1365 | if response_type != 1 { |
1366 | return Err(ParseError::InvalidValue); |
1367 | } |
1368 | let result: QueryVersionReply = QueryVersionReply { sequence, length, major_version, minor_version }; |
1369 | let _ = remaining; |
1370 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
1371 | .ok_or(err:ParseError::InsufficientData)?; |
1372 | Ok((result, remaining)) |
1373 | } |
1374 | } |
1375 | impl Serialize for QueryVersionReply { |
1376 | type Bytes = [u8; 32]; |
1377 | fn serialize(&self) -> [u8; 32] { |
1378 | let response_type_bytes = &[1]; |
1379 | let sequence_bytes = self.sequence.serialize(); |
1380 | let length_bytes = self.length.serialize(); |
1381 | let major_version_bytes = self.major_version.serialize(); |
1382 | let minor_version_bytes = self.minor_version.serialize(); |
1383 | [ |
1384 | response_type_bytes[0], |
1385 | 0, |
1386 | sequence_bytes[0], |
1387 | sequence_bytes[1], |
1388 | length_bytes[0], |
1389 | length_bytes[1], |
1390 | length_bytes[2], |
1391 | length_bytes[3], |
1392 | major_version_bytes[0], |
1393 | major_version_bytes[1], |
1394 | major_version_bytes[2], |
1395 | major_version_bytes[3], |
1396 | minor_version_bytes[0], |
1397 | minor_version_bytes[1], |
1398 | minor_version_bytes[2], |
1399 | minor_version_bytes[3], |
1400 | 0, |
1401 | 0, |
1402 | 0, |
1403 | 0, |
1404 | 0, |
1405 | 0, |
1406 | 0, |
1407 | 0, |
1408 | 0, |
1409 | 0, |
1410 | 0, |
1411 | 0, |
1412 | 0, |
1413 | 0, |
1414 | 0, |
1415 | 0, |
1416 | ] |
1417 | } |
1418 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
1419 | bytes.reserve(32); |
1420 | let response_type_bytes = &[1]; |
1421 | bytes.push(response_type_bytes[0]); |
1422 | bytes.extend_from_slice(&[0; 1]); |
1423 | self.sequence.serialize_into(bytes); |
1424 | self.length.serialize_into(bytes); |
1425 | self.major_version.serialize_into(bytes); |
1426 | self.minor_version.serialize_into(bytes); |
1427 | bytes.extend_from_slice(&[0; 16]); |
1428 | } |
1429 | } |
1430 | |
1431 | /// Opcode for the QueryPictFormats request |
1432 | pub const QUERY_PICT_FORMATS_REQUEST: u8 = 1; |
1433 | #[derive (Clone, Copy, Default)] |
1434 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1435 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1436 | pub struct QueryPictFormatsRequest; |
1437 | impl_debug_if_no_extra_traits!(QueryPictFormatsRequest, "QueryPictFormatsRequest" ); |
1438 | impl QueryPictFormatsRequest { |
1439 | /// Serialize this request into bytes for the provided connection |
1440 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
1441 | let length_so_far = 0; |
1442 | let mut request0 = vec![ |
1443 | major_opcode, |
1444 | QUERY_PICT_FORMATS_REQUEST, |
1445 | 0, |
1446 | 0, |
1447 | ]; |
1448 | let length_so_far = length_so_far + request0.len(); |
1449 | assert_eq!(length_so_far % 4, 0); |
1450 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
1451 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
1452 | ([request0.into()], vec![]) |
1453 | } |
1454 | /// Parse this request given its header, its body, and any fds that go along with it |
1455 | #[cfg (feature = "request-parsing" )] |
1456 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
1457 | if header.minor_opcode != QUERY_PICT_FORMATS_REQUEST { |
1458 | return Err(ParseError::InvalidValue); |
1459 | } |
1460 | let _ = value; |
1461 | Ok(QueryPictFormatsRequest |
1462 | ) |
1463 | } |
1464 | } |
1465 | impl Request for QueryPictFormatsRequest { |
1466 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
1467 | |
1468 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
1469 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
1470 | // Flatten the buffers into a single vector |
1471 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
1472 | (buf, fds) |
1473 | } |
1474 | } |
1475 | impl crate::x11_utils::ReplyRequest for QueryPictFormatsRequest { |
1476 | type Reply = QueryPictFormatsReply; |
1477 | } |
1478 | |
1479 | #[derive (Clone, Default)] |
1480 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1481 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1482 | pub struct QueryPictFormatsReply { |
1483 | pub sequence: u16, |
1484 | pub length: u32, |
1485 | pub num_depths: u32, |
1486 | pub num_visuals: u32, |
1487 | pub formats: Vec<Pictforminfo>, |
1488 | pub screens: Vec<Pictscreen>, |
1489 | pub subpixels: Vec<SubPixel>, |
1490 | } |
1491 | impl_debug_if_no_extra_traits!(QueryPictFormatsReply, "QueryPictFormatsReply" ); |
1492 | impl TryParse for QueryPictFormatsReply { |
1493 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
1494 | let remaining = initial_value; |
1495 | let (response_type, remaining) = u8::try_parse(remaining)?; |
1496 | let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?; |
1497 | let (sequence, remaining) = u16::try_parse(remaining)?; |
1498 | let (length, remaining) = u32::try_parse(remaining)?; |
1499 | let (num_formats, remaining) = u32::try_parse(remaining)?; |
1500 | let (num_screens, remaining) = u32::try_parse(remaining)?; |
1501 | let (num_depths, remaining) = u32::try_parse(remaining)?; |
1502 | let (num_visuals, remaining) = u32::try_parse(remaining)?; |
1503 | let (num_subpixel, remaining) = u32::try_parse(remaining)?; |
1504 | let remaining = remaining.get(4..).ok_or(ParseError::InsufficientData)?; |
1505 | let (formats, remaining) = crate::x11_utils::parse_list::<Pictforminfo>(remaining, num_formats.try_to_usize()?)?; |
1506 | let (screens, remaining) = crate::x11_utils::parse_list::<Pictscreen>(remaining, num_screens.try_to_usize()?)?; |
1507 | let mut remaining = remaining; |
1508 | let list_length = num_subpixel.try_to_usize()?; |
1509 | let mut subpixels = Vec::with_capacity(list_length); |
1510 | for _ in 0..list_length { |
1511 | let (v, new_remaining) = u32::try_parse(remaining)?; |
1512 | let v = v.into(); |
1513 | remaining = new_remaining; |
1514 | subpixels.push(v); |
1515 | } |
1516 | if response_type != 1 { |
1517 | return Err(ParseError::InvalidValue); |
1518 | } |
1519 | let result = QueryPictFormatsReply { sequence, length, num_depths, num_visuals, formats, screens, subpixels }; |
1520 | let _ = remaining; |
1521 | let remaining = initial_value.get(32 + length as usize * 4..) |
1522 | .ok_or(ParseError::InsufficientData)?; |
1523 | Ok((result, remaining)) |
1524 | } |
1525 | } |
1526 | impl Serialize for QueryPictFormatsReply { |
1527 | type Bytes = Vec<u8>; |
1528 | fn serialize(&self) -> Vec<u8> { |
1529 | let mut result = Vec::new(); |
1530 | self.serialize_into(&mut result); |
1531 | result |
1532 | } |
1533 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
1534 | bytes.reserve(32); |
1535 | let response_type_bytes = &[1]; |
1536 | bytes.push(response_type_bytes[0]); |
1537 | bytes.extend_from_slice(&[0; 1]); |
1538 | self.sequence.serialize_into(bytes); |
1539 | self.length.serialize_into(bytes); |
1540 | let num_formats = u32::try_from(self.formats.len()).expect("`formats` has too many elements" ); |
1541 | num_formats.serialize_into(bytes); |
1542 | let num_screens = u32::try_from(self.screens.len()).expect("`screens` has too many elements" ); |
1543 | num_screens.serialize_into(bytes); |
1544 | self.num_depths.serialize_into(bytes); |
1545 | self.num_visuals.serialize_into(bytes); |
1546 | let num_subpixel = u32::try_from(self.subpixels.len()).expect("`subpixels` has too many elements" ); |
1547 | num_subpixel.serialize_into(bytes); |
1548 | bytes.extend_from_slice(&[0; 4]); |
1549 | self.formats.serialize_into(bytes); |
1550 | self.screens.serialize_into(bytes); |
1551 | for element in self.subpixels.iter().copied() { |
1552 | u32::from(element).serialize_into(bytes); |
1553 | } |
1554 | } |
1555 | } |
1556 | impl QueryPictFormatsReply { |
1557 | /// Get the value of the `num_formats` field. |
1558 | /// |
1559 | /// The `num_formats` field is used as the length field of the `formats` field. |
1560 | /// This function computes the field's value again based on the length of the list. |
1561 | /// |
1562 | /// # Panics |
1563 | /// |
1564 | /// Panics if the value cannot be represented in the target type. This |
1565 | /// cannot happen with values of the struct received from the X11 server. |
1566 | pub fn num_formats(&self) -> u32 { |
1567 | self.formats.len() |
1568 | .try_into().unwrap() |
1569 | } |
1570 | /// Get the value of the `num_screens` field. |
1571 | /// |
1572 | /// The `num_screens` field is used as the length field of the `screens` field. |
1573 | /// This function computes the field's value again based on the length of the list. |
1574 | /// |
1575 | /// # Panics |
1576 | /// |
1577 | /// Panics if the value cannot be represented in the target type. This |
1578 | /// cannot happen with values of the struct received from the X11 server. |
1579 | pub fn num_screens(&self) -> u32 { |
1580 | self.screens.len() |
1581 | .try_into().unwrap() |
1582 | } |
1583 | /// Get the value of the `num_subpixel` field. |
1584 | /// |
1585 | /// The `num_subpixel` field is used as the length field of the `subpixels` field. |
1586 | /// This function computes the field's value again based on the length of the list. |
1587 | /// |
1588 | /// # Panics |
1589 | /// |
1590 | /// Panics if the value cannot be represented in the target type. This |
1591 | /// cannot happen with values of the struct received from the X11 server. |
1592 | pub fn num_subpixel(&self) -> u32 { |
1593 | self.subpixels.len() |
1594 | .try_into().unwrap() |
1595 | } |
1596 | } |
1597 | |
1598 | /// Opcode for the QueryPictIndexValues request |
1599 | pub const QUERY_PICT_INDEX_VALUES_REQUEST: u8 = 2; |
1600 | #[derive (Clone, Copy, Default)] |
1601 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1602 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1603 | pub struct QueryPictIndexValuesRequest { |
1604 | pub format: Pictformat, |
1605 | } |
1606 | impl_debug_if_no_extra_traits!(QueryPictIndexValuesRequest, "QueryPictIndexValuesRequest" ); |
1607 | impl QueryPictIndexValuesRequest { |
1608 | /// Serialize this request into bytes for the provided connection |
1609 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
1610 | let length_so_far = 0; |
1611 | let format_bytes = self.format.serialize(); |
1612 | let mut request0 = vec![ |
1613 | major_opcode, |
1614 | QUERY_PICT_INDEX_VALUES_REQUEST, |
1615 | 0, |
1616 | 0, |
1617 | format_bytes[0], |
1618 | format_bytes[1], |
1619 | format_bytes[2], |
1620 | format_bytes[3], |
1621 | ]; |
1622 | let length_so_far = length_so_far + request0.len(); |
1623 | assert_eq!(length_so_far % 4, 0); |
1624 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
1625 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
1626 | ([request0.into()], vec![]) |
1627 | } |
1628 | /// Parse this request given its header, its body, and any fds that go along with it |
1629 | #[cfg (feature = "request-parsing" )] |
1630 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
1631 | if header.minor_opcode != QUERY_PICT_INDEX_VALUES_REQUEST { |
1632 | return Err(ParseError::InvalidValue); |
1633 | } |
1634 | let (format, remaining) = Pictformat::try_parse(value)?; |
1635 | let _ = remaining; |
1636 | Ok(QueryPictIndexValuesRequest { |
1637 | format, |
1638 | }) |
1639 | } |
1640 | } |
1641 | impl Request for QueryPictIndexValuesRequest { |
1642 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
1643 | |
1644 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
1645 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
1646 | // Flatten the buffers into a single vector |
1647 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
1648 | (buf, fds) |
1649 | } |
1650 | } |
1651 | impl crate::x11_utils::ReplyRequest for QueryPictIndexValuesRequest { |
1652 | type Reply = QueryPictIndexValuesReply; |
1653 | } |
1654 | |
1655 | #[derive (Clone, Default)] |
1656 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1657 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1658 | pub struct QueryPictIndexValuesReply { |
1659 | pub sequence: u16, |
1660 | pub length: u32, |
1661 | pub values: Vec<Indexvalue>, |
1662 | } |
1663 | impl_debug_if_no_extra_traits!(QueryPictIndexValuesReply, "QueryPictIndexValuesReply" ); |
1664 | impl TryParse for QueryPictIndexValuesReply { |
1665 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
1666 | let remaining: &[u8] = initial_value; |
1667 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
1668 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
1669 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
1670 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
1671 | let (num_values: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
1672 | let remaining: &[u8] = remaining.get(20..).ok_or(err:ParseError::InsufficientData)?; |
1673 | let (values: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<Indexvalue>(data:remaining, list_length:num_values.try_to_usize()?)?; |
1674 | if response_type != 1 { |
1675 | return Err(ParseError::InvalidValue); |
1676 | } |
1677 | let result: QueryPictIndexValuesReply = QueryPictIndexValuesReply { sequence, length, values }; |
1678 | let _ = remaining; |
1679 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
1680 | .ok_or(err:ParseError::InsufficientData)?; |
1681 | Ok((result, remaining)) |
1682 | } |
1683 | } |
1684 | impl Serialize for QueryPictIndexValuesReply { |
1685 | type Bytes = Vec<u8>; |
1686 | fn serialize(&self) -> Vec<u8> { |
1687 | let mut result: Vec = Vec::new(); |
1688 | self.serialize_into(&mut result); |
1689 | result |
1690 | } |
1691 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
1692 | bytes.reserve(additional:32); |
1693 | let response_type_bytes: &[u8; 1] = &[1]; |
1694 | bytes.push(response_type_bytes[0]); |
1695 | bytes.extend_from_slice(&[0; 1]); |
1696 | self.sequence.serialize_into(bytes); |
1697 | self.length.serialize_into(bytes); |
1698 | let num_values: u32 = u32::try_from(self.values.len()).expect(msg:"`values` has too many elements" ); |
1699 | num_values.serialize_into(bytes); |
1700 | bytes.extend_from_slice(&[0; 20]); |
1701 | self.values.serialize_into(bytes); |
1702 | } |
1703 | } |
1704 | impl QueryPictIndexValuesReply { |
1705 | /// Get the value of the `num_values` field. |
1706 | /// |
1707 | /// The `num_values` field is used as the length field of the `values` field. |
1708 | /// This function computes the field's value again based on the length of the list. |
1709 | /// |
1710 | /// # Panics |
1711 | /// |
1712 | /// Panics if the value cannot be represented in the target type. This |
1713 | /// cannot happen with values of the struct received from the X11 server. |
1714 | pub fn num_values(&self) -> u32 { |
1715 | self.values.len() |
1716 | .try_into().unwrap() |
1717 | } |
1718 | } |
1719 | |
1720 | /// Auxiliary and optional information for the `create_picture` function |
1721 | #[derive (Clone, Copy, Default)] |
1722 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
1723 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
1724 | pub struct CreatePictureAux { |
1725 | pub repeat: Option<Repeat>, |
1726 | pub alphamap: Option<Picture>, |
1727 | pub alphaxorigin: Option<i32>, |
1728 | pub alphayorigin: Option<i32>, |
1729 | pub clipxorigin: Option<i32>, |
1730 | pub clipyorigin: Option<i32>, |
1731 | pub clipmask: Option<xproto::Pixmap>, |
1732 | pub graphicsexposure: Option<u32>, |
1733 | pub subwindowmode: Option<xproto::SubwindowMode>, |
1734 | pub polyedge: Option<PolyEdge>, |
1735 | pub polymode: Option<PolyMode>, |
1736 | pub dither: Option<xproto::Atom>, |
1737 | pub componentalpha: Option<u32>, |
1738 | } |
1739 | impl_debug_if_no_extra_traits!(CreatePictureAux, "CreatePictureAux" ); |
1740 | impl CreatePictureAux { |
1741 | #[cfg_attr (not(feature = "request-parsing" ), allow(dead_code))] |
1742 | fn try_parse(value: &[u8], value_mask: u32) -> Result<(Self, &[u8]), ParseError> { |
1743 | let switch_expr = u32::from(value_mask); |
1744 | let mut outer_remaining = value; |
1745 | let repeat = if switch_expr & u32::from(CP::REPEAT) != 0 { |
1746 | let remaining = outer_remaining; |
1747 | let (repeat, remaining) = u32::try_parse(remaining)?; |
1748 | let repeat = repeat.into(); |
1749 | outer_remaining = remaining; |
1750 | Some(repeat) |
1751 | } else { |
1752 | None |
1753 | }; |
1754 | let alphamap = if switch_expr & u32::from(CP::ALPHA_MAP) != 0 { |
1755 | let remaining = outer_remaining; |
1756 | let (alphamap, remaining) = Picture::try_parse(remaining)?; |
1757 | outer_remaining = remaining; |
1758 | Some(alphamap) |
1759 | } else { |
1760 | None |
1761 | }; |
1762 | let alphaxorigin = if switch_expr & u32::from(CP::ALPHA_X_ORIGIN) != 0 { |
1763 | let remaining = outer_remaining; |
1764 | let (alphaxorigin, remaining) = i32::try_parse(remaining)?; |
1765 | outer_remaining = remaining; |
1766 | Some(alphaxorigin) |
1767 | } else { |
1768 | None |
1769 | }; |
1770 | let alphayorigin = if switch_expr & u32::from(CP::ALPHA_Y_ORIGIN) != 0 { |
1771 | let remaining = outer_remaining; |
1772 | let (alphayorigin, remaining) = i32::try_parse(remaining)?; |
1773 | outer_remaining = remaining; |
1774 | Some(alphayorigin) |
1775 | } else { |
1776 | None |
1777 | }; |
1778 | let clipxorigin = if switch_expr & u32::from(CP::CLIP_X_ORIGIN) != 0 { |
1779 | let remaining = outer_remaining; |
1780 | let (clipxorigin, remaining) = i32::try_parse(remaining)?; |
1781 | outer_remaining = remaining; |
1782 | Some(clipxorigin) |
1783 | } else { |
1784 | None |
1785 | }; |
1786 | let clipyorigin = if switch_expr & u32::from(CP::CLIP_Y_ORIGIN) != 0 { |
1787 | let remaining = outer_remaining; |
1788 | let (clipyorigin, remaining) = i32::try_parse(remaining)?; |
1789 | outer_remaining = remaining; |
1790 | Some(clipyorigin) |
1791 | } else { |
1792 | None |
1793 | }; |
1794 | let clipmask = if switch_expr & u32::from(CP::CLIP_MASK) != 0 { |
1795 | let remaining = outer_remaining; |
1796 | let (clipmask, remaining) = xproto::Pixmap::try_parse(remaining)?; |
1797 | outer_remaining = remaining; |
1798 | Some(clipmask) |
1799 | } else { |
1800 | None |
1801 | }; |
1802 | let graphicsexposure = if switch_expr & u32::from(CP::GRAPHICS_EXPOSURE) != 0 { |
1803 | let remaining = outer_remaining; |
1804 | let (graphicsexposure, remaining) = u32::try_parse(remaining)?; |
1805 | outer_remaining = remaining; |
1806 | Some(graphicsexposure) |
1807 | } else { |
1808 | None |
1809 | }; |
1810 | let subwindowmode = if switch_expr & u32::from(CP::SUBWINDOW_MODE) != 0 { |
1811 | let remaining = outer_remaining; |
1812 | let (subwindowmode, remaining) = u32::try_parse(remaining)?; |
1813 | let subwindowmode = subwindowmode.into(); |
1814 | outer_remaining = remaining; |
1815 | Some(subwindowmode) |
1816 | } else { |
1817 | None |
1818 | }; |
1819 | let polyedge = if switch_expr & u32::from(CP::POLY_EDGE) != 0 { |
1820 | let remaining = outer_remaining; |
1821 | let (polyedge, remaining) = u32::try_parse(remaining)?; |
1822 | let polyedge = polyedge.into(); |
1823 | outer_remaining = remaining; |
1824 | Some(polyedge) |
1825 | } else { |
1826 | None |
1827 | }; |
1828 | let polymode = if switch_expr & u32::from(CP::POLY_MODE) != 0 { |
1829 | let remaining = outer_remaining; |
1830 | let (polymode, remaining) = u32::try_parse(remaining)?; |
1831 | let polymode = polymode.into(); |
1832 | outer_remaining = remaining; |
1833 | Some(polymode) |
1834 | } else { |
1835 | None |
1836 | }; |
1837 | let dither = if switch_expr & u32::from(CP::DITHER) != 0 { |
1838 | let remaining = outer_remaining; |
1839 | let (dither, remaining) = xproto::Atom::try_parse(remaining)?; |
1840 | outer_remaining = remaining; |
1841 | Some(dither) |
1842 | } else { |
1843 | None |
1844 | }; |
1845 | let componentalpha = if switch_expr & u32::from(CP::COMPONENT_ALPHA) != 0 { |
1846 | let remaining = outer_remaining; |
1847 | let (componentalpha, remaining) = u32::try_parse(remaining)?; |
1848 | outer_remaining = remaining; |
1849 | Some(componentalpha) |
1850 | } else { |
1851 | None |
1852 | }; |
1853 | let result = CreatePictureAux { repeat, alphamap, alphaxorigin, alphayorigin, clipxorigin, clipyorigin, clipmask, graphicsexposure, subwindowmode, polyedge, polymode, dither, componentalpha }; |
1854 | Ok((result, outer_remaining)) |
1855 | } |
1856 | } |
1857 | impl CreatePictureAux { |
1858 | #[allow (dead_code)] |
1859 | fn serialize(&self, value_mask: u32) -> Vec<u8> { |
1860 | let mut result = Vec::new(); |
1861 | self.serialize_into(&mut result, u32::from(value_mask)); |
1862 | result |
1863 | } |
1864 | fn serialize_into(&self, bytes: &mut Vec<u8>, value_mask: u32) { |
1865 | assert_eq!(self.switch_expr(), u32::from(value_mask), "switch `value_list` has an inconsistent discriminant" ); |
1866 | if let Some(repeat) = self.repeat { |
1867 | u32::from(repeat).serialize_into(bytes); |
1868 | } |
1869 | if let Some(alphamap) = self.alphamap { |
1870 | alphamap.serialize_into(bytes); |
1871 | } |
1872 | if let Some(alphaxorigin) = self.alphaxorigin { |
1873 | alphaxorigin.serialize_into(bytes); |
1874 | } |
1875 | if let Some(alphayorigin) = self.alphayorigin { |
1876 | alphayorigin.serialize_into(bytes); |
1877 | } |
1878 | if let Some(clipxorigin) = self.clipxorigin { |
1879 | clipxorigin.serialize_into(bytes); |
1880 | } |
1881 | if let Some(clipyorigin) = self.clipyorigin { |
1882 | clipyorigin.serialize_into(bytes); |
1883 | } |
1884 | if let Some(clipmask) = self.clipmask { |
1885 | clipmask.serialize_into(bytes); |
1886 | } |
1887 | if let Some(graphicsexposure) = self.graphicsexposure { |
1888 | graphicsexposure.serialize_into(bytes); |
1889 | } |
1890 | if let Some(subwindowmode) = self.subwindowmode { |
1891 | u32::from(subwindowmode).serialize_into(bytes); |
1892 | } |
1893 | if let Some(polyedge) = self.polyedge { |
1894 | u32::from(polyedge).serialize_into(bytes); |
1895 | } |
1896 | if let Some(polymode) = self.polymode { |
1897 | u32::from(polymode).serialize_into(bytes); |
1898 | } |
1899 | if let Some(dither) = self.dither { |
1900 | dither.serialize_into(bytes); |
1901 | } |
1902 | if let Some(componentalpha) = self.componentalpha { |
1903 | componentalpha.serialize_into(bytes); |
1904 | } |
1905 | } |
1906 | } |
1907 | impl CreatePictureAux { |
1908 | fn switch_expr(&self) -> u32 { |
1909 | let mut expr_value = 0; |
1910 | if self.repeat.is_some() { |
1911 | expr_value |= u32::from(CP::REPEAT); |
1912 | } |
1913 | if self.alphamap.is_some() { |
1914 | expr_value |= u32::from(CP::ALPHA_MAP); |
1915 | } |
1916 | if self.alphaxorigin.is_some() { |
1917 | expr_value |= u32::from(CP::ALPHA_X_ORIGIN); |
1918 | } |
1919 | if self.alphayorigin.is_some() { |
1920 | expr_value |= u32::from(CP::ALPHA_Y_ORIGIN); |
1921 | } |
1922 | if self.clipxorigin.is_some() { |
1923 | expr_value |= u32::from(CP::CLIP_X_ORIGIN); |
1924 | } |
1925 | if self.clipyorigin.is_some() { |
1926 | expr_value |= u32::from(CP::CLIP_Y_ORIGIN); |
1927 | } |
1928 | if self.clipmask.is_some() { |
1929 | expr_value |= u32::from(CP::CLIP_MASK); |
1930 | } |
1931 | if self.graphicsexposure.is_some() { |
1932 | expr_value |= u32::from(CP::GRAPHICS_EXPOSURE); |
1933 | } |
1934 | if self.subwindowmode.is_some() { |
1935 | expr_value |= u32::from(CP::SUBWINDOW_MODE); |
1936 | } |
1937 | if self.polyedge.is_some() { |
1938 | expr_value |= u32::from(CP::POLY_EDGE); |
1939 | } |
1940 | if self.polymode.is_some() { |
1941 | expr_value |= u32::from(CP::POLY_MODE); |
1942 | } |
1943 | if self.dither.is_some() { |
1944 | expr_value |= u32::from(CP::DITHER); |
1945 | } |
1946 | if self.componentalpha.is_some() { |
1947 | expr_value |= u32::from(CP::COMPONENT_ALPHA); |
1948 | } |
1949 | expr_value |
1950 | } |
1951 | } |
1952 | impl CreatePictureAux { |
1953 | /// Create a new instance with all fields unset / not present. |
1954 | pub fn new() -> Self { |
1955 | Default::default() |
1956 | } |
1957 | /// Set the `repeat` field of this structure. |
1958 | #[must_use ] |
1959 | pub fn repeat<I>(mut self, value: I) -> Self where I: Into<Option<Repeat>> { |
1960 | self.repeat = value.into(); |
1961 | self |
1962 | } |
1963 | /// Set the `alphamap` field of this structure. |
1964 | #[must_use ] |
1965 | pub fn alphamap<I>(mut self, value: I) -> Self where I: Into<Option<Picture>> { |
1966 | self.alphamap = value.into(); |
1967 | self |
1968 | } |
1969 | /// Set the `alphaxorigin` field of this structure. |
1970 | #[must_use ] |
1971 | pub fn alphaxorigin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> { |
1972 | self.alphaxorigin = value.into(); |
1973 | self |
1974 | } |
1975 | /// Set the `alphayorigin` field of this structure. |
1976 | #[must_use ] |
1977 | pub fn alphayorigin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> { |
1978 | self.alphayorigin = value.into(); |
1979 | self |
1980 | } |
1981 | /// Set the `clipxorigin` field of this structure. |
1982 | #[must_use ] |
1983 | pub fn clipxorigin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> { |
1984 | self.clipxorigin = value.into(); |
1985 | self |
1986 | } |
1987 | /// Set the `clipyorigin` field of this structure. |
1988 | #[must_use ] |
1989 | pub fn clipyorigin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> { |
1990 | self.clipyorigin = value.into(); |
1991 | self |
1992 | } |
1993 | /// Set the `clipmask` field of this structure. |
1994 | #[must_use ] |
1995 | pub fn clipmask<I>(mut self, value: I) -> Self where I: Into<Option<xproto::Pixmap>> { |
1996 | self.clipmask = value.into(); |
1997 | self |
1998 | } |
1999 | /// Set the `graphicsexposure` field of this structure. |
2000 | #[must_use ] |
2001 | pub fn graphicsexposure<I>(mut self, value: I) -> Self where I: Into<Option<u32>> { |
2002 | self.graphicsexposure = value.into(); |
2003 | self |
2004 | } |
2005 | /// Set the `subwindowmode` field of this structure. |
2006 | #[must_use ] |
2007 | pub fn subwindowmode<I>(mut self, value: I) -> Self where I: Into<Option<xproto::SubwindowMode>> { |
2008 | self.subwindowmode = value.into(); |
2009 | self |
2010 | } |
2011 | /// Set the `polyedge` field of this structure. |
2012 | #[must_use ] |
2013 | pub fn polyedge<I>(mut self, value: I) -> Self where I: Into<Option<PolyEdge>> { |
2014 | self.polyedge = value.into(); |
2015 | self |
2016 | } |
2017 | /// Set the `polymode` field of this structure. |
2018 | #[must_use ] |
2019 | pub fn polymode<I>(mut self, value: I) -> Self where I: Into<Option<PolyMode>> { |
2020 | self.polymode = value.into(); |
2021 | self |
2022 | } |
2023 | /// Set the `dither` field of this structure. |
2024 | #[must_use ] |
2025 | pub fn dither<I>(mut self, value: I) -> Self where I: Into<Option<xproto::Atom>> { |
2026 | self.dither = value.into(); |
2027 | self |
2028 | } |
2029 | /// Set the `componentalpha` field of this structure. |
2030 | #[must_use ] |
2031 | pub fn componentalpha<I>(mut self, value: I) -> Self where I: Into<Option<u32>> { |
2032 | self.componentalpha = value.into(); |
2033 | self |
2034 | } |
2035 | } |
2036 | |
2037 | /// Opcode for the CreatePicture request |
2038 | pub const CREATE_PICTURE_REQUEST: u8 = 4; |
2039 | #[derive (Clone, Default)] |
2040 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2041 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2042 | pub struct CreatePictureRequest<'input> { |
2043 | pub pid: Picture, |
2044 | pub drawable: xproto::Drawable, |
2045 | pub format: Pictformat, |
2046 | pub value_list: Cow<'input, CreatePictureAux>, |
2047 | } |
2048 | impl_debug_if_no_extra_traits!(CreatePictureRequest<'_>, "CreatePictureRequest" ); |
2049 | impl<'input> CreatePictureRequest<'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 pid_bytes = self.pid.serialize(); |
2054 | let drawable_bytes = self.drawable.serialize(); |
2055 | let format_bytes = self.format.serialize(); |
2056 | let value_mask: u32 = self.value_list.switch_expr(); |
2057 | let value_mask_bytes = value_mask.serialize(); |
2058 | let mut request0 = vec![ |
2059 | major_opcode, |
2060 | CREATE_PICTURE_REQUEST, |
2061 | 0, |
2062 | 0, |
2063 | pid_bytes[0], |
2064 | pid_bytes[1], |
2065 | pid_bytes[2], |
2066 | pid_bytes[3], |
2067 | drawable_bytes[0], |
2068 | drawable_bytes[1], |
2069 | drawable_bytes[2], |
2070 | drawable_bytes[3], |
2071 | format_bytes[0], |
2072 | format_bytes[1], |
2073 | format_bytes[2], |
2074 | format_bytes[3], |
2075 | value_mask_bytes[0], |
2076 | value_mask_bytes[1], |
2077 | value_mask_bytes[2], |
2078 | value_mask_bytes[3], |
2079 | ]; |
2080 | let length_so_far = length_so_far + request0.len(); |
2081 | let value_list_bytes = self.value_list.serialize(u32::from(value_mask)); |
2082 | let length_so_far = length_so_far + value_list_bytes.len(); |
2083 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
2084 | let length_so_far = length_so_far + padding0.len(); |
2085 | assert_eq!(length_so_far % 4, 0); |
2086 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2087 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2088 | ([request0.into(), value_list_bytes.into(), padding0.into()], vec![]) |
2089 | } |
2090 | /// Parse this request given its header, its body, and any fds that go along with it |
2091 | #[cfg (feature = "request-parsing" )] |
2092 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
2093 | if header.minor_opcode != CREATE_PICTURE_REQUEST { |
2094 | return Err(ParseError::InvalidValue); |
2095 | } |
2096 | let (pid, remaining) = Picture::try_parse(value)?; |
2097 | let (drawable, remaining) = xproto::Drawable::try_parse(remaining)?; |
2098 | let (format, remaining) = Pictformat::try_parse(remaining)?; |
2099 | let (value_mask, remaining) = u32::try_parse(remaining)?; |
2100 | let (value_list, remaining) = CreatePictureAux::try_parse(remaining, u32::from(value_mask))?; |
2101 | let _ = remaining; |
2102 | Ok(CreatePictureRequest { |
2103 | pid, |
2104 | drawable, |
2105 | format, |
2106 | value_list: Cow::Owned(value_list), |
2107 | }) |
2108 | } |
2109 | /// Clone all borrowed data in this CreatePictureRequest. |
2110 | pub fn into_owned(self) -> CreatePictureRequest<'static> { |
2111 | CreatePictureRequest { |
2112 | pid: self.pid, |
2113 | drawable: self.drawable, |
2114 | format: self.format, |
2115 | value_list: Cow::Owned(self.value_list.into_owned()), |
2116 | } |
2117 | } |
2118 | } |
2119 | impl<'input> Request for CreatePictureRequest<'input> { |
2120 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
2121 | |
2122 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
2123 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
2124 | // Flatten the buffers into a single vector |
2125 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
2126 | (buf, fds) |
2127 | } |
2128 | } |
2129 | impl<'input> crate::x11_utils::VoidRequest for CreatePictureRequest<'input> { |
2130 | } |
2131 | |
2132 | /// Auxiliary and optional information for the `change_picture` function |
2133 | #[derive (Clone, Copy, Default)] |
2134 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2135 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2136 | pub struct ChangePictureAux { |
2137 | pub repeat: Option<Repeat>, |
2138 | pub alphamap: Option<Picture>, |
2139 | pub alphaxorigin: Option<i32>, |
2140 | pub alphayorigin: Option<i32>, |
2141 | pub clipxorigin: Option<i32>, |
2142 | pub clipyorigin: Option<i32>, |
2143 | pub clipmask: Option<xproto::Pixmap>, |
2144 | pub graphicsexposure: Option<u32>, |
2145 | pub subwindowmode: Option<xproto::SubwindowMode>, |
2146 | pub polyedge: Option<PolyEdge>, |
2147 | pub polymode: Option<PolyMode>, |
2148 | pub dither: Option<xproto::Atom>, |
2149 | pub componentalpha: Option<u32>, |
2150 | } |
2151 | impl_debug_if_no_extra_traits!(ChangePictureAux, "ChangePictureAux" ); |
2152 | impl ChangePictureAux { |
2153 | #[cfg_attr (not(feature = "request-parsing" ), allow(dead_code))] |
2154 | fn try_parse(value: &[u8], value_mask: u32) -> Result<(Self, &[u8]), ParseError> { |
2155 | let switch_expr = u32::from(value_mask); |
2156 | let mut outer_remaining = value; |
2157 | let repeat = if switch_expr & u32::from(CP::REPEAT) != 0 { |
2158 | let remaining = outer_remaining; |
2159 | let (repeat, remaining) = u32::try_parse(remaining)?; |
2160 | let repeat = repeat.into(); |
2161 | outer_remaining = remaining; |
2162 | Some(repeat) |
2163 | } else { |
2164 | None |
2165 | }; |
2166 | let alphamap = if switch_expr & u32::from(CP::ALPHA_MAP) != 0 { |
2167 | let remaining = outer_remaining; |
2168 | let (alphamap, remaining) = Picture::try_parse(remaining)?; |
2169 | outer_remaining = remaining; |
2170 | Some(alphamap) |
2171 | } else { |
2172 | None |
2173 | }; |
2174 | let alphaxorigin = if switch_expr & u32::from(CP::ALPHA_X_ORIGIN) != 0 { |
2175 | let remaining = outer_remaining; |
2176 | let (alphaxorigin, remaining) = i32::try_parse(remaining)?; |
2177 | outer_remaining = remaining; |
2178 | Some(alphaxorigin) |
2179 | } else { |
2180 | None |
2181 | }; |
2182 | let alphayorigin = if switch_expr & u32::from(CP::ALPHA_Y_ORIGIN) != 0 { |
2183 | let remaining = outer_remaining; |
2184 | let (alphayorigin, remaining) = i32::try_parse(remaining)?; |
2185 | outer_remaining = remaining; |
2186 | Some(alphayorigin) |
2187 | } else { |
2188 | None |
2189 | }; |
2190 | let clipxorigin = if switch_expr & u32::from(CP::CLIP_X_ORIGIN) != 0 { |
2191 | let remaining = outer_remaining; |
2192 | let (clipxorigin, remaining) = i32::try_parse(remaining)?; |
2193 | outer_remaining = remaining; |
2194 | Some(clipxorigin) |
2195 | } else { |
2196 | None |
2197 | }; |
2198 | let clipyorigin = if switch_expr & u32::from(CP::CLIP_Y_ORIGIN) != 0 { |
2199 | let remaining = outer_remaining; |
2200 | let (clipyorigin, remaining) = i32::try_parse(remaining)?; |
2201 | outer_remaining = remaining; |
2202 | Some(clipyorigin) |
2203 | } else { |
2204 | None |
2205 | }; |
2206 | let clipmask = if switch_expr & u32::from(CP::CLIP_MASK) != 0 { |
2207 | let remaining = outer_remaining; |
2208 | let (clipmask, remaining) = xproto::Pixmap::try_parse(remaining)?; |
2209 | outer_remaining = remaining; |
2210 | Some(clipmask) |
2211 | } else { |
2212 | None |
2213 | }; |
2214 | let graphicsexposure = if switch_expr & u32::from(CP::GRAPHICS_EXPOSURE) != 0 { |
2215 | let remaining = outer_remaining; |
2216 | let (graphicsexposure, remaining) = u32::try_parse(remaining)?; |
2217 | outer_remaining = remaining; |
2218 | Some(graphicsexposure) |
2219 | } else { |
2220 | None |
2221 | }; |
2222 | let subwindowmode = if switch_expr & u32::from(CP::SUBWINDOW_MODE) != 0 { |
2223 | let remaining = outer_remaining; |
2224 | let (subwindowmode, remaining) = u32::try_parse(remaining)?; |
2225 | let subwindowmode = subwindowmode.into(); |
2226 | outer_remaining = remaining; |
2227 | Some(subwindowmode) |
2228 | } else { |
2229 | None |
2230 | }; |
2231 | let polyedge = if switch_expr & u32::from(CP::POLY_EDGE) != 0 { |
2232 | let remaining = outer_remaining; |
2233 | let (polyedge, remaining) = u32::try_parse(remaining)?; |
2234 | let polyedge = polyedge.into(); |
2235 | outer_remaining = remaining; |
2236 | Some(polyedge) |
2237 | } else { |
2238 | None |
2239 | }; |
2240 | let polymode = if switch_expr & u32::from(CP::POLY_MODE) != 0 { |
2241 | let remaining = outer_remaining; |
2242 | let (polymode, remaining) = u32::try_parse(remaining)?; |
2243 | let polymode = polymode.into(); |
2244 | outer_remaining = remaining; |
2245 | Some(polymode) |
2246 | } else { |
2247 | None |
2248 | }; |
2249 | let dither = if switch_expr & u32::from(CP::DITHER) != 0 { |
2250 | let remaining = outer_remaining; |
2251 | let (dither, remaining) = xproto::Atom::try_parse(remaining)?; |
2252 | outer_remaining = remaining; |
2253 | Some(dither) |
2254 | } else { |
2255 | None |
2256 | }; |
2257 | let componentalpha = if switch_expr & u32::from(CP::COMPONENT_ALPHA) != 0 { |
2258 | let remaining = outer_remaining; |
2259 | let (componentalpha, remaining) = u32::try_parse(remaining)?; |
2260 | outer_remaining = remaining; |
2261 | Some(componentalpha) |
2262 | } else { |
2263 | None |
2264 | }; |
2265 | let result = ChangePictureAux { repeat, alphamap, alphaxorigin, alphayorigin, clipxorigin, clipyorigin, clipmask, graphicsexposure, subwindowmode, polyedge, polymode, dither, componentalpha }; |
2266 | Ok((result, outer_remaining)) |
2267 | } |
2268 | } |
2269 | impl ChangePictureAux { |
2270 | #[allow (dead_code)] |
2271 | fn serialize(&self, value_mask: u32) -> Vec<u8> { |
2272 | let mut result = Vec::new(); |
2273 | self.serialize_into(&mut result, u32::from(value_mask)); |
2274 | result |
2275 | } |
2276 | fn serialize_into(&self, bytes: &mut Vec<u8>, value_mask: u32) { |
2277 | assert_eq!(self.switch_expr(), u32::from(value_mask), "switch `value_list` has an inconsistent discriminant" ); |
2278 | if let Some(repeat) = self.repeat { |
2279 | u32::from(repeat).serialize_into(bytes); |
2280 | } |
2281 | if let Some(alphamap) = self.alphamap { |
2282 | alphamap.serialize_into(bytes); |
2283 | } |
2284 | if let Some(alphaxorigin) = self.alphaxorigin { |
2285 | alphaxorigin.serialize_into(bytes); |
2286 | } |
2287 | if let Some(alphayorigin) = self.alphayorigin { |
2288 | alphayorigin.serialize_into(bytes); |
2289 | } |
2290 | if let Some(clipxorigin) = self.clipxorigin { |
2291 | clipxorigin.serialize_into(bytes); |
2292 | } |
2293 | if let Some(clipyorigin) = self.clipyorigin { |
2294 | clipyorigin.serialize_into(bytes); |
2295 | } |
2296 | if let Some(clipmask) = self.clipmask { |
2297 | clipmask.serialize_into(bytes); |
2298 | } |
2299 | if let Some(graphicsexposure) = self.graphicsexposure { |
2300 | graphicsexposure.serialize_into(bytes); |
2301 | } |
2302 | if let Some(subwindowmode) = self.subwindowmode { |
2303 | u32::from(subwindowmode).serialize_into(bytes); |
2304 | } |
2305 | if let Some(polyedge) = self.polyedge { |
2306 | u32::from(polyedge).serialize_into(bytes); |
2307 | } |
2308 | if let Some(polymode) = self.polymode { |
2309 | u32::from(polymode).serialize_into(bytes); |
2310 | } |
2311 | if let Some(dither) = self.dither { |
2312 | dither.serialize_into(bytes); |
2313 | } |
2314 | if let Some(componentalpha) = self.componentalpha { |
2315 | componentalpha.serialize_into(bytes); |
2316 | } |
2317 | } |
2318 | } |
2319 | impl ChangePictureAux { |
2320 | fn switch_expr(&self) -> u32 { |
2321 | let mut expr_value = 0; |
2322 | if self.repeat.is_some() { |
2323 | expr_value |= u32::from(CP::REPEAT); |
2324 | } |
2325 | if self.alphamap.is_some() { |
2326 | expr_value |= u32::from(CP::ALPHA_MAP); |
2327 | } |
2328 | if self.alphaxorigin.is_some() { |
2329 | expr_value |= u32::from(CP::ALPHA_X_ORIGIN); |
2330 | } |
2331 | if self.alphayorigin.is_some() { |
2332 | expr_value |= u32::from(CP::ALPHA_Y_ORIGIN); |
2333 | } |
2334 | if self.clipxorigin.is_some() { |
2335 | expr_value |= u32::from(CP::CLIP_X_ORIGIN); |
2336 | } |
2337 | if self.clipyorigin.is_some() { |
2338 | expr_value |= u32::from(CP::CLIP_Y_ORIGIN); |
2339 | } |
2340 | if self.clipmask.is_some() { |
2341 | expr_value |= u32::from(CP::CLIP_MASK); |
2342 | } |
2343 | if self.graphicsexposure.is_some() { |
2344 | expr_value |= u32::from(CP::GRAPHICS_EXPOSURE); |
2345 | } |
2346 | if self.subwindowmode.is_some() { |
2347 | expr_value |= u32::from(CP::SUBWINDOW_MODE); |
2348 | } |
2349 | if self.polyedge.is_some() { |
2350 | expr_value |= u32::from(CP::POLY_EDGE); |
2351 | } |
2352 | if self.polymode.is_some() { |
2353 | expr_value |= u32::from(CP::POLY_MODE); |
2354 | } |
2355 | if self.dither.is_some() { |
2356 | expr_value |= u32::from(CP::DITHER); |
2357 | } |
2358 | if self.componentalpha.is_some() { |
2359 | expr_value |= u32::from(CP::COMPONENT_ALPHA); |
2360 | } |
2361 | expr_value |
2362 | } |
2363 | } |
2364 | impl ChangePictureAux { |
2365 | /// Create a new instance with all fields unset / not present. |
2366 | pub fn new() -> Self { |
2367 | Default::default() |
2368 | } |
2369 | /// Set the `repeat` field of this structure. |
2370 | #[must_use ] |
2371 | pub fn repeat<I>(mut self, value: I) -> Self where I: Into<Option<Repeat>> { |
2372 | self.repeat = value.into(); |
2373 | self |
2374 | } |
2375 | /// Set the `alphamap` field of this structure. |
2376 | #[must_use ] |
2377 | pub fn alphamap<I>(mut self, value: I) -> Self where I: Into<Option<Picture>> { |
2378 | self.alphamap = value.into(); |
2379 | self |
2380 | } |
2381 | /// Set the `alphaxorigin` field of this structure. |
2382 | #[must_use ] |
2383 | pub fn alphaxorigin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> { |
2384 | self.alphaxorigin = value.into(); |
2385 | self |
2386 | } |
2387 | /// Set the `alphayorigin` field of this structure. |
2388 | #[must_use ] |
2389 | pub fn alphayorigin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> { |
2390 | self.alphayorigin = value.into(); |
2391 | self |
2392 | } |
2393 | /// Set the `clipxorigin` field of this structure. |
2394 | #[must_use ] |
2395 | pub fn clipxorigin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> { |
2396 | self.clipxorigin = value.into(); |
2397 | self |
2398 | } |
2399 | /// Set the `clipyorigin` field of this structure. |
2400 | #[must_use ] |
2401 | pub fn clipyorigin<I>(mut self, value: I) -> Self where I: Into<Option<i32>> { |
2402 | self.clipyorigin = value.into(); |
2403 | self |
2404 | } |
2405 | /// Set the `clipmask` field of this structure. |
2406 | #[must_use ] |
2407 | pub fn clipmask<I>(mut self, value: I) -> Self where I: Into<Option<xproto::Pixmap>> { |
2408 | self.clipmask = value.into(); |
2409 | self |
2410 | } |
2411 | /// Set the `graphicsexposure` field of this structure. |
2412 | #[must_use ] |
2413 | pub fn graphicsexposure<I>(mut self, value: I) -> Self where I: Into<Option<u32>> { |
2414 | self.graphicsexposure = value.into(); |
2415 | self |
2416 | } |
2417 | /// Set the `subwindowmode` field of this structure. |
2418 | #[must_use ] |
2419 | pub fn subwindowmode<I>(mut self, value: I) -> Self where I: Into<Option<xproto::SubwindowMode>> { |
2420 | self.subwindowmode = value.into(); |
2421 | self |
2422 | } |
2423 | /// Set the `polyedge` field of this structure. |
2424 | #[must_use ] |
2425 | pub fn polyedge<I>(mut self, value: I) -> Self where I: Into<Option<PolyEdge>> { |
2426 | self.polyedge = value.into(); |
2427 | self |
2428 | } |
2429 | /// Set the `polymode` field of this structure. |
2430 | #[must_use ] |
2431 | pub fn polymode<I>(mut self, value: I) -> Self where I: Into<Option<PolyMode>> { |
2432 | self.polymode = value.into(); |
2433 | self |
2434 | } |
2435 | /// Set the `dither` field of this structure. |
2436 | #[must_use ] |
2437 | pub fn dither<I>(mut self, value: I) -> Self where I: Into<Option<xproto::Atom>> { |
2438 | self.dither = value.into(); |
2439 | self |
2440 | } |
2441 | /// Set the `componentalpha` field of this structure. |
2442 | #[must_use ] |
2443 | pub fn componentalpha<I>(mut self, value: I) -> Self where I: Into<Option<u32>> { |
2444 | self.componentalpha = value.into(); |
2445 | self |
2446 | } |
2447 | } |
2448 | |
2449 | /// Opcode for the ChangePicture request |
2450 | pub const CHANGE_PICTURE_REQUEST: u8 = 5; |
2451 | #[derive (Clone, Default)] |
2452 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2453 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2454 | pub struct ChangePictureRequest<'input> { |
2455 | pub picture: Picture, |
2456 | pub value_list: Cow<'input, ChangePictureAux>, |
2457 | } |
2458 | impl_debug_if_no_extra_traits!(ChangePictureRequest<'_>, "ChangePictureRequest" ); |
2459 | impl<'input> ChangePictureRequest<'input> { |
2460 | /// Serialize this request into bytes for the provided connection |
2461 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
2462 | let length_so_far = 0; |
2463 | let picture_bytes = self.picture.serialize(); |
2464 | let value_mask: u32 = self.value_list.switch_expr(); |
2465 | let value_mask_bytes = value_mask.serialize(); |
2466 | let mut request0 = vec![ |
2467 | major_opcode, |
2468 | CHANGE_PICTURE_REQUEST, |
2469 | 0, |
2470 | 0, |
2471 | picture_bytes[0], |
2472 | picture_bytes[1], |
2473 | picture_bytes[2], |
2474 | picture_bytes[3], |
2475 | value_mask_bytes[0], |
2476 | value_mask_bytes[1], |
2477 | value_mask_bytes[2], |
2478 | value_mask_bytes[3], |
2479 | ]; |
2480 | let length_so_far = length_so_far + request0.len(); |
2481 | let value_list_bytes = self.value_list.serialize(u32::from(value_mask)); |
2482 | let length_so_far = length_so_far + value_list_bytes.len(); |
2483 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
2484 | let length_so_far = length_so_far + padding0.len(); |
2485 | assert_eq!(length_so_far % 4, 0); |
2486 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2487 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2488 | ([request0.into(), value_list_bytes.into(), padding0.into()], vec![]) |
2489 | } |
2490 | /// Parse this request given its header, its body, and any fds that go along with it |
2491 | #[cfg (feature = "request-parsing" )] |
2492 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
2493 | if header.minor_opcode != CHANGE_PICTURE_REQUEST { |
2494 | return Err(ParseError::InvalidValue); |
2495 | } |
2496 | let (picture, remaining) = Picture::try_parse(value)?; |
2497 | let (value_mask, remaining) = u32::try_parse(remaining)?; |
2498 | let (value_list, remaining) = ChangePictureAux::try_parse(remaining, u32::from(value_mask))?; |
2499 | let _ = remaining; |
2500 | Ok(ChangePictureRequest { |
2501 | picture, |
2502 | value_list: Cow::Owned(value_list), |
2503 | }) |
2504 | } |
2505 | /// Clone all borrowed data in this ChangePictureRequest. |
2506 | pub fn into_owned(self) -> ChangePictureRequest<'static> { |
2507 | ChangePictureRequest { |
2508 | picture: self.picture, |
2509 | value_list: Cow::Owned(self.value_list.into_owned()), |
2510 | } |
2511 | } |
2512 | } |
2513 | impl<'input> Request for ChangePictureRequest<'input> { |
2514 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
2515 | |
2516 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
2517 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
2518 | // Flatten the buffers into a single vector |
2519 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
2520 | (buf, fds) |
2521 | } |
2522 | } |
2523 | impl<'input> crate::x11_utils::VoidRequest for ChangePictureRequest<'input> { |
2524 | } |
2525 | |
2526 | /// Opcode for the SetPictureClipRectangles request |
2527 | pub const SET_PICTURE_CLIP_RECTANGLES_REQUEST: u8 = 6; |
2528 | #[derive (Clone, Default)] |
2529 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2530 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2531 | pub struct SetPictureClipRectanglesRequest<'input> { |
2532 | pub picture: Picture, |
2533 | pub clip_x_origin: i16, |
2534 | pub clip_y_origin: i16, |
2535 | pub rectangles: Cow<'input, [xproto::Rectangle]>, |
2536 | } |
2537 | impl_debug_if_no_extra_traits!(SetPictureClipRectanglesRequest<'_>, "SetPictureClipRectanglesRequest" ); |
2538 | impl<'input> SetPictureClipRectanglesRequest<'input> { |
2539 | /// Serialize this request into bytes for the provided connection |
2540 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
2541 | let length_so_far = 0; |
2542 | let picture_bytes = self.picture.serialize(); |
2543 | let clip_x_origin_bytes = self.clip_x_origin.serialize(); |
2544 | let clip_y_origin_bytes = self.clip_y_origin.serialize(); |
2545 | let mut request0 = vec![ |
2546 | major_opcode, |
2547 | SET_PICTURE_CLIP_RECTANGLES_REQUEST, |
2548 | 0, |
2549 | 0, |
2550 | picture_bytes[0], |
2551 | picture_bytes[1], |
2552 | picture_bytes[2], |
2553 | picture_bytes[3], |
2554 | clip_x_origin_bytes[0], |
2555 | clip_x_origin_bytes[1], |
2556 | clip_y_origin_bytes[0], |
2557 | clip_y_origin_bytes[1], |
2558 | ]; |
2559 | let length_so_far = length_so_far + request0.len(); |
2560 | let rectangles_bytes = self.rectangles.serialize(); |
2561 | let length_so_far = length_so_far + rectangles_bytes.len(); |
2562 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
2563 | let length_so_far = length_so_far + padding0.len(); |
2564 | assert_eq!(length_so_far % 4, 0); |
2565 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2566 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2567 | ([request0.into(), rectangles_bytes.into(), padding0.into()], vec![]) |
2568 | } |
2569 | /// Parse this request given its header, its body, and any fds that go along with it |
2570 | #[cfg (feature = "request-parsing" )] |
2571 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
2572 | if header.minor_opcode != SET_PICTURE_CLIP_RECTANGLES_REQUEST { |
2573 | return Err(ParseError::InvalidValue); |
2574 | } |
2575 | let (picture, remaining) = Picture::try_parse(value)?; |
2576 | let (clip_x_origin, remaining) = i16::try_parse(remaining)?; |
2577 | let (clip_y_origin, remaining) = i16::try_parse(remaining)?; |
2578 | let mut remaining = remaining; |
2579 | // Length is 'everything left in the input' |
2580 | let mut rectangles = Vec::new(); |
2581 | while !remaining.is_empty() { |
2582 | let (v, new_remaining) = xproto::Rectangle::try_parse(remaining)?; |
2583 | remaining = new_remaining; |
2584 | rectangles.push(v); |
2585 | } |
2586 | let _ = remaining; |
2587 | Ok(SetPictureClipRectanglesRequest { |
2588 | picture, |
2589 | clip_x_origin, |
2590 | clip_y_origin, |
2591 | rectangles: Cow::Owned(rectangles), |
2592 | }) |
2593 | } |
2594 | /// Clone all borrowed data in this SetPictureClipRectanglesRequest. |
2595 | pub fn into_owned(self) -> SetPictureClipRectanglesRequest<'static> { |
2596 | SetPictureClipRectanglesRequest { |
2597 | picture: self.picture, |
2598 | clip_x_origin: self.clip_x_origin, |
2599 | clip_y_origin: self.clip_y_origin, |
2600 | rectangles: Cow::Owned(self.rectangles.into_owned()), |
2601 | } |
2602 | } |
2603 | } |
2604 | impl<'input> Request for SetPictureClipRectanglesRequest<'input> { |
2605 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
2606 | |
2607 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
2608 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
2609 | // Flatten the buffers into a single vector |
2610 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
2611 | (buf, fds) |
2612 | } |
2613 | } |
2614 | impl<'input> crate::x11_utils::VoidRequest for SetPictureClipRectanglesRequest<'input> { |
2615 | } |
2616 | |
2617 | /// Opcode for the FreePicture request |
2618 | pub const FREE_PICTURE_REQUEST: u8 = 7; |
2619 | #[derive (Clone, Copy, Default)] |
2620 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2621 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2622 | pub struct FreePictureRequest { |
2623 | pub picture: Picture, |
2624 | } |
2625 | impl_debug_if_no_extra_traits!(FreePictureRequest, "FreePictureRequest" ); |
2626 | impl FreePictureRequest { |
2627 | /// Serialize this request into bytes for the provided connection |
2628 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
2629 | let length_so_far = 0; |
2630 | let picture_bytes = self.picture.serialize(); |
2631 | let mut request0 = vec![ |
2632 | major_opcode, |
2633 | FREE_PICTURE_REQUEST, |
2634 | 0, |
2635 | 0, |
2636 | picture_bytes[0], |
2637 | picture_bytes[1], |
2638 | picture_bytes[2], |
2639 | picture_bytes[3], |
2640 | ]; |
2641 | let length_so_far = length_so_far + request0.len(); |
2642 | assert_eq!(length_so_far % 4, 0); |
2643 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2644 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2645 | ([request0.into()], vec![]) |
2646 | } |
2647 | /// Parse this request given its header, its body, and any fds that go along with it |
2648 | #[cfg (feature = "request-parsing" )] |
2649 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
2650 | if header.minor_opcode != FREE_PICTURE_REQUEST { |
2651 | return Err(ParseError::InvalidValue); |
2652 | } |
2653 | let (picture, remaining) = Picture::try_parse(value)?; |
2654 | let _ = remaining; |
2655 | Ok(FreePictureRequest { |
2656 | picture, |
2657 | }) |
2658 | } |
2659 | } |
2660 | impl Request for FreePictureRequest { |
2661 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
2662 | |
2663 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
2664 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
2665 | // Flatten the buffers into a single vector |
2666 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
2667 | (buf, fds) |
2668 | } |
2669 | } |
2670 | impl crate::x11_utils::VoidRequest for FreePictureRequest { |
2671 | } |
2672 | |
2673 | /// Opcode for the Composite request |
2674 | pub const COMPOSITE_REQUEST: u8 = 8; |
2675 | #[derive (Clone, Copy, Default)] |
2676 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2677 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2678 | pub struct CompositeRequest { |
2679 | pub op: PictOp, |
2680 | pub src: Picture, |
2681 | pub mask: Picture, |
2682 | pub dst: Picture, |
2683 | pub src_x: i16, |
2684 | pub src_y: i16, |
2685 | pub mask_x: i16, |
2686 | pub mask_y: i16, |
2687 | pub dst_x: i16, |
2688 | pub dst_y: i16, |
2689 | pub width: u16, |
2690 | pub height: u16, |
2691 | } |
2692 | impl_debug_if_no_extra_traits!(CompositeRequest, "CompositeRequest" ); |
2693 | impl CompositeRequest { |
2694 | /// Serialize this request into bytes for the provided connection |
2695 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
2696 | let length_so_far = 0; |
2697 | let op_bytes = u8::from(self.op).serialize(); |
2698 | let src_bytes = self.src.serialize(); |
2699 | let mask_bytes = self.mask.serialize(); |
2700 | let dst_bytes = self.dst.serialize(); |
2701 | let src_x_bytes = self.src_x.serialize(); |
2702 | let src_y_bytes = self.src_y.serialize(); |
2703 | let mask_x_bytes = self.mask_x.serialize(); |
2704 | let mask_y_bytes = self.mask_y.serialize(); |
2705 | let dst_x_bytes = self.dst_x.serialize(); |
2706 | let dst_y_bytes = self.dst_y.serialize(); |
2707 | let width_bytes = self.width.serialize(); |
2708 | let height_bytes = self.height.serialize(); |
2709 | let mut request0 = vec![ |
2710 | major_opcode, |
2711 | COMPOSITE_REQUEST, |
2712 | 0, |
2713 | 0, |
2714 | op_bytes[0], |
2715 | 0, |
2716 | 0, |
2717 | 0, |
2718 | src_bytes[0], |
2719 | src_bytes[1], |
2720 | src_bytes[2], |
2721 | src_bytes[3], |
2722 | mask_bytes[0], |
2723 | mask_bytes[1], |
2724 | mask_bytes[2], |
2725 | mask_bytes[3], |
2726 | dst_bytes[0], |
2727 | dst_bytes[1], |
2728 | dst_bytes[2], |
2729 | dst_bytes[3], |
2730 | src_x_bytes[0], |
2731 | src_x_bytes[1], |
2732 | src_y_bytes[0], |
2733 | src_y_bytes[1], |
2734 | mask_x_bytes[0], |
2735 | mask_x_bytes[1], |
2736 | mask_y_bytes[0], |
2737 | mask_y_bytes[1], |
2738 | dst_x_bytes[0], |
2739 | dst_x_bytes[1], |
2740 | dst_y_bytes[0], |
2741 | dst_y_bytes[1], |
2742 | width_bytes[0], |
2743 | width_bytes[1], |
2744 | height_bytes[0], |
2745 | height_bytes[1], |
2746 | ]; |
2747 | let length_so_far = length_so_far + request0.len(); |
2748 | assert_eq!(length_so_far % 4, 0); |
2749 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2750 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2751 | ([request0.into()], vec![]) |
2752 | } |
2753 | /// Parse this request given its header, its body, and any fds that go along with it |
2754 | #[cfg (feature = "request-parsing" )] |
2755 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
2756 | if header.minor_opcode != COMPOSITE_REQUEST { |
2757 | return Err(ParseError::InvalidValue); |
2758 | } |
2759 | let (op, remaining) = u8::try_parse(value)?; |
2760 | let op = op.into(); |
2761 | let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?; |
2762 | let (src, remaining) = Picture::try_parse(remaining)?; |
2763 | let (mask, remaining) = Picture::try_parse(remaining)?; |
2764 | let (dst, remaining) = Picture::try_parse(remaining)?; |
2765 | let (src_x, remaining) = i16::try_parse(remaining)?; |
2766 | let (src_y, remaining) = i16::try_parse(remaining)?; |
2767 | let (mask_x, remaining) = i16::try_parse(remaining)?; |
2768 | let (mask_y, remaining) = i16::try_parse(remaining)?; |
2769 | let (dst_x, remaining) = i16::try_parse(remaining)?; |
2770 | let (dst_y, remaining) = i16::try_parse(remaining)?; |
2771 | let (width, remaining) = u16::try_parse(remaining)?; |
2772 | let (height, remaining) = u16::try_parse(remaining)?; |
2773 | let _ = remaining; |
2774 | Ok(CompositeRequest { |
2775 | op, |
2776 | src, |
2777 | mask, |
2778 | dst, |
2779 | src_x, |
2780 | src_y, |
2781 | mask_x, |
2782 | mask_y, |
2783 | dst_x, |
2784 | dst_y, |
2785 | width, |
2786 | height, |
2787 | }) |
2788 | } |
2789 | } |
2790 | impl Request for CompositeRequest { |
2791 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
2792 | |
2793 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
2794 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
2795 | // Flatten the buffers into a single vector |
2796 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
2797 | (buf, fds) |
2798 | } |
2799 | } |
2800 | impl crate::x11_utils::VoidRequest for CompositeRequest { |
2801 | } |
2802 | |
2803 | /// Opcode for the Trapezoids request |
2804 | pub const TRAPEZOIDS_REQUEST: u8 = 10; |
2805 | #[derive (Clone, Default)] |
2806 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2807 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2808 | pub struct TrapezoidsRequest<'input> { |
2809 | pub op: PictOp, |
2810 | pub src: Picture, |
2811 | pub dst: Picture, |
2812 | pub mask_format: Pictformat, |
2813 | pub src_x: i16, |
2814 | pub src_y: i16, |
2815 | pub traps: Cow<'input, [Trapezoid]>, |
2816 | } |
2817 | impl_debug_if_no_extra_traits!(TrapezoidsRequest<'_>, "TrapezoidsRequest" ); |
2818 | impl<'input> TrapezoidsRequest<'input> { |
2819 | /// Serialize this request into bytes for the provided connection |
2820 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
2821 | let length_so_far = 0; |
2822 | let op_bytes = u8::from(self.op).serialize(); |
2823 | let src_bytes = self.src.serialize(); |
2824 | let dst_bytes = self.dst.serialize(); |
2825 | let mask_format_bytes = self.mask_format.serialize(); |
2826 | let src_x_bytes = self.src_x.serialize(); |
2827 | let src_y_bytes = self.src_y.serialize(); |
2828 | let mut request0 = vec![ |
2829 | major_opcode, |
2830 | TRAPEZOIDS_REQUEST, |
2831 | 0, |
2832 | 0, |
2833 | op_bytes[0], |
2834 | 0, |
2835 | 0, |
2836 | 0, |
2837 | src_bytes[0], |
2838 | src_bytes[1], |
2839 | src_bytes[2], |
2840 | src_bytes[3], |
2841 | dst_bytes[0], |
2842 | dst_bytes[1], |
2843 | dst_bytes[2], |
2844 | dst_bytes[3], |
2845 | mask_format_bytes[0], |
2846 | mask_format_bytes[1], |
2847 | mask_format_bytes[2], |
2848 | mask_format_bytes[3], |
2849 | src_x_bytes[0], |
2850 | src_x_bytes[1], |
2851 | src_y_bytes[0], |
2852 | src_y_bytes[1], |
2853 | ]; |
2854 | let length_so_far = length_so_far + request0.len(); |
2855 | let traps_bytes = self.traps.serialize(); |
2856 | let length_so_far = length_so_far + traps_bytes.len(); |
2857 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
2858 | let length_so_far = length_so_far + padding0.len(); |
2859 | assert_eq!(length_so_far % 4, 0); |
2860 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2861 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2862 | ([request0.into(), traps_bytes.into(), padding0.into()], vec![]) |
2863 | } |
2864 | /// Parse this request given its header, its body, and any fds that go along with it |
2865 | #[cfg (feature = "request-parsing" )] |
2866 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
2867 | if header.minor_opcode != TRAPEZOIDS_REQUEST { |
2868 | return Err(ParseError::InvalidValue); |
2869 | } |
2870 | let (op, remaining) = u8::try_parse(value)?; |
2871 | let op = op.into(); |
2872 | let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?; |
2873 | let (src, remaining) = Picture::try_parse(remaining)?; |
2874 | let (dst, remaining) = Picture::try_parse(remaining)?; |
2875 | let (mask_format, remaining) = Pictformat::try_parse(remaining)?; |
2876 | let (src_x, remaining) = i16::try_parse(remaining)?; |
2877 | let (src_y, remaining) = i16::try_parse(remaining)?; |
2878 | let mut remaining = remaining; |
2879 | // Length is 'everything left in the input' |
2880 | let mut traps = Vec::new(); |
2881 | while !remaining.is_empty() { |
2882 | let (v, new_remaining) = Trapezoid::try_parse(remaining)?; |
2883 | remaining = new_remaining; |
2884 | traps.push(v); |
2885 | } |
2886 | let _ = remaining; |
2887 | Ok(TrapezoidsRequest { |
2888 | op, |
2889 | src, |
2890 | dst, |
2891 | mask_format, |
2892 | src_x, |
2893 | src_y, |
2894 | traps: Cow::Owned(traps), |
2895 | }) |
2896 | } |
2897 | /// Clone all borrowed data in this TrapezoidsRequest. |
2898 | pub fn into_owned(self) -> TrapezoidsRequest<'static> { |
2899 | TrapezoidsRequest { |
2900 | op: self.op, |
2901 | src: self.src, |
2902 | dst: self.dst, |
2903 | mask_format: self.mask_format, |
2904 | src_x: self.src_x, |
2905 | src_y: self.src_y, |
2906 | traps: Cow::Owned(self.traps.into_owned()), |
2907 | } |
2908 | } |
2909 | } |
2910 | impl<'input> Request for TrapezoidsRequest<'input> { |
2911 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
2912 | |
2913 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
2914 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
2915 | // Flatten the buffers into a single vector |
2916 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
2917 | (buf, fds) |
2918 | } |
2919 | } |
2920 | impl<'input> crate::x11_utils::VoidRequest for TrapezoidsRequest<'input> { |
2921 | } |
2922 | |
2923 | /// Opcode for the Triangles request |
2924 | pub const TRIANGLES_REQUEST: u8 = 11; |
2925 | #[derive (Clone, Default)] |
2926 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
2927 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
2928 | pub struct TrianglesRequest<'input> { |
2929 | pub op: PictOp, |
2930 | pub src: Picture, |
2931 | pub dst: Picture, |
2932 | pub mask_format: Pictformat, |
2933 | pub src_x: i16, |
2934 | pub src_y: i16, |
2935 | pub triangles: Cow<'input, [Triangle]>, |
2936 | } |
2937 | impl_debug_if_no_extra_traits!(TrianglesRequest<'_>, "TrianglesRequest" ); |
2938 | impl<'input> TrianglesRequest<'input> { |
2939 | /// Serialize this request into bytes for the provided connection |
2940 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
2941 | let length_so_far = 0; |
2942 | let op_bytes = u8::from(self.op).serialize(); |
2943 | let src_bytes = self.src.serialize(); |
2944 | let dst_bytes = self.dst.serialize(); |
2945 | let mask_format_bytes = self.mask_format.serialize(); |
2946 | let src_x_bytes = self.src_x.serialize(); |
2947 | let src_y_bytes = self.src_y.serialize(); |
2948 | let mut request0 = vec![ |
2949 | major_opcode, |
2950 | TRIANGLES_REQUEST, |
2951 | 0, |
2952 | 0, |
2953 | op_bytes[0], |
2954 | 0, |
2955 | 0, |
2956 | 0, |
2957 | src_bytes[0], |
2958 | src_bytes[1], |
2959 | src_bytes[2], |
2960 | src_bytes[3], |
2961 | dst_bytes[0], |
2962 | dst_bytes[1], |
2963 | dst_bytes[2], |
2964 | dst_bytes[3], |
2965 | mask_format_bytes[0], |
2966 | mask_format_bytes[1], |
2967 | mask_format_bytes[2], |
2968 | mask_format_bytes[3], |
2969 | src_x_bytes[0], |
2970 | src_x_bytes[1], |
2971 | src_y_bytes[0], |
2972 | src_y_bytes[1], |
2973 | ]; |
2974 | let length_so_far = length_so_far + request0.len(); |
2975 | let triangles_bytes = self.triangles.serialize(); |
2976 | let length_so_far = length_so_far + triangles_bytes.len(); |
2977 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
2978 | let length_so_far = length_so_far + padding0.len(); |
2979 | assert_eq!(length_so_far % 4, 0); |
2980 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
2981 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
2982 | ([request0.into(), triangles_bytes.into(), padding0.into()], vec![]) |
2983 | } |
2984 | /// Parse this request given its header, its body, and any fds that go along with it |
2985 | #[cfg (feature = "request-parsing" )] |
2986 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
2987 | if header.minor_opcode != TRIANGLES_REQUEST { |
2988 | return Err(ParseError::InvalidValue); |
2989 | } |
2990 | let (op, remaining) = u8::try_parse(value)?; |
2991 | let op = op.into(); |
2992 | let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?; |
2993 | let (src, remaining) = Picture::try_parse(remaining)?; |
2994 | let (dst, remaining) = Picture::try_parse(remaining)?; |
2995 | let (mask_format, remaining) = Pictformat::try_parse(remaining)?; |
2996 | let (src_x, remaining) = i16::try_parse(remaining)?; |
2997 | let (src_y, remaining) = i16::try_parse(remaining)?; |
2998 | let mut remaining = remaining; |
2999 | // Length is 'everything left in the input' |
3000 | let mut triangles = Vec::new(); |
3001 | while !remaining.is_empty() { |
3002 | let (v, new_remaining) = Triangle::try_parse(remaining)?; |
3003 | remaining = new_remaining; |
3004 | triangles.push(v); |
3005 | } |
3006 | let _ = remaining; |
3007 | Ok(TrianglesRequest { |
3008 | op, |
3009 | src, |
3010 | dst, |
3011 | mask_format, |
3012 | src_x, |
3013 | src_y, |
3014 | triangles: Cow::Owned(triangles), |
3015 | }) |
3016 | } |
3017 | /// Clone all borrowed data in this TrianglesRequest. |
3018 | pub fn into_owned(self) -> TrianglesRequest<'static> { |
3019 | TrianglesRequest { |
3020 | op: self.op, |
3021 | src: self.src, |
3022 | dst: self.dst, |
3023 | mask_format: self.mask_format, |
3024 | src_x: self.src_x, |
3025 | src_y: self.src_y, |
3026 | triangles: Cow::Owned(self.triangles.into_owned()), |
3027 | } |
3028 | } |
3029 | } |
3030 | impl<'input> Request for TrianglesRequest<'input> { |
3031 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3032 | |
3033 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3034 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
3035 | // Flatten the buffers into a single vector |
3036 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3037 | (buf, fds) |
3038 | } |
3039 | } |
3040 | impl<'input> crate::x11_utils::VoidRequest for TrianglesRequest<'input> { |
3041 | } |
3042 | |
3043 | /// Opcode for the TriStrip request |
3044 | pub const TRI_STRIP_REQUEST: u8 = 12; |
3045 | #[derive (Clone, Default)] |
3046 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3047 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3048 | pub struct TriStripRequest<'input> { |
3049 | pub op: PictOp, |
3050 | pub src: Picture, |
3051 | pub dst: Picture, |
3052 | pub mask_format: Pictformat, |
3053 | pub src_x: i16, |
3054 | pub src_y: i16, |
3055 | pub points: Cow<'input, [Pointfix]>, |
3056 | } |
3057 | impl_debug_if_no_extra_traits!(TriStripRequest<'_>, "TriStripRequest" ); |
3058 | impl<'input> TriStripRequest<'input> { |
3059 | /// Serialize this request into bytes for the provided connection |
3060 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
3061 | let length_so_far = 0; |
3062 | let op_bytes = u8::from(self.op).serialize(); |
3063 | let src_bytes = self.src.serialize(); |
3064 | let dst_bytes = self.dst.serialize(); |
3065 | let mask_format_bytes = self.mask_format.serialize(); |
3066 | let src_x_bytes = self.src_x.serialize(); |
3067 | let src_y_bytes = self.src_y.serialize(); |
3068 | let mut request0 = vec![ |
3069 | major_opcode, |
3070 | TRI_STRIP_REQUEST, |
3071 | 0, |
3072 | 0, |
3073 | op_bytes[0], |
3074 | 0, |
3075 | 0, |
3076 | 0, |
3077 | src_bytes[0], |
3078 | src_bytes[1], |
3079 | src_bytes[2], |
3080 | src_bytes[3], |
3081 | dst_bytes[0], |
3082 | dst_bytes[1], |
3083 | dst_bytes[2], |
3084 | dst_bytes[3], |
3085 | mask_format_bytes[0], |
3086 | mask_format_bytes[1], |
3087 | mask_format_bytes[2], |
3088 | mask_format_bytes[3], |
3089 | src_x_bytes[0], |
3090 | src_x_bytes[1], |
3091 | src_y_bytes[0], |
3092 | src_y_bytes[1], |
3093 | ]; |
3094 | let length_so_far = length_so_far + request0.len(); |
3095 | let points_bytes = self.points.serialize(); |
3096 | let length_so_far = length_so_far + points_bytes.len(); |
3097 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
3098 | let length_so_far = length_so_far + padding0.len(); |
3099 | assert_eq!(length_so_far % 4, 0); |
3100 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3101 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3102 | ([request0.into(), points_bytes.into(), padding0.into()], vec![]) |
3103 | } |
3104 | /// Parse this request given its header, its body, and any fds that go along with it |
3105 | #[cfg (feature = "request-parsing" )] |
3106 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
3107 | if header.minor_opcode != TRI_STRIP_REQUEST { |
3108 | return Err(ParseError::InvalidValue); |
3109 | } |
3110 | let (op, remaining) = u8::try_parse(value)?; |
3111 | let op = op.into(); |
3112 | let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?; |
3113 | let (src, remaining) = Picture::try_parse(remaining)?; |
3114 | let (dst, remaining) = Picture::try_parse(remaining)?; |
3115 | let (mask_format, remaining) = Pictformat::try_parse(remaining)?; |
3116 | let (src_x, remaining) = i16::try_parse(remaining)?; |
3117 | let (src_y, remaining) = i16::try_parse(remaining)?; |
3118 | let mut remaining = remaining; |
3119 | // Length is 'everything left in the input' |
3120 | let mut points = Vec::new(); |
3121 | while !remaining.is_empty() { |
3122 | let (v, new_remaining) = Pointfix::try_parse(remaining)?; |
3123 | remaining = new_remaining; |
3124 | points.push(v); |
3125 | } |
3126 | let _ = remaining; |
3127 | Ok(TriStripRequest { |
3128 | op, |
3129 | src, |
3130 | dst, |
3131 | mask_format, |
3132 | src_x, |
3133 | src_y, |
3134 | points: Cow::Owned(points), |
3135 | }) |
3136 | } |
3137 | /// Clone all borrowed data in this TriStripRequest. |
3138 | pub fn into_owned(self) -> TriStripRequest<'static> { |
3139 | TriStripRequest { |
3140 | op: self.op, |
3141 | src: self.src, |
3142 | dst: self.dst, |
3143 | mask_format: self.mask_format, |
3144 | src_x: self.src_x, |
3145 | src_y: self.src_y, |
3146 | points: Cow::Owned(self.points.into_owned()), |
3147 | } |
3148 | } |
3149 | } |
3150 | impl<'input> Request for TriStripRequest<'input> { |
3151 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3152 | |
3153 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3154 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
3155 | // Flatten the buffers into a single vector |
3156 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3157 | (buf, fds) |
3158 | } |
3159 | } |
3160 | impl<'input> crate::x11_utils::VoidRequest for TriStripRequest<'input> { |
3161 | } |
3162 | |
3163 | /// Opcode for the TriFan request |
3164 | pub const TRI_FAN_REQUEST: u8 = 13; |
3165 | #[derive (Clone, Default)] |
3166 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3167 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3168 | pub struct TriFanRequest<'input> { |
3169 | pub op: PictOp, |
3170 | pub src: Picture, |
3171 | pub dst: Picture, |
3172 | pub mask_format: Pictformat, |
3173 | pub src_x: i16, |
3174 | pub src_y: i16, |
3175 | pub points: Cow<'input, [Pointfix]>, |
3176 | } |
3177 | impl_debug_if_no_extra_traits!(TriFanRequest<'_>, "TriFanRequest" ); |
3178 | impl<'input> TriFanRequest<'input> { |
3179 | /// Serialize this request into bytes for the provided connection |
3180 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
3181 | let length_so_far = 0; |
3182 | let op_bytes = u8::from(self.op).serialize(); |
3183 | let src_bytes = self.src.serialize(); |
3184 | let dst_bytes = self.dst.serialize(); |
3185 | let mask_format_bytes = self.mask_format.serialize(); |
3186 | let src_x_bytes = self.src_x.serialize(); |
3187 | let src_y_bytes = self.src_y.serialize(); |
3188 | let mut request0 = vec![ |
3189 | major_opcode, |
3190 | TRI_FAN_REQUEST, |
3191 | 0, |
3192 | 0, |
3193 | op_bytes[0], |
3194 | 0, |
3195 | 0, |
3196 | 0, |
3197 | src_bytes[0], |
3198 | src_bytes[1], |
3199 | src_bytes[2], |
3200 | src_bytes[3], |
3201 | dst_bytes[0], |
3202 | dst_bytes[1], |
3203 | dst_bytes[2], |
3204 | dst_bytes[3], |
3205 | mask_format_bytes[0], |
3206 | mask_format_bytes[1], |
3207 | mask_format_bytes[2], |
3208 | mask_format_bytes[3], |
3209 | src_x_bytes[0], |
3210 | src_x_bytes[1], |
3211 | src_y_bytes[0], |
3212 | src_y_bytes[1], |
3213 | ]; |
3214 | let length_so_far = length_so_far + request0.len(); |
3215 | let points_bytes = self.points.serialize(); |
3216 | let length_so_far = length_so_far + points_bytes.len(); |
3217 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
3218 | let length_so_far = length_so_far + padding0.len(); |
3219 | assert_eq!(length_so_far % 4, 0); |
3220 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3221 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3222 | ([request0.into(), points_bytes.into(), padding0.into()], vec![]) |
3223 | } |
3224 | /// Parse this request given its header, its body, and any fds that go along with it |
3225 | #[cfg (feature = "request-parsing" )] |
3226 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
3227 | if header.minor_opcode != TRI_FAN_REQUEST { |
3228 | return Err(ParseError::InvalidValue); |
3229 | } |
3230 | let (op, remaining) = u8::try_parse(value)?; |
3231 | let op = op.into(); |
3232 | let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?; |
3233 | let (src, remaining) = Picture::try_parse(remaining)?; |
3234 | let (dst, remaining) = Picture::try_parse(remaining)?; |
3235 | let (mask_format, remaining) = Pictformat::try_parse(remaining)?; |
3236 | let (src_x, remaining) = i16::try_parse(remaining)?; |
3237 | let (src_y, remaining) = i16::try_parse(remaining)?; |
3238 | let mut remaining = remaining; |
3239 | // Length is 'everything left in the input' |
3240 | let mut points = Vec::new(); |
3241 | while !remaining.is_empty() { |
3242 | let (v, new_remaining) = Pointfix::try_parse(remaining)?; |
3243 | remaining = new_remaining; |
3244 | points.push(v); |
3245 | } |
3246 | let _ = remaining; |
3247 | Ok(TriFanRequest { |
3248 | op, |
3249 | src, |
3250 | dst, |
3251 | mask_format, |
3252 | src_x, |
3253 | src_y, |
3254 | points: Cow::Owned(points), |
3255 | }) |
3256 | } |
3257 | /// Clone all borrowed data in this TriFanRequest. |
3258 | pub fn into_owned(self) -> TriFanRequest<'static> { |
3259 | TriFanRequest { |
3260 | op: self.op, |
3261 | src: self.src, |
3262 | dst: self.dst, |
3263 | mask_format: self.mask_format, |
3264 | src_x: self.src_x, |
3265 | src_y: self.src_y, |
3266 | points: Cow::Owned(self.points.into_owned()), |
3267 | } |
3268 | } |
3269 | } |
3270 | impl<'input> Request for TriFanRequest<'input> { |
3271 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3272 | |
3273 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3274 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
3275 | // Flatten the buffers into a single vector |
3276 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3277 | (buf, fds) |
3278 | } |
3279 | } |
3280 | impl<'input> crate::x11_utils::VoidRequest for TriFanRequest<'input> { |
3281 | } |
3282 | |
3283 | /// Opcode for the CreateGlyphSet request |
3284 | pub const CREATE_GLYPH_SET_REQUEST: u8 = 17; |
3285 | #[derive (Clone, Copy, Default)] |
3286 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3287 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3288 | pub struct CreateGlyphSetRequest { |
3289 | pub gsid: Glyphset, |
3290 | pub format: Pictformat, |
3291 | } |
3292 | impl_debug_if_no_extra_traits!(CreateGlyphSetRequest, "CreateGlyphSetRequest" ); |
3293 | impl CreateGlyphSetRequest { |
3294 | /// Serialize this request into bytes for the provided connection |
3295 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
3296 | let length_so_far = 0; |
3297 | let gsid_bytes = self.gsid.serialize(); |
3298 | let format_bytes = self.format.serialize(); |
3299 | let mut request0 = vec![ |
3300 | major_opcode, |
3301 | CREATE_GLYPH_SET_REQUEST, |
3302 | 0, |
3303 | 0, |
3304 | gsid_bytes[0], |
3305 | gsid_bytes[1], |
3306 | gsid_bytes[2], |
3307 | gsid_bytes[3], |
3308 | format_bytes[0], |
3309 | format_bytes[1], |
3310 | format_bytes[2], |
3311 | format_bytes[3], |
3312 | ]; |
3313 | let length_so_far = length_so_far + request0.len(); |
3314 | assert_eq!(length_so_far % 4, 0); |
3315 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3316 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3317 | ([request0.into()], vec![]) |
3318 | } |
3319 | /// Parse this request given its header, its body, and any fds that go along with it |
3320 | #[cfg (feature = "request-parsing" )] |
3321 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
3322 | if header.minor_opcode != CREATE_GLYPH_SET_REQUEST { |
3323 | return Err(ParseError::InvalidValue); |
3324 | } |
3325 | let (gsid, remaining) = Glyphset::try_parse(value)?; |
3326 | let (format, remaining) = Pictformat::try_parse(remaining)?; |
3327 | let _ = remaining; |
3328 | Ok(CreateGlyphSetRequest { |
3329 | gsid, |
3330 | format, |
3331 | }) |
3332 | } |
3333 | } |
3334 | impl Request for CreateGlyphSetRequest { |
3335 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3336 | |
3337 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3338 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
3339 | // Flatten the buffers into a single vector |
3340 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3341 | (buf, fds) |
3342 | } |
3343 | } |
3344 | impl crate::x11_utils::VoidRequest for CreateGlyphSetRequest { |
3345 | } |
3346 | |
3347 | /// Opcode for the ReferenceGlyphSet request |
3348 | pub const REFERENCE_GLYPH_SET_REQUEST: u8 = 18; |
3349 | #[derive (Clone, Copy, Default)] |
3350 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3351 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3352 | pub struct ReferenceGlyphSetRequest { |
3353 | pub gsid: Glyphset, |
3354 | pub existing: Glyphset, |
3355 | } |
3356 | impl_debug_if_no_extra_traits!(ReferenceGlyphSetRequest, "ReferenceGlyphSetRequest" ); |
3357 | impl ReferenceGlyphSetRequest { |
3358 | /// Serialize this request into bytes for the provided connection |
3359 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
3360 | let length_so_far = 0; |
3361 | let gsid_bytes = self.gsid.serialize(); |
3362 | let existing_bytes = self.existing.serialize(); |
3363 | let mut request0 = vec![ |
3364 | major_opcode, |
3365 | REFERENCE_GLYPH_SET_REQUEST, |
3366 | 0, |
3367 | 0, |
3368 | gsid_bytes[0], |
3369 | gsid_bytes[1], |
3370 | gsid_bytes[2], |
3371 | gsid_bytes[3], |
3372 | existing_bytes[0], |
3373 | existing_bytes[1], |
3374 | existing_bytes[2], |
3375 | existing_bytes[3], |
3376 | ]; |
3377 | let length_so_far = length_so_far + request0.len(); |
3378 | assert_eq!(length_so_far % 4, 0); |
3379 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3380 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3381 | ([request0.into()], vec![]) |
3382 | } |
3383 | /// Parse this request given its header, its body, and any fds that go along with it |
3384 | #[cfg (feature = "request-parsing" )] |
3385 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
3386 | if header.minor_opcode != REFERENCE_GLYPH_SET_REQUEST { |
3387 | return Err(ParseError::InvalidValue); |
3388 | } |
3389 | let (gsid, remaining) = Glyphset::try_parse(value)?; |
3390 | let (existing, remaining) = Glyphset::try_parse(remaining)?; |
3391 | let _ = remaining; |
3392 | Ok(ReferenceGlyphSetRequest { |
3393 | gsid, |
3394 | existing, |
3395 | }) |
3396 | } |
3397 | } |
3398 | impl Request for ReferenceGlyphSetRequest { |
3399 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3400 | |
3401 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3402 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
3403 | // Flatten the buffers into a single vector |
3404 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3405 | (buf, fds) |
3406 | } |
3407 | } |
3408 | impl crate::x11_utils::VoidRequest for ReferenceGlyphSetRequest { |
3409 | } |
3410 | |
3411 | /// Opcode for the FreeGlyphSet request |
3412 | pub const FREE_GLYPH_SET_REQUEST: u8 = 19; |
3413 | #[derive (Clone, Copy, Default)] |
3414 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3415 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3416 | pub struct FreeGlyphSetRequest { |
3417 | pub glyphset: Glyphset, |
3418 | } |
3419 | impl_debug_if_no_extra_traits!(FreeGlyphSetRequest, "FreeGlyphSetRequest" ); |
3420 | impl FreeGlyphSetRequest { |
3421 | /// Serialize this request into bytes for the provided connection |
3422 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
3423 | let length_so_far = 0; |
3424 | let glyphset_bytes = self.glyphset.serialize(); |
3425 | let mut request0 = vec![ |
3426 | major_opcode, |
3427 | FREE_GLYPH_SET_REQUEST, |
3428 | 0, |
3429 | 0, |
3430 | glyphset_bytes[0], |
3431 | glyphset_bytes[1], |
3432 | glyphset_bytes[2], |
3433 | glyphset_bytes[3], |
3434 | ]; |
3435 | let length_so_far = length_so_far + request0.len(); |
3436 | assert_eq!(length_so_far % 4, 0); |
3437 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3438 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3439 | ([request0.into()], vec![]) |
3440 | } |
3441 | /// Parse this request given its header, its body, and any fds that go along with it |
3442 | #[cfg (feature = "request-parsing" )] |
3443 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
3444 | if header.minor_opcode != FREE_GLYPH_SET_REQUEST { |
3445 | return Err(ParseError::InvalidValue); |
3446 | } |
3447 | let (glyphset, remaining) = Glyphset::try_parse(value)?; |
3448 | let _ = remaining; |
3449 | Ok(FreeGlyphSetRequest { |
3450 | glyphset, |
3451 | }) |
3452 | } |
3453 | } |
3454 | impl Request for FreeGlyphSetRequest { |
3455 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3456 | |
3457 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3458 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
3459 | // Flatten the buffers into a single vector |
3460 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3461 | (buf, fds) |
3462 | } |
3463 | } |
3464 | impl crate::x11_utils::VoidRequest for FreeGlyphSetRequest { |
3465 | } |
3466 | |
3467 | /// Opcode for the AddGlyphs request |
3468 | pub const ADD_GLYPHS_REQUEST: u8 = 20; |
3469 | #[derive (Clone, Default)] |
3470 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3471 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3472 | pub struct AddGlyphsRequest<'input> { |
3473 | pub glyphset: Glyphset, |
3474 | pub glyphids: Cow<'input, [u32]>, |
3475 | pub glyphs: Cow<'input, [Glyphinfo]>, |
3476 | pub data: Cow<'input, [u8]>, |
3477 | } |
3478 | impl_debug_if_no_extra_traits!(AddGlyphsRequest<'_>, "AddGlyphsRequest" ); |
3479 | impl<'input> AddGlyphsRequest<'input> { |
3480 | /// Serialize this request into bytes for the provided connection |
3481 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 5]> { |
3482 | let length_so_far = 0; |
3483 | let glyphset_bytes = self.glyphset.serialize(); |
3484 | let glyphs_len = u32::try_from(self.glyphids.len()).expect("`glyphids` has too many elements" ); |
3485 | let glyphs_len_bytes = glyphs_len.serialize(); |
3486 | let mut request0 = vec![ |
3487 | major_opcode, |
3488 | ADD_GLYPHS_REQUEST, |
3489 | 0, |
3490 | 0, |
3491 | glyphset_bytes[0], |
3492 | glyphset_bytes[1], |
3493 | glyphset_bytes[2], |
3494 | glyphset_bytes[3], |
3495 | glyphs_len_bytes[0], |
3496 | glyphs_len_bytes[1], |
3497 | glyphs_len_bytes[2], |
3498 | glyphs_len_bytes[3], |
3499 | ]; |
3500 | let length_so_far = length_so_far + request0.len(); |
3501 | let glyphids_bytes = self.glyphids.serialize(); |
3502 | let length_so_far = length_so_far + glyphids_bytes.len(); |
3503 | assert_eq!(self.glyphs.len(), usize::try_from(glyphs_len).unwrap(), "`glyphs` has an incorrect length" ); |
3504 | let glyphs_bytes = self.glyphs.serialize(); |
3505 | let length_so_far = length_so_far + glyphs_bytes.len(); |
3506 | let length_so_far = length_so_far + self.data.len(); |
3507 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
3508 | let length_so_far = length_so_far + padding0.len(); |
3509 | assert_eq!(length_so_far % 4, 0); |
3510 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3511 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3512 | ([request0.into(), glyphids_bytes.into(), glyphs_bytes.into(), self.data, padding0.into()], vec![]) |
3513 | } |
3514 | /// Parse this request given its header, its body, and any fds that go along with it |
3515 | #[cfg (feature = "request-parsing" )] |
3516 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
3517 | if header.minor_opcode != ADD_GLYPHS_REQUEST { |
3518 | return Err(ParseError::InvalidValue); |
3519 | } |
3520 | let (glyphset, remaining) = Glyphset::try_parse(value)?; |
3521 | let (glyphs_len, remaining) = u32::try_parse(remaining)?; |
3522 | let (glyphids, remaining) = crate::x11_utils::parse_list::<u32>(remaining, glyphs_len.try_to_usize()?)?; |
3523 | let (glyphs, remaining) = crate::x11_utils::parse_list::<Glyphinfo>(remaining, glyphs_len.try_to_usize()?)?; |
3524 | let (data, remaining) = remaining.split_at(remaining.len()); |
3525 | let _ = remaining; |
3526 | Ok(AddGlyphsRequest { |
3527 | glyphset, |
3528 | glyphids: Cow::Owned(glyphids), |
3529 | glyphs: Cow::Owned(glyphs), |
3530 | data: Cow::Borrowed(data), |
3531 | }) |
3532 | } |
3533 | /// Clone all borrowed data in this AddGlyphsRequest. |
3534 | pub fn into_owned(self) -> AddGlyphsRequest<'static> { |
3535 | AddGlyphsRequest { |
3536 | glyphset: self.glyphset, |
3537 | glyphids: Cow::Owned(self.glyphids.into_owned()), |
3538 | glyphs: Cow::Owned(self.glyphs.into_owned()), |
3539 | data: Cow::Owned(self.data.into_owned()), |
3540 | } |
3541 | } |
3542 | } |
3543 | impl<'input> Request for AddGlyphsRequest<'input> { |
3544 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3545 | |
3546 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3547 | let (bufs: [Cow<'_, [u8]>; 5], fds: Vec) = self.serialize(major_opcode); |
3548 | // Flatten the buffers into a single vector |
3549 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3550 | (buf, fds) |
3551 | } |
3552 | } |
3553 | impl<'input> crate::x11_utils::VoidRequest for AddGlyphsRequest<'input> { |
3554 | } |
3555 | |
3556 | /// Opcode for the FreeGlyphs request |
3557 | pub const FREE_GLYPHS_REQUEST: u8 = 22; |
3558 | #[derive (Clone, Default)] |
3559 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3560 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3561 | pub struct FreeGlyphsRequest<'input> { |
3562 | pub glyphset: Glyphset, |
3563 | pub glyphs: Cow<'input, [Glyph]>, |
3564 | } |
3565 | impl_debug_if_no_extra_traits!(FreeGlyphsRequest<'_>, "FreeGlyphsRequest" ); |
3566 | impl<'input> FreeGlyphsRequest<'input> { |
3567 | /// Serialize this request into bytes for the provided connection |
3568 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
3569 | let length_so_far = 0; |
3570 | let glyphset_bytes = self.glyphset.serialize(); |
3571 | let mut request0 = vec![ |
3572 | major_opcode, |
3573 | FREE_GLYPHS_REQUEST, |
3574 | 0, |
3575 | 0, |
3576 | glyphset_bytes[0], |
3577 | glyphset_bytes[1], |
3578 | glyphset_bytes[2], |
3579 | glyphset_bytes[3], |
3580 | ]; |
3581 | let length_so_far = length_so_far + request0.len(); |
3582 | let glyphs_bytes = self.glyphs.serialize(); |
3583 | let length_so_far = length_so_far + glyphs_bytes.len(); |
3584 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
3585 | let length_so_far = length_so_far + padding0.len(); |
3586 | assert_eq!(length_so_far % 4, 0); |
3587 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3588 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3589 | ([request0.into(), glyphs_bytes.into(), padding0.into()], vec![]) |
3590 | } |
3591 | /// Parse this request given its header, its body, and any fds that go along with it |
3592 | #[cfg (feature = "request-parsing" )] |
3593 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
3594 | if header.minor_opcode != FREE_GLYPHS_REQUEST { |
3595 | return Err(ParseError::InvalidValue); |
3596 | } |
3597 | let (glyphset, remaining) = Glyphset::try_parse(value)?; |
3598 | let mut remaining = remaining; |
3599 | // Length is 'everything left in the input' |
3600 | let mut glyphs = Vec::new(); |
3601 | while !remaining.is_empty() { |
3602 | let (v, new_remaining) = Glyph::try_parse(remaining)?; |
3603 | remaining = new_remaining; |
3604 | glyphs.push(v); |
3605 | } |
3606 | let _ = remaining; |
3607 | Ok(FreeGlyphsRequest { |
3608 | glyphset, |
3609 | glyphs: Cow::Owned(glyphs), |
3610 | }) |
3611 | } |
3612 | /// Clone all borrowed data in this FreeGlyphsRequest. |
3613 | pub fn into_owned(self) -> FreeGlyphsRequest<'static> { |
3614 | FreeGlyphsRequest { |
3615 | glyphset: self.glyphset, |
3616 | glyphs: Cow::Owned(self.glyphs.into_owned()), |
3617 | } |
3618 | } |
3619 | } |
3620 | impl<'input> Request for FreeGlyphsRequest<'input> { |
3621 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3622 | |
3623 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3624 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
3625 | // Flatten the buffers into a single vector |
3626 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3627 | (buf, fds) |
3628 | } |
3629 | } |
3630 | impl<'input> crate::x11_utils::VoidRequest for FreeGlyphsRequest<'input> { |
3631 | } |
3632 | |
3633 | /// Opcode for the CompositeGlyphs8 request |
3634 | pub const COMPOSITE_GLYPHS8_REQUEST: u8 = 23; |
3635 | #[derive (Clone, Default)] |
3636 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3637 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3638 | pub struct CompositeGlyphs8Request<'input> { |
3639 | pub op: PictOp, |
3640 | pub src: Picture, |
3641 | pub dst: Picture, |
3642 | pub mask_format: Pictformat, |
3643 | pub glyphset: Glyphset, |
3644 | pub src_x: i16, |
3645 | pub src_y: i16, |
3646 | pub glyphcmds: Cow<'input, [u8]>, |
3647 | } |
3648 | impl_debug_if_no_extra_traits!(CompositeGlyphs8Request<'_>, "CompositeGlyphs8Request" ); |
3649 | impl<'input> CompositeGlyphs8Request<'input> { |
3650 | /// Serialize this request into bytes for the provided connection |
3651 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
3652 | let length_so_far = 0; |
3653 | let op_bytes = u8::from(self.op).serialize(); |
3654 | let src_bytes = self.src.serialize(); |
3655 | let dst_bytes = self.dst.serialize(); |
3656 | let mask_format_bytes = self.mask_format.serialize(); |
3657 | let glyphset_bytes = self.glyphset.serialize(); |
3658 | let src_x_bytes = self.src_x.serialize(); |
3659 | let src_y_bytes = self.src_y.serialize(); |
3660 | let mut request0 = vec![ |
3661 | major_opcode, |
3662 | COMPOSITE_GLYPHS8_REQUEST, |
3663 | 0, |
3664 | 0, |
3665 | op_bytes[0], |
3666 | 0, |
3667 | 0, |
3668 | 0, |
3669 | src_bytes[0], |
3670 | src_bytes[1], |
3671 | src_bytes[2], |
3672 | src_bytes[3], |
3673 | dst_bytes[0], |
3674 | dst_bytes[1], |
3675 | dst_bytes[2], |
3676 | dst_bytes[3], |
3677 | mask_format_bytes[0], |
3678 | mask_format_bytes[1], |
3679 | mask_format_bytes[2], |
3680 | mask_format_bytes[3], |
3681 | glyphset_bytes[0], |
3682 | glyphset_bytes[1], |
3683 | glyphset_bytes[2], |
3684 | glyphset_bytes[3], |
3685 | src_x_bytes[0], |
3686 | src_x_bytes[1], |
3687 | src_y_bytes[0], |
3688 | src_y_bytes[1], |
3689 | ]; |
3690 | let length_so_far = length_so_far + request0.len(); |
3691 | let length_so_far = length_so_far + self.glyphcmds.len(); |
3692 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
3693 | let length_so_far = length_so_far + padding0.len(); |
3694 | assert_eq!(length_so_far % 4, 0); |
3695 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3696 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3697 | ([request0.into(), self.glyphcmds, padding0.into()], vec![]) |
3698 | } |
3699 | /// Parse this request given its header, its body, and any fds that go along with it |
3700 | #[cfg (feature = "request-parsing" )] |
3701 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
3702 | if header.minor_opcode != COMPOSITE_GLYPHS8_REQUEST { |
3703 | return Err(ParseError::InvalidValue); |
3704 | } |
3705 | let (op, remaining) = u8::try_parse(value)?; |
3706 | let op = op.into(); |
3707 | let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?; |
3708 | let (src, remaining) = Picture::try_parse(remaining)?; |
3709 | let (dst, remaining) = Picture::try_parse(remaining)?; |
3710 | let (mask_format, remaining) = Pictformat::try_parse(remaining)?; |
3711 | let (glyphset, remaining) = Glyphset::try_parse(remaining)?; |
3712 | let (src_x, remaining) = i16::try_parse(remaining)?; |
3713 | let (src_y, remaining) = i16::try_parse(remaining)?; |
3714 | let (glyphcmds, remaining) = remaining.split_at(remaining.len()); |
3715 | let _ = remaining; |
3716 | Ok(CompositeGlyphs8Request { |
3717 | op, |
3718 | src, |
3719 | dst, |
3720 | mask_format, |
3721 | glyphset, |
3722 | src_x, |
3723 | src_y, |
3724 | glyphcmds: Cow::Borrowed(glyphcmds), |
3725 | }) |
3726 | } |
3727 | /// Clone all borrowed data in this CompositeGlyphs8Request. |
3728 | pub fn into_owned(self) -> CompositeGlyphs8Request<'static> { |
3729 | CompositeGlyphs8Request { |
3730 | op: self.op, |
3731 | src: self.src, |
3732 | dst: self.dst, |
3733 | mask_format: self.mask_format, |
3734 | glyphset: self.glyphset, |
3735 | src_x: self.src_x, |
3736 | src_y: self.src_y, |
3737 | glyphcmds: Cow::Owned(self.glyphcmds.into_owned()), |
3738 | } |
3739 | } |
3740 | } |
3741 | impl<'input> Request for CompositeGlyphs8Request<'input> { |
3742 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3743 | |
3744 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3745 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
3746 | // Flatten the buffers into a single vector |
3747 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3748 | (buf, fds) |
3749 | } |
3750 | } |
3751 | impl<'input> crate::x11_utils::VoidRequest for CompositeGlyphs8Request<'input> { |
3752 | } |
3753 | |
3754 | /// Opcode for the CompositeGlyphs16 request |
3755 | pub const COMPOSITE_GLYPHS16_REQUEST: u8 = 24; |
3756 | #[derive (Clone, Default)] |
3757 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3758 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3759 | pub struct CompositeGlyphs16Request<'input> { |
3760 | pub op: PictOp, |
3761 | pub src: Picture, |
3762 | pub dst: Picture, |
3763 | pub mask_format: Pictformat, |
3764 | pub glyphset: Glyphset, |
3765 | pub src_x: i16, |
3766 | pub src_y: i16, |
3767 | pub glyphcmds: Cow<'input, [u8]>, |
3768 | } |
3769 | impl_debug_if_no_extra_traits!(CompositeGlyphs16Request<'_>, "CompositeGlyphs16Request" ); |
3770 | impl<'input> CompositeGlyphs16Request<'input> { |
3771 | /// Serialize this request into bytes for the provided connection |
3772 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
3773 | let length_so_far = 0; |
3774 | let op_bytes = u8::from(self.op).serialize(); |
3775 | let src_bytes = self.src.serialize(); |
3776 | let dst_bytes = self.dst.serialize(); |
3777 | let mask_format_bytes = self.mask_format.serialize(); |
3778 | let glyphset_bytes = self.glyphset.serialize(); |
3779 | let src_x_bytes = self.src_x.serialize(); |
3780 | let src_y_bytes = self.src_y.serialize(); |
3781 | let mut request0 = vec![ |
3782 | major_opcode, |
3783 | COMPOSITE_GLYPHS16_REQUEST, |
3784 | 0, |
3785 | 0, |
3786 | op_bytes[0], |
3787 | 0, |
3788 | 0, |
3789 | 0, |
3790 | src_bytes[0], |
3791 | src_bytes[1], |
3792 | src_bytes[2], |
3793 | src_bytes[3], |
3794 | dst_bytes[0], |
3795 | dst_bytes[1], |
3796 | dst_bytes[2], |
3797 | dst_bytes[3], |
3798 | mask_format_bytes[0], |
3799 | mask_format_bytes[1], |
3800 | mask_format_bytes[2], |
3801 | mask_format_bytes[3], |
3802 | glyphset_bytes[0], |
3803 | glyphset_bytes[1], |
3804 | glyphset_bytes[2], |
3805 | glyphset_bytes[3], |
3806 | src_x_bytes[0], |
3807 | src_x_bytes[1], |
3808 | src_y_bytes[0], |
3809 | src_y_bytes[1], |
3810 | ]; |
3811 | let length_so_far = length_so_far + request0.len(); |
3812 | let length_so_far = length_so_far + self.glyphcmds.len(); |
3813 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
3814 | let length_so_far = length_so_far + padding0.len(); |
3815 | assert_eq!(length_so_far % 4, 0); |
3816 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3817 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3818 | ([request0.into(), self.glyphcmds, padding0.into()], vec![]) |
3819 | } |
3820 | /// Parse this request given its header, its body, and any fds that go along with it |
3821 | #[cfg (feature = "request-parsing" )] |
3822 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
3823 | if header.minor_opcode != COMPOSITE_GLYPHS16_REQUEST { |
3824 | return Err(ParseError::InvalidValue); |
3825 | } |
3826 | let (op, remaining) = u8::try_parse(value)?; |
3827 | let op = op.into(); |
3828 | let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?; |
3829 | let (src, remaining) = Picture::try_parse(remaining)?; |
3830 | let (dst, remaining) = Picture::try_parse(remaining)?; |
3831 | let (mask_format, remaining) = Pictformat::try_parse(remaining)?; |
3832 | let (glyphset, remaining) = Glyphset::try_parse(remaining)?; |
3833 | let (src_x, remaining) = i16::try_parse(remaining)?; |
3834 | let (src_y, remaining) = i16::try_parse(remaining)?; |
3835 | let (glyphcmds, remaining) = remaining.split_at(remaining.len()); |
3836 | let _ = remaining; |
3837 | Ok(CompositeGlyphs16Request { |
3838 | op, |
3839 | src, |
3840 | dst, |
3841 | mask_format, |
3842 | glyphset, |
3843 | src_x, |
3844 | src_y, |
3845 | glyphcmds: Cow::Borrowed(glyphcmds), |
3846 | }) |
3847 | } |
3848 | /// Clone all borrowed data in this CompositeGlyphs16Request. |
3849 | pub fn into_owned(self) -> CompositeGlyphs16Request<'static> { |
3850 | CompositeGlyphs16Request { |
3851 | op: self.op, |
3852 | src: self.src, |
3853 | dst: self.dst, |
3854 | mask_format: self.mask_format, |
3855 | glyphset: self.glyphset, |
3856 | src_x: self.src_x, |
3857 | src_y: self.src_y, |
3858 | glyphcmds: Cow::Owned(self.glyphcmds.into_owned()), |
3859 | } |
3860 | } |
3861 | } |
3862 | impl<'input> Request for CompositeGlyphs16Request<'input> { |
3863 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3864 | |
3865 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3866 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
3867 | // Flatten the buffers into a single vector |
3868 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3869 | (buf, fds) |
3870 | } |
3871 | } |
3872 | impl<'input> crate::x11_utils::VoidRequest for CompositeGlyphs16Request<'input> { |
3873 | } |
3874 | |
3875 | /// Opcode for the CompositeGlyphs32 request |
3876 | pub const COMPOSITE_GLYPHS32_REQUEST: u8 = 25; |
3877 | #[derive (Clone, Default)] |
3878 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
3879 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
3880 | pub struct CompositeGlyphs32Request<'input> { |
3881 | pub op: PictOp, |
3882 | pub src: Picture, |
3883 | pub dst: Picture, |
3884 | pub mask_format: Pictformat, |
3885 | pub glyphset: Glyphset, |
3886 | pub src_x: i16, |
3887 | pub src_y: i16, |
3888 | pub glyphcmds: Cow<'input, [u8]>, |
3889 | } |
3890 | impl_debug_if_no_extra_traits!(CompositeGlyphs32Request<'_>, "CompositeGlyphs32Request" ); |
3891 | impl<'input> CompositeGlyphs32Request<'input> { |
3892 | /// Serialize this request into bytes for the provided connection |
3893 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
3894 | let length_so_far = 0; |
3895 | let op_bytes = u8::from(self.op).serialize(); |
3896 | let src_bytes = self.src.serialize(); |
3897 | let dst_bytes = self.dst.serialize(); |
3898 | let mask_format_bytes = self.mask_format.serialize(); |
3899 | let glyphset_bytes = self.glyphset.serialize(); |
3900 | let src_x_bytes = self.src_x.serialize(); |
3901 | let src_y_bytes = self.src_y.serialize(); |
3902 | let mut request0 = vec![ |
3903 | major_opcode, |
3904 | COMPOSITE_GLYPHS32_REQUEST, |
3905 | 0, |
3906 | 0, |
3907 | op_bytes[0], |
3908 | 0, |
3909 | 0, |
3910 | 0, |
3911 | src_bytes[0], |
3912 | src_bytes[1], |
3913 | src_bytes[2], |
3914 | src_bytes[3], |
3915 | dst_bytes[0], |
3916 | dst_bytes[1], |
3917 | dst_bytes[2], |
3918 | dst_bytes[3], |
3919 | mask_format_bytes[0], |
3920 | mask_format_bytes[1], |
3921 | mask_format_bytes[2], |
3922 | mask_format_bytes[3], |
3923 | glyphset_bytes[0], |
3924 | glyphset_bytes[1], |
3925 | glyphset_bytes[2], |
3926 | glyphset_bytes[3], |
3927 | src_x_bytes[0], |
3928 | src_x_bytes[1], |
3929 | src_y_bytes[0], |
3930 | src_y_bytes[1], |
3931 | ]; |
3932 | let length_so_far = length_so_far + request0.len(); |
3933 | let length_so_far = length_so_far + self.glyphcmds.len(); |
3934 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
3935 | let length_so_far = length_so_far + padding0.len(); |
3936 | assert_eq!(length_so_far % 4, 0); |
3937 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
3938 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
3939 | ([request0.into(), self.glyphcmds, padding0.into()], vec![]) |
3940 | } |
3941 | /// Parse this request given its header, its body, and any fds that go along with it |
3942 | #[cfg (feature = "request-parsing" )] |
3943 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
3944 | if header.minor_opcode != COMPOSITE_GLYPHS32_REQUEST { |
3945 | return Err(ParseError::InvalidValue); |
3946 | } |
3947 | let (op, remaining) = u8::try_parse(value)?; |
3948 | let op = op.into(); |
3949 | let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?; |
3950 | let (src, remaining) = Picture::try_parse(remaining)?; |
3951 | let (dst, remaining) = Picture::try_parse(remaining)?; |
3952 | let (mask_format, remaining) = Pictformat::try_parse(remaining)?; |
3953 | let (glyphset, remaining) = Glyphset::try_parse(remaining)?; |
3954 | let (src_x, remaining) = i16::try_parse(remaining)?; |
3955 | let (src_y, remaining) = i16::try_parse(remaining)?; |
3956 | let (glyphcmds, remaining) = remaining.split_at(remaining.len()); |
3957 | let _ = remaining; |
3958 | Ok(CompositeGlyphs32Request { |
3959 | op, |
3960 | src, |
3961 | dst, |
3962 | mask_format, |
3963 | glyphset, |
3964 | src_x, |
3965 | src_y, |
3966 | glyphcmds: Cow::Borrowed(glyphcmds), |
3967 | }) |
3968 | } |
3969 | /// Clone all borrowed data in this CompositeGlyphs32Request. |
3970 | pub fn into_owned(self) -> CompositeGlyphs32Request<'static> { |
3971 | CompositeGlyphs32Request { |
3972 | op: self.op, |
3973 | src: self.src, |
3974 | dst: self.dst, |
3975 | mask_format: self.mask_format, |
3976 | glyphset: self.glyphset, |
3977 | src_x: self.src_x, |
3978 | src_y: self.src_y, |
3979 | glyphcmds: Cow::Owned(self.glyphcmds.into_owned()), |
3980 | } |
3981 | } |
3982 | } |
3983 | impl<'input> Request for CompositeGlyphs32Request<'input> { |
3984 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
3985 | |
3986 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
3987 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
3988 | // Flatten the buffers into a single vector |
3989 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
3990 | (buf, fds) |
3991 | } |
3992 | } |
3993 | impl<'input> crate::x11_utils::VoidRequest for CompositeGlyphs32Request<'input> { |
3994 | } |
3995 | |
3996 | /// Opcode for the FillRectangles request |
3997 | pub const FILL_RECTANGLES_REQUEST: u8 = 26; |
3998 | #[derive (Clone, Default)] |
3999 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4000 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4001 | pub struct FillRectanglesRequest<'input> { |
4002 | pub op: PictOp, |
4003 | pub dst: Picture, |
4004 | pub color: Color, |
4005 | pub rects: Cow<'input, [xproto::Rectangle]>, |
4006 | } |
4007 | impl_debug_if_no_extra_traits!(FillRectanglesRequest<'_>, "FillRectanglesRequest" ); |
4008 | impl<'input> FillRectanglesRequest<'input> { |
4009 | /// Serialize this request into bytes for the provided connection |
4010 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
4011 | let length_so_far = 0; |
4012 | let op_bytes = u8::from(self.op).serialize(); |
4013 | let dst_bytes = self.dst.serialize(); |
4014 | let color_bytes = self.color.serialize(); |
4015 | let mut request0 = vec![ |
4016 | major_opcode, |
4017 | FILL_RECTANGLES_REQUEST, |
4018 | 0, |
4019 | 0, |
4020 | op_bytes[0], |
4021 | 0, |
4022 | 0, |
4023 | 0, |
4024 | dst_bytes[0], |
4025 | dst_bytes[1], |
4026 | dst_bytes[2], |
4027 | dst_bytes[3], |
4028 | color_bytes[0], |
4029 | color_bytes[1], |
4030 | color_bytes[2], |
4031 | color_bytes[3], |
4032 | color_bytes[4], |
4033 | color_bytes[5], |
4034 | color_bytes[6], |
4035 | color_bytes[7], |
4036 | ]; |
4037 | let length_so_far = length_so_far + request0.len(); |
4038 | let rects_bytes = self.rects.serialize(); |
4039 | let length_so_far = length_so_far + rects_bytes.len(); |
4040 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
4041 | let length_so_far = length_so_far + padding0.len(); |
4042 | assert_eq!(length_so_far % 4, 0); |
4043 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
4044 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
4045 | ([request0.into(), rects_bytes.into(), padding0.into()], vec![]) |
4046 | } |
4047 | /// Parse this request given its header, its body, and any fds that go along with it |
4048 | #[cfg (feature = "request-parsing" )] |
4049 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
4050 | if header.minor_opcode != FILL_RECTANGLES_REQUEST { |
4051 | return Err(ParseError::InvalidValue); |
4052 | } |
4053 | let (op, remaining) = u8::try_parse(value)?; |
4054 | let op = op.into(); |
4055 | let remaining = remaining.get(3..).ok_or(ParseError::InsufficientData)?; |
4056 | let (dst, remaining) = Picture::try_parse(remaining)?; |
4057 | let (color, remaining) = Color::try_parse(remaining)?; |
4058 | let mut remaining = remaining; |
4059 | // Length is 'everything left in the input' |
4060 | let mut rects = Vec::new(); |
4061 | while !remaining.is_empty() { |
4062 | let (v, new_remaining) = xproto::Rectangle::try_parse(remaining)?; |
4063 | remaining = new_remaining; |
4064 | rects.push(v); |
4065 | } |
4066 | let _ = remaining; |
4067 | Ok(FillRectanglesRequest { |
4068 | op, |
4069 | dst, |
4070 | color, |
4071 | rects: Cow::Owned(rects), |
4072 | }) |
4073 | } |
4074 | /// Clone all borrowed data in this FillRectanglesRequest. |
4075 | pub fn into_owned(self) -> FillRectanglesRequest<'static> { |
4076 | FillRectanglesRequest { |
4077 | op: self.op, |
4078 | dst: self.dst, |
4079 | color: self.color, |
4080 | rects: Cow::Owned(self.rects.into_owned()), |
4081 | } |
4082 | } |
4083 | } |
4084 | impl<'input> Request for FillRectanglesRequest<'input> { |
4085 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
4086 | |
4087 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
4088 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
4089 | // Flatten the buffers into a single vector |
4090 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
4091 | (buf, fds) |
4092 | } |
4093 | } |
4094 | impl<'input> crate::x11_utils::VoidRequest for FillRectanglesRequest<'input> { |
4095 | } |
4096 | |
4097 | /// Opcode for the CreateCursor request |
4098 | pub const CREATE_CURSOR_REQUEST: u8 = 27; |
4099 | #[derive (Clone, Copy, Default)] |
4100 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4101 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4102 | pub struct CreateCursorRequest { |
4103 | pub cid: xproto::Cursor, |
4104 | pub source: Picture, |
4105 | pub x: u16, |
4106 | pub y: u16, |
4107 | } |
4108 | impl_debug_if_no_extra_traits!(CreateCursorRequest, "CreateCursorRequest" ); |
4109 | impl CreateCursorRequest { |
4110 | /// Serialize this request into bytes for the provided connection |
4111 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
4112 | let length_so_far = 0; |
4113 | let cid_bytes = self.cid.serialize(); |
4114 | let source_bytes = self.source.serialize(); |
4115 | let x_bytes = self.x.serialize(); |
4116 | let y_bytes = self.y.serialize(); |
4117 | let mut request0 = vec![ |
4118 | major_opcode, |
4119 | CREATE_CURSOR_REQUEST, |
4120 | 0, |
4121 | 0, |
4122 | cid_bytes[0], |
4123 | cid_bytes[1], |
4124 | cid_bytes[2], |
4125 | cid_bytes[3], |
4126 | source_bytes[0], |
4127 | source_bytes[1], |
4128 | source_bytes[2], |
4129 | source_bytes[3], |
4130 | x_bytes[0], |
4131 | x_bytes[1], |
4132 | y_bytes[0], |
4133 | y_bytes[1], |
4134 | ]; |
4135 | let length_so_far = length_so_far + request0.len(); |
4136 | assert_eq!(length_so_far % 4, 0); |
4137 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
4138 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
4139 | ([request0.into()], vec![]) |
4140 | } |
4141 | /// Parse this request given its header, its body, and any fds that go along with it |
4142 | #[cfg (feature = "request-parsing" )] |
4143 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
4144 | if header.minor_opcode != CREATE_CURSOR_REQUEST { |
4145 | return Err(ParseError::InvalidValue); |
4146 | } |
4147 | let (cid, remaining) = xproto::Cursor::try_parse(value)?; |
4148 | let (source, remaining) = Picture::try_parse(remaining)?; |
4149 | let (x, remaining) = u16::try_parse(remaining)?; |
4150 | let (y, remaining) = u16::try_parse(remaining)?; |
4151 | let _ = remaining; |
4152 | Ok(CreateCursorRequest { |
4153 | cid, |
4154 | source, |
4155 | x, |
4156 | y, |
4157 | }) |
4158 | } |
4159 | } |
4160 | impl Request for CreateCursorRequest { |
4161 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
4162 | |
4163 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
4164 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
4165 | // Flatten the buffers into a single vector |
4166 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
4167 | (buf, fds) |
4168 | } |
4169 | } |
4170 | impl crate::x11_utils::VoidRequest for CreateCursorRequest { |
4171 | } |
4172 | |
4173 | #[derive (Clone, Copy, Default)] |
4174 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4175 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4176 | pub struct Transform { |
4177 | pub matrix11: Fixed, |
4178 | pub matrix12: Fixed, |
4179 | pub matrix13: Fixed, |
4180 | pub matrix21: Fixed, |
4181 | pub matrix22: Fixed, |
4182 | pub matrix23: Fixed, |
4183 | pub matrix31: Fixed, |
4184 | pub matrix32: Fixed, |
4185 | pub matrix33: Fixed, |
4186 | } |
4187 | impl_debug_if_no_extra_traits!(Transform, "Transform" ); |
4188 | impl TryParse for Transform { |
4189 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
4190 | let (matrix11: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
4191 | let (matrix12: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
4192 | let (matrix13: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
4193 | let (matrix21: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
4194 | let (matrix22: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
4195 | let (matrix23: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
4196 | let (matrix31: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
4197 | let (matrix32: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
4198 | let (matrix33: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
4199 | let result: Transform = Transform { matrix11, matrix12, matrix13, matrix21, matrix22, matrix23, matrix31, matrix32, matrix33 }; |
4200 | Ok((result, remaining)) |
4201 | } |
4202 | } |
4203 | impl Serialize for Transform { |
4204 | type Bytes = [u8; 36]; |
4205 | fn serialize(&self) -> [u8; 36] { |
4206 | let matrix11_bytes = self.matrix11.serialize(); |
4207 | let matrix12_bytes = self.matrix12.serialize(); |
4208 | let matrix13_bytes = self.matrix13.serialize(); |
4209 | let matrix21_bytes = self.matrix21.serialize(); |
4210 | let matrix22_bytes = self.matrix22.serialize(); |
4211 | let matrix23_bytes = self.matrix23.serialize(); |
4212 | let matrix31_bytes = self.matrix31.serialize(); |
4213 | let matrix32_bytes = self.matrix32.serialize(); |
4214 | let matrix33_bytes = self.matrix33.serialize(); |
4215 | [ |
4216 | matrix11_bytes[0], |
4217 | matrix11_bytes[1], |
4218 | matrix11_bytes[2], |
4219 | matrix11_bytes[3], |
4220 | matrix12_bytes[0], |
4221 | matrix12_bytes[1], |
4222 | matrix12_bytes[2], |
4223 | matrix12_bytes[3], |
4224 | matrix13_bytes[0], |
4225 | matrix13_bytes[1], |
4226 | matrix13_bytes[2], |
4227 | matrix13_bytes[3], |
4228 | matrix21_bytes[0], |
4229 | matrix21_bytes[1], |
4230 | matrix21_bytes[2], |
4231 | matrix21_bytes[3], |
4232 | matrix22_bytes[0], |
4233 | matrix22_bytes[1], |
4234 | matrix22_bytes[2], |
4235 | matrix22_bytes[3], |
4236 | matrix23_bytes[0], |
4237 | matrix23_bytes[1], |
4238 | matrix23_bytes[2], |
4239 | matrix23_bytes[3], |
4240 | matrix31_bytes[0], |
4241 | matrix31_bytes[1], |
4242 | matrix31_bytes[2], |
4243 | matrix31_bytes[3], |
4244 | matrix32_bytes[0], |
4245 | matrix32_bytes[1], |
4246 | matrix32_bytes[2], |
4247 | matrix32_bytes[3], |
4248 | matrix33_bytes[0], |
4249 | matrix33_bytes[1], |
4250 | matrix33_bytes[2], |
4251 | matrix33_bytes[3], |
4252 | ] |
4253 | } |
4254 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
4255 | bytes.reserve(36); |
4256 | self.matrix11.serialize_into(bytes); |
4257 | self.matrix12.serialize_into(bytes); |
4258 | self.matrix13.serialize_into(bytes); |
4259 | self.matrix21.serialize_into(bytes); |
4260 | self.matrix22.serialize_into(bytes); |
4261 | self.matrix23.serialize_into(bytes); |
4262 | self.matrix31.serialize_into(bytes); |
4263 | self.matrix32.serialize_into(bytes); |
4264 | self.matrix33.serialize_into(bytes); |
4265 | } |
4266 | } |
4267 | |
4268 | /// Opcode for the SetPictureTransform request |
4269 | pub const SET_PICTURE_TRANSFORM_REQUEST: u8 = 28; |
4270 | #[derive (Clone, Copy, Default)] |
4271 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4272 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4273 | pub struct SetPictureTransformRequest { |
4274 | pub picture: Picture, |
4275 | pub transform: Transform, |
4276 | } |
4277 | impl_debug_if_no_extra_traits!(SetPictureTransformRequest, "SetPictureTransformRequest" ); |
4278 | impl SetPictureTransformRequest { |
4279 | /// Serialize this request into bytes for the provided connection |
4280 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
4281 | let length_so_far = 0; |
4282 | let picture_bytes = self.picture.serialize(); |
4283 | let transform_bytes = self.transform.serialize(); |
4284 | let mut request0 = vec![ |
4285 | major_opcode, |
4286 | SET_PICTURE_TRANSFORM_REQUEST, |
4287 | 0, |
4288 | 0, |
4289 | picture_bytes[0], |
4290 | picture_bytes[1], |
4291 | picture_bytes[2], |
4292 | picture_bytes[3], |
4293 | transform_bytes[0], |
4294 | transform_bytes[1], |
4295 | transform_bytes[2], |
4296 | transform_bytes[3], |
4297 | transform_bytes[4], |
4298 | transform_bytes[5], |
4299 | transform_bytes[6], |
4300 | transform_bytes[7], |
4301 | transform_bytes[8], |
4302 | transform_bytes[9], |
4303 | transform_bytes[10], |
4304 | transform_bytes[11], |
4305 | transform_bytes[12], |
4306 | transform_bytes[13], |
4307 | transform_bytes[14], |
4308 | transform_bytes[15], |
4309 | transform_bytes[16], |
4310 | transform_bytes[17], |
4311 | transform_bytes[18], |
4312 | transform_bytes[19], |
4313 | transform_bytes[20], |
4314 | transform_bytes[21], |
4315 | transform_bytes[22], |
4316 | transform_bytes[23], |
4317 | transform_bytes[24], |
4318 | transform_bytes[25], |
4319 | transform_bytes[26], |
4320 | transform_bytes[27], |
4321 | transform_bytes[28], |
4322 | transform_bytes[29], |
4323 | transform_bytes[30], |
4324 | transform_bytes[31], |
4325 | transform_bytes[32], |
4326 | transform_bytes[33], |
4327 | transform_bytes[34], |
4328 | transform_bytes[35], |
4329 | ]; |
4330 | let length_so_far = length_so_far + request0.len(); |
4331 | assert_eq!(length_so_far % 4, 0); |
4332 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
4333 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
4334 | ([request0.into()], vec![]) |
4335 | } |
4336 | /// Parse this request given its header, its body, and any fds that go along with it |
4337 | #[cfg (feature = "request-parsing" )] |
4338 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
4339 | if header.minor_opcode != SET_PICTURE_TRANSFORM_REQUEST { |
4340 | return Err(ParseError::InvalidValue); |
4341 | } |
4342 | let (picture, remaining) = Picture::try_parse(value)?; |
4343 | let (transform, remaining) = Transform::try_parse(remaining)?; |
4344 | let _ = remaining; |
4345 | Ok(SetPictureTransformRequest { |
4346 | picture, |
4347 | transform, |
4348 | }) |
4349 | } |
4350 | } |
4351 | impl Request for SetPictureTransformRequest { |
4352 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
4353 | |
4354 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
4355 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
4356 | // Flatten the buffers into a single vector |
4357 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
4358 | (buf, fds) |
4359 | } |
4360 | } |
4361 | impl crate::x11_utils::VoidRequest for SetPictureTransformRequest { |
4362 | } |
4363 | |
4364 | /// Opcode for the QueryFilters request |
4365 | pub const QUERY_FILTERS_REQUEST: u8 = 29; |
4366 | #[derive (Clone, Copy, Default)] |
4367 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4368 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4369 | pub struct QueryFiltersRequest { |
4370 | pub drawable: xproto::Drawable, |
4371 | } |
4372 | impl_debug_if_no_extra_traits!(QueryFiltersRequest, "QueryFiltersRequest" ); |
4373 | impl QueryFiltersRequest { |
4374 | /// Serialize this request into bytes for the provided connection |
4375 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
4376 | let length_so_far = 0; |
4377 | let drawable_bytes = self.drawable.serialize(); |
4378 | let mut request0 = vec![ |
4379 | major_opcode, |
4380 | QUERY_FILTERS_REQUEST, |
4381 | 0, |
4382 | 0, |
4383 | drawable_bytes[0], |
4384 | drawable_bytes[1], |
4385 | drawable_bytes[2], |
4386 | drawable_bytes[3], |
4387 | ]; |
4388 | let length_so_far = length_so_far + request0.len(); |
4389 | assert_eq!(length_so_far % 4, 0); |
4390 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
4391 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
4392 | ([request0.into()], vec![]) |
4393 | } |
4394 | /// Parse this request given its header, its body, and any fds that go along with it |
4395 | #[cfg (feature = "request-parsing" )] |
4396 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
4397 | if header.minor_opcode != QUERY_FILTERS_REQUEST { |
4398 | return Err(ParseError::InvalidValue); |
4399 | } |
4400 | let (drawable, remaining) = xproto::Drawable::try_parse(value)?; |
4401 | let _ = remaining; |
4402 | Ok(QueryFiltersRequest { |
4403 | drawable, |
4404 | }) |
4405 | } |
4406 | } |
4407 | impl Request for QueryFiltersRequest { |
4408 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
4409 | |
4410 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
4411 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
4412 | // Flatten the buffers into a single vector |
4413 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
4414 | (buf, fds) |
4415 | } |
4416 | } |
4417 | impl crate::x11_utils::ReplyRequest for QueryFiltersRequest { |
4418 | type Reply = QueryFiltersReply; |
4419 | } |
4420 | |
4421 | #[derive (Clone, Default)] |
4422 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4423 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4424 | pub struct QueryFiltersReply { |
4425 | pub sequence: u16, |
4426 | pub length: u32, |
4427 | pub aliases: Vec<u16>, |
4428 | pub filters: Vec<xproto::Str>, |
4429 | } |
4430 | impl_debug_if_no_extra_traits!(QueryFiltersReply, "QueryFiltersReply" ); |
4431 | impl TryParse for QueryFiltersReply { |
4432 | fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
4433 | let remaining: &[u8] = initial_value; |
4434 | let (response_type: u8, remaining: &[u8]) = u8::try_parse(remaining)?; |
4435 | let remaining: &[u8] = remaining.get(1..).ok_or(err:ParseError::InsufficientData)?; |
4436 | let (sequence: u16, remaining: &[u8]) = u16::try_parse(remaining)?; |
4437 | let (length: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
4438 | let (num_aliases: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
4439 | let (num_filters: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
4440 | let remaining: &[u8] = remaining.get(16..).ok_or(err:ParseError::InsufficientData)?; |
4441 | let (aliases: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<u16>(data:remaining, list_length:num_aliases.try_to_usize()?)?; |
4442 | let (filters: Vec, remaining: &[u8]) = crate::x11_utils::parse_list::<xproto::Str>(data:remaining, list_length:num_filters.try_to_usize()?)?; |
4443 | if response_type != 1 { |
4444 | return Err(ParseError::InvalidValue); |
4445 | } |
4446 | let result: QueryFiltersReply = QueryFiltersReply { sequence, length, aliases, filters }; |
4447 | let _ = remaining; |
4448 | let remaining: &[u8] = initial_value.get(32 + length as usize * 4..) |
4449 | .ok_or(err:ParseError::InsufficientData)?; |
4450 | Ok((result, remaining)) |
4451 | } |
4452 | } |
4453 | impl Serialize for QueryFiltersReply { |
4454 | type Bytes = Vec<u8>; |
4455 | fn serialize(&self) -> Vec<u8> { |
4456 | let mut result: Vec = Vec::new(); |
4457 | self.serialize_into(&mut result); |
4458 | result |
4459 | } |
4460 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
4461 | bytes.reserve(additional:32); |
4462 | let response_type_bytes: &[u8; 1] = &[1]; |
4463 | bytes.push(response_type_bytes[0]); |
4464 | bytes.extend_from_slice(&[0; 1]); |
4465 | self.sequence.serialize_into(bytes); |
4466 | self.length.serialize_into(bytes); |
4467 | let num_aliases: u32 = u32::try_from(self.aliases.len()).expect(msg:"`aliases` has too many elements" ); |
4468 | num_aliases.serialize_into(bytes); |
4469 | let num_filters: u32 = u32::try_from(self.filters.len()).expect(msg:"`filters` has too many elements" ); |
4470 | num_filters.serialize_into(bytes); |
4471 | bytes.extend_from_slice(&[0; 16]); |
4472 | self.aliases.serialize_into(bytes); |
4473 | self.filters.serialize_into(bytes); |
4474 | } |
4475 | } |
4476 | impl QueryFiltersReply { |
4477 | /// Get the value of the `num_aliases` field. |
4478 | /// |
4479 | /// The `num_aliases` field is used as the length field of the `aliases` field. |
4480 | /// This function computes the field's value again based on the length of the list. |
4481 | /// |
4482 | /// # Panics |
4483 | /// |
4484 | /// Panics if the value cannot be represented in the target type. This |
4485 | /// cannot happen with values of the struct received from the X11 server. |
4486 | pub fn num_aliases(&self) -> u32 { |
4487 | self.aliases.len() |
4488 | .try_into().unwrap() |
4489 | } |
4490 | /// Get the value of the `num_filters` field. |
4491 | /// |
4492 | /// The `num_filters` field is used as the length field of the `filters` field. |
4493 | /// This function computes the field's value again based on the length of the list. |
4494 | /// |
4495 | /// # Panics |
4496 | /// |
4497 | /// Panics if the value cannot be represented in the target type. This |
4498 | /// cannot happen with values of the struct received from the X11 server. |
4499 | pub fn num_filters(&self) -> u32 { |
4500 | self.filters.len() |
4501 | .try_into().unwrap() |
4502 | } |
4503 | } |
4504 | |
4505 | /// Opcode for the SetPictureFilter request |
4506 | pub const SET_PICTURE_FILTER_REQUEST: u8 = 30; |
4507 | #[derive (Clone, Default)] |
4508 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4509 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4510 | pub struct SetPictureFilterRequest<'input> { |
4511 | pub picture: Picture, |
4512 | pub filter: Cow<'input, [u8]>, |
4513 | pub values: Cow<'input, [Fixed]>, |
4514 | } |
4515 | impl_debug_if_no_extra_traits!(SetPictureFilterRequest<'_>, "SetPictureFilterRequest" ); |
4516 | impl<'input> SetPictureFilterRequest<'input> { |
4517 | /// Serialize this request into bytes for the provided connection |
4518 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 5]> { |
4519 | let length_so_far = 0; |
4520 | let picture_bytes = self.picture.serialize(); |
4521 | let filter_len = u16::try_from(self.filter.len()).expect("`filter` has too many elements" ); |
4522 | let filter_len_bytes = filter_len.serialize(); |
4523 | let mut request0 = vec![ |
4524 | major_opcode, |
4525 | SET_PICTURE_FILTER_REQUEST, |
4526 | 0, |
4527 | 0, |
4528 | picture_bytes[0], |
4529 | picture_bytes[1], |
4530 | picture_bytes[2], |
4531 | picture_bytes[3], |
4532 | filter_len_bytes[0], |
4533 | filter_len_bytes[1], |
4534 | 0, |
4535 | 0, |
4536 | ]; |
4537 | let length_so_far = length_so_far + request0.len(); |
4538 | let length_so_far = length_so_far + self.filter.len(); |
4539 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
4540 | let length_so_far = length_so_far + padding0.len(); |
4541 | let values_bytes = self.values.serialize(); |
4542 | let length_so_far = length_so_far + values_bytes.len(); |
4543 | let padding1 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
4544 | let length_so_far = length_so_far + padding1.len(); |
4545 | assert_eq!(length_so_far % 4, 0); |
4546 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
4547 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
4548 | ([request0.into(), self.filter, padding0.into(), values_bytes.into(), padding1.into()], vec![]) |
4549 | } |
4550 | /// Parse this request given its header, its body, and any fds that go along with it |
4551 | #[cfg (feature = "request-parsing" )] |
4552 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
4553 | if header.minor_opcode != SET_PICTURE_FILTER_REQUEST { |
4554 | return Err(ParseError::InvalidValue); |
4555 | } |
4556 | let (picture, remaining) = Picture::try_parse(value)?; |
4557 | let (filter_len, remaining) = u16::try_parse(remaining)?; |
4558 | let remaining = remaining.get(2..).ok_or(ParseError::InsufficientData)?; |
4559 | let (filter, remaining) = crate::x11_utils::parse_u8_list(remaining, filter_len.try_to_usize()?)?; |
4560 | // Align offset to multiple of 4 |
4561 | let offset = remaining.as_ptr() as usize - value.as_ptr() as usize; |
4562 | let misalignment = (4 - (offset % 4)) % 4; |
4563 | let remaining = remaining.get(misalignment..).ok_or(ParseError::InsufficientData)?; |
4564 | let mut remaining = remaining; |
4565 | // Length is 'everything left in the input' |
4566 | let mut values = Vec::new(); |
4567 | while !remaining.is_empty() { |
4568 | let (v, new_remaining) = Fixed::try_parse(remaining)?; |
4569 | remaining = new_remaining; |
4570 | values.push(v); |
4571 | } |
4572 | let _ = remaining; |
4573 | Ok(SetPictureFilterRequest { |
4574 | picture, |
4575 | filter: Cow::Borrowed(filter), |
4576 | values: Cow::Owned(values), |
4577 | }) |
4578 | } |
4579 | /// Clone all borrowed data in this SetPictureFilterRequest. |
4580 | pub fn into_owned(self) -> SetPictureFilterRequest<'static> { |
4581 | SetPictureFilterRequest { |
4582 | picture: self.picture, |
4583 | filter: Cow::Owned(self.filter.into_owned()), |
4584 | values: Cow::Owned(self.values.into_owned()), |
4585 | } |
4586 | } |
4587 | } |
4588 | impl<'input> Request for SetPictureFilterRequest<'input> { |
4589 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
4590 | |
4591 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
4592 | let (bufs: [Cow<'_, [u8]>; 5], fds: Vec) = self.serialize(major_opcode); |
4593 | // Flatten the buffers into a single vector |
4594 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
4595 | (buf, fds) |
4596 | } |
4597 | } |
4598 | impl<'input> crate::x11_utils::VoidRequest for SetPictureFilterRequest<'input> { |
4599 | } |
4600 | |
4601 | #[derive (Clone, Copy, Default)] |
4602 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4603 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4604 | pub struct Animcursorelt { |
4605 | pub cursor: xproto::Cursor, |
4606 | pub delay: u32, |
4607 | } |
4608 | impl_debug_if_no_extra_traits!(Animcursorelt, "Animcursorelt" ); |
4609 | impl TryParse for Animcursorelt { |
4610 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
4611 | let (cursor: u32, remaining: &[u8]) = xproto::Cursor::try_parse(remaining)?; |
4612 | let (delay: u32, remaining: &[u8]) = u32::try_parse(remaining)?; |
4613 | let result: Animcursorelt = Animcursorelt { cursor, delay }; |
4614 | Ok((result, remaining)) |
4615 | } |
4616 | } |
4617 | impl Serialize for Animcursorelt { |
4618 | type Bytes = [u8; 8]; |
4619 | fn serialize(&self) -> [u8; 8] { |
4620 | let cursor_bytes: [u8; 4] = self.cursor.serialize(); |
4621 | let delay_bytes: [u8; 4] = self.delay.serialize(); |
4622 | [ |
4623 | cursor_bytes[0], |
4624 | cursor_bytes[1], |
4625 | cursor_bytes[2], |
4626 | cursor_bytes[3], |
4627 | delay_bytes[0], |
4628 | delay_bytes[1], |
4629 | delay_bytes[2], |
4630 | delay_bytes[3], |
4631 | ] |
4632 | } |
4633 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
4634 | bytes.reserve(additional:8); |
4635 | self.cursor.serialize_into(bytes); |
4636 | self.delay.serialize_into(bytes); |
4637 | } |
4638 | } |
4639 | |
4640 | /// Opcode for the CreateAnimCursor request |
4641 | pub const CREATE_ANIM_CURSOR_REQUEST: u8 = 31; |
4642 | #[derive (Clone, Default)] |
4643 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4644 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4645 | pub struct CreateAnimCursorRequest<'input> { |
4646 | pub cid: xproto::Cursor, |
4647 | pub cursors: Cow<'input, [Animcursorelt]>, |
4648 | } |
4649 | impl_debug_if_no_extra_traits!(CreateAnimCursorRequest<'_>, "CreateAnimCursorRequest" ); |
4650 | impl<'input> CreateAnimCursorRequest<'input> { |
4651 | /// Serialize this request into bytes for the provided connection |
4652 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
4653 | let length_so_far = 0; |
4654 | let cid_bytes = self.cid.serialize(); |
4655 | let mut request0 = vec![ |
4656 | major_opcode, |
4657 | CREATE_ANIM_CURSOR_REQUEST, |
4658 | 0, |
4659 | 0, |
4660 | cid_bytes[0], |
4661 | cid_bytes[1], |
4662 | cid_bytes[2], |
4663 | cid_bytes[3], |
4664 | ]; |
4665 | let length_so_far = length_so_far + request0.len(); |
4666 | let cursors_bytes = self.cursors.serialize(); |
4667 | let length_so_far = length_so_far + cursors_bytes.len(); |
4668 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
4669 | let length_so_far = length_so_far + padding0.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(), cursors_bytes.into(), padding0.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: &'input [u8]) -> Result<Self, ParseError> { |
4678 | if header.minor_opcode != CREATE_ANIM_CURSOR_REQUEST { |
4679 | return Err(ParseError::InvalidValue); |
4680 | } |
4681 | let (cid, remaining) = xproto::Cursor::try_parse(value)?; |
4682 | let mut remaining = remaining; |
4683 | // Length is 'everything left in the input' |
4684 | let mut cursors = Vec::new(); |
4685 | while !remaining.is_empty() { |
4686 | let (v, new_remaining) = Animcursorelt::try_parse(remaining)?; |
4687 | remaining = new_remaining; |
4688 | cursors.push(v); |
4689 | } |
4690 | let _ = remaining; |
4691 | Ok(CreateAnimCursorRequest { |
4692 | cid, |
4693 | cursors: Cow::Owned(cursors), |
4694 | }) |
4695 | } |
4696 | /// Clone all borrowed data in this CreateAnimCursorRequest. |
4697 | pub fn into_owned(self) -> CreateAnimCursorRequest<'static> { |
4698 | CreateAnimCursorRequest { |
4699 | cid: self.cid, |
4700 | cursors: Cow::Owned(self.cursors.into_owned()), |
4701 | } |
4702 | } |
4703 | } |
4704 | impl<'input> Request for CreateAnimCursorRequest<'input> { |
4705 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
4706 | |
4707 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
4708 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
4709 | // Flatten the buffers into a single vector |
4710 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
4711 | (buf, fds) |
4712 | } |
4713 | } |
4714 | impl<'input> crate::x11_utils::VoidRequest for CreateAnimCursorRequest<'input> { |
4715 | } |
4716 | |
4717 | #[derive (Clone, Copy, Default)] |
4718 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4719 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4720 | pub struct Spanfix { |
4721 | pub l: Fixed, |
4722 | pub r: Fixed, |
4723 | pub y: Fixed, |
4724 | } |
4725 | impl_debug_if_no_extra_traits!(Spanfix, "Spanfix" ); |
4726 | impl TryParse for Spanfix { |
4727 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
4728 | let (l: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
4729 | let (r: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
4730 | let (y: i32, remaining: &[u8]) = Fixed::try_parse(remaining)?; |
4731 | let result: Spanfix = Spanfix { l, r, y }; |
4732 | Ok((result, remaining)) |
4733 | } |
4734 | } |
4735 | impl Serialize for Spanfix { |
4736 | type Bytes = [u8; 12]; |
4737 | fn serialize(&self) -> [u8; 12] { |
4738 | let l_bytes = self.l.serialize(); |
4739 | let r_bytes = self.r.serialize(); |
4740 | let y_bytes = self.y.serialize(); |
4741 | [ |
4742 | l_bytes[0], |
4743 | l_bytes[1], |
4744 | l_bytes[2], |
4745 | l_bytes[3], |
4746 | r_bytes[0], |
4747 | r_bytes[1], |
4748 | r_bytes[2], |
4749 | r_bytes[3], |
4750 | y_bytes[0], |
4751 | y_bytes[1], |
4752 | y_bytes[2], |
4753 | y_bytes[3], |
4754 | ] |
4755 | } |
4756 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
4757 | bytes.reserve(12); |
4758 | self.l.serialize_into(bytes); |
4759 | self.r.serialize_into(bytes); |
4760 | self.y.serialize_into(bytes); |
4761 | } |
4762 | } |
4763 | |
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 Trap { |
4768 | pub top: Spanfix, |
4769 | pub bot: Spanfix, |
4770 | } |
4771 | impl_debug_if_no_extra_traits!(Trap, "Trap" ); |
4772 | impl TryParse for Trap { |
4773 | fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> { |
4774 | let (top: Spanfix, remaining: &[u8]) = Spanfix::try_parse(remaining)?; |
4775 | let (bot: Spanfix, remaining: &[u8]) = Spanfix::try_parse(remaining)?; |
4776 | let result: Trap = Trap { top, bot }; |
4777 | Ok((result, remaining)) |
4778 | } |
4779 | } |
4780 | impl Serialize for Trap { |
4781 | type Bytes = [u8; 24]; |
4782 | fn serialize(&self) -> [u8; 24] { |
4783 | let top_bytes = self.top.serialize(); |
4784 | let bot_bytes = self.bot.serialize(); |
4785 | [ |
4786 | top_bytes[0], |
4787 | top_bytes[1], |
4788 | top_bytes[2], |
4789 | top_bytes[3], |
4790 | top_bytes[4], |
4791 | top_bytes[5], |
4792 | top_bytes[6], |
4793 | top_bytes[7], |
4794 | top_bytes[8], |
4795 | top_bytes[9], |
4796 | top_bytes[10], |
4797 | top_bytes[11], |
4798 | bot_bytes[0], |
4799 | bot_bytes[1], |
4800 | bot_bytes[2], |
4801 | bot_bytes[3], |
4802 | bot_bytes[4], |
4803 | bot_bytes[5], |
4804 | bot_bytes[6], |
4805 | bot_bytes[7], |
4806 | bot_bytes[8], |
4807 | bot_bytes[9], |
4808 | bot_bytes[10], |
4809 | bot_bytes[11], |
4810 | ] |
4811 | } |
4812 | fn serialize_into(&self, bytes: &mut Vec<u8>) { |
4813 | bytes.reserve(24); |
4814 | self.top.serialize_into(bytes); |
4815 | self.bot.serialize_into(bytes); |
4816 | } |
4817 | } |
4818 | |
4819 | /// Opcode for the AddTraps request |
4820 | pub const ADD_TRAPS_REQUEST: u8 = 32; |
4821 | #[derive (Clone, Default)] |
4822 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4823 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4824 | pub struct AddTrapsRequest<'input> { |
4825 | pub picture: Picture, |
4826 | pub x_off: i16, |
4827 | pub y_off: i16, |
4828 | pub traps: Cow<'input, [Trap]>, |
4829 | } |
4830 | impl_debug_if_no_extra_traits!(AddTrapsRequest<'_>, "AddTrapsRequest" ); |
4831 | impl<'input> AddTrapsRequest<'input> { |
4832 | /// Serialize this request into bytes for the provided connection |
4833 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> { |
4834 | let length_so_far = 0; |
4835 | let picture_bytes = self.picture.serialize(); |
4836 | let x_off_bytes = self.x_off.serialize(); |
4837 | let y_off_bytes = self.y_off.serialize(); |
4838 | let mut request0 = vec![ |
4839 | major_opcode, |
4840 | ADD_TRAPS_REQUEST, |
4841 | 0, |
4842 | 0, |
4843 | picture_bytes[0], |
4844 | picture_bytes[1], |
4845 | picture_bytes[2], |
4846 | picture_bytes[3], |
4847 | x_off_bytes[0], |
4848 | x_off_bytes[1], |
4849 | y_off_bytes[0], |
4850 | y_off_bytes[1], |
4851 | ]; |
4852 | let length_so_far = length_so_far + request0.len(); |
4853 | let traps_bytes = self.traps.serialize(); |
4854 | let length_so_far = length_so_far + traps_bytes.len(); |
4855 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
4856 | let length_so_far = length_so_far + padding0.len(); |
4857 | assert_eq!(length_so_far % 4, 0); |
4858 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
4859 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
4860 | ([request0.into(), traps_bytes.into(), padding0.into()], vec![]) |
4861 | } |
4862 | /// Parse this request given its header, its body, and any fds that go along with it |
4863 | #[cfg (feature = "request-parsing" )] |
4864 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
4865 | if header.minor_opcode != ADD_TRAPS_REQUEST { |
4866 | return Err(ParseError::InvalidValue); |
4867 | } |
4868 | let (picture, remaining) = Picture::try_parse(value)?; |
4869 | let (x_off, remaining) = i16::try_parse(remaining)?; |
4870 | let (y_off, remaining) = i16::try_parse(remaining)?; |
4871 | let mut remaining = remaining; |
4872 | // Length is 'everything left in the input' |
4873 | let mut traps = Vec::new(); |
4874 | while !remaining.is_empty() { |
4875 | let (v, new_remaining) = Trap::try_parse(remaining)?; |
4876 | remaining = new_remaining; |
4877 | traps.push(v); |
4878 | } |
4879 | let _ = remaining; |
4880 | Ok(AddTrapsRequest { |
4881 | picture, |
4882 | x_off, |
4883 | y_off, |
4884 | traps: Cow::Owned(traps), |
4885 | }) |
4886 | } |
4887 | /// Clone all borrowed data in this AddTrapsRequest. |
4888 | pub fn into_owned(self) -> AddTrapsRequest<'static> { |
4889 | AddTrapsRequest { |
4890 | picture: self.picture, |
4891 | x_off: self.x_off, |
4892 | y_off: self.y_off, |
4893 | traps: Cow::Owned(self.traps.into_owned()), |
4894 | } |
4895 | } |
4896 | } |
4897 | impl<'input> Request for AddTrapsRequest<'input> { |
4898 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
4899 | |
4900 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
4901 | let (bufs: [Cow<'_, [u8]>; 3], fds: Vec) = self.serialize(major_opcode); |
4902 | // Flatten the buffers into a single vector |
4903 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
4904 | (buf, fds) |
4905 | } |
4906 | } |
4907 | impl<'input> crate::x11_utils::VoidRequest for AddTrapsRequest<'input> { |
4908 | } |
4909 | |
4910 | /// Opcode for the CreateSolidFill request |
4911 | pub const CREATE_SOLID_FILL_REQUEST: u8 = 33; |
4912 | #[derive (Clone, Copy, Default)] |
4913 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4914 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4915 | pub struct CreateSolidFillRequest { |
4916 | pub picture: Picture, |
4917 | pub color: Color, |
4918 | } |
4919 | impl_debug_if_no_extra_traits!(CreateSolidFillRequest, "CreateSolidFillRequest" ); |
4920 | impl CreateSolidFillRequest { |
4921 | /// Serialize this request into bytes for the provided connection |
4922 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> { |
4923 | let length_so_far = 0; |
4924 | let picture_bytes = self.picture.serialize(); |
4925 | let color_bytes = self.color.serialize(); |
4926 | let mut request0 = vec![ |
4927 | major_opcode, |
4928 | CREATE_SOLID_FILL_REQUEST, |
4929 | 0, |
4930 | 0, |
4931 | picture_bytes[0], |
4932 | picture_bytes[1], |
4933 | picture_bytes[2], |
4934 | picture_bytes[3], |
4935 | color_bytes[0], |
4936 | color_bytes[1], |
4937 | color_bytes[2], |
4938 | color_bytes[3], |
4939 | color_bytes[4], |
4940 | color_bytes[5], |
4941 | color_bytes[6], |
4942 | color_bytes[7], |
4943 | ]; |
4944 | let length_so_far = length_so_far + request0.len(); |
4945 | assert_eq!(length_so_far % 4, 0); |
4946 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
4947 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
4948 | ([request0.into()], vec![]) |
4949 | } |
4950 | /// Parse this request given its header, its body, and any fds that go along with it |
4951 | #[cfg (feature = "request-parsing" )] |
4952 | pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> { |
4953 | if header.minor_opcode != CREATE_SOLID_FILL_REQUEST { |
4954 | return Err(ParseError::InvalidValue); |
4955 | } |
4956 | let (picture, remaining) = Picture::try_parse(value)?; |
4957 | let (color, remaining) = Color::try_parse(remaining)?; |
4958 | let _ = remaining; |
4959 | Ok(CreateSolidFillRequest { |
4960 | picture, |
4961 | color, |
4962 | }) |
4963 | } |
4964 | } |
4965 | impl Request for CreateSolidFillRequest { |
4966 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
4967 | |
4968 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
4969 | let (bufs: [Cow<'_, [u8]>; 1], fds: Vec) = self.serialize(major_opcode); |
4970 | // Flatten the buffers into a single vector |
4971 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
4972 | (buf, fds) |
4973 | } |
4974 | } |
4975 | impl crate::x11_utils::VoidRequest for CreateSolidFillRequest { |
4976 | } |
4977 | |
4978 | /// Opcode for the CreateLinearGradient request |
4979 | pub const CREATE_LINEAR_GRADIENT_REQUEST: u8 = 34; |
4980 | #[derive (Clone, Default)] |
4981 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
4982 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
4983 | pub struct CreateLinearGradientRequest<'input> { |
4984 | pub picture: Picture, |
4985 | pub p1: Pointfix, |
4986 | pub p2: Pointfix, |
4987 | pub stops: Cow<'input, [Fixed]>, |
4988 | pub colors: Cow<'input, [Color]>, |
4989 | } |
4990 | impl_debug_if_no_extra_traits!(CreateLinearGradientRequest<'_>, "CreateLinearGradientRequest" ); |
4991 | impl<'input> CreateLinearGradientRequest<'input> { |
4992 | /// Serialize this request into bytes for the provided connection |
4993 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 4]> { |
4994 | let length_so_far = 0; |
4995 | let picture_bytes = self.picture.serialize(); |
4996 | let p1_bytes = self.p1.serialize(); |
4997 | let p2_bytes = self.p2.serialize(); |
4998 | let num_stops = u32::try_from(self.stops.len()).expect("`stops` has too many elements" ); |
4999 | let num_stops_bytes = num_stops.serialize(); |
5000 | let mut request0 = vec![ |
5001 | major_opcode, |
5002 | CREATE_LINEAR_GRADIENT_REQUEST, |
5003 | 0, |
5004 | 0, |
5005 | picture_bytes[0], |
5006 | picture_bytes[1], |
5007 | picture_bytes[2], |
5008 | picture_bytes[3], |
5009 | p1_bytes[0], |
5010 | p1_bytes[1], |
5011 | p1_bytes[2], |
5012 | p1_bytes[3], |
5013 | p1_bytes[4], |
5014 | p1_bytes[5], |
5015 | p1_bytes[6], |
5016 | p1_bytes[7], |
5017 | p2_bytes[0], |
5018 | p2_bytes[1], |
5019 | p2_bytes[2], |
5020 | p2_bytes[3], |
5021 | p2_bytes[4], |
5022 | p2_bytes[5], |
5023 | p2_bytes[6], |
5024 | p2_bytes[7], |
5025 | num_stops_bytes[0], |
5026 | num_stops_bytes[1], |
5027 | num_stops_bytes[2], |
5028 | num_stops_bytes[3], |
5029 | ]; |
5030 | let length_so_far = length_so_far + request0.len(); |
5031 | let stops_bytes = self.stops.serialize(); |
5032 | let length_so_far = length_so_far + stops_bytes.len(); |
5033 | assert_eq!(self.colors.len(), usize::try_from(num_stops).unwrap(), "`colors` has an incorrect length" ); |
5034 | let colors_bytes = self.colors.serialize(); |
5035 | let length_so_far = length_so_far + colors_bytes.len(); |
5036 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
5037 | let length_so_far = length_so_far + padding0.len(); |
5038 | assert_eq!(length_so_far % 4, 0); |
5039 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
5040 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
5041 | ([request0.into(), stops_bytes.into(), colors_bytes.into(), padding0.into()], vec![]) |
5042 | } |
5043 | /// Parse this request given its header, its body, and any fds that go along with it |
5044 | #[cfg (feature = "request-parsing" )] |
5045 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
5046 | if header.minor_opcode != CREATE_LINEAR_GRADIENT_REQUEST { |
5047 | return Err(ParseError::InvalidValue); |
5048 | } |
5049 | let (picture, remaining) = Picture::try_parse(value)?; |
5050 | let (p1, remaining) = Pointfix::try_parse(remaining)?; |
5051 | let (p2, remaining) = Pointfix::try_parse(remaining)?; |
5052 | let (num_stops, remaining) = u32::try_parse(remaining)?; |
5053 | let (stops, remaining) = crate::x11_utils::parse_list::<Fixed>(remaining, num_stops.try_to_usize()?)?; |
5054 | let (colors, remaining) = crate::x11_utils::parse_list::<Color>(remaining, num_stops.try_to_usize()?)?; |
5055 | let _ = remaining; |
5056 | Ok(CreateLinearGradientRequest { |
5057 | picture, |
5058 | p1, |
5059 | p2, |
5060 | stops: Cow::Owned(stops), |
5061 | colors: Cow::Owned(colors), |
5062 | }) |
5063 | } |
5064 | /// Clone all borrowed data in this CreateLinearGradientRequest. |
5065 | pub fn into_owned(self) -> CreateLinearGradientRequest<'static> { |
5066 | CreateLinearGradientRequest { |
5067 | picture: self.picture, |
5068 | p1: self.p1, |
5069 | p2: self.p2, |
5070 | stops: Cow::Owned(self.stops.into_owned()), |
5071 | colors: Cow::Owned(self.colors.into_owned()), |
5072 | } |
5073 | } |
5074 | } |
5075 | impl<'input> Request for CreateLinearGradientRequest<'input> { |
5076 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
5077 | |
5078 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
5079 | let (bufs: [Cow<'_, [u8]>; 4], fds: Vec) = self.serialize(major_opcode); |
5080 | // Flatten the buffers into a single vector |
5081 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
5082 | (buf, fds) |
5083 | } |
5084 | } |
5085 | impl<'input> crate::x11_utils::VoidRequest for CreateLinearGradientRequest<'input> { |
5086 | } |
5087 | |
5088 | /// Opcode for the CreateRadialGradient request |
5089 | pub const CREATE_RADIAL_GRADIENT_REQUEST: u8 = 35; |
5090 | #[derive (Clone, Default)] |
5091 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
5092 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
5093 | pub struct CreateRadialGradientRequest<'input> { |
5094 | pub picture: Picture, |
5095 | pub inner: Pointfix, |
5096 | pub outer: Pointfix, |
5097 | pub inner_radius: Fixed, |
5098 | pub outer_radius: Fixed, |
5099 | pub stops: Cow<'input, [Fixed]>, |
5100 | pub colors: Cow<'input, [Color]>, |
5101 | } |
5102 | impl_debug_if_no_extra_traits!(CreateRadialGradientRequest<'_>, "CreateRadialGradientRequest" ); |
5103 | impl<'input> CreateRadialGradientRequest<'input> { |
5104 | /// Serialize this request into bytes for the provided connection |
5105 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 4]> { |
5106 | let length_so_far = 0; |
5107 | let picture_bytes = self.picture.serialize(); |
5108 | let inner_bytes = self.inner.serialize(); |
5109 | let outer_bytes = self.outer.serialize(); |
5110 | let inner_radius_bytes = self.inner_radius.serialize(); |
5111 | let outer_radius_bytes = self.outer_radius.serialize(); |
5112 | let num_stops = u32::try_from(self.stops.len()).expect("`stops` has too many elements" ); |
5113 | let num_stops_bytes = num_stops.serialize(); |
5114 | let mut request0 = vec![ |
5115 | major_opcode, |
5116 | CREATE_RADIAL_GRADIENT_REQUEST, |
5117 | 0, |
5118 | 0, |
5119 | picture_bytes[0], |
5120 | picture_bytes[1], |
5121 | picture_bytes[2], |
5122 | picture_bytes[3], |
5123 | inner_bytes[0], |
5124 | inner_bytes[1], |
5125 | inner_bytes[2], |
5126 | inner_bytes[3], |
5127 | inner_bytes[4], |
5128 | inner_bytes[5], |
5129 | inner_bytes[6], |
5130 | inner_bytes[7], |
5131 | outer_bytes[0], |
5132 | outer_bytes[1], |
5133 | outer_bytes[2], |
5134 | outer_bytes[3], |
5135 | outer_bytes[4], |
5136 | outer_bytes[5], |
5137 | outer_bytes[6], |
5138 | outer_bytes[7], |
5139 | inner_radius_bytes[0], |
5140 | inner_radius_bytes[1], |
5141 | inner_radius_bytes[2], |
5142 | inner_radius_bytes[3], |
5143 | outer_radius_bytes[0], |
5144 | outer_radius_bytes[1], |
5145 | outer_radius_bytes[2], |
5146 | outer_radius_bytes[3], |
5147 | num_stops_bytes[0], |
5148 | num_stops_bytes[1], |
5149 | num_stops_bytes[2], |
5150 | num_stops_bytes[3], |
5151 | ]; |
5152 | let length_so_far = length_so_far + request0.len(); |
5153 | let stops_bytes = self.stops.serialize(); |
5154 | let length_so_far = length_so_far + stops_bytes.len(); |
5155 | assert_eq!(self.colors.len(), usize::try_from(num_stops).unwrap(), "`colors` has an incorrect length" ); |
5156 | let colors_bytes = self.colors.serialize(); |
5157 | let length_so_far = length_so_far + colors_bytes.len(); |
5158 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
5159 | let length_so_far = length_so_far + padding0.len(); |
5160 | assert_eq!(length_so_far % 4, 0); |
5161 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
5162 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
5163 | ([request0.into(), stops_bytes.into(), colors_bytes.into(), padding0.into()], vec![]) |
5164 | } |
5165 | /// Parse this request given its header, its body, and any fds that go along with it |
5166 | #[cfg (feature = "request-parsing" )] |
5167 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
5168 | if header.minor_opcode != CREATE_RADIAL_GRADIENT_REQUEST { |
5169 | return Err(ParseError::InvalidValue); |
5170 | } |
5171 | let (picture, remaining) = Picture::try_parse(value)?; |
5172 | let (inner, remaining) = Pointfix::try_parse(remaining)?; |
5173 | let (outer, remaining) = Pointfix::try_parse(remaining)?; |
5174 | let (inner_radius, remaining) = Fixed::try_parse(remaining)?; |
5175 | let (outer_radius, remaining) = Fixed::try_parse(remaining)?; |
5176 | let (num_stops, remaining) = u32::try_parse(remaining)?; |
5177 | let (stops, remaining) = crate::x11_utils::parse_list::<Fixed>(remaining, num_stops.try_to_usize()?)?; |
5178 | let (colors, remaining) = crate::x11_utils::parse_list::<Color>(remaining, num_stops.try_to_usize()?)?; |
5179 | let _ = remaining; |
5180 | Ok(CreateRadialGradientRequest { |
5181 | picture, |
5182 | inner, |
5183 | outer, |
5184 | inner_radius, |
5185 | outer_radius, |
5186 | stops: Cow::Owned(stops), |
5187 | colors: Cow::Owned(colors), |
5188 | }) |
5189 | } |
5190 | /// Clone all borrowed data in this CreateRadialGradientRequest. |
5191 | pub fn into_owned(self) -> CreateRadialGradientRequest<'static> { |
5192 | CreateRadialGradientRequest { |
5193 | picture: self.picture, |
5194 | inner: self.inner, |
5195 | outer: self.outer, |
5196 | inner_radius: self.inner_radius, |
5197 | outer_radius: self.outer_radius, |
5198 | stops: Cow::Owned(self.stops.into_owned()), |
5199 | colors: Cow::Owned(self.colors.into_owned()), |
5200 | } |
5201 | } |
5202 | } |
5203 | impl<'input> Request for CreateRadialGradientRequest<'input> { |
5204 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
5205 | |
5206 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
5207 | let (bufs: [Cow<'_, [u8]>; 4], fds: Vec) = self.serialize(major_opcode); |
5208 | // Flatten the buffers into a single vector |
5209 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
5210 | (buf, fds) |
5211 | } |
5212 | } |
5213 | impl<'input> crate::x11_utils::VoidRequest for CreateRadialGradientRequest<'input> { |
5214 | } |
5215 | |
5216 | /// Opcode for the CreateConicalGradient request |
5217 | pub const CREATE_CONICAL_GRADIENT_REQUEST: u8 = 36; |
5218 | #[derive (Clone, Default)] |
5219 | #[cfg_attr (feature = "extra-traits" , derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))] |
5220 | #[cfg_attr (feature = "serde" , derive(serde::Serialize, serde::Deserialize))] |
5221 | pub struct CreateConicalGradientRequest<'input> { |
5222 | pub picture: Picture, |
5223 | pub center: Pointfix, |
5224 | pub angle: Fixed, |
5225 | pub stops: Cow<'input, [Fixed]>, |
5226 | pub colors: Cow<'input, [Color]>, |
5227 | } |
5228 | impl_debug_if_no_extra_traits!(CreateConicalGradientRequest<'_>, "CreateConicalGradientRequest" ); |
5229 | impl<'input> CreateConicalGradientRequest<'input> { |
5230 | /// Serialize this request into bytes for the provided connection |
5231 | pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 4]> { |
5232 | let length_so_far = 0; |
5233 | let picture_bytes = self.picture.serialize(); |
5234 | let center_bytes = self.center.serialize(); |
5235 | let angle_bytes = self.angle.serialize(); |
5236 | let num_stops = u32::try_from(self.stops.len()).expect("`stops` has too many elements" ); |
5237 | let num_stops_bytes = num_stops.serialize(); |
5238 | let mut request0 = vec![ |
5239 | major_opcode, |
5240 | CREATE_CONICAL_GRADIENT_REQUEST, |
5241 | 0, |
5242 | 0, |
5243 | picture_bytes[0], |
5244 | picture_bytes[1], |
5245 | picture_bytes[2], |
5246 | picture_bytes[3], |
5247 | center_bytes[0], |
5248 | center_bytes[1], |
5249 | center_bytes[2], |
5250 | center_bytes[3], |
5251 | center_bytes[4], |
5252 | center_bytes[5], |
5253 | center_bytes[6], |
5254 | center_bytes[7], |
5255 | angle_bytes[0], |
5256 | angle_bytes[1], |
5257 | angle_bytes[2], |
5258 | angle_bytes[3], |
5259 | num_stops_bytes[0], |
5260 | num_stops_bytes[1], |
5261 | num_stops_bytes[2], |
5262 | num_stops_bytes[3], |
5263 | ]; |
5264 | let length_so_far = length_so_far + request0.len(); |
5265 | let stops_bytes = self.stops.serialize(); |
5266 | let length_so_far = length_so_far + stops_bytes.len(); |
5267 | assert_eq!(self.colors.len(), usize::try_from(num_stops).unwrap(), "`colors` has an incorrect length" ); |
5268 | let colors_bytes = self.colors.serialize(); |
5269 | let length_so_far = length_so_far + colors_bytes.len(); |
5270 | let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4]; |
5271 | let length_so_far = length_so_far + padding0.len(); |
5272 | assert_eq!(length_so_far % 4, 0); |
5273 | let length = u16::try_from(length_so_far / 4).unwrap_or(0); |
5274 | request0[2..4].copy_from_slice(&length.to_ne_bytes()); |
5275 | ([request0.into(), stops_bytes.into(), colors_bytes.into(), padding0.into()], vec![]) |
5276 | } |
5277 | /// Parse this request given its header, its body, and any fds that go along with it |
5278 | #[cfg (feature = "request-parsing" )] |
5279 | pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> { |
5280 | if header.minor_opcode != CREATE_CONICAL_GRADIENT_REQUEST { |
5281 | return Err(ParseError::InvalidValue); |
5282 | } |
5283 | let (picture, remaining) = Picture::try_parse(value)?; |
5284 | let (center, remaining) = Pointfix::try_parse(remaining)?; |
5285 | let (angle, remaining) = Fixed::try_parse(remaining)?; |
5286 | let (num_stops, remaining) = u32::try_parse(remaining)?; |
5287 | let (stops, remaining) = crate::x11_utils::parse_list::<Fixed>(remaining, num_stops.try_to_usize()?)?; |
5288 | let (colors, remaining) = crate::x11_utils::parse_list::<Color>(remaining, num_stops.try_to_usize()?)?; |
5289 | let _ = remaining; |
5290 | Ok(CreateConicalGradientRequest { |
5291 | picture, |
5292 | center, |
5293 | angle, |
5294 | stops: Cow::Owned(stops), |
5295 | colors: Cow::Owned(colors), |
5296 | }) |
5297 | } |
5298 | /// Clone all borrowed data in this CreateConicalGradientRequest. |
5299 | pub fn into_owned(self) -> CreateConicalGradientRequest<'static> { |
5300 | CreateConicalGradientRequest { |
5301 | picture: self.picture, |
5302 | center: self.center, |
5303 | angle: self.angle, |
5304 | stops: Cow::Owned(self.stops.into_owned()), |
5305 | colors: Cow::Owned(self.colors.into_owned()), |
5306 | } |
5307 | } |
5308 | } |
5309 | impl<'input> Request for CreateConicalGradientRequest<'input> { |
5310 | const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME); |
5311 | |
5312 | fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> { |
5313 | let (bufs: [Cow<'_, [u8]>; 4], fds: Vec) = self.serialize(major_opcode); |
5314 | // Flatten the buffers into a single vector |
5315 | let buf: Vec = bufs.iter().flat_map(|buf: &Cow<'_, [u8]>| buf.iter().copied()).collect(); |
5316 | (buf, fds) |
5317 | } |
5318 | } |
5319 | impl<'input> crate::x11_utils::VoidRequest for CreateConicalGradientRequest<'input> { |
5320 | } |
5321 | |
5322 | |