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::dbe::*;
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, major_version: u8, minor_version: u8) -> Result<Cookie<'_, Conn, QueryVersionReply>, ConnectionError>
48where
49 Conn: RequestConnection + ?Sized,
50{
51 let request0 = QueryVersionRequest {
52 major_version,
53 minor_version,
54 };
55 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
56 let slices = [IoSlice::new(&bytes[0])];
57 assert_eq!(slices.len(), bytes.len());
58 conn.send_request_with_reply(&slices, fds).await
59}
60pub async fn allocate_back_buffer<Conn>(conn: &Conn, window: xproto::Window, buffer: BackBuffer, swap_action: u8) -> Result<VoidCookie<'_, Conn>, ConnectionError>
70where
71 Conn: RequestConnection + ?Sized,
72{
73 let request0 = AllocateBackBufferRequest {
74 window,
75 buffer,
76 swap_action,
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 deallocate_back_buffer<Conn>(conn: &Conn, buffer: BackBuffer) -> Result<VoidCookie<'_, Conn>, ConnectionError>
91where
92 Conn: RequestConnection + ?Sized,
93{
94 let request0 = DeallocateBackBufferRequest {
95 buffer,
96 };
97 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
98 let slices = [IoSlice::new(&bytes[0])];
99 assert_eq!(slices.len(), bytes.len());
100 conn.send_request_without_reply(&slices, fds).await
101}
102pub async fn swap_buffers<'c, 'input, Conn>(conn: &'c Conn, actions: &'input [SwapInfo]) -> Result<VoidCookie<'c, Conn>, ConnectionError>
111where
112 Conn: RequestConnection + ?Sized,
113{
114 let request0 = SwapBuffersRequest {
115 actions: Cow::Borrowed(actions),
116 };
117 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
118 let slices = [IoSlice::new(&bytes[0]), IoSlice::new(&bytes[1]), IoSlice::new(&bytes[2])];
119 assert_eq!(slices.len(), bytes.len());
120 conn.send_request_without_reply(&slices, fds).await
121}
122pub async fn begin_idiom<Conn>(conn: &Conn) -> Result<VoidCookie<'_, Conn>, ConnectionError>
126where
127 Conn: RequestConnection + ?Sized,
128{
129 let request0 = BeginIdiomRequest;
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_without_reply(&slices, fds).await
134}
135pub async fn end_idiom<Conn>(conn: &Conn) -> Result<VoidCookie<'_, Conn>, ConnectionError>
137where
138 Conn: RequestConnection + ?Sized,
139{
140 let request0 = EndIdiomRequest;
141 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
142 let slices = [IoSlice::new(&bytes[0])];
143 assert_eq!(slices.len(), bytes.len());
144 conn.send_request_without_reply(&slices, fds).await
145}
146pub async fn get_visual_info<'c, 'input, Conn>(conn: &'c Conn, drawables: &'input [xproto::Drawable]) -> Result<Cookie<'c, Conn, GetVisualInfoReply>, ConnectionError>
148where
149 Conn: RequestConnection + ?Sized,
150{
151 let request0 = GetVisualInfoRequest {
152 drawables: Cow::Borrowed(drawables),
153 };
154 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
155 let slices = [IoSlice::new(&bytes[0]), IoSlice::new(&bytes[1]), IoSlice::new(&bytes[2])];
156 assert_eq!(slices.len(), bytes.len());
157 conn.send_request_with_reply(&slices, fds).await
158}
159pub async fn get_back_buffer_attributes<Conn>(conn: &Conn, buffer: BackBuffer) -> Result<Cookie<'_, Conn, GetBackBufferAttributesReply>, ConnectionError>
168where
169 Conn: RequestConnection + ?Sized,
170{
171 let request0 = GetBackBufferAttributesRequest {
172 buffer,
173 };
174 let (bytes, fds) = request0.serialize(major_opcode(conn).await?);
175 let slices = [IoSlice::new(&bytes[0])];
176 assert_eq!(slices.len(), bytes.len());
177 conn.send_request_with_reply(&slices, fds).await
178}
179pub trait ConnectionExt: RequestConnection {
181 fn dbe_query_version(&self, major_version: u8, minor_version: u8) -> Pin<Box<dyn Future<Output = Result<Cookie<'_, Self, QueryVersionReply>, ConnectionError>> + Send + '_>>
190 {
191 Box::pin(query_version(self, major_version, minor_version))
192 }
193 fn dbe_allocate_back_buffer(&self, window: xproto::Window, buffer: BackBuffer, swap_action: u8) -> Pin<Box<dyn Future<Output = Result<VoidCookie<'_, Self>, ConnectionError>> + Send + '_>>
203 {
204 Box::pin(allocate_back_buffer(self, window, buffer, swap_action))
205 }
206 fn dbe_deallocate_back_buffer(&self, buffer: BackBuffer) -> Pin<Box<dyn Future<Output = Result<VoidCookie<'_, Self>, ConnectionError>> + Send + '_>>
214 {
215 Box::pin(deallocate_back_buffer(self, buffer))
216 }
217 fn dbe_swap_buffers<'c, 'input, 'future>(&'c self, actions: &'input [SwapInfo]) -> Pin<Box<dyn Future<Output = Result<VoidCookie<'c, Self>, ConnectionError>> + Send + 'future>>
226 where
227 'c: 'future,
228 'input: 'future,
229 {
230 Box::pin(swap_buffers(self, actions))
231 }
232 fn dbe_begin_idiom(&self) -> Pin<Box<dyn Future<Output = Result<VoidCookie<'_, Self>, ConnectionError>> + Send + '_>>
236 {
237 Box::pin(begin_idiom(self))
238 }
239 fn dbe_end_idiom(&self) -> Pin<Box<dyn Future<Output = Result<VoidCookie<'_, Self>, ConnectionError>> + Send + '_>>
241 {
242 Box::pin(end_idiom(self))
243 }
244 fn dbe_get_visual_info<'c, 'input, 'future>(&'c self, drawables: &'input [xproto::Drawable]) -> Pin<Box<dyn Future<Output = Result<Cookie<'c, Self, GetVisualInfoReply>, ConnectionError>> + Send + 'future>>
246 where
247 'c: 'future,
248 'input: 'future,
249 {
250 Box::pin(get_visual_info(self, drawables))
251 }
252 fn dbe_get_back_buffer_attributes(&self, buffer: BackBuffer) -> Pin<Box<dyn Future<Output = Result<Cookie<'_, Self, GetBackBufferAttributesReply>, ConnectionError>> + Send + '_>>
261 {
262 Box::pin(get_back_buffer_attributes(self, buffer))
263 }
264}
265
266impl<C: RequestConnection + ?Sized> ConnectionExt for C {}