1#![allow(clippy::too_many_arguments)]
7
8#[allow(unused_imports)]
9use std::borrow::Cow;
10#[allow(unused_imports)]
11use std::convert::TryInto;
12#[allow(unused_imports)]
13use crate::utils::RawFdContainer;
14#[allow(unused_imports)]
15use crate::x11_utils::{Request, RequestHeader, Serialize, TryParse, TryParseFd};
16use std::io::IoSlice;
17use crate::connection::RequestConnection;
18#[allow(unused_imports)]
19use crate::connection::Connection as X11Connection;
20#[allow(unused_imports)]
21use crate::cookie::{Cookie, CookieWithFds, VoidCookie};
22use crate::errors::ConnectionError;
23#[allow(unused_imports)]
24use crate::errors::ReplyOrIdError;
25use std::future::Future;
26use std::pin::Pin;
27#[allow(unused_imports)]
28use super::xproto;
29
30pub use x11rb_protocol::protocol::res::*;
31
32async fn major_opcode<Conn: RequestConnection + ?Sized>(conn: &Conn) -> Result<u8, ConnectionError> {
34 let info = conn.extension_information(X11_EXTENSION_NAME).await?;
35 let info = info.ok_or(ConnectionError::UnsupportedExtension)?;
36 Ok(info.major_opcode)
37}
38
39pub async fn query_version<Conn>(conn: &Conn, client_major: u8, client_minor: u8) -> Result<Cookie<'_, Conn, QueryVersionReply>, ConnectionError>
40where
41 Conn: RequestConnection + ?Sized,
42{
43 let request0 = QueryVersionRequest {
44 client_major,
45 client_minor,
46 };
47 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
48 let slices = [IoSlice::new(&bytes[0])];
49 assert_eq!(slices.len(), bytes.len());
50 conn.send_request_with_reply(&slices, fds).await
51}
52pub async fn query_clients<Conn>(conn: &Conn) -> Result<Cookie<'_, Conn, QueryClientsReply>, ConnectionError>
53where
54 Conn: RequestConnection + ?Sized,
55{
56 let request0 = QueryClientsRequest;
57 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
58 let slices = [IoSlice::new(&bytes[0])];
59 assert_eq!(slices.len(), bytes.len());
60 conn.send_request_with_reply(&slices, fds).await
61}
62pub async fn query_client_resources<Conn>(conn: &Conn, xid: u32) -> Result<Cookie<'_, Conn, QueryClientResourcesReply>, ConnectionError>
63where
64 Conn: RequestConnection + ?Sized,
65{
66 let request0 = QueryClientResourcesRequest {
67 xid,
68 };
69 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
70 let slices = [IoSlice::new(&bytes[0])];
71 assert_eq!(slices.len(), bytes.len());
72 conn.send_request_with_reply(&slices, fds).await
73}
74pub async fn query_client_pixmap_bytes<Conn>(conn: &Conn, xid: u32) -> Result<Cookie<'_, Conn, QueryClientPixmapBytesReply>, ConnectionError>
75where
76 Conn: RequestConnection + ?Sized,
77{
78 let request0 = QueryClientPixmapBytesRequest {
79 xid,
80 };
81 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
82 let slices = [IoSlice::new(&bytes[0])];
83 assert_eq!(slices.len(), bytes.len());
84 conn.send_request_with_reply(&slices, fds).await
85}
86pub async fn query_client_ids<'c, 'input, Conn>(conn: &'c Conn, specs: &'input [ClientIdSpec]) -> Result<Cookie<'c, Conn, QueryClientIdsReply>, ConnectionError>
87where
88 Conn: RequestConnection + ?Sized,
89{
90 let request0 = QueryClientIdsRequest {
91 specs: Cow::Borrowed(specs),
92 };
93 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
94 let slices = [IoSlice::new(&bytes[0]), IoSlice::new(&bytes[1]), IoSlice::new(&bytes[2])];
95 assert_eq!(slices.len(), bytes.len());
96 conn.send_request_with_reply(&slices, fds).await
97}
98pub async fn query_resource_bytes<'c, 'input, Conn>(conn: &'c Conn, client: u32, specs: &'input [ResourceIdSpec]) -> Result<Cookie<'c, Conn, QueryResourceBytesReply>, ConnectionError>
99where
100 Conn: RequestConnection + ?Sized,
101{
102 let request0 = QueryResourceBytesRequest {
103 client,
104 specs: Cow::Borrowed(specs),
105 };
106 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
107 let slices = [IoSlice::new(&bytes[0]), IoSlice::new(&bytes[1]), IoSlice::new(&bytes[2])];
108 assert_eq!(slices.len(), bytes.len());
109 conn.send_request_with_reply(&slices, fds).await
110}
111pub trait ConnectionExt: RequestConnection {
113 fn res_query_version(&self, client_major: u8, client_minor: u8) -> Pin<Box<dyn Future<Output = Result<Cookie<'_, Self, QueryVersionReply>, ConnectionError>> + Send + '_>>
114 {
115 Box::pin(query_version(self, client_major, client_minor))
116 }
117 fn res_query_clients(&self) -> Pin<Box<dyn Future<Output = Result<Cookie<'_, Self, QueryClientsReply>, ConnectionError>> + Send + '_>>
118 {
119 Box::pin(query_clients(self))
120 }
121 fn res_query_client_resources(&self, xid: u32) -> Pin<Box<dyn Future<Output = Result<Cookie<'_, Self, QueryClientResourcesReply>, ConnectionError>> + Send + '_>>
122 {
123 Box::pin(query_client_resources(self, xid))
124 }
125 fn res_query_client_pixmap_bytes(&self, xid: u32) -> Pin<Box<dyn Future<Output = Result<Cookie<'_, Self, QueryClientPixmapBytesReply>, ConnectionError>> + Send + '_>>
126 {
127 Box::pin(query_client_pixmap_bytes(self, xid))
128 }
129 fn res_query_client_ids<'c, 'input, 'future>(&'c self, specs: &'input [ClientIdSpec]) -> Pin<Box<dyn Future<Output = Result<Cookie<'c, Self, QueryClientIdsReply>, ConnectionError>> + Send + 'future>>
130 where
131 'c: 'future,
132 'input: 'future,
133 {
134 Box::pin(query_client_ids(self, specs))
135 }
136 fn res_query_resource_bytes<'c, 'input, 'future>(&'c self, client: u32, specs: &'input [ResourceIdSpec]) -> Pin<Box<dyn Future<Output = Result<Cookie<'c, Self, QueryResourceBytesReply>, ConnectionError>> + Send + 'future>>
137 where
138 'c: 'future,
139 'input: 'future,
140 {
141 Box::pin(query_resource_bytes(self, client, specs))
142 }
143}
144
145impl<C: RequestConnection + ?Sized> ConnectionExt for C {}