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
28pub use x11rb_protocol::protocol::xf86dri::*;
29
30async fn major_opcode<Conn: RequestConnection + ?Sized>(conn: &Conn) -> Result<u8, ConnectionError> {
32 let info = conn.extension_information(X11_EXTENSION_NAME).await?;
33 let info = info.ok_or(ConnectionError::UnsupportedExtension)?;
34 Ok(info.major_opcode)
35}
36
37pub async fn query_version<Conn>(conn: &Conn) -> Result<Cookie<'_, Conn, QueryVersionReply>, ConnectionError>
38where
39 Conn: RequestConnection + ?Sized,
40{
41 let request0 = QueryVersionRequest;
42 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
43 let slices = [IoSlice::new(&bytes[0])];
44 assert_eq!(slices.len(), bytes.len());
45 conn.send_request_with_reply(&slices, fds).await
46}
47pub async fn query_direct_rendering_capable<Conn>(conn: &Conn, screen: u32) -> Result<Cookie<'_, Conn, QueryDirectRenderingCapableReply>, ConnectionError>
48where
49 Conn: RequestConnection + ?Sized,
50{
51 let request0 = QueryDirectRenderingCapableRequest {
52 screen,
53 };
54 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
55 let slices = [IoSlice::new(&bytes[0])];
56 assert_eq!(slices.len(), bytes.len());
57 conn.send_request_with_reply(&slices, fds).await
58}
59pub async fn open_connection<Conn>(conn: &Conn, screen: u32) -> Result<Cookie<'_, Conn, OpenConnectionReply>, ConnectionError>
60where
61 Conn: RequestConnection + ?Sized,
62{
63 let request0 = OpenConnectionRequest {
64 screen,
65 };
66 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
67 let slices = [IoSlice::new(&bytes[0])];
68 assert_eq!(slices.len(), bytes.len());
69 conn.send_request_with_reply(&slices, fds).await
70}
71pub async fn close_connection<Conn>(conn: &Conn, screen: u32) -> Result<VoidCookie<'_, Conn>, ConnectionError>
72where
73 Conn: RequestConnection + ?Sized,
74{
75 let request0 = CloseConnectionRequest {
76 screen,
77 };
78 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
79 let slices = [IoSlice::new(&bytes[0])];
80 assert_eq!(slices.len(), bytes.len());
81 conn.send_request_without_reply(&slices, fds).await
82}
83pub async fn get_client_driver_name<Conn>(conn: &Conn, screen: u32) -> Result<Cookie<'_, Conn, GetClientDriverNameReply>, ConnectionError>
84where
85 Conn: RequestConnection + ?Sized,
86{
87 let request0 = GetClientDriverNameRequest {
88 screen,
89 };
90 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
91 let slices = [IoSlice::new(&bytes[0])];
92 assert_eq!(slices.len(), bytes.len());
93 conn.send_request_with_reply(&slices, fds).await
94}
95pub async fn create_context<Conn>(conn: &Conn, screen: u32, visual: u32, context: u32) -> Result<Cookie<'_, Conn, CreateContextReply>, ConnectionError>
96where
97 Conn: RequestConnection + ?Sized,
98{
99 let request0 = CreateContextRequest {
100 screen,
101 visual,
102 context,
103 };
104 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
105 let slices = [IoSlice::new(&bytes[0])];
106 assert_eq!(slices.len(), bytes.len());
107 conn.send_request_with_reply(&slices, fds).await
108}
109pub async fn destroy_context<Conn>(conn: &Conn, screen: u32, context: u32) -> Result<VoidCookie<'_, Conn>, ConnectionError>
110where
111 Conn: RequestConnection + ?Sized,
112{
113 let request0 = DestroyContextRequest {
114 screen,
115 context,
116 };
117 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
118 let slices = [IoSlice::new(&bytes[0])];
119 assert_eq!(slices.len(), bytes.len());
120 conn.send_request_without_reply(&slices, fds).await
121}
122pub async fn create_drawable<Conn>(conn: &Conn, screen: u32, drawable: u32) -> Result<Cookie<'_, Conn, CreateDrawableReply>, ConnectionError>
123where
124 Conn: RequestConnection + ?Sized,
125{
126 let request0 = CreateDrawableRequest {
127 screen,
128 drawable,
129 };
130 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
131 let slices = [IoSlice::new(&bytes[0])];
132 assert_eq!(slices.len(), bytes.len());
133 conn.send_request_with_reply(&slices, fds).await
134}
135pub async fn destroy_drawable<Conn>(conn: &Conn, screen: u32, drawable: u32) -> Result<VoidCookie<'_, Conn>, ConnectionError>
136where
137 Conn: RequestConnection + ?Sized,
138{
139 let request0 = DestroyDrawableRequest {
140 screen,
141 drawable,
142 };
143 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
144 let slices = [IoSlice::new(&bytes[0])];
145 assert_eq!(slices.len(), bytes.len());
146 conn.send_request_without_reply(&slices, fds).await
147}
148pub async fn get_drawable_info<Conn>(conn: &Conn, screen: u32, drawable: u32) -> Result<Cookie<'_, Conn, GetDrawableInfoReply>, ConnectionError>
149where
150 Conn: RequestConnection + ?Sized,
151{
152 let request0 = GetDrawableInfoRequest {
153 screen,
154 drawable,
155 };
156 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
157 let slices = [IoSlice::new(&bytes[0])];
158 assert_eq!(slices.len(), bytes.len());
159 conn.send_request_with_reply(&slices, fds).await
160}
161pub async fn get_device_info<Conn>(conn: &Conn, screen: u32) -> Result<Cookie<'_, Conn, GetDeviceInfoReply>, ConnectionError>
162where
163 Conn: RequestConnection + ?Sized,
164{
165 let request0 = GetDeviceInfoRequest {
166 screen,
167 };
168 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
169 let slices = [IoSlice::new(&bytes[0])];
170 assert_eq!(slices.len(), bytes.len());
171 conn.send_request_with_reply(&slices, fds).await
172}
173pub async fn auth_connection<Conn>(conn: &Conn, screen: u32, magic: u32) -> Result<Cookie<'_, Conn, AuthConnectionReply>, ConnectionError>
174where
175 Conn: RequestConnection + ?Sized,
176{
177 let request0 = AuthConnectionRequest {
178 screen,
179 magic,
180 };
181 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
182 let slices = [IoSlice::new(&bytes[0])];
183 assert_eq!(slices.len(), bytes.len());
184 conn.send_request_with_reply(&slices, fds).await
185}
186pub trait ConnectionExt: RequestConnection {
188 fn xf86dri_query_version(&self) -> Pin<Box<dyn Future<Output = Result<Cookie<'_, Self, QueryVersionReply>, ConnectionError>> + Send + '_>>
189 {
190 Box::pin(query_version(self))
191 }
192 fn xf86dri_query_direct_rendering_capable(&self, screen: u32) -> Pin<Box<dyn Future<Output = Result<Cookie<'_, Self, QueryDirectRenderingCapableReply>, ConnectionError>> + Send + '_>>
193 {
194 Box::pin(query_direct_rendering_capable(self, screen))
195 }
196 fn xf86dri_open_connection(&self, screen: u32) -> Pin<Box<dyn Future<Output = Result<Cookie<'_, Self, OpenConnectionReply>, ConnectionError>> + Send + '_>>
197 {
198 Box::pin(open_connection(self, screen))
199 }
200 fn xf86dri_close_connection(&self, screen: u32) -> Pin<Box<dyn Future<Output = Result<VoidCookie<'_, Self>, ConnectionError>> + Send + '_>>
201 {
202 Box::pin(close_connection(self, screen))
203 }
204 fn xf86dri_get_client_driver_name(&self, screen: u32) -> Pin<Box<dyn Future<Output = Result<Cookie<'_, Self, GetClientDriverNameReply>, ConnectionError>> + Send + '_>>
205 {
206 Box::pin(get_client_driver_name(self, screen))
207 }
208 fn xf86dri_create_context(&self, screen: u32, visual: u32, context: u32) -> Pin<Box<dyn Future<Output = Result<Cookie<'_, Self, CreateContextReply>, ConnectionError>> + Send + '_>>
209 {
210 Box::pin(create_context(self, screen, visual, context))
211 }
212 fn xf86dri_destroy_context(&self, screen: u32, context: u32) -> Pin<Box<dyn Future<Output = Result<VoidCookie<'_, Self>, ConnectionError>> + Send + '_>>
213 {
214 Box::pin(destroy_context(self, screen, context))
215 }
216 fn xf86dri_create_drawable(&self, screen: u32, drawable: u32) -> Pin<Box<dyn Future<Output = Result<Cookie<'_, Self, CreateDrawableReply>, ConnectionError>> + Send + '_>>
217 {
218 Box::pin(create_drawable(self, screen, drawable))
219 }
220 fn xf86dri_destroy_drawable(&self, screen: u32, drawable: u32) -> Pin<Box<dyn Future<Output = Result<VoidCookie<'_, Self>, ConnectionError>> + Send + '_>>
221 {
222 Box::pin(destroy_drawable(self, screen, drawable))
223 }
224 fn xf86dri_get_drawable_info(&self, screen: u32, drawable: u32) -> Pin<Box<dyn Future<Output = Result<Cookie<'_, Self, GetDrawableInfoReply>, ConnectionError>> + Send + '_>>
225 {
226 Box::pin(get_drawable_info(self, screen, drawable))
227 }
228 fn xf86dri_get_device_info(&self, screen: u32) -> Pin<Box<dyn Future<Output = Result<Cookie<'_, Self, GetDeviceInfoReply>, ConnectionError>> + Send + '_>>
229 {
230 Box::pin(get_device_info(self, screen))
231 }
232 fn xf86dri_auth_connection(&self, screen: u32, magic: u32) -> Pin<Box<dyn Future<Output = Result<Cookie<'_, Self, AuthConnectionReply>, ConnectionError>> + Send + '_>>
233 {
234 Box::pin(auth_connection(self, screen, magic))
235 }
236}
237
238impl<C: RequestConnection + ?Sized> ConnectionExt for C {}