1#![allow(clippy::too_many_arguments)]
7#![allow(clippy::useless_conversion)]
9
10#[allow(unused_imports)]
11use alloc::borrow::Cow;
12#[allow(unused_imports)]
13use core::convert::TryInto;
14use alloc::vec;
15use alloc::vec::Vec;
16use core::convert::TryFrom;
17use crate::errors::ParseError;
18#[allow(unused_imports)]
19use crate::x11_utils::TryIntoUSize;
20use crate::BufWithFds;
21#[allow(unused_imports)]
22use crate::utils::{RawFdContainer, pretty_print_bitmask, pretty_print_enum};
23#[allow(unused_imports)]
24use crate::x11_utils::{Request, RequestHeader, Serialize, TryParse, TryParseFd};
25#[allow(unused_imports)]
26use super::xproto;
27
28pub const X11_EXTENSION_NAME: &str = "X-Resource";
30
31pub const X11_XML_VERSION: (u32, u32) = (1, 2);
38
39#[derive(Clone, Copy, Default)]
40#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
41#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
42pub struct Client {
43 pub resource_base: u32,
44 pub resource_mask: u32,
45}
46impl_debug_if_no_extra_traits!(Client, "Client");
47impl TryParse for Client {
48 fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
49 let (resource_base, remaining) = u32::try_parse(remaining)?;
50 let (resource_mask, remaining) = u32::try_parse(remaining)?;
51 let result = Client { resource_base, resource_mask };
52 Ok((result, remaining))
53 }
54}
55impl Serialize for Client {
56 type Bytes = [u8; 8];
57 fn serialize(&self) -> [u8; 8] {
58 let resource_base_bytes = self.resource_base.serialize();
59 let resource_mask_bytes = self.resource_mask.serialize();
60 [
61 resource_base_bytes[0],
62 resource_base_bytes[1],
63 resource_base_bytes[2],
64 resource_base_bytes[3],
65 resource_mask_bytes[0],
66 resource_mask_bytes[1],
67 resource_mask_bytes[2],
68 resource_mask_bytes[3],
69 ]
70 }
71 fn serialize_into(&self, bytes: &mut Vec<u8>) {
72 bytes.reserve(8);
73 self.resource_base.serialize_into(bytes);
74 self.resource_mask.serialize_into(bytes);
75 }
76}
77
78#[derive(Clone, Copy, Default)]
79#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
80#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
81pub struct Type {
82 pub resource_type: xproto::Atom,
83 pub count: u32,
84}
85impl_debug_if_no_extra_traits!(Type, "Type");
86impl TryParse for Type {
87 fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
88 let (resource_type, remaining) = xproto::Atom::try_parse(remaining)?;
89 let (count, remaining) = u32::try_parse(remaining)?;
90 let result = Type { resource_type, count };
91 Ok((result, remaining))
92 }
93}
94impl Serialize for Type {
95 type Bytes = [u8; 8];
96 fn serialize(&self) -> [u8; 8] {
97 let resource_type_bytes = self.resource_type.serialize();
98 let count_bytes = self.count.serialize();
99 [
100 resource_type_bytes[0],
101 resource_type_bytes[1],
102 resource_type_bytes[2],
103 resource_type_bytes[3],
104 count_bytes[0],
105 count_bytes[1],
106 count_bytes[2],
107 count_bytes[3],
108 ]
109 }
110 fn serialize_into(&self, bytes: &mut Vec<u8>) {
111 bytes.reserve(8);
112 self.resource_type.serialize_into(bytes);
113 self.count.serialize_into(bytes);
114 }
115}
116
117#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
118#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
119pub struct ClientIdMask(u32);
120impl ClientIdMask {
121 pub const CLIENT_XID: Self = Self(1 << 0);
122 pub const LOCAL_CLIENT_PID: Self = Self(1 << 1);
123}
124impl From<ClientIdMask> for u32 {
125 #[inline]
126 fn from(input: ClientIdMask) -> Self {
127 input.0
128 }
129}
130impl From<ClientIdMask> for Option<u32> {
131 #[inline]
132 fn from(input: ClientIdMask) -> Self {
133 Some(input.0)
134 }
135}
136impl From<u8> for ClientIdMask {
137 #[inline]
138 fn from(value: u8) -> Self {
139 Self(value.into())
140 }
141}
142impl From<u16> for ClientIdMask {
143 #[inline]
144 fn from(value: u16) -> Self {
145 Self(value.into())
146 }
147}
148impl From<u32> for ClientIdMask {
149 #[inline]
150 fn from(value: u32) -> Self {
151 Self(value)
152 }
153}
154impl core::fmt::Debug for ClientIdMask {
155 fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
156 let variants = [
157 (Self::CLIENT_XID.0, "CLIENT_XID", "ClientXID"),
158 (Self::LOCAL_CLIENT_PID.0, "LOCAL_CLIENT_PID", "LocalClientPID"),
159 ];
160 pretty_print_bitmask(fmt, self.0, &variants)
161 }
162}
163bitmask_binop!(ClientIdMask, u32);
164
165#[derive(Clone, Copy, Default)]
166#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
167#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
168pub struct ClientIdSpec {
169 pub client: u32,
170 pub mask: ClientIdMask,
171}
172impl_debug_if_no_extra_traits!(ClientIdSpec, "ClientIdSpec");
173impl TryParse for ClientIdSpec {
174 fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
175 let (client, remaining) = u32::try_parse(remaining)?;
176 let (mask, remaining) = u32::try_parse(remaining)?;
177 let mask = mask.into();
178 let result = ClientIdSpec { client, mask };
179 Ok((result, remaining))
180 }
181}
182impl Serialize for ClientIdSpec {
183 type Bytes = [u8; 8];
184 fn serialize(&self) -> [u8; 8] {
185 let client_bytes = self.client.serialize();
186 let mask_bytes = u32::from(self.mask).serialize();
187 [
188 client_bytes[0],
189 client_bytes[1],
190 client_bytes[2],
191 client_bytes[3],
192 mask_bytes[0],
193 mask_bytes[1],
194 mask_bytes[2],
195 mask_bytes[3],
196 ]
197 }
198 fn serialize_into(&self, bytes: &mut Vec<u8>) {
199 bytes.reserve(8);
200 self.client.serialize_into(bytes);
201 u32::from(self.mask).serialize_into(bytes);
202 }
203}
204
205#[derive(Clone, Default)]
206#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
207#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
208pub struct ClientIdValue {
209 pub spec: ClientIdSpec,
210 pub value: Vec<u32>,
211}
212impl_debug_if_no_extra_traits!(ClientIdValue, "ClientIdValue");
213impl TryParse for ClientIdValue {
214 fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
215 let (spec, remaining) = ClientIdSpec::try_parse(remaining)?;
216 let (length, remaining) = u32::try_parse(remaining)?;
217 let (value, remaining) = crate::x11_utils::parse_list::<u32>(remaining, u32::from(length).checked_div(4u32).ok_or(ParseError::InvalidExpression)?.try_to_usize()?)?;
218 let result = ClientIdValue { spec, value };
219 Ok((result, remaining))
220 }
221}
222impl Serialize for ClientIdValue {
223 type Bytes = Vec<u8>;
224 fn serialize(&self) -> Vec<u8> {
225 let mut result = Vec::new();
226 self.serialize_into(&mut result);
227 result
228 }
229 fn serialize_into(&self, bytes: &mut Vec<u8>) {
230 bytes.reserve(12);
231 self.spec.serialize_into(bytes);
232 let length = u32::try_from(self.value.len()).ok().and_then(|len| len.checked_mul(4)).expect("`value` has too many elements");
233 length.serialize_into(bytes);
234 self.value.serialize_into(bytes);
235 }
236}
237impl ClientIdValue {
238 pub fn length(&self) -> u32 {
248 self.value.len()
249 .checked_mul(4).unwrap()
250 .try_into().unwrap()
251 }
252}
253
254#[derive(Clone, Copy, Default)]
255#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
256#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
257pub struct ResourceIdSpec {
258 pub resource: u32,
259 pub type_: u32,
260}
261impl_debug_if_no_extra_traits!(ResourceIdSpec, "ResourceIdSpec");
262impl TryParse for ResourceIdSpec {
263 fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
264 let (resource, remaining) = u32::try_parse(remaining)?;
265 let (type_, remaining) = u32::try_parse(remaining)?;
266 let result = ResourceIdSpec { resource, type_ };
267 Ok((result, remaining))
268 }
269}
270impl Serialize for ResourceIdSpec {
271 type Bytes = [u8; 8];
272 fn serialize(&self) -> [u8; 8] {
273 let resource_bytes = self.resource.serialize();
274 let type_bytes = self.type_.serialize();
275 [
276 resource_bytes[0],
277 resource_bytes[1],
278 resource_bytes[2],
279 resource_bytes[3],
280 type_bytes[0],
281 type_bytes[1],
282 type_bytes[2],
283 type_bytes[3],
284 ]
285 }
286 fn serialize_into(&self, bytes: &mut Vec<u8>) {
287 bytes.reserve(8);
288 self.resource.serialize_into(bytes);
289 self.type_.serialize_into(bytes);
290 }
291}
292
293#[derive(Clone, Copy, Default)]
294#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
295#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
296pub struct ResourceSizeSpec {
297 pub spec: ResourceIdSpec,
298 pub bytes: u32,
299 pub ref_count: u32,
300 pub use_count: u32,
301}
302impl_debug_if_no_extra_traits!(ResourceSizeSpec, "ResourceSizeSpec");
303impl TryParse for ResourceSizeSpec {
304 fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
305 let (spec, remaining) = ResourceIdSpec::try_parse(remaining)?;
306 let (bytes, remaining) = u32::try_parse(remaining)?;
307 let (ref_count, remaining) = u32::try_parse(remaining)?;
308 let (use_count, remaining) = u32::try_parse(remaining)?;
309 let result = ResourceSizeSpec { spec, bytes, ref_count, use_count };
310 Ok((result, remaining))
311 }
312}
313impl Serialize for ResourceSizeSpec {
314 type Bytes = [u8; 20];
315 fn serialize(&self) -> [u8; 20] {
316 let spec_bytes = self.spec.serialize();
317 let bytes_bytes = self.bytes.serialize();
318 let ref_count_bytes = self.ref_count.serialize();
319 let use_count_bytes = self.use_count.serialize();
320 [
321 spec_bytes[0],
322 spec_bytes[1],
323 spec_bytes[2],
324 spec_bytes[3],
325 spec_bytes[4],
326 spec_bytes[5],
327 spec_bytes[6],
328 spec_bytes[7],
329 bytes_bytes[0],
330 bytes_bytes[1],
331 bytes_bytes[2],
332 bytes_bytes[3],
333 ref_count_bytes[0],
334 ref_count_bytes[1],
335 ref_count_bytes[2],
336 ref_count_bytes[3],
337 use_count_bytes[0],
338 use_count_bytes[1],
339 use_count_bytes[2],
340 use_count_bytes[3],
341 ]
342 }
343 fn serialize_into(&self, bytes: &mut Vec<u8>) {
344 bytes.reserve(20);
345 self.spec.serialize_into(bytes);
346 self.bytes.serialize_into(bytes);
347 self.ref_count.serialize_into(bytes);
348 self.use_count.serialize_into(bytes);
349 }
350}
351
352#[derive(Clone, Default)]
353#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
354#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
355pub struct ResourceSizeValue {
356 pub size: ResourceSizeSpec,
357 pub cross_references: Vec<ResourceSizeSpec>,
358}
359impl_debug_if_no_extra_traits!(ResourceSizeValue, "ResourceSizeValue");
360impl TryParse for ResourceSizeValue {
361 fn try_parse(remaining: &[u8]) -> Result<(Self, &[u8]), ParseError> {
362 let (size, remaining) = ResourceSizeSpec::try_parse(remaining)?;
363 let (num_cross_references, remaining) = u32::try_parse(remaining)?;
364 let (cross_references, remaining) = crate::x11_utils::parse_list::<ResourceSizeSpec>(remaining, num_cross_references.try_to_usize()?)?;
365 let result = ResourceSizeValue { size, cross_references };
366 Ok((result, remaining))
367 }
368}
369impl Serialize for ResourceSizeValue {
370 type Bytes = Vec<u8>;
371 fn serialize(&self) -> Vec<u8> {
372 let mut result = Vec::new();
373 self.serialize_into(&mut result);
374 result
375 }
376 fn serialize_into(&self, bytes: &mut Vec<u8>) {
377 bytes.reserve(24);
378 self.size.serialize_into(bytes);
379 let num_cross_references = u32::try_from(self.cross_references.len()).expect("`cross_references` has too many elements");
380 num_cross_references.serialize_into(bytes);
381 self.cross_references.serialize_into(bytes);
382 }
383}
384impl ResourceSizeValue {
385 pub fn num_cross_references(&self) -> u32 {
395 self.cross_references.len()
396 .try_into().unwrap()
397 }
398}
399
400pub const QUERY_VERSION_REQUEST: u8 = 0;
402#[derive(Clone, Copy, Default)]
403#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
404#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
405pub struct QueryVersionRequest {
406 pub client_major: u8,
407 pub client_minor: u8,
408}
409impl_debug_if_no_extra_traits!(QueryVersionRequest, "QueryVersionRequest");
410impl QueryVersionRequest {
411 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
413 let length_so_far = 0;
414 let client_major_bytes = self.client_major.serialize();
415 let client_minor_bytes = self.client_minor.serialize();
416 let mut request0 = vec![
417 major_opcode,
418 QUERY_VERSION_REQUEST,
419 0,
420 0,
421 client_major_bytes[0],
422 client_minor_bytes[0],
423 0,
424 0,
425 ];
426 let length_so_far = length_so_far + request0.len();
427 assert_eq!(length_so_far % 4, 0);
428 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
429 request0[2..4].copy_from_slice(&length.to_ne_bytes());
430 ([request0.into()], vec![])
431 }
432 #[cfg(feature = "request-parsing")]
434 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
435 if header.minor_opcode != QUERY_VERSION_REQUEST {
436 return Err(ParseError::InvalidValue);
437 }
438 let (client_major, remaining) = u8::try_parse(value)?;
439 let (client_minor, remaining) = u8::try_parse(remaining)?;
440 let _ = remaining;
441 Ok(QueryVersionRequest {
442 client_major,
443 client_minor,
444 })
445 }
446}
447impl Request for QueryVersionRequest {
448 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
449
450 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
451 let (bufs, fds) = self.serialize(major_opcode);
452 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
454 (buf, fds)
455 }
456}
457impl crate::x11_utils::ReplyRequest for QueryVersionRequest {
458 type Reply = QueryVersionReply;
459}
460
461#[derive(Clone, Copy, Default)]
462#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
463#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
464pub struct QueryVersionReply {
465 pub sequence: u16,
466 pub length: u32,
467 pub server_major: u16,
468 pub server_minor: u16,
469}
470impl_debug_if_no_extra_traits!(QueryVersionReply, "QueryVersionReply");
471impl TryParse for QueryVersionReply {
472 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
473 let remaining = initial_value;
474 let (response_type, remaining) = u8::try_parse(remaining)?;
475 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
476 let (sequence, remaining) = u16::try_parse(remaining)?;
477 let (length, remaining) = u32::try_parse(remaining)?;
478 let (server_major, remaining) = u16::try_parse(remaining)?;
479 let (server_minor, remaining) = u16::try_parse(remaining)?;
480 if response_type != 1 {
481 return Err(ParseError::InvalidValue);
482 }
483 let result = QueryVersionReply { sequence, length, server_major, server_minor };
484 let _ = remaining;
485 let remaining = initial_value.get(32 + length as usize * 4..)
486 .ok_or(ParseError::InsufficientData)?;
487 Ok((result, remaining))
488 }
489}
490impl Serialize for QueryVersionReply {
491 type Bytes = [u8; 12];
492 fn serialize(&self) -> [u8; 12] {
493 let response_type_bytes = &[1];
494 let sequence_bytes = self.sequence.serialize();
495 let length_bytes = self.length.serialize();
496 let server_major_bytes = self.server_major.serialize();
497 let server_minor_bytes = self.server_minor.serialize();
498 [
499 response_type_bytes[0],
500 0,
501 sequence_bytes[0],
502 sequence_bytes[1],
503 length_bytes[0],
504 length_bytes[1],
505 length_bytes[2],
506 length_bytes[3],
507 server_major_bytes[0],
508 server_major_bytes[1],
509 server_minor_bytes[0],
510 server_minor_bytes[1],
511 ]
512 }
513 fn serialize_into(&self, bytes: &mut Vec<u8>) {
514 bytes.reserve(12);
515 let response_type_bytes = &[1];
516 bytes.push(response_type_bytes[0]);
517 bytes.extend_from_slice(&[0; 1]);
518 self.sequence.serialize_into(bytes);
519 self.length.serialize_into(bytes);
520 self.server_major.serialize_into(bytes);
521 self.server_minor.serialize_into(bytes);
522 }
523}
524
525pub const QUERY_CLIENTS_REQUEST: u8 = 1;
527#[derive(Clone, Copy, Default)]
528#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
529#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
530pub struct QueryClientsRequest;
531impl_debug_if_no_extra_traits!(QueryClientsRequest, "QueryClientsRequest");
532impl QueryClientsRequest {
533 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
535 let length_so_far = 0;
536 let mut request0 = vec![
537 major_opcode,
538 QUERY_CLIENTS_REQUEST,
539 0,
540 0,
541 ];
542 let length_so_far = length_so_far + request0.len();
543 assert_eq!(length_so_far % 4, 0);
544 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
545 request0[2..4].copy_from_slice(&length.to_ne_bytes());
546 ([request0.into()], vec![])
547 }
548 #[cfg(feature = "request-parsing")]
550 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
551 if header.minor_opcode != QUERY_CLIENTS_REQUEST {
552 return Err(ParseError::InvalidValue);
553 }
554 let _ = value;
555 Ok(QueryClientsRequest
556 )
557 }
558}
559impl Request for QueryClientsRequest {
560 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
561
562 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
563 let (bufs, fds) = self.serialize(major_opcode);
564 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
566 (buf, fds)
567 }
568}
569impl crate::x11_utils::ReplyRequest for QueryClientsRequest {
570 type Reply = QueryClientsReply;
571}
572
573#[derive(Clone, Default)]
574#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
575#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
576pub struct QueryClientsReply {
577 pub sequence: u16,
578 pub length: u32,
579 pub clients: Vec<Client>,
580}
581impl_debug_if_no_extra_traits!(QueryClientsReply, "QueryClientsReply");
582impl TryParse for QueryClientsReply {
583 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
584 let remaining = initial_value;
585 let (response_type, remaining) = u8::try_parse(remaining)?;
586 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
587 let (sequence, remaining) = u16::try_parse(remaining)?;
588 let (length, remaining) = u32::try_parse(remaining)?;
589 let (num_clients, remaining) = u32::try_parse(remaining)?;
590 let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
591 let (clients, remaining) = crate::x11_utils::parse_list::<Client>(remaining, num_clients.try_to_usize()?)?;
592 if response_type != 1 {
593 return Err(ParseError::InvalidValue);
594 }
595 let result = QueryClientsReply { sequence, length, clients };
596 let _ = remaining;
597 let remaining = initial_value.get(32 + length as usize * 4..)
598 .ok_or(ParseError::InsufficientData)?;
599 Ok((result, remaining))
600 }
601}
602impl Serialize for QueryClientsReply {
603 type Bytes = Vec<u8>;
604 fn serialize(&self) -> Vec<u8> {
605 let mut result = Vec::new();
606 self.serialize_into(&mut result);
607 result
608 }
609 fn serialize_into(&self, bytes: &mut Vec<u8>) {
610 bytes.reserve(32);
611 let response_type_bytes = &[1];
612 bytes.push(response_type_bytes[0]);
613 bytes.extend_from_slice(&[0; 1]);
614 self.sequence.serialize_into(bytes);
615 self.length.serialize_into(bytes);
616 let num_clients = u32::try_from(self.clients.len()).expect("`clients` has too many elements");
617 num_clients.serialize_into(bytes);
618 bytes.extend_from_slice(&[0; 20]);
619 self.clients.serialize_into(bytes);
620 }
621}
622impl QueryClientsReply {
623 pub fn num_clients(&self) -> u32 {
633 self.clients.len()
634 .try_into().unwrap()
635 }
636}
637
638pub const QUERY_CLIENT_RESOURCES_REQUEST: u8 = 2;
640#[derive(Clone, Copy, Default)]
641#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
642#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
643pub struct QueryClientResourcesRequest {
644 pub xid: u32,
645}
646impl_debug_if_no_extra_traits!(QueryClientResourcesRequest, "QueryClientResourcesRequest");
647impl QueryClientResourcesRequest {
648 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
650 let length_so_far = 0;
651 let xid_bytes = self.xid.serialize();
652 let mut request0 = vec![
653 major_opcode,
654 QUERY_CLIENT_RESOURCES_REQUEST,
655 0,
656 0,
657 xid_bytes[0],
658 xid_bytes[1],
659 xid_bytes[2],
660 xid_bytes[3],
661 ];
662 let length_so_far = length_so_far + request0.len();
663 assert_eq!(length_so_far % 4, 0);
664 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
665 request0[2..4].copy_from_slice(&length.to_ne_bytes());
666 ([request0.into()], vec![])
667 }
668 #[cfg(feature = "request-parsing")]
670 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
671 if header.minor_opcode != QUERY_CLIENT_RESOURCES_REQUEST {
672 return Err(ParseError::InvalidValue);
673 }
674 let (xid, remaining) = u32::try_parse(value)?;
675 let _ = remaining;
676 Ok(QueryClientResourcesRequest {
677 xid,
678 })
679 }
680}
681impl Request for QueryClientResourcesRequest {
682 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
683
684 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
685 let (bufs, fds) = self.serialize(major_opcode);
686 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
688 (buf, fds)
689 }
690}
691impl crate::x11_utils::ReplyRequest for QueryClientResourcesRequest {
692 type Reply = QueryClientResourcesReply;
693}
694
695#[derive(Clone, Default)]
696#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
697#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
698pub struct QueryClientResourcesReply {
699 pub sequence: u16,
700 pub length: u32,
701 pub types: Vec<Type>,
702}
703impl_debug_if_no_extra_traits!(QueryClientResourcesReply, "QueryClientResourcesReply");
704impl TryParse for QueryClientResourcesReply {
705 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
706 let remaining = initial_value;
707 let (response_type, remaining) = u8::try_parse(remaining)?;
708 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
709 let (sequence, remaining) = u16::try_parse(remaining)?;
710 let (length, remaining) = u32::try_parse(remaining)?;
711 let (num_types, remaining) = u32::try_parse(remaining)?;
712 let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
713 let (types, remaining) = crate::x11_utils::parse_list::<Type>(remaining, num_types.try_to_usize()?)?;
714 if response_type != 1 {
715 return Err(ParseError::InvalidValue);
716 }
717 let result = QueryClientResourcesReply { sequence, length, types };
718 let _ = remaining;
719 let remaining = initial_value.get(32 + length as usize * 4..)
720 .ok_or(ParseError::InsufficientData)?;
721 Ok((result, remaining))
722 }
723}
724impl Serialize for QueryClientResourcesReply {
725 type Bytes = Vec<u8>;
726 fn serialize(&self) -> Vec<u8> {
727 let mut result = Vec::new();
728 self.serialize_into(&mut result);
729 result
730 }
731 fn serialize_into(&self, bytes: &mut Vec<u8>) {
732 bytes.reserve(32);
733 let response_type_bytes = &[1];
734 bytes.push(response_type_bytes[0]);
735 bytes.extend_from_slice(&[0; 1]);
736 self.sequence.serialize_into(bytes);
737 self.length.serialize_into(bytes);
738 let num_types = u32::try_from(self.types.len()).expect("`types` has too many elements");
739 num_types.serialize_into(bytes);
740 bytes.extend_from_slice(&[0; 20]);
741 self.types.serialize_into(bytes);
742 }
743}
744impl QueryClientResourcesReply {
745 pub fn num_types(&self) -> u32 {
755 self.types.len()
756 .try_into().unwrap()
757 }
758}
759
760pub const QUERY_CLIENT_PIXMAP_BYTES_REQUEST: u8 = 3;
762#[derive(Clone, Copy, Default)]
763#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
764#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
765pub struct QueryClientPixmapBytesRequest {
766 pub xid: u32,
767}
768impl_debug_if_no_extra_traits!(QueryClientPixmapBytesRequest, "QueryClientPixmapBytesRequest");
769impl QueryClientPixmapBytesRequest {
770 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'static, [u8]>; 1]> {
772 let length_so_far = 0;
773 let xid_bytes = self.xid.serialize();
774 let mut request0 = vec![
775 major_opcode,
776 QUERY_CLIENT_PIXMAP_BYTES_REQUEST,
777 0,
778 0,
779 xid_bytes[0],
780 xid_bytes[1],
781 xid_bytes[2],
782 xid_bytes[3],
783 ];
784 let length_so_far = length_so_far + request0.len();
785 assert_eq!(length_so_far % 4, 0);
786 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
787 request0[2..4].copy_from_slice(&length.to_ne_bytes());
788 ([request0.into()], vec![])
789 }
790 #[cfg(feature = "request-parsing")]
792 pub fn try_parse_request(header: RequestHeader, value: &[u8]) -> Result<Self, ParseError> {
793 if header.minor_opcode != QUERY_CLIENT_PIXMAP_BYTES_REQUEST {
794 return Err(ParseError::InvalidValue);
795 }
796 let (xid, remaining) = u32::try_parse(value)?;
797 let _ = remaining;
798 Ok(QueryClientPixmapBytesRequest {
799 xid,
800 })
801 }
802}
803impl Request for QueryClientPixmapBytesRequest {
804 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
805
806 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
807 let (bufs, fds) = self.serialize(major_opcode);
808 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
810 (buf, fds)
811 }
812}
813impl crate::x11_utils::ReplyRequest for QueryClientPixmapBytesRequest {
814 type Reply = QueryClientPixmapBytesReply;
815}
816
817#[derive(Clone, Copy, Default)]
818#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
819#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
820pub struct QueryClientPixmapBytesReply {
821 pub sequence: u16,
822 pub length: u32,
823 pub bytes: u32,
824 pub bytes_overflow: u32,
825}
826impl_debug_if_no_extra_traits!(QueryClientPixmapBytesReply, "QueryClientPixmapBytesReply");
827impl TryParse for QueryClientPixmapBytesReply {
828 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
829 let remaining = initial_value;
830 let (response_type, remaining) = u8::try_parse(remaining)?;
831 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
832 let (sequence, remaining) = u16::try_parse(remaining)?;
833 let (length, remaining) = u32::try_parse(remaining)?;
834 let (bytes, remaining) = u32::try_parse(remaining)?;
835 let (bytes_overflow, remaining) = u32::try_parse(remaining)?;
836 if response_type != 1 {
837 return Err(ParseError::InvalidValue);
838 }
839 let result = QueryClientPixmapBytesReply { sequence, length, bytes, bytes_overflow };
840 let _ = remaining;
841 let remaining = initial_value.get(32 + length as usize * 4..)
842 .ok_or(ParseError::InsufficientData)?;
843 Ok((result, remaining))
844 }
845}
846impl Serialize for QueryClientPixmapBytesReply {
847 type Bytes = [u8; 16];
848 fn serialize(&self) -> [u8; 16] {
849 let response_type_bytes = &[1];
850 let sequence_bytes = self.sequence.serialize();
851 let length_bytes = self.length.serialize();
852 let bytes_bytes = self.bytes.serialize();
853 let bytes_overflow_bytes = self.bytes_overflow.serialize();
854 [
855 response_type_bytes[0],
856 0,
857 sequence_bytes[0],
858 sequence_bytes[1],
859 length_bytes[0],
860 length_bytes[1],
861 length_bytes[2],
862 length_bytes[3],
863 bytes_bytes[0],
864 bytes_bytes[1],
865 bytes_bytes[2],
866 bytes_bytes[3],
867 bytes_overflow_bytes[0],
868 bytes_overflow_bytes[1],
869 bytes_overflow_bytes[2],
870 bytes_overflow_bytes[3],
871 ]
872 }
873 fn serialize_into(&self, bytes: &mut Vec<u8>) {
874 bytes.reserve(16);
875 let response_type_bytes = &[1];
876 bytes.push(response_type_bytes[0]);
877 bytes.extend_from_slice(&[0; 1]);
878 self.sequence.serialize_into(bytes);
879 self.length.serialize_into(bytes);
880 self.bytes.serialize_into(bytes);
881 self.bytes_overflow.serialize_into(bytes);
882 }
883}
884
885pub const QUERY_CLIENT_IDS_REQUEST: u8 = 4;
887#[derive(Clone, Default)]
888#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
889#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
890pub struct QueryClientIdsRequest<'input> {
891 pub specs: Cow<'input, [ClientIdSpec]>,
892}
893impl_debug_if_no_extra_traits!(QueryClientIdsRequest<'_>, "QueryClientIdsRequest");
894impl<'input> QueryClientIdsRequest<'input> {
895 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
897 let length_so_far = 0;
898 let num_specs = u32::try_from(self.specs.len()).expect("`specs` has too many elements");
899 let num_specs_bytes = num_specs.serialize();
900 let mut request0 = vec![
901 major_opcode,
902 QUERY_CLIENT_IDS_REQUEST,
903 0,
904 0,
905 num_specs_bytes[0],
906 num_specs_bytes[1],
907 num_specs_bytes[2],
908 num_specs_bytes[3],
909 ];
910 let length_so_far = length_so_far + request0.len();
911 let specs_bytes = self.specs.serialize();
912 let length_so_far = length_so_far + specs_bytes.len();
913 let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
914 let length_so_far = length_so_far + padding0.len();
915 assert_eq!(length_so_far % 4, 0);
916 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
917 request0[2..4].copy_from_slice(&length.to_ne_bytes());
918 ([request0.into(), specs_bytes.into(), padding0.into()], vec![])
919 }
920 #[cfg(feature = "request-parsing")]
922 pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
923 if header.minor_opcode != QUERY_CLIENT_IDS_REQUEST {
924 return Err(ParseError::InvalidValue);
925 }
926 let (num_specs, remaining) = u32::try_parse(value)?;
927 let (specs, remaining) = crate::x11_utils::parse_list::<ClientIdSpec>(remaining, num_specs.try_to_usize()?)?;
928 let _ = remaining;
929 Ok(QueryClientIdsRequest {
930 specs: Cow::Owned(specs),
931 })
932 }
933 pub fn into_owned(self) -> QueryClientIdsRequest<'static> {
935 QueryClientIdsRequest {
936 specs: Cow::Owned(self.specs.into_owned()),
937 }
938 }
939}
940impl<'input> Request for QueryClientIdsRequest<'input> {
941 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
942
943 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
944 let (bufs, fds) = self.serialize(major_opcode);
945 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
947 (buf, fds)
948 }
949}
950impl<'input> crate::x11_utils::ReplyRequest for QueryClientIdsRequest<'input> {
951 type Reply = QueryClientIdsReply;
952}
953
954#[derive(Clone, Default)]
955#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
956#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
957pub struct QueryClientIdsReply {
958 pub sequence: u16,
959 pub length: u32,
960 pub ids: Vec<ClientIdValue>,
961}
962impl_debug_if_no_extra_traits!(QueryClientIdsReply, "QueryClientIdsReply");
963impl TryParse for QueryClientIdsReply {
964 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
965 let remaining = initial_value;
966 let (response_type, remaining) = u8::try_parse(remaining)?;
967 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
968 let (sequence, remaining) = u16::try_parse(remaining)?;
969 let (length, remaining) = u32::try_parse(remaining)?;
970 let (num_ids, remaining) = u32::try_parse(remaining)?;
971 let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
972 let (ids, remaining) = crate::x11_utils::parse_list::<ClientIdValue>(remaining, num_ids.try_to_usize()?)?;
973 if response_type != 1 {
974 return Err(ParseError::InvalidValue);
975 }
976 let result = QueryClientIdsReply { sequence, length, ids };
977 let _ = remaining;
978 let remaining = initial_value.get(32 + length as usize * 4..)
979 .ok_or(ParseError::InsufficientData)?;
980 Ok((result, remaining))
981 }
982}
983impl Serialize for QueryClientIdsReply {
984 type Bytes = Vec<u8>;
985 fn serialize(&self) -> Vec<u8> {
986 let mut result = Vec::new();
987 self.serialize_into(&mut result);
988 result
989 }
990 fn serialize_into(&self, bytes: &mut Vec<u8>) {
991 bytes.reserve(32);
992 let response_type_bytes = &[1];
993 bytes.push(response_type_bytes[0]);
994 bytes.extend_from_slice(&[0; 1]);
995 self.sequence.serialize_into(bytes);
996 self.length.serialize_into(bytes);
997 let num_ids = u32::try_from(self.ids.len()).expect("`ids` has too many elements");
998 num_ids.serialize_into(bytes);
999 bytes.extend_from_slice(&[0; 20]);
1000 self.ids.serialize_into(bytes);
1001 }
1002}
1003impl QueryClientIdsReply {
1004 pub fn num_ids(&self) -> u32 {
1014 self.ids.len()
1015 .try_into().unwrap()
1016 }
1017}
1018
1019pub const QUERY_RESOURCE_BYTES_REQUEST: u8 = 5;
1021#[derive(Clone, Default)]
1022#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1023#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1024pub struct QueryResourceBytesRequest<'input> {
1025 pub client: u32,
1026 pub specs: Cow<'input, [ResourceIdSpec]>,
1027}
1028impl_debug_if_no_extra_traits!(QueryResourceBytesRequest<'_>, "QueryResourceBytesRequest");
1029impl<'input> QueryResourceBytesRequest<'input> {
1030 pub fn serialize(self, major_opcode: u8) -> BufWithFds<[Cow<'input, [u8]>; 3]> {
1032 let length_so_far = 0;
1033 let client_bytes = self.client.serialize();
1034 let num_specs = u32::try_from(self.specs.len()).expect("`specs` has too many elements");
1035 let num_specs_bytes = num_specs.serialize();
1036 let mut request0 = vec![
1037 major_opcode,
1038 QUERY_RESOURCE_BYTES_REQUEST,
1039 0,
1040 0,
1041 client_bytes[0],
1042 client_bytes[1],
1043 client_bytes[2],
1044 client_bytes[3],
1045 num_specs_bytes[0],
1046 num_specs_bytes[1],
1047 num_specs_bytes[2],
1048 num_specs_bytes[3],
1049 ];
1050 let length_so_far = length_so_far + request0.len();
1051 let specs_bytes = self.specs.serialize();
1052 let length_so_far = length_so_far + specs_bytes.len();
1053 let padding0 = &[0; 3][..(4 - (length_so_far % 4)) % 4];
1054 let length_so_far = length_so_far + padding0.len();
1055 assert_eq!(length_so_far % 4, 0);
1056 let length = u16::try_from(length_so_far / 4).unwrap_or(0);
1057 request0[2..4].copy_from_slice(&length.to_ne_bytes());
1058 ([request0.into(), specs_bytes.into(), padding0.into()], vec![])
1059 }
1060 #[cfg(feature = "request-parsing")]
1062 pub fn try_parse_request(header: RequestHeader, value: &'input [u8]) -> Result<Self, ParseError> {
1063 if header.minor_opcode != QUERY_RESOURCE_BYTES_REQUEST {
1064 return Err(ParseError::InvalidValue);
1065 }
1066 let (client, remaining) = u32::try_parse(value)?;
1067 let (num_specs, remaining) = u32::try_parse(remaining)?;
1068 let (specs, remaining) = crate::x11_utils::parse_list::<ResourceIdSpec>(remaining, num_specs.try_to_usize()?)?;
1069 let _ = remaining;
1070 Ok(QueryResourceBytesRequest {
1071 client,
1072 specs: Cow::Owned(specs),
1073 })
1074 }
1075 pub fn into_owned(self) -> QueryResourceBytesRequest<'static> {
1077 QueryResourceBytesRequest {
1078 client: self.client,
1079 specs: Cow::Owned(self.specs.into_owned()),
1080 }
1081 }
1082}
1083impl<'input> Request for QueryResourceBytesRequest<'input> {
1084 const EXTENSION_NAME: Option<&'static str> = Some(X11_EXTENSION_NAME);
1085
1086 fn serialize(self, major_opcode: u8) -> BufWithFds<Vec<u8>> {
1087 let (bufs, fds) = self.serialize(major_opcode);
1088 let buf = bufs.iter().flat_map(|buf| buf.iter().copied()).collect();
1090 (buf, fds)
1091 }
1092}
1093impl<'input> crate::x11_utils::ReplyRequest for QueryResourceBytesRequest<'input> {
1094 type Reply = QueryResourceBytesReply;
1095}
1096
1097#[derive(Clone, Default)]
1098#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash))]
1099#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1100pub struct QueryResourceBytesReply {
1101 pub sequence: u16,
1102 pub length: u32,
1103 pub sizes: Vec<ResourceSizeValue>,
1104}
1105impl_debug_if_no_extra_traits!(QueryResourceBytesReply, "QueryResourceBytesReply");
1106impl TryParse for QueryResourceBytesReply {
1107 fn try_parse(initial_value: &[u8]) -> Result<(Self, &[u8]), ParseError> {
1108 let remaining = initial_value;
1109 let (response_type, remaining) = u8::try_parse(remaining)?;
1110 let remaining = remaining.get(1..).ok_or(ParseError::InsufficientData)?;
1111 let (sequence, remaining) = u16::try_parse(remaining)?;
1112 let (length, remaining) = u32::try_parse(remaining)?;
1113 let (num_sizes, remaining) = u32::try_parse(remaining)?;
1114 let remaining = remaining.get(20..).ok_or(ParseError::InsufficientData)?;
1115 let (sizes, remaining) = crate::x11_utils::parse_list::<ResourceSizeValue>(remaining, num_sizes.try_to_usize()?)?;
1116 if response_type != 1 {
1117 return Err(ParseError::InvalidValue);
1118 }
1119 let result = QueryResourceBytesReply { sequence, length, sizes };
1120 let _ = remaining;
1121 let remaining = initial_value.get(32 + length as usize * 4..)
1122 .ok_or(ParseError::InsufficientData)?;
1123 Ok((result, remaining))
1124 }
1125}
1126impl Serialize for QueryResourceBytesReply {
1127 type Bytes = Vec<u8>;
1128 fn serialize(&self) -> Vec<u8> {
1129 let mut result = Vec::new();
1130 self.serialize_into(&mut result);
1131 result
1132 }
1133 fn serialize_into(&self, bytes: &mut Vec<u8>) {
1134 bytes.reserve(32);
1135 let response_type_bytes = &[1];
1136 bytes.push(response_type_bytes[0]);
1137 bytes.extend_from_slice(&[0; 1]);
1138 self.sequence.serialize_into(bytes);
1139 self.length.serialize_into(bytes);
1140 let num_sizes = u32::try_from(self.sizes.len()).expect("`sizes` has too many elements");
1141 num_sizes.serialize_into(bytes);
1142 bytes.extend_from_slice(&[0; 20]);
1143 self.sizes.serialize_into(bytes);
1144 }
1145}
1146impl QueryResourceBytesReply {
1147 pub fn num_sizes(&self) -> u32 {
1157 self.sizes.len()
1158 .try_into().unwrap()
1159 }
1160}
1161